Apa kabar?


20

Martin telah membuat cuplikan yang bagus yang dapat digunakan untuk melacak skor untuk jawaban terhadap tantangan. Itu hebat dan semuanya, tetapi bukankah lebih baik jika Anda bisa melacaknya sendiri?

Buat program yang membandingkan jumlah byte itu sendiri dengan sisa jawaban untuk pertanyaan ini, dan mengembalikan "Saya menjawab nomor n".

Aturan:

  • Hitungan byte dalam jawaban Anda sendiri dapat dikodekan dalam kode

  • Fungsi dapat mengambil url sebagai input, atau dapat di-hardcode. Karakter untuk url tidak akan dihitung ke jumlah byte, jadi tidak perlu menggunakan penyingkat url.

  • url-address ke jawaban tidak bisa di-hardcode

  • Skor untuk jawaban dapat ditemukan dari tajuk, (seperti halnya cuplikan Martin).

  • Header jawaban harus memiliki format yang benar (dijelaskan di bawah).

  • Jika memungkinkan untuk menjalankan program secara online, silakan bagikan tautan ke kompiler online (atau cuplikan kode yang dapat dieksekusi dari jawabannya). Jika tidak memungkinkan, tolong tunjukkan cara memanggil fungsi, dan tampilkan output dari kompiler Anda sendiri (pada saat Anda memposting jawabannya. Anda tidak perlu memperbaruinya kecuali jika Anda ingin tentu saja).

  • Anda harus benar-benar membandingkan jawaban dengan jawaban lain untuk pertanyaan ini. Cukup menulis skrip I'm answer number 1.dalam beberapa bahasa tidak sah.

  • Jika jawaban lain memiliki jumlah byte yang sama dengan jawaban Anda, Anda dapat memilih apakah Anda ingin yang terbaik atau lebih buruk dari mereka.

Header harus diformat:

# Language Name, N bytes

Strike-through dll tidak dapat digunakan, jadi jika ukuran kode diubah, tampilkan dalam huruf tebal di bawah header atau tunjukkan dengan cara lain.

Keluaran harus I'm answer number n., di mana angka nadalah posisi (trailing newline / spasi OK). Jadi, jawaban terpendek akan menghasilkan: "Saya menjawab nomor 1.", jawaban kedua adalah "Saya menjawab nomor 2." dll.

Ini kode golf, jadi jawaban tersingkat dalam byte akan menang.


Jika jawaban lain memiliki jumlah byte yang sama dengan jawaban Anda, Anda dapat memilih apakah Anda ingin yang terbaik atau lebih buruk dari mereka. Mungkin tanggal posting harus menjadi pemutus ikatan, jadi Anda tidak memiliki dua jawaban yang mengaku nomor yang sama. Atau, Anda dapat menggunakan standar bahwa jika mereka terikat, keduanya terikat untuk tempat yang lebih tinggi.
mbomb007

2
Saya tidak yakin ini akan berhasil. Kebanyakan penerjemah online (baik) tidak mengizinkan mengeriting halaman web lain, tetapi dalam tantangan itu dikatakan bahwa kode tersebut harus dijalankan pada penerjemah online.
spaghetto

Mari kita bicarakan ini dalam obrolan.
spaghetto

Apakah ada kutipan di sekitar URL yang perlu dihitung? Beberapa jawaban saat ini mengecualikan mereka dari hitungan, yang lain menyertakannya.
hvd

Jawaban:


2

Perl, 107 byte

use LWP;print"I'm answer number ",1+grep($_<107,LWP::UserAgent->new->get('http://codegolf.stackexchange.com/q/60204')->content=~/<h1>.+, (\d+)/g),'.';

Sedikit kurang golf:

use LWP;
$agent = new LWP::UserAgent();
$response = $agent->get('http://codegolf.stackexchange.com/q/60204');
@answers = $response->content =~ m/<h1>.+, (\d+)/g;
print "I'm answer number ", 1+grep($_<107, @answers), '.';

Contoh Penggunaan

$ perl my_rank.pl
I'm answer number 1.

7

Python 2, 145 byte

