Змінити код, змінити послідовність: Розбійники


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 разів більше, ніж потрібно.


Саме те, що я мав. Затримався трохи довше, ніж я очікував
Синій

Щойно я побачив це, я зрозумів, що це було призначене рішення.
Джонатан Аллан

4

Мозок-Флак , 28 байт, відстань 4, A002817 , A090809

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

Цю відповідь було виявлено за допомогою грубого нападника, який генерував 35000 можливих програм (лоти з них були незбалансовані, і, таким чином, недійсний код прокляття мозку, але я покатався з помилкою і все-таки знайшов відповідь). Це було близько 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) = сума (i * A000124 (i), i = 0..n-1). [Бруно Берселлі, 20 грудня 2013]

А A000124 - це трикутні числа + 1. Однак я не знаю точно, що таке форуми, тому не можу повністю пояснити, як це працює.


3

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

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

+>замість +<також працювали б.

Спробуйте в Інтернеті!

Як це працює

infix ... досить корисний для простих рекурсивних послідовностей. (0,1,*+*...*)Частина вихідного коду, який є узагальнюючим для

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

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

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


2

Перл 6 , 10 байт, відстань 1 - оцінка 5

Тріщина запису smls

*[0]o 1***

Стає:

*[0]o 1*+*

Спробуйте в Інтернеті!


Хороша робота! Я не думав про це рішення, моє було трохи складніше і насправді вимагало *[0]o бути там. Я думаю, це означає, що я можу придумати ще одне виклик на основі моєї "хитрості" ... :)
smls

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

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


2

Вольфрам Альфа , відстань 1, Грег Мартін , A002378 , A000537

(sum1to#of n^1)^2&

Як це працює

Я зрозумів, що цікаво, що (n * (n + 1) / 2) ^ 2 - це формула другої послідовності. Оскільки сума (від 1 до n) еквівалентна n * (n + 1) / 2, мені просто довелося переключити * на ^.


Ви повинні повідомити йому, що ви зламали його відповідь
Post Rock Garf Hunter

Добре помічений! :)
Грег Мартін



1

JavaScript (ES6), відстань 1, Advancid

Оригінал:

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

Тріщина:

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

Java, Відстань 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;}

Тріщина:

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) .. . + [п!] 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 і базовий регістр збігається також.


Як вам це вдалося за так мало спроб? Мене цікавлять ваші мислячі процеси
Синій

Перетворення змішаної бази є досить поширеним трюком для гольфу. Це не перший раз, коли я ним користувався.
Денніс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.