Прихована інверсія (нитка копів)


35

Це головоломки грабіжників. Нитку грабіжників можна знайти тут .

Вашим завданням буде дві записати дві програми (або функції), щоб вони були анаграмами один одного і одна виконувала ліву зворотну сторону іншої. Ці програми можуть приймати та виводити скільки завгодно цілих чисел чи складних чисел. Якщо ви вирішили взяти цифри як символьні точки або будь-який інший розумний засіб, ви повинні вказати, що ви робите це у своїй відповіді. Якщо ви вирішили обмежити домен вашої функції, ви також повинні вказати домен з обмеженим доступом у своїй відповіді.

Потім ви представите першу програму у вигляді відповіді з лівою зворотною стороною, прихованою для розбійників.

Показана програма повинна реалізовувати ін'єкційну функцію (інакше існувати прихованої відповіді неможливо).

Якщо ваша відповідь не була зламана за один тиждень, ви можете розкрити приховану відповідь і позначити її як безпечну . Безпечні відповіді грабіжники не можуть зламати, і вони залишатимуться невикористаними нескінченно довго.

Метою буде створення найкоротшого невиправленого відповіді в байтах.

Приклад

Ви можете показати наступну програму python, яка додає одну до вводу

lambda x:~-x

Рішенням може бути:

lambda x:-~x

Це віднімає один із вхідних даних


Чи можемо ми мати уявні / складні цілі числа?
Стюі Гріффін

@stewie, якщо ви вкажете, так ви можете
Пшеничний майстер

1
Чи визначається анаграмізація як перестановка символів чи перекручування байтів (мовами, які не використовують однобайтовий набір символів)?

1. " Ви представите одну із програм ", здається, підказує, що ми можемо вибрати, яку подати, але пропозиція продовжується " з прихованою лівою стороною ", маючи на увазі, що ми маємо представити конкретну. Що це таке? 2. У запитанні конкретно зазначено " програма " і, здається, не дозволяються функції, але приклад - це функція, а не програма. Що це таке?
Пітер Тейлор

Чи має значення капіталізація?
Kritixi Lithos

Відповіді:


12

Python 3, 80 байт ( тріщини )

bhmq = int(input())
print(bhmq ** 2)
(1 or [(sqrt),(specification+of*integerr)])

Домен: натуральні числа. Функція - це просто квадратування числа. Введення в stdin, вихід у stdout, а також у зворотну функцію. Зауважте, що Python ігнорує тут третій рядок, тому що він синтаксично дійсний, а 1 - це вже правдоподібне значення, тому Python навіть не виглядає, чи правильно визначена права частина "чи".

Розбійники повинні записати функцію sqrt, яка буде коректно працювати на всіх ненульових квадратах, друкуючи ціле число, як є, без плаваючої точки (тому на вході '4' вихід повинен бути '2' або '2 \ n', а не '2.0' або '2.0 \ n').


1
Мені це подобається. Зманливо важко зламати
Пшеничний чарівник

3
Ласкаво просимо в ppcg! Гарний перший пост!
Rɪᴋᴇʀ

1
Не забудьте про цю тріщину, я заплутався. Питання все ще залишається.
orlp

1
Я б сказав "ні", якщо мені дійсно дозволяють поставити це обмеження правилами виклику.
Вольфрам


11

Python 3, 46 байт, тріснув

