CJam, 25 - 25 = 0 байт
q~1,*_@{[\{1$^}/_](;)\}/;
Это просто прямой порт CJam из ответа GolfScript ниже, поскольку, прочитав ответ Мартина Бюттнера , я понял, что могу сохранить один байт благодаря обработке CJam целочисленных и символьных типов. (По сути, CJam не нуждается в 1&
использовании, чтобы принудительно вводить символы ASCII в биты в коде GolfScript, но требует предварительно добавленногоq
для чтения ввода.) Обычно я считаю такой тривиальный порт дешевым трюком, но достижение нулевого результата сделало ИМО стоит.
В любом случае, эта программа работает точно так же, как оригинальная программа GolfScript ниже, поэтому, пожалуйста, обратитесь к ее описанию и инструкциям по использованию. Как обычно, вы можете протестировать версию CJam с помощью этого онлайн-переводчика .
GolfScript, 26 - 25 = 1 байт
~1,*.@{[1&\{1$^}/.](;)\}/;
Это решение перебирает входную строку только один раз, поэтому я считаю, что оно соответствует бонусу в 25 байт. Он работает путем внутреннего поддержания массива k- элементов, в котором хранится текущий бит каждого из k предварительных итераций.
Ввод должен быть "1111111" 3
сделан через stdin, в формате , то есть в виде строки 0
и 1
символов в кавычках , за которыми следует число k . Вывод будет в стандартный вывод, как цепочка бит без кавычек.
Протестируйте этот код онлайн. (Если время ожидания программы истекло, попробуйте перезапустить ее; сервер 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
В основном, как и большинство итерационных решений, этот код можно понимать как применение повторения
б я , J : = Ь I , ( J - 1) ⊕ б ( я -1), ( J - 1) ,
где b 0, j - j-й входной бит (для j ≥ 1), b k , j - j-й выходной бит и b i , 0 = 0 по предположению. Разница заключается в том, что, в то время как итерационных решениях, в сущности, вычислить «строку за строкой» рекуррентной (т.е. первого б 1, j для всех j , затем b 2, j и т. Д.), Это решение вместо этого вычисляет его «столбец путем столбец "(или, точнее," диагональ по диагонали "), сначала вычисляя b i , i для 1 ≤ i≤ k , затем b i , i +1 , затем b i , i +2 и т. Д.
Одно (теоретическое) преимущество этого подхода состоит в том, что в принципе этот метод может обрабатывать произвольно длинную входную строку, используя только O ( k ) память. Конечно, интерпретатор GolfScript автоматически считывает все вводимые данные в память перед тем, как запустить программу, в основном сводя на нет это преимущество.