CJam, 25-25 = 0 bayt
q~1,*_@{[\{1$^}/_](;)\}/;
Bu, aşağıdaki GolfScript cevabının düz bir CJam portudur, çünkü Martin Büttner'in cevabını okuduktan sonra CJam'ın tamsayı ve karakter tiplerini işlemesi nedeniyle bir bayt kaydedebileceğimi fark ettim. (Temel olarak, CJam, 1&
ASCII karakterlerini GolfScript kodundaki bitlere zorlamak için kullanılmasına gerek yoktur , ancak q
girişi okumak için bir öneri gerektirir .) Genellikle böyle önemsiz bir bağlantı noktasını ucuz bir numara olarak görüyorum, ancak sıfır puan elde ediyorum IMO değerli.
Her durumda, bu program aşağıdaki orijinal GolfScript programı gibi çalışır, bu yüzden lütfen açıklamasına ve kullanım talimatlarına bakın. Her zamanki gibi, bu çevrimiçi yorumlayıcıyı kullanarak CJam sürümünü test edebilirsiniz .
GolfScript, 26-25 = 1 bayt
~1,*.@{[1&\{1$^}/.](;)\}/;
Bu çözüm yalnızca bir kez giriş dizesi üzerinde yinelenir, bu yüzden by25 bayt bonusu için uygun olduğuna inanıyorum. Dahili olarak her bir k yinelemesinin geçerli bitini saklayan bir k- element dizisini koruyarak çalışır .
Giriş stdin aracılığıyla "1111111" 3
, yani tırnak içine alınmış bir karakter 0
ve 1
karakter dizisi ve ardından k sayısı şeklinde verilmelidir . Çıktı tırnak işaretleri olmadan bir bit dizisi olarak stdout olacaktır.
Bu kodu çevrimiçi test edin. (Program zaman aşımına uğrarsa, yeniden çalıştırmayı deneyin; Web GolfScript sunucusu rastgele zaman aşımları için kötü şöhretlidir.)
İşte bu programın yorumlarla birlikte genişletilmiş bir sürümü:
~ # 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
Temel olarak, yinelemeli çözümlerin çoğu gibi, bu kod yinelemenin uygulanması olarak anlaşılabilir
b i , j : = b i , ( j −1) ⊕ b ( i −1), ( j −1) ,
burada b , 0, j olan j (için inci giriş biti j ≥ 1), b , k , j olan j -inci çıkış biti ve B i , 0 varsayımı = 0. Fark (yani önce bu, iteratif çözeltiler ise, aslında, "satır satır" nüksetme hesaplamak olan b 1, J tüm j Daha sonra, b , 2, j , vs.), bu çözelti yerine "kolon o hesaplar sütun "(veya daha doğrusu" köşegen ile çapraz "), ilk önce b i , i için 1 ≤ i≤ k , sonra b i , i +1 , sonra b i , i +2 vb.
Bu yaklaşımın (teorik) bir avantajı, prensip olarak, bu yöntemin keyfi olarak uzun bir giriş dizesini sadece O ( k ) depolaması kullanarak işleyebilmesidir . Elbette, GolfScript yorumlayıcısı, programı yine de çalıştırmadan önce belleğe tüm girdileri otomatik olarak okur ve çoğunlukla bu avantajı reddeder.