Позвольте f
быть функцией, которая отображает битовое поле ( {0 1}
) размера n+1
в битовое поле размера n
, применяя XOR
к i
th-му и i+1
битному биту и записывая результат в новое битовое поле.
Пример: f("0101") = "111"
Неформальный расчет:
0 XOR 1 = 1
1 XOR 0 = 1
0 XOR 1 = 1
Позвольте f_inverse
быть обратной функцией f
. Поскольку обратное не является уникальным, f_inverse
возвращает одно допустимое решение.
Ввод: битовое поле в виде строки (то есть "0101111101011"
) и заданного натурального числаk
Выход: битовое поле в виде строки, так что строка содержит результат, если время f_inverse
применяется k
к входному битовому полю. (то есть f_inverse(f_inverse(f_inverse(input)))
)
Критерии победы: наименьшее количество персонажей
Бонус:
-25
Символы, если f_inverse
не применяется рекурсивно / итеративно, вместо этого выходная строка вычисляется напрямую
Testscript:
a = "011001"
k = 3
def f(a):
k = len(a)
r = ""
for i in xrange(k-1):
r += str(int(a[i]) ^ int(a[i+1]))
return r
def iterate_f(a, k):
print "Input ", a
for i in xrange(k):
a = f(a)
print "Step " + str(i+1), a
iterate_f(a, k)
Вы можете вставить его, например, сюда, а затем попробовать.
{0-1}
-Bitfields? Также я не понимаю определениеf
, откуда этоi
взялось? Каков второй аргумент XOR? как мы получаем111
от0101
?i
?"0 XOR 1" = 1 "1 XOR 0" = 1 "0 XOR 1" = 1
ничего не объясняет: я знаю, как работает XOR, но что именно мы делаем XOR и где мы храним результат?f([a,b,c,d]) = [a^b, b^c, c^d]
. И он хочет инверсию этой функции, то естьf'([x,y,z]) = [a,b,c,d]
такие , чтоa^b=x
,b^c=y
,c^d=z
.Ответы:
Pyth,
3330 - 25 = 5 байтЗапустите его с помощью ввода из stdin like (онлайн-переводчик: https://pyth.herokuapp.com/ ):
и результат будет записан на стандартный вывод.
Это прямой перевод:
Python 2,
12711879 - 25 = 54 байтаНазовите это как
i("111", 3)
, и результат будет записан на стандартный вывод.Обратите внимание, что мы ожидаем, что k не будет слишком большим, поскольку для целей игры в гольф код внутреннего цикла будет работать для O (2 k ) раз.
Я думаю, что мы обычно называем эту операцию "xorshift" или что-то в этом роде. Если мы выражаем входные данные как целые числа с прямым порядком байтов, то функция f просто:
Если мы применим f дважды, мы получим:
Однако применение 3 раза будет иметь другую картину:
Применяя 4 раза, вернитесь к основной форме:
И так далее:
Обратите внимание, что если мы выберем достаточно большие 2 k , то (x k 2 k ) = 0, что означает f 2 k (x) = x, а обратное тривиально является тождественной функцией!
Поэтому стратегия для нахождения ф -к (х) , не вызывая е -1 (х) на все это:
Найдите K такой, что:
Экспресс f -k (x) = f -K + (Kk) (x) = f -K (f K-k (x)) = f K-k (x)
Таким образом, результат
f
называется Кк раз25 символов прибыли: р
Обновление 1 : используется восьмеричное представление вместо двоичного, чтобы мы могли использовать
%
форматирование для экономии большого количества байтов.Обновление 2 : использовать периодическую структуру
f
. Отказался от итеративной версии, поскольку неитеративная версия короче даже без бонуса -25 байт.Обновление 3 : уменьшено на 3 байта от Pyth, спасибо isaacg!
источник
Jiz8K+lzQ%"%0*o",KuxG/G8rQ^2KJ
CJam,
1514 байтовПринимает вход как
Проверьте это здесь.
объяснение
Результат автоматически распечатывается в конце программы.
Я говорю «строка / массив», потому что я начинаю со строки (которая является просто массивом символов), но я продолжаю принимать XOR между ними и между числами.
Character Character ^
дает целое число (на основе XOR кодовых точек)Character Integer ^
иInteger Character ^
дает символ (на основе XOR числа с кодовой точкой - интерпретируется как кодовая точка). ИInteger Integer ^
конечно, просто дает целое число.Таким образом, типы летают повсюду, но , к счастью, когда у меня есть целое число , это либо
0
или ,1
и всякий раз , когда у меня есть характер , это либо'0
и'1
и результат всегда желательно один (в любом типе). Поскольку строки - это просто массивы символов, смешивание символов с числами не является проблемой. И в конце, когда все напечатано, символы не получают специальных разделителей, поэтому на вывод не влияет то, какой бит представлен как число или символ.источник
J, 17 символов
Всегда используя 0 в качестве ведущей цифры.
Начиная с 128 1-го состояния верхнего ряда (слева) и случайного состояния (справа), показывая последние 128 цифр в течение первой 129 итерации.
источник
APL 11
Объяснение:
Попробуйте на tryapl.org
источник
≠\
не будет работать вместо2|+\
?((0,≠\)⍣⎕)⎕
я получаю недействительный токен. Tryapl не может обрабатывать ввод?CJam, 25 - 25 = 0 байт
Это просто прямой порт CJam из ответа GolfScript ниже, поскольку, прочитав ответ Мартина Бюттнера , я понял, что могу сохранить один байт благодаря обработке CJam целочисленных и символьных типов. (По сути, CJam не нуждается в
1&
использовании, чтобы принудительно вводить символы ASCII в биты в коде GolfScript, но требует предварительно добавленногоq
для чтения ввода.) Обычно я считаю такой тривиальный порт дешевым трюком, но достижение нулевого результата сделало ИМО стоит.В любом случае, эта программа работает точно так же, как оригинальная программа GolfScript ниже, поэтому, пожалуйста, обратитесь к ее описанию и инструкциям по использованию. Как обычно, вы можете протестировать версию CJam с помощью этого онлайн-переводчика .
GolfScript, 26 - 25 = 1 байт
Это решение перебирает входную строку только один раз, поэтому я считаю, что оно соответствует бонусу в 25 байт. Он работает путем внутреннего поддержания массива k- элементов, в котором хранится текущий бит каждого из k предварительных итераций.
Ввод должен быть
"1111111" 3
сделан через stdin, в формате , то есть в виде строки0
и1
символов в кавычках , за которыми следует число k . Вывод будет в стандартный вывод, как цепочка бит без кавычек.Протестируйте этот код онлайн. (Если время ожидания программы истекло, попробуйте перезапустить ее; сервер Web GolfScript печально известен случайными таймаутами.)
Вот расширенная версия этой программы с комментариями:
В основном, как и большинство итерационных решений, этот код можно понимать как применение повторения
б я , 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 автоматически считывает все вводимые данные в память перед тем, как запустить программу, в основном сводя на нет это преимущество.
источник
Питон,
9478Будет выполнен по крайней мере один раз и, следовательно, даст тот же результат для
n=0
иn=1
Старая версия, которая преобразует строку в числовой массив и «интегрирует» по модулю 2
источник
Python 2, 68
Абсолютно рекурсивное решение. Это легче понять, если разбить на две функции
где
f
вычисляет последовательные различия иg
составляетf
с собой n раз.Функция
f
вычисляет кумулятивные суммы XORl
, которые являются обратной операцией к последовательным различиям XOR. Поскольку входные данные задаются в виде строки, нам нужно извлечьint(l[0])
, но сделать это короче при сравнении строкl>='1'
.Python 2, 69
Итеративное решение с использованием
exec
цикла оказалось на 1 символ длиннее.Может быть, есть более короткий способ справиться со строкой. Если бы мы могли иметь ввод / вывод в виде списков чисел, это позволило бы сохранить 5 символов
источник
Perl 5, 34
Параметры приведены на стандартном вводе через пробел.
источник
Javascript ES6, 47 символов
Кстати, побочных эффектов нет :)
источник
C # -
178161115 символовРазряженный с помощью ремня
источник
CJam, 20 байтов
Ввод как
"111" 3
Попробуйте онлайн здесь
источник