CJam, 25 - 25 = 0 байт
q~1,*_@{[\{1$^}/_](;)\}/;
Це лише прямий порт CJam відповіді GolfScript нижче, оскільки, прочитавши відповідь Мартина Бюттнера , я зрозумів, що можу зберегти один байт завдяки обробці CJam цілих чисел та символів. (В основному, CJam не потрібно 1&
використовувати для примусового використання символів ASCII в біти в коді GolfScript, але вимагає попередньо q
прочитати вхідні дані.) Я б зазвичай вважав такий тривіальний порт дешевим трюком, але досягнення нульового балу зроблено це IMO варто.
У будь-якому випадку ця програма працює точно так само, як оригінальна програма GolfScript, наведена нижче, тому зверніться до її опису та інструкцій із використання. Як завжди, ви можете протестувати версію CJam за допомогою цього інтерпретатора .
GolfScript, 26 - 25 = 1 байт
~1,*.@{[1&\{1$^}/.](;)\}/;
Це рішення повторюється через рядок введення лише один раз, тому я вважаю, що він може отримати бонус -25 байт. Він працює, підтримуючи внутрішньо масив k -елементів, який зберігає поточний біт кожної з k -ітерацій.
Введення слід вводити через stdin у форматі "1111111" 3
, тобто у вигляді цитованого рядка 0
та 1
символів, а потім цифрою k . Виведенням буде stdout, як бітстринг без лапок.
Перевірте цей код в Інтернеті. (Якщо програма вичерпується, спробуйте запустити її повторно; сервер Web GolfScript відомий для випадкових тайм-аутів.)
Ось розширена версія цієї програми з коментарями:
~ # 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
В основному, як і більшість ітеративних рішень, цей код можна розуміти як застосування рецидиву
b i , j : = b i , ( j −1) ⊕ b ( i −1), ( j −1) ,
де b 0, j - j -й вхідний біт (для j ≥ 1), b k , j - j -й вихідний біт, а b i , 0 = 0 за припущенням. Різниця полягає в тому, що, хоча ітеративні рішення фактично обчислюють повторення "рядок за рядком" (тобто спочатку b 1, j для всіх j , потім b 2, j і т.д.), це рішення замість цього обчислює його "стовпцем по стовпця "(або, точніше," діагоналі по діагоналі "), спочатку обчисливши b i , i для 1 ≤ i≤ k , тоді b i , i +1 , потім b i , i +2 і т.д.
Однією (теоретичною) перевагою такого підходу є те, що в принципі цей метод може обробляти довільно довгий рядок введення, використовуючи лише O ( k ) сховище. Звичайно, інтерпретатор GolfScript автоматично зчитує весь вхід в пам'ять перед тим, як все-таки запустити програму, в основному заперечуючи цю перевагу.