Трансформатори в маскуванні (нитка копів)


10

Нитка грабіжника тут

Завдання поліцейських полягає в тому, щоб написати функцію або програму, яка при введенні себе видає кінцеву детерміновану рядок. Якщо програмі надано інший вхід, вона повинна повернути інший вихід.

Правила:

  • Подання складаються з:
    • Назва мови
      • Якщо використовуються будь-які прапори, їх слід розкрити.
    • Кількість байтів програми
    • Кількість байтів на виході
    • Вихідні дані
      • Якщо він особливо довгий, будь ласка, надайте пастебін чи щось подібне
      • Якщо він містить недруковані матеріали, будь ласка, надайте шістнадцятковий шрифт.
      • У висновку повинні бути включені останні рядки та пробіли
    • Звідки надходить вхід (STDIN, командний рядок тощо )
  • Якщо можливо, ви можете припустити, що байт, що представляє EOF, не присутній у вході, якщо ви не використовуєте цей байт у своїй програмі.
  • Якщо ваша програма зламана, додайте посилання на відповідну відповідь у темі розбійника у вашому заголовку.
  • Ваша програма не є безпечною, поки не пройде тиждень, і ви її так позначите.
  • Я не схвалюю такі прийоми, як висівання випадкових даних із вхідними або криптографічними хеш-функціями. Я не можу їх зупинити, але не буду приймати рішення, яке використовує будь-яке з них . Також зауважте, що деякі з цих методів можуть мати зіткнення, коли різні рядки дають однаковий вихід.
  • Ваша мета - отримати найкоротший вихід. Найкоротше безпечне рішення, розміщене протягом трьох тижнів після публікації цього питання, виграє!

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

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

Приклад подання:

мозковий ебать, 10 байт, оцінка: 10

]<.[<],>[,

Це рішення - [>,] <[. <], Яке просто перевертає вхід

Удачі!


"Якщо програмі надано інший вхід, вона повинна повернути інший вихід." Це означає, що програма ніколи не повинна виводити те саме для інших входів? Або це означає, що програма не повинна постійно щось виводити незалежно від вкладених даних? (ВИНАХОДЖЕННЯ вхід не дорівнює собі; проти. ВПРАВНІ входи, не рівні собі, повертають інший вихід.)
tsh

@tsh Тільки сам вхід повинен мати унікальний вихід. Наприклад, дійсним поданням може бути програма для самовизначення , яка виводить 1для себе і в 0іншому випадку
Джо Кінг

@JoKing Тож ваш приклад Python 3 подання недійсний? Тому що це очевидно також виводить 1021111143210532105110321051101121171164041581121141051101164011111410040105414410111010061393941для деяких інших рядків.
Лінн

@lynn Ти маєш рацію. Я вилучив цей приклад
Джо Кінг

Відповіді:


4

7 , 31 персонаж, оцінка 30, безпечний, але можливо зламаний?

Програма 7 зазвичай є просто числом, але вона може містити пробіл, розділяючи її на кілька чисел. Таким чином, ця заявка складається з двох чисел (які неявно об'єднані 7 перекладачем), і програма також приймає два числа як вхідні дані за допомогою стандартного введення. ("31 символ" у заголовку - загальна довжина двох чисел плюс один розділовий символ пробілу; цифри, що складають числа, інтерпретуються як вісімкові, коли вони використовуються як програма, але десяткові, коли використовуються як вхідні дані, і це цифри, однакові в двох випадках, а не фактичні числа. Зверніть увагу, що це не має значення ні тоді, коли вони розглядаються як програма, ні вони розглядаються як вхідні дані, незалежно від того, розділяєте ви їх пробілом чи новим рядком; я сподіваюся, що це не недійсне подання.)

Очікуваний вихід - наступне число (виражене тут у десятковій формі, оскільки це вихідний формат, який використовує 7 перекладач):

238363505302130098723162537059

Зауважте, що 7 інтерпретаторів, пов’язаних із вікі Esolang, внутрішньо зберігають номери в одинаковому значенні, тобто ви навряд чи матимете достатньо пам’яті, щоб насправді запустити програму, щоб побачити, що вона робить. Я перевірив програму, опрацювавши її поведінку вручну і випробувавши її на невеликих входах, щоб переконатися, що вона зробила те, що я очікувала. Альтернативним підходом було б написання перекладача, який використовує більш ефективний метод зберігання чисел.

Уникнення тріщин тут було чимось болем, але я нарешті переконався, що жодне два числа, крім тих, що є в самій програмі, не здатні видавати 238363505302130098723162537059 як вихід. ( EDIT через 1 тиждень. Можливо, я помилився, залежно від того, як ви інтерпретуєте питання; див. Нижче. )

Рішення

Початкова програма була:

711170237403706
111723603700633
Ця програма приймає два числа х і у і обчислює результат виразу 3ху-у-2 (тобто у(3х-1)-2 ). Якщо ми виконаємо цей обчислення за х=711170237403706 і у=111723603700633 , отримаємо результат 238363505302130098723162537059 як потрібно .

Передбачалося, що жоден інший внесок не дасть бажаного результату, оскільки:

Вхід повинен бути обраний таким чином, щоб у(3х-1)-2=238363505302130098723162537059 , тобто у(3х-1)=238363505302130098723162537061 (додаючи 2 в обидві сторони). Це число є напівприміром, має лише два фактори: 111723603700633 та 2133510712211117 . Тільки одне з цих чисел, 2133510712211117 , може бути виражене у формі 3х-1 (надання (3×711170237403706)-1=2133510712211117 ). Тож ми можемо однозначно визначити, яке число єх а якеу , тобто лише один вхід працює.

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

113х-1х79454501767376699574387512354189), які не містяться в наборі символів для 7 програм. Отже, якщо вхід обмежений тим, що він є тим самим набором символів, що і програма, це рішення є дійсним; але якщо дозволено введення символів, що містять символи за межами набору символів програми, це рішення недійсне.

Пояснення

Ось як функціонує призначене рішення:

711170237403706 111723603700633
7 7 7 Розділювачі елементів стеку
 111 023 403706 111723603700633 Початкові елементи стеки
 111 Число 3, в одн
     023 DSL вводу / виводу для "введення номера"
         403706 111723603700633 Основна програма
(Неявне: виконати копію основного елемента програми, зберігши оригінал)
         40 Зміна {023} вище {програма}, уникаючи цього
           3 Чи виконувати введення / виведення за допомогою {023}; поп {програма}
     0 I / O: числовий
      23 Введіть число, копіюючи {111} стільки разів
            706 Додайте "6" до числа (декрементуючи його)
                11 Натисніть два порожні елементи стека
                  17236 Натисніть на елемент стеки "23" (без набору розмірів)
                       0 Escape {23}, споживаючи порожній елемент
                        3 Чи виконувати введення / виведення за допомогою {23}; поп {елемент нижче}
                    23 Копіюйте верхню частину вводу багато разів
                         7006 Додайте "66" (тобто віднімайте 2)
                             3 Вихід {як число}
                              3 Вийти з програми (через низький стек)
170666123453123451234512345


3

Node.js v10.9.0 , 40 байт, Оцінка: 40, Зламаний

Вхідні дані

Це функція, що приймає рівно один параметр.

Вихідні дані

&`nij.9=j.,)r31n=+(=ooj`[o.o.)1.s](>=6>t

Я можу переставити лише номери o=>[...j=o,].sort(n=>(j+=113)&69).join`` , але jне можу перейти на ціле число
l4m2

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

3

Дерево груші , 46 байт ASCII, оцінка 0, тріщинами

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

Іншими словами, завдання тут полягає в тому, щоб написати програму A Pear Tree, яка нічого не видає на стандартному виході, коли вона дається на стандартному вході, і яка робить щось на стандартному виході, коли йому надається щось, крім себе, на стандартному вході, не використовуючи більше 46 байт. (Мені вдалося це зробити, утримуючи програму також для друку ASCII, незважаючи на те, що Pear Tree часто використовує символи, що не належать до ASCII, та недруковані символи.) Це фактично завдання написання самоідентифікуючої програми з конкретним вихідним форматом. (тобто нульовий рядок, коли успішна самоідентифікація); однак, у Грушевого дерева є щонайменше два повороти, які роблять завдання дещо складнішим, ніж це виглядає, коли виконується цією конкретною мовою (саме тому я вибрав його для мого представника поліції).

Моє рішення

Моє рішення трохи відрізняється від тріщини:

eval(k=q(print$\=$_="eval(k=q($k))"ne$_;MZpa))

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

Замість використання exitя замість цього встановив $_(неявний вихід) та $\(новий рядок після виводу, включаючи неявний вихід) нульовий рядок, якщо є збіг (і 1якщо немає відповідності). A printвсе ще потрібен, оскільки неявний вихід увімкнено лише за наявності хоча б одного байта вводу (таким чином, нам потрібно явно надрукувати щось, якщо нам введено порожній рядок як вхід, який відрізняється від програми).

Кожна програма Pear Tree повинна десь містити контрольну суму (це є MZpaв цьому рішенні). І моє рішення, і тріщина вибирають назви змінних (і змінюють інші незначні деталі коду) для того, щоб контрольна сума повністю складалася з літер ASCII.



3

Perl 5 -p0777, 10 байт, оцінка 10, безпечно

W)9r46<(k

Останній символ тут - "зсув", код символу 14 (десятковий) / 0E (шістнадцятковий). Усі інші друкуються ASCII.

Оскільки ми використовуємо неявний аргумент -p0777введення- виводу Perl , вхід надходить зі стандартного вводу, а вихід іде на стандартний вихід.

Рішення

Програма виконує наступні дії:

NUL-колодки вводять щонайменше 10 символів, потім XOR з рядком svgOUT_TOP

що означає, що сама програма, єдиний вхід, що дає бажаний вихід,:

$ _ ^ = abc | $ ^

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

Пояснення

Perl має ряд змінних спеціального призначення. Наприклад, при використанні -p0777для неявного вводу / виводу $_вводиться на початку програми і виводиться в кінці програми.

Більшість цих змінних мають дуже просте значення за замовчуванням. Однак значення за замовчуванням для $^вибраного в даний час формату верхньої сторінки - це значно довший рядок STDOUT_TOP. Як такий, ми можемо використовувати це як дуже короткий метод обфускування через XORing $^зі значенням, яке ми хочемо притупити (у цьому випадку програма).

Для того, щоб приховати розповідь _TOPв кінці, я доповнив програму на 10 символів, додавши додаток abc|, що означає, що всі символи STDOUT_TOPXORed будуть чимось; вибір abc|на початку був простим способом зберегти вихідний здебільшого друкований (і щоб було важче помітити, що я XORing використовував рядок, виготовлений з великої літери, тому що в ASCII, великі регістри XOR - малі).


3

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

Вхід і вихід з / до stdin / -out. Вихідний результат для кожного введення різний. Унікальний вихід при введенні вихідного коду:

218216195196222130136136132192197195196130241204136209197216206130201131244155157154215136138204197216138201138195196138195196218223222130131247131131

(Це 150 цифр)

Удачі!


Ого! Зараз я бачу, що цей виклик вже давно закінчений ... Дивно, що він з’явився на моїй шкалі / каналі. Цікаво подивитися , якщо хто - небудь відповідає на це ...
agtoever



2

Cubix , 18 байт, оцінка 18, безпечно

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

Це повинно бути досить легко зламати.

Вхід відstdin

Вихідні дані

$`*2aJPJ#74(o);89

Редагувати: Я мушу зазначити, що це очікує на джерело у скороченому вигляді ... і тепер я помітив, що в результаті відсутній байт (недрукований) є результат, який я зламав, коли розміщував повідомлення. Слід скопіювати зараз. Шістнадцяткові значення є24 60 2a 13 32 61 4a 50 4a 23 37 34 28 6f 29 3b 38 39

Концепція полягала в тому, щоб видалити друк першого символу, а потім видалити зворотний індекс із символу, наприклад [chars] - [0, len ([chars]) ..

Код є

$r;#AoW\U-@</u.?;;

який відображає на наступний куб

    $ r
    ; #
A o W \ U - @ <
/ u . ? ; ; . .
    . .
    . .

Спробуйте тут


2

Желе , 14 байт, Оцінка: 21, Безпечно

Як програма, так і розмір виводу рахуються за допомогою кодової сторінки Jelly.

Вхідні дані

Перший аргумент командного рядка.

Вихідні дані

-§ḋẇ"*YdĖDƘ>Ẉed€Ç+æạɦ

Рішення

ØJiⱮÄÆNPḃØ⁵ịØJ

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


Оскільки конвертувати з / у кодову сторінку Jelly важко, було б корисно мати перевіряючий елемент (який приймає програму, перетворює її з UTF8 в Jelly, годує її собою, перетворює з Jelly в UTF8 і перевіряє, чи вона дорівнює очікуваній вихід)
user202729

@ user202729 ця програма Jellyv⁼ , отримає результат, 1якщо вхід, що оцінюється як Jelly-код з входом входу, дорівнює вводу, і буде або вихід, 0або помилка (якщо вхід недійсний код Jelly), якщо ні.
Джонатан Аллан

1

JavaScript Firefox, <10 байт, Оцінка: 52, з введення аргументу функції, Зламаний

ZnVuY3Rpb24gYnRvYSgpIHsKICAgIFtuYXRpdmUgY29kZV0KfQ==


btoa

btoa(btoa) кодує наступний рядок:

function btoa() {
    [native code]
}

що дає:

"ZnVuY3Rpb24gYnRvYSgpIHsKICAgIFtuYXRpdmUgY29kZV0KfQ=="

щойно скопійовано


Перш за все, після очевидного, це не фактичний код? По-друге, ви не вказуєте, звідки беруться дані. Я б опублікував тріщину, але, чесно кажучи, не впевнений, чи справді це повідомлення.
Квінтек


Я не думаю, що потрібно включати пост тріщини в цю публікацію - люди можуть просто натиснути посилання, щоб переглянути тріщину.
користувач202729

1

GCC 61-> 61 байт

70 4F 92 73 08 D4 03 E7 65 DC D6 89 B5 AD BA 90 
97 26 31 10 F6 FA 0A 30 8F 24 69 0A A7 8B 59 9E 
A2 42 D5 67 B8 12 3A 1E 9D 25 80 F9 6B 25 32 C2 
EE 46 3F 8D 7E 0C 73 0F F0 93 C6 68 50

Повна програма, прийміть вхід зі stdin та виведіть у stdout


Отже, чи є простір після останнього 50?
tsh

@tsh Це шістнадцятковий смітник
l4m2

1

Perl 6, 43 байти, Оцінка: 15, від stdin

49671296789805

2
Просто перевіряючи, оскільки ваша попередня відповідь не відповідала правилам унікального виходу для вашої програми як вхідного даних, чи можете ви підтвердити, що це подання?
Джо Кінг

Так, я так думаю.
Дональд


1

J , 26 байт, оцінка: 52, безпечно

Програма - це не REPL, а повний сценарій, який приймає stdinта чітко друкуєstdout .

Вхідні дані

Стандартний вхід.

Вихідні дані

6fc42353c98217ef5a2908a3c63d090aa9a55b2558b61294e06a

Ні, це не метод шифрування.


Рішення

echo]hfd]257x#.3&u:stdin''
                   stdin'' Take the whole input
               3&u:        Convert to codepoints
         257x#.     Convert base 257 to integer
     hfd]           "Hex from Decimal"
echo]               Print to stdout

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


1

Кег , 6 байт, оцінка: 6

Вхідні дані

З stdin, використовуючи?

Вихідні дані

5\x1c"\x1c"9

Зверніть увагу, що це послідовності втечі для недрукуваних байтів. Замініть втечі буквальними символами. Сирий текст доступний тут

Успіхів з цим! Побачимось на наступному тижні!


0

 Perl 6, 31 байт, Оцінка: 39, від stdin - Зламаний

Тріснув тут

().1111111111112222235abcegijkmnorstvy

Сире рішення. Може вижити.


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