from requests import*
print"I'm answer number %s."%(sorted([int(a["body"].split(",")[1].split()[0])for a in get('http://api.stackexchange.com/2.2/questions/60204/answers?pagesize=99&order=desc&sort=activity&site=codegolf&filter=!SWJ_BpAceOT6L*G2Qa').json()["items"]]).index(145)+1)

Output dari 2015-10-10 17:30:00 UTC:

I'm answer number 1.

Saya tidak menghitung URL apa pun untuk skor saya, jika saya harap beri komentar berapa banyak saya harus menambahkannya. Memiliki skor sendiri yang dikodekan di dalamnya, dengan asumsi skor sudah diposkan Akan rusak jika lebih dari 99 jawaban diposting.


6

Otomatis, 175 byte

(202 byte - 27 untuk URL)

#include<String.au3>
$0=_StringBetween
$1=1
For $2 In $0(BinaryToString(InetRead("http://q.codegolf.xyz/60204")),'<h1>',' b')
$1+=$0($2,', ','')[0]<175?1:0
Next
ConsoleWrite("I'm answer number "&$1&".")

Output dari 2015-10-09 17:47:00 UTC:

I'm answer number 1.

Saya bahkan belum pernah mendengar tentang Autolt, tetapi apakah benar ini tidak akan berhasil jika nama bahasanya ada koma? (Saya tidak tahu apakah ada bahasa seperti itu, jadi saya tidak yakin apakah itu penting)
Stewie Griffin

@StewieGriffin Ya, tapi saya tidak ingat bahasa apa pun dengan koma di dalamnya ;-). Jika ada yang muncul saya akan mengubahnya.
mınxomaτ

@ minxomat Nama itu sepertinya lbukan I, jadi saya salah baca. Satu-satunya alasan saya menyadarinya adalah dengan melihat artikel Wikipedia , yang memiliki serif.
mbomb007

Hanya menunggu seseorang untuk menciptakan bahasa dengan koma di dalamnya hanya untuk menyabot jawaban ini ...
Darrel Hoffman

@DarrelHoffman Ya, itu harus memiliki koma dan spasi berturut-turut dalam nama itu ^^
mınxomaτ

4

JavaScript (ES7), 149 byte

283 byte - 134 untuk URL. Saya belum pernah menggunakan permintaan HTTP sebelumnya, tapi begini ...

x=z=>alert(`I'm answer number ${[for(y of z.items)y.body.match(/, (\d+)/)[1]].sort().indexOf("149")+1}.`);document.write('<script src="//api.stackexchange.com/2.2/questions/60204/answers?pagesize=100&order=desc&sort=votes&site=codegolf&filter=!--pn9sqW9y0T&callback=x">\x3C/script>')

Diuji berhasil di Firefox 41.

Pertama ia melihat melalui header dari semua jawaban untuk menemukan byte-counts mereka, kemudian ia menemukan posisi pertama dengan byte-count 243 149. Saat ini diatur untuk memeriksa hanya 100 jawaban pertama, dan akan pecah jika seseorang mendapat di bawah 100 byte, tetapi berfungsi untuk saat ini. ;)

Terima kasih kepada @GeorgeReith untuk teknik yang jauh lebih pendek. Versi lama menggunakan AJAX (243 byte):

x=new XMLHttpRequest,x.onreadystatechange=_=>{if(x.readyState==4&&x.status==200)alert(`I'm answer number ${[for(y of JSON.parse(x.responseText).items)y.body.match(/, (\d+)/)[1]].sort((a,b)=>a-b).indexOf("243")+1}.`)},x.open("GET","//api.stackexchange.com/2.2/questions/60204/answers?pagesize=100&order=desc&sort=votes&site=codegolf&filter=!--pn9sqW9y0T",!0),x.send()

Terlihat bagus ... walaupun mungkin akan rusak jika seseorang mengirim jawaban 151 byte lainnya
George Reith

@ GeorgeReith Nah, seharusnya tidak. OP mengatakan bahwa ikatan dapat diputuskan, dan ini akan menempatkan dirinya di depan yang lain.
ETHproduksi