lambda x:x*(1999888577766665//844333333222200)

Подвоює введення.


3
Як працює "Python" у розбійниках копів? Чи можемо ми обрати довільну версію, щоб атакувати вашу відповідь?
orlp

О, це конкретно Python 3 , вибачте. Так /само і поплавковий поділ.
Лінь

3
Ну, ви щойно довели, що цей виклик не вартий мого часу. Жити далі.
mbomb007


11

7 , 9 байт, тріщинами

У цій програмі повно недрукуваних символів, тож ось шістнадцятковий набір:

00000000: 2573 dc01 7e13 dcb6 1f                   %s..~....

Примітка: для цього використовується числовий режим введення, який не може вводити від’ємні числа, тому це подання обмежується лише негативними цілими числами.

Одна з проблем, пов’язаних із проблемами, пов’язаними з полягає в тому, що ви не пишете пояснень коду (щоб зробити його складніше зламати). З іншого боку, це означає, що мені тут не треба йти на біди.

Я вибрав 7 як мову, тому що, особливо в стислих її позначеннях, це досить важко читати, і я не розумію, чому саме мені доводиться переживати проблеми пересування 8-бітових фрагментів програм, написаних на 3-бітове кодування. Удачі!

Пояснення

Тепер, коли програма була зламана (грубою силою, на жаль, це небезпека завжди в цих коротких рішеннях), я можу також пояснити, до чого я потрапляв. Це насправді було досить вирішимим, прочитавши програму; Я міг би зробити це набагато складніше, але це відчувало себе поганою ідеєю, коли існують жорстокі тріщини.

Почнемо з представлення програми в більш природному кодуванні. Як завжди, напівжирний цифри показують команди , які виконуються негайно (не всі з яких подана в програмі, 6і 7є , але 2для 5не є), unbolded числа представляють їх вцілілі еквіваленти ( 0до 5, всі з яких подана у вихідній програмі, до відома що 0є втечею 6і 1є втечею 7):

112 7 1 7 34002 77 023 67 13303

Набір команд, наявний у програмному джерелі 7, означає, що це в основному просто літерал, який представляє оригінальний стек (нічого іншого, що можна зробити з щойно уникнутими командами, 6і 7) не можна. Отже, перше, що програма зробить - це натиснути купу матеріалів на стек. Ось як виглядає стек після запуску програми ( |відокремлює елементи стека, як зазвичай у 7):

772 | 7 | 34662 | 023 | 73363

Кінцевий елемент стека потім копіюється, щоб стати кодом для запуску (залишаючись у стеку). Як це буває, це єдина частина програми, кодом; все інше - лише дані. Ось що це означає:

73363 
7 Помістіть       порожній елемент на стек
  3      Виведіть верхній елемент стека, відкиньте елемент нижче
 73      Комбінований ефект із цього: відкиньте верхній елемент стека
   3     Виведіть верхній елемент стека, відкиньте елемент нижче
    6    Вийдіть з елемента верхнього стека, потім додайте його до елемента нижче
     3   Виведіть елемент верхнього стека, відкиньте елемент внизу

Іншими словами, це здебільшого лише купа інструкцій вводу / виводу. Давайте детально проаналізуємо це:

  • 73відкидає те, 73363що все ще знаходиться на вершині стека.
  • 3виводить 023і відкидає 34662. Таким чином, видно, що 34662це коментар, який використовувався для зберігання потрібних байтів в іншій версії програми. Що стосується того, що 023робить при виході, він вибирає формат вводу / виводу 0 (цілі числа), то 23це директива, яка вимагає від реалізації ввести ціле число (в 7 ви вводите за допомогою виведення конкретних кодів, які вимагають введення). Введення робиться шляхом копіювання елемента стека внизу, наприклад, якщо ціле число введення дорівнює 10, наступним елементом стека (на даний момент 7) стане 7777777777. Таким чином, ми приймаємо дані від користувача у десятковій формі, але вони зберігаються як одинакові.
  • 6виходить з верхнього елемента стека (змінюючи кожен екземпляр 7до 1; таким чином 7виводяться рядки, що складаються повністю з s), а потім додає його до елемента стека перед ( 772). Тож наші дані зараз щось подібне 7721111111111.
  • Нарешті, 3виводить відповідний елемент стека (і з'являється порожній елемент стека, який є частиною початкового стека за замовчуванням). Його значення обчислюється, беручи число 1s і 7s, і віднімаючи число 0s і 6s. (У 2середині в більшості випадків ігнорується; якщо він знаходиться в кінці рядка, він замість того, щоб його ігнорувати, перетвориться на новий рядок, але правила PPCG це не хвилюють.) Таким чином, вихід є оригінальним вхід плюс 2.

На даний момент у стеку немає нічого корисного і нічого в програмі, тому програма виходить.

Як ми це повернемо? Це проста проблема зміни 11на 00, щоб ми передбачили символи до входу, що робить його на 2 нижче, а не на 2 вище. У програмі є додатково 00приховані вісім восьмеричних цифр (щоб восьмеричні цифри та байти вирівнювалися один з одним), тому ми можемо просто поміняти їх 11на початок.



Побічна примітка: вам не потрібно пояснювати свій код, але знаючи, що робить ваша програма, було б непогано.
ГБ

@GB: Я дав повне пояснення програми (включаючи пояснення, як працює тріщина).


6

Python 2, 83 байти, тріщини

#((()))****+,,---/2289;==oppppppqqqqqw~~
lambda n:pow(n,65537,10998167423251438693)

Це схоже на мою іншу відповідь. Однак для цього використовується 64-розрядний RSA, і він криптографічно досить слабкий. Якщо ви зможете пограбувати цю відповідь, ви можете теоретично пограбувати і мою іншу, давши достатньо часу.



5

Python 2, 47 bytes, Cracked

lambda x:x**2or (iron() and saxifrage.extend())

Домен для цієї функції дорівнює {x ∈ ℤ | x> 0}. Він квадратикує свій вхід.


nmjcman101 знайшов призначене рішення:

lambda x:sorted(a**2for a in range(x)).index(x)


1
Ха-ха, люблю складені функції дзвінків
FlipTack

1
Тріснуто Це було весело, я застряг на відсортованій анаграмі, яку я залишив!
nmjcman101

5

JavaScript (ES6), 46 байт, Зламаний

x=>Math.log(x+(+String(t=985921996597669)[5]))

Ця функція повертається ln(x+1)там, де xє негативне число.

Використання

(x=>Math.log(x+(+String(t=985921996597669)[5])))(5)

Примітка: Через природу числа з плаваючою комою f(g(x))можуть не точно дорівнювати x. Приклад:f(g(4))=3.9999999999999996


Тріснув. Це було дійсно весело :-)
ETHproductions


4

Processing.js, 59 байт, Зламано!

float igetuwebaoli(int p){return p*(((17*-4*-3)))+0+0;}//,,

Ця функція помножує вхід на 204( 17*-4*-3=204). Він приймає int як вхід і виводить поплавок. Як і очікувалося, обернена ділить вхід на 204.

Інтернет-перекладач для обробки js можна знайти тут .





4

J , 29 байт ( розбитий милями)

5#.[:,(3 5&#:(-$]-)7)#.inv"0]

Це дієслово, яке приймає додаткове ціле число як вхідне і робить наступне:

  1. Перетворити на бази 2 і 4.
  2. Підкладіть представлення base-4 з 0s, щоб мати таку ж довжину, як представлення base-2.
  3. Об’єднайте два подання (спочатку база-2).
  4. Інтерпретувати конкатенацію як подання base-5 та перетворити на ціле число.

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

Моє рішення

Логіка майже така ж, як і в тріщині. Зв'язок рангів "може бути застряг у багатьох місцях (і я використовую його, щоб позбутися від зайвого 0та 3), оскільки він насправді нічого не вирішує.

(7-5)#.[:(]-:&#$,)5#.inv"0 3]

Я не розумію J, але мої експерименти показують, що це фактично займає цілі числа в базах 2 і 4, додає нулі в кінці бази 4, щоб зробити їх довжиною рівним, і лише потім конкатенати. Чи призначені ці нулі?
Вольфрам

@Wolfram Нулі призначені, саме це я намагався сказати "одночасно". Інакше я не думаю, що це було б оборотно.
Згарб

@Wolfram Я додав більш чіткий опис.
Згарб


4

Обробка (java), 59 байт, SAFE

float igetuwebaoli(int p){return p*(((17*-4*-3)))+0+0;}//,,

Ця функція помножує вхід на 204( 17*-4*-3=204). Він приймає int як вхід і виводить поплавок. Як і очікувалося, обернена ділить вхід на 204. Примітка: обидві програми приймають int як вхід і виводить поплавок.

Ця відповідь точно така ж, як і моя інша відповідь, за винятком того, що моя інша відповідь була написана в Processing.js. Знайомтеся з Processing-java, менш багатослівним двоюрідним братом Яви. Завантажити обробку тут можна на веб-сайті Process.org.

Тріщина

float ap(int i){return i*pow(blue(get(0,0)),-1);}//++7*4*-3

Ця програма розділяє аргумент на 204. Але як? Зайдемо всередину функції.

i *                              //multiply i by
         blue( get(0, 0) )       //this (evaluates to 204)
    pow(                  , -1)  //raises to the -1 power (ie its reciprocal)

Досить просто, але як це blue( get(0, 0) )стане 204? Це центральне місце цього подання. Перш за все, get(0,0)отримує колір пікселя, розташований в (0,0)(верхній лівий кут вікна, який завжди відкривається в ескізі обробки). Далі blue()отримує синє значення пікселя, яке є 204!

Щоб придумати це подання, я експериментував, надрукувавши різні атрибути кольору, отримані компанією get(0,0). Я дізнався, що червоний, зелений, синій, альфа - значення 204, 204, 204і 255відповідно. З цього я вирішив зробити просту операцію з цим номером і закінчив цю посаду.


Я думав, що Котлін - менш багатослівний двоюрідний брат Яви! Я визнаю, що сім'я мов C досить велика ... але як виглядатиме генеалогічне дерево насправді ...
CAD97

Я вважаю, що ви це зробили, ніхто не зламав вашу посаду, і минув тиждень.
милі

3

JavaScript (ES6), 63 байти Зламаний Ільмарі Каронен

x=>eval(atob`eCp4KzEvLyAgfXBModLS4TvEn4wp1iys9YRRKC85KLIhNMC=`)

Час на якусь atobнісенітницю. Ця функція повертається x*x+1там, де xє негативне число.

Використання

(x=>eval(atob`eCp4KzEvLyAgfXBModLS4TvEn4wp1iys9YRRKC85KLIhNMC=`))(5)

Задуманий

x=>eval(atob`Lyp5fMRwICAgKi9NYXRoLnBvdyh4LTEsMC41KS8veCp4KzE=`)

Існує велика кількість потенційних рішень, але я сподівався, що провідні персонажі відкинуть байтовий порядок достатньо, щоб зробити це важче. C'est laatob



Ви просто випадково перевстановили код виклику як призначене рішення? :)
Ільмарі Каронен

