Изменить код, изменить последовательность: грабители


15

Это задача . Для нити полицейских, иди сюда .

Эта задача включает в себя две последовательности OEIS , выбранные полицейскими - S 1 , S 2 - и то, насколько хорошо эти последовательности можно обыграть и запутать.

Полицейские строят код A, который производит S 1, и дают число X, которое, как они утверждают, является наилучшим возможным расстоянием Левенштейна (в символах) для создания B, которое производит S 2 .

Проблема грабителей

Чтобы взломать представление конкретного полицейского, грабители должны придумать программу C на том же языке (и версии), что и тот ответ, который выдает S 2 (n) и символ Y меняется по сравнению с AY <= X). Грабителям не обязательно находить тот же самый B- код, который (тайно) создал полицейский. Представления грабителей должны придерживаться того же 0-индекса или 1-индекса, как указано в представлении полицейского.

Если вам это удастся, опубликуйте ответ с решением, со ссылкой на ответ полицейского, и оставьте комментарий к ответу полицейского со ссылкой на ваш.

Каждый ответ полицейского может быть взломан только один раз, и, конечно, вы не можете взломать свой собственный ответ. Если ответ полицейского оказывается недействительным до или после взлома, он не засчитывается в счет грабителя.

Победа и выигрыш

Грабителей (X - Y)*5 + 5забивают по каждой из их трещин, и грабитель с общим наибольшим количеством очков выигрывает.

Дальнейшие правила

  • Вы не должны использовать какие-либо встроенные модули для хэширования, шифрования или генерации случайных чисел (даже если вы запрограммировали генератор случайных чисел на фиксированное значение).
  • Разрешены либо программы, либо функции, но код не должен быть фрагментом кода, и вы не должны использовать среду REPL.
  • Вы можете принимать и выводить данные в любом удобном формате . Методы ввода / вывода должны быть одинаковыми для обеих последовательностей.
  • Окончательный калькулятор для расстояния Левенштейна для этой задачи - это тот, что на Planet Calc.
  • Это не только вызов CnR, но и поэтому применяются все обычные правила игры в гольф.

Ответы:


7

Пайк, Левенштейн дистанция 1, A036487 , A135628 - оценка 5

Трещина входа на мутную рыбу

wX*e

Попробуй это здесь!

Исходный код, X*eвозводит в квадрат вход, Xумножает его на вход *и делит пополам результат на половину e.

Хитрость в том, что 'X'56 в базовом представлении 96 w, так что wXполучается 56, умножьте это на входное значение, затем на пол и разделите пополам, и вы получите 28-кратный ввод по мере необходимости.


Именно то, что я имел. Продолжалось немного дольше, чем я ожидал
Blue

Как только я увидел это, я понял, что это было намеченное решение.
Джонатан Аллан

4

Brain-Flak , 28 байтов, расстояние 4, A002817 , A090809

(({(({})[()])}{}){{({}[()])}{}})

Этот ответ был обнаружен с помощью брутфорсера, который сгенерировал 35 000 возможных программ (многие из них были несбалансированными, и, следовательно, недействительным кодом мозгового штурма, но я все равно нашел ошибку и нашел ответ в любом случае). Это было около 20-тысячной протестированной программы, и потребовалось около часа, чтобы найти (хотя я не знаю точно, сколько времени прошло с тех пор, как я закончил).

Я вроде не хотел публиковать этот ответ, так как у меня пока нет полного понимания того, как работает эта программа. Тем не менее, ответ должен быть безопасным, поэтому я не хочу, чтобы срок его действия истек. Я надеюсь обновить этот ответ еще раз, как только я его полностью понимаю, а также опубликовать код, который я использовал, чтобы найти этот ответ. Но пока я просто выложу частичное объяснение.

#Push the sum of:
(

    #The (n-1)th triangular number, and the range [1, n] (The range doesn't count towards the sum I believe)
    ({(({})[()])}{})

    #Triangulate every number on the stack
    {{({}[()])}{}}

)

Это имеет смысл, потому что OEIS заявляет:

Для n> 0 члены этой последовательности связаны с A000124 посредством a (n) = sum (i * A000124 (i), i = 0..n-1). [Бруно Берселли, 20 декабря 2013 г.]

А A000124 - это треугольные числа +1. Однако я точно не знаю, что такое forumla, поэтому я не могу полностью объяснить, как это работает.


3

Perl 6, 19 байт, X = 1, A000045 → A000035

{(0,1,*+<*...*)[$_]}

+>на месте +<будет также работать.

Попробуйте онлайн!

Как это устроено

Infix ... довольно полезен для простых рекурсивных последовательностей. (0,1,*+*...*)Часть исходного кода, который является обобщающим для

(0, 1, -> $x, $y { $x + $y } ... *)

задает последовательность, которая начинается с 0 и 1 , затем добавляет элементы путем вычисления суммы двух предыдущих элементов последовательности.

Напротив, (0,1,*+<*...*)использует сдвиг влево ( +>вправо, также сдвиг вправо) для построения последовательности контроля четности. Поскольку смещение 1 на 0 единиц влево равно 1 , а смещение 0 на 1 единицу влево равно 0 , мы получаем желаемые чередующиеся комбинации единиц и нулей.


2

Perl 6 , 10 байт, дистанция 1 - оценка 5

Crack из записи по SMLS

*[0]o 1***

становится:

*[0]o 1*+*

Попробуйте онлайн!


Молодец! Я не думал об этом решении, мое было немного сложнее и на самом деле требовало *[0]o быть там. Я предполагаю, что это означает, что я могу придумать еще один вызов, основанный на моем "трюке" ... :)
smls

Я на самом деле не знаю Perl, просто увидел ***и подумал, что похоже, что он может развернуть операцию двоичного умножения *, с предыдущими аргументами, я действительно не знаю, что на самом деле делает код. Не стесняйтесь редактировать некоторые объяснения!
Джонатан Аллан

2
1***анализируется как 1 ** *, то есть лямбда, которая делает "1 в степени х". 1*+*анализируется как 1 * (+*), то есть лямбда, которая делает «1, умноженное на (x преобразовано в число)».
smls


2

WolframAlpha, расстояние 1, Грег Мартин , A002378 , A000537

(sum1to#of n^1)^2&

Как это устроено

Я понял, что интересно, (n * (n + 1) / 2) ^ 2 - формула для второй последовательности. Поскольку сумма (от 1 до n) эквивалентна n * (n + 1) / 2, мне просто нужно было переключить * на a ^.


Вы должны сообщить ему, что вы взломали его ответ
Post Rock

Хорошо подмечено! :)
Грег Мартин



1

JavaScript (ES6), расстояние 1, Advancid

Оригинал:

as=function(){ return 2*2**((11)*-1*~arguments[0]/11-(4-(as+[]).length%89))-(as+[]).length%7}

Crack:

as=function(){ return 0*2**((11)*-1*~arguments[0]/11-(4-(as+[]).length%89))-(as+[]).length%7}

Попробуйте онлайн!

или

as=function(){ return 2*1**((11)*-1*~arguments[0]/11-(4-(as+[]).length%89))-(as+[]).length%7}

Попробуйте онлайн!

Каким-то образом я смог заставить его вести себя по-разному между TIO и repl.it (абсолютно без понятия, почему 2 * 1 ^ ... будет равно 0, как в repl.it)


Я слишком глуп, я не думаю о смене 2 до 0. Вот функция B: as=function(){ return 2*2**((1^1)*-1*~arguments[0]/11-(4-(as+[]).length%89))-(as+[]).length%7}.


1

Ява, Расстояние 4, Peech , A094683 , A000290

Оригинал:

int x{double r=1;for(int i=0;i<42;i++)r=r/2+n/r/2;int k=(int)((int)n*(float)n/Math.pow(n,(Math.sin(n)*Math.sin(n)+Math.cos(n)*Math.cos(n))/2));return n%4%2==(int)Math.log10(Math.E)/Math.log((double)'H'-'@')?(int)r:k;}

Crack:

int x{double r=1;for(int i=0;i<42;i++)r=r/2+n/r/2;int k=(int)((int)n*(float)n/Math.pow(n,(Math.sin(n)*Math.sin(n)+Math.cos(n)*Math.cos(n))/2));return n%4%1==(int)Math.log10(Math.E)/Math.log((double)'H'-'@')?(int)n*n:k;}
                                                                                                                                                          ^                                                         ^^^

возвращает n * n


1

Javascript, Advancid , расстояние 2, A059841 и A000004

Только оставляя код за ссылкой TIO, потому что он, кажется, нарушает работу сайта.

Благодаря @nderscore, чей код я использовал для расшифровки исходного кода

Был некоторый избыточный код, такой как использование !! [] + [] + [] вместо !! [] + [].

Добавление! + [] - (! + []) (+ 1-1) изначально предотвращало дешифрование.

Попробуйте онлайн


1

Пайк, Левенштейн расстояние 2, A008788, A007526

'SS^

Попробуй это здесь!

Как это устроено

Это делает смешанное базовое преобразование.

'Sзахватывает ввод n и применяет, нажимая [1, ..., n] в стеке. Следующий Sполучает вход n и толкает тот же массив еще раз. 'кажется, что следующая команда будет применена к предыдущей вершине в стеке; Я немного неясен в деталях.

Наконец, ^применяется смешанное базовое преобразование, поэтому [1, ..., n] [1, ..., n] f вычисляет
a (n): = [1] n + n + (n) (n-1) .. . + [n!] 1 где скобки указывают значение места и цифру справа от цифры.

Теперь a (n) = (1 + (1) (n-1) + (n-1) (n-2) (n-3) + ... + (n-1)!) N = n ( a (n) + 1) , это та же самая рекурсивная формула, которая определяет a (n) в [A007526]. Поскольку пустая сумма равна нулю, a (0) = 0 и базовый случай также совпадает.


Как ты получил это с таким небольшим количеством попыток? Мне интересны ваши мыслительные процессы
Blue

Смешанная базовая конверсия - довольно распространенная игра в гольф. Это не первый раз, когда я использовал это.
Деннис
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.