Ah dia mengeditnya. Masih mungkin lebih baik untuk mengurutkan berdasarkan tanggal pembuatan daripada membuatnya lebih mungkin menemukan Anda daripada salah satu dari sedikit yang memposting sebelumnya dan mengedit jawaban mereka.
George Reith

@ GeorgeReith If other answers have the same number of bytes as your own, you can choose if you want to be best or worse of them.Itu masih di pos utama; Apakah saya salah memahami sesuatu?
ETHproduksi

Tidak ada permintaan maaf saya sedang membaca riwayat sunting dan menjadi bingung.
George Reith

4

PHP, 158 159 164 byte

I'm answer number <?for(;$h[]=json_decode(fread(gzopen('http://api.stackexchange.com/2.2/questions/60204/answers?pagesize=99&order=desc&sort=votes&site=codegolf&filter=!--pn9sqW9y0T',r),1e4),1)[items][+$i++][body];);echo array_sum(preg_filter(~„ÑÕß×£›ÔÖ߆‹šŒÃЗÎÑÕ‚Œš,~ÛÎÃÎÊÇ,$h)),~Ñ;

127 byte dari 'http://api.stackexchange.com/2.2/questions/60204/answers?pagesize=99&order=desc&sort=votes&site=codegolf&filter=!--pn9sqW9y0T'tidak dihitung

Versi yang diformat dengan string yang tidak dikoleksi:

<?
for(;
    $h[]=json_decode(
        fread(
            gzopen(
                'http://api.stackexchange.com/2.2/questions/60204/answers?pagesize=99&order=desc&sort=votes&site=codegolf&filter=!--pn9sqW9y0T',r
            ), 1e4
        ), 1
    )[items][+$i++][body];
);
echo"I'm answer number ",
    array_sum(
        preg_filter('{.* (\d+) bytes</h1.*}se','$1<159', $h)
    ),
    ".";
  • Memuat respons JSON (satu kali per jawaban sebenarnya untuk menghemat 5 byte, terima kasih kepada @Blackhole)
  • Mengumpulkan badan jawaban di $h
  • ganti seluruh teks dengan "1" (benar) jika jumlah byte <= 159, atau "" (salah) sebaliknya
  • jumlah hasilnya

Urutan karakter seperti ¶Ø’ßž‘Œˆšß‘Š’šßadalah nama konstan yang valid dalam PHP, tetapi karena konstanta tidak ada diperlakukan sebagai string literal. ~membalikkan mereka, yang ini ke "I'm answer number "(masing-masing menyimpan byte untuk satu tanda kutip)

Pemakaian

php -derror_reporting=0 howareyou.php

Saya jawab nomor 1.


Apakah $avariabel itu benar-benar diperlukan? Mengapa tidak Anda lakukan saja $h[]=json_decode(…)[items][+$i++][body]? Ngomong-ngomong, apa karakter yang aneh ini?
Blackhole

Poin bagus. Ini akan membuat permintaan baru untuk setiap jawaban tetapi siapa yang peduli :) Karakter aneh adalah string terbalik bitwise. Mereka adalah nama konstan yang valid di PHP yang digunakan sebagai string literal jika tidak ada, jadi saya bisa menyimpan tanda kutip. Misalnya " "(3 byte) dapat dikurangi menjadi (2 byte)
Fabian Schmengler

Memang, saya telah menemukan penjelasan Anda tentang jawaban ini . Karena itu metode yang tidak biasa, saya pikir itu bisa menjadi ide yang bagus untuk menjelaskannya lagi di sini di posting Anda :).
Blackhole

Saya pikir Anda dapat melakukan jauh lebih baik jika Anda melewatkan json_decodedan hanya splitpada ':'atau sesuatu, misalnya: codepad.org/7rZg06by
primo

Ide bagus tapi saya khawatir itu mungkin tidak bisa diandalkan karena akan ada banyak titik dua dalam kode sumber. Menempatkan "I'm answer number" sebelum tag PHP pembuka menyimpan setidaknya dua byte, terima kasih untuk itu!
Fabian Schmengler

3

Javascript (ES6), 186 byte

(335 - 149 byte untuk URL)

a=d=>alert(`I'm answer number ${d.items.map(q=>(y=[q.body.match(/, (\d+)/)[1],(x=q.owner.user_id==11182)])&&x?z=y:y).sort().indexOf(z)+1}.`)
document.write(`<script src="https://api.stackexchange.com/questions/60204/answers?pagesize=100&order=desc&sort=activity&site=codegolf&filter=!)Q2B_A19OPkd2j8JforD00f5&callback=a">\x3C/script>`)


Saya tidak tahu Anda bisa melakukannya dengan cara itu! Bolehkah saya bertanya mengapa Anda menggunakan \x3Cbukan <?
ETHproduksi

@ ETHproductions Karena browser mencari tag skrip penutup segera dan tidak akan menjalankan skrip sebaliknya, ini menghalangi penutupan tag skrip hingga penyisipan posting. Ia menggunakan JSONP dengan panggilan balik dan terserah API apakah mendukungnya tapi untungnya stackexchange melakukannya. Jujur saya tidak sepenuhnya memahami alasan untuk itu tetapi ini adalah masalah yang sah.
George Reith

1

Awk, 153 byte

BEGIN{if(u){print"I\047m answer number "system("curl -s "u"|awk -f a")".";exit}FS="1>.*,|es<\/h"}NF==3{r+=($2+0)<153?1:0}END{exit(r<1?1:r)}

Ini harus disimpan ke file adan dijalankan seperti:

awk -v u=http://codegolf.stackexchange.com/questions/60204/how-are-you-doing -f a

Saya mengurangi 68 byte untuk http://codegolf.stackexchange.com/questions/60204/how-are-you-doingdan menambahkan 13 ke kode untuk bootstrap awk -v u=dan -f a.

Kurang golf, ini bisa lebih pendek:

curl -s http://codegolf.stackexchange.com/questions/60204/how-are-you-doing | awk -F"1>.*,|es<\/h" 'NF==3{r+=(0+$2)<103?1:0}END{print"I\047m answer number "(r<1?1:0)"."}'

Itu selalu lebih suka dalam ikatan. Hitungan byte masing-masing dikodekan dengan keras.

Versi yang lebih golf memiliki skrip yang memanggil dirinya sendiri dan mengeluarkan nilai keluar melalui sistem. Dalam setiap kasus hanya dihitung lebih rendah dari kenaikan nilai yang dikodekan secara keras r, yang kemudian harus disesuaikan kembali 1jika itu mengarah.

Ini akan gagal menemukan byte dengan benar jika ada spasi putih di antara bytesdan </h1>dan mungkin sejumlah kasus lain yang belum saya pertimbangkan.

Pada Sun Oct 11 05:17:51 UTC 2015, ini memberi:

I'm answer number 3.

Karena ini adalah pertama kalinya saya bermain golf, beri tahu saya jika saya telah melanggar aturan, celah, jumlah, dll. Atau peningkatan apa yang bisa saya lakukan.
n0741337

Saya pikir Anda perlu mencetak "Saya menjawab nomor" daripada "Saya nomor".
lirtosiast

@ThomasKwa Hah! Saya tahu itu terlalu bagus untuk menjadi kenyataan. Terima kasih dan diperbaiki. Apakah menambahkan byte kembali membutuhkan pemogokan?
n0741337

Anda tidak memerlukannya, sama seperti Anda tidak perlu dicoret saat Anda bermain golf dengan byte.
lirtosiast

1

GNU Awk, 156 byte

(Terinspirasi oleh n0741337 's solusi AWK .)

Yang ini melakukan semuanya sendiri, tanpa menjalankan perintah eksternal.

BEGIN{d="/inet/tcp/0/"h"/80"
print"GET "p" HTTP/1.1\nHost:"h"\n"|&d
while(d|&getline)n+=match($0,/1>.*, ([0-9]+)/,m)&&m[1]<156
print"I'm answer number",n+1}

Mengharapkan nama host dan jalur sebagai nilai yang terpisah. Mengingat mereka tersedia secara gratis, mudah-mudahan ini tidak melanggar aturan.

Contoh dijalankan:

bash-4.3$ awk -v h=codegolf.stackexchange.com -v p=/questions/60204/how-are-you-doing -f number.awk 
I'm answer number 4
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.