@IlmariKaronen Дякую, що я навчу мене копіювати / вставляти ...
хай


2

Python 2, 225 байт, розламаний Sp3000

#((()))****+,,---/000555666888;==oppppppqqqqqw~~
lambda n:pow(n,65537,9273089718324971160906816222280219512637222672577602579509954532420895497077475973192045191331307498433055746131266769952623190481881511473086869829441397)

Домен цієї функції - [0, n), де n - величезна кількість вище. Так, ця функція є зворотною для цього домену. І якщо я не заплутався, порушити цю відповідь так само важко, як і порушити 512 бітну RSA.


1
Насильницьку грубу допомогу це набагато простіше, ніж жорстоке форсування RSA, оскільки у вас вже є приблизна анаграма постійної, яка вам потрібна. З іншого боку, це, ймовірно, ще важко керувати на практиці.

4
Майте на увазі, що існує мета-повідомлення про рандомізацію проблем CnR: meta.codegolf.stackexchange.com/questions/10793/…
Kritixi Lithos

5
@KritixiLithos Моя відповідь не містить рандомізації, хешей чи вбудованого криптокоду. Це буквально одна модульна експоненція.
orlp

2
Ваша відповідь цілеспрямовано спрямована на проблему, яку, як відомо, важко вирішити, а тому відповідає мета-пошті (тим більше, що вона безпосередньо згадує RSA). Я думаю, що навіть якщо ви мета-лазівкою, ваш сценарій все-таки заслуговує мого голосування.
Крістоф


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