CJam, 25 - 25 = 0 byte
q~1,*_@{[\{1$^}/_](;)\}/;
Ini hanyalah port CJam langsung dari jawaban GolfScript di bawah ini, karena, setelah membaca jawaban Martin Büttner , saya menyadari bahwa saya bisa menghemat satu byte karena penanganan CJam pada tipe integer dan karakter. (Pada dasarnya, CJam tidak perlu 1&digunakan untuk memaksa karakter ASCII menjadi bit dalam kode GolfScript, tetapi memang membutuhkan prepended quntuk membaca input.) Saya biasanya akan menganggap port sepele seperti trik murah, tetapi mencapai skor nol dibuat itu IMO berharga.
Bagaimanapun, program ini bekerja persis seperti program GolfScript asli di bawah ini, jadi silakan merujuk ke deskripsi dan instruksi penggunaannya. Seperti biasa, Anda dapat menguji versi CJam menggunakan penerjemah online ini .
GolfScript, 26 - 25 = 1 byte
~1,*.@{[1&\{1$^}/.](;)\}/;
Solusi ini hanya diulang pada input string sekali saja, jadi saya yakin ini memenuhi syarat untuk bonus −25 byte. Ini bekerja dengan secara internal memelihara k array elemen yang menyimpan bit saat ini dari setiap pre-iterates k .
Input harus diberikan melalui stdin, dalam format "1111111" 3, yaitu sebagai string 0dan1 karakter yang , diikuti oleh angka k . Output akan menjadi stdout, sebagai bitstring tanpa tanda kutip.
Uji kode ini secara online.(Jika program habis, coba jalankan kembali; server Web GolfScript terkenal karena waktu habis secara acak.)
Inilah versi yang diperluas dari program ini, dengan komentar:
~ # eval the input, leaving a string and the number k on the stack
1,* # turn the number k into an array of k zeros ("the state array")
. # make a copy of the array; it will be left on the stack, making up the
# first k bits of the output (which are always zeros)
@ # move the input string to the top of the stack, to be iterated over
{
[ # place a start-of-array marker on the stack, for later use
1& # zero out all but the lowest bit of this input byte
\ # move the state array to the top of the stack, to be iterated over
{ 1$^ } / # iterate over each element of the state array, XORing each
# element with the previous value on the stack, and leave
# the results on the stack
. # duplicate the last value on the stack (which is the output bit we want)
] # collect all values put on the stack since the last [ into an array
(; # remove the first element of the array (the input bit)
) # pop the last element (the duplicated output bit) off the array
\ # move the popped bit below the new state array on the stack
}
/ # iterate the preceding code block over the bytes in the input string
; # discard the state array, leaving just the output bits on the stack
Pada dasarnya, seperti kebanyakan solusi berulang, kode ini dapat dipahami sebagai penerapan perulangan
b i , j : = b i , ( j −1) ⊕ b ( i −1), ( j −1) ,
di mana b 0, j adalah bit input ke- j (untuk j ≥ 1), b k , j adalah bit keluaran ke- j , dan b i , 0 = 0 dengan asumsi. Perbedaannya adalah bahwa, sedangkan solusi iteratif, pada dasarnya, menghitung perulangan "baris demi baris" (yaitu pertama b 1, j untuk semua j , kemudian b 2, j , dll.), Solusi ini malah menghitungnya "kolom oleh kolom "(atau, lebih tepatnya," diagonal demi diagonal "), komputasi pertama b b i , i +1 i , i untuk 1 ≤ ≤ k , lalu i, lalu b i , i +2 , dll.
Satu keuntungan (teoretis) dari pendekatan ini adalah bahwa, pada prinsipnya, metode ini dapat memproses string input panjang yang sewenang-wenang hanya dengan menggunakan penyimpanan O ( k ). Tentu saja, interpreter GolfScript secara otomatis membaca semua input ke dalam memori sebelum menjalankan program, kebanyakan meniadakan keuntungan ini.