Приховані інверсії (нитка розбійників)


16

Це головоломка , нитку поліцейських можна знайти тут.

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

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

Вам буде набрано кількість програм, які ви першими зламали.

Відповіді:


21

Пітон 3, 46 байт, Лінн

lambda x0223334566789:(x0223334566789*89)//178

Як я можу "сповістити початкового відповіді"?
ГБ

Залишив коментар зв'язує відповіді на оригіналі
Сеф

Ви повинні залишити f=код на початку свого коду, оскільки він не потрібен і не є частиною початкової функції
0

Готово, я просто скопіював це занадто швидко.
ГБ

16
Ось я насправді грубо змушує рішення (і навіть припускаючи, що таке існує), і ви просто уникаєте всієї проблеми! +1
orlp

14

Python 2, 225 байт, orlp

p=90930641353124136621573325641513715557077985927835294018496194596645372722158;q=101979812089012306249375934082966806799688507587087308196267706260111970225882#--223444799
lambda n:pow(n,pow(65537,(p*q-2*(p+q))/4,p*q),~p*~q)

Гадаю, мені пощастило, коли цілий день здогадувались про випадкові прості дільники ...

(За замовчуванням ліміт точок c4.8 за величиною - 4, але в минулому році мені вдалося підняти його до 10. Довелося налаштувати конфігурацію FAAS з 16 рабів на 6, хоча (+3 mpi, 1 майстер). 20m поліселект, просіювання 12h 50m, 2h 25 м ліналу, 30 м кв. Загальна вартість ~ 70 дол. США. Принаймні @orlp було досить приємно, щоб вибрати вирішуваний розмір, але я цього більше не роблю! Дякую @IlmariKaronen за останній крок, і так, я жартую про вгадування: P)


Я .. що ... Тепер мені погано коштувати вам грошей: (я навмисно вибрав розмір, який все ще буде розумно малим, але занадто високою вартістю для нападу. Я насправді не думав, що хтось витратить гроші на це.
orlp

1
@orlp Цілком вартий цього як разового досвіду для мене. Я сподіваюся, що люди дізнаються щось про 512-бітну безпеку RSA в природі з цього :)
Sp3000

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

@miles Я повинен зазначити, що AWS має кредит для студентів, якщо хтось хоче спробувати, і я не здивуюсь, якби інші служби зробили те саме. Отже, ви, мабуть, не за горами з цією ідеєю випробувань, принаймні вперше. (Якщо хтось захоче спробувати - переконайтесь, що ви видалите всі томи, AMI тощо), коли закінчите, тому що в іншому випадку вам стягуватиметься плата за зберігання)
Sp3000

11

Python 2, 83 байти, orlp

Оригінал:

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

Тріщина:

p=3207399658;q=3428998126#--11
lambda n:pow(n,pow(65537,(p*q-2*(p+q))/4,p*q),~p*~q)

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

Злом RSA, зроблений Wolfram Alpha . ;)


Я щойно зрозумів, що ~p*~qце прямо вгору коротше -~p*-~q, ой.
orlp

Як ти реверсував інженерну (p*q-2*(p+q))/4частину? :)
orlp

Це було найскладніше, чи не так? В принципі, знання функції Кармайкл і той факт , що p/2і q/2обидва були непарні прості числа, і купу проб і помилок , щоб знайти що - то , що буде працювати , використовуючи доступні символи.
Ільмарі Каронен

Я навмисно вибрав pі q(справжні, той, який в коді є, p-1і q-1для цілей гольфу) такий, який (p-1)/2є першочерговим, так що ми маємо φ(φ(pq)) = ((p-1)/2-1)((q-1)/2-1). Це дозволяє нам обчислити модульну інверсію 65537мода φ(pq)(що нам потрібно для RSA), використовуючи ідентифікацію Ейлера, що робить відповідь набагато коротшим, оскільки нам не потрібно реалізовувати модульну зворотну логіку або жорсткий код іншої великої постійної. Окрім -~q*-~p-> ~q*~p, ви знайшли саме мою функцію :)
orlp

1
Власне, щоб забрати незначну нітку, я вірю φ(φ(pq)) = 2((p-1)/2-1)((q-1)/2-1)в безпечні праймери pі q, тому що φ(4) = 2. Але λ(φ(pq)) = lcm(2, (p-1)/2-1, (q-1)/2-1)це максимум ((p-1)/2-1)((q-1)/2-1)/2, і будь-який кратний з них, мінус один, зробить для показника. :)
Ільмарі Каронен

7

Python 3, 80 байт, Wolfram

from bisect import*
q=int(input())
print(bisect([(h+1)**2 for h in range(q)],q))

Це було справді важко зламати! Я використовую бібліотеку бісектів , яка входить у розподіл Python 3. bisectФункція приймає відсортований список і елемент, і повертає крайній правий індекс , де елемент може бути вставлений для підтримки порядку. Ми просто даємо йому qсписок довжин квадратів, починаючи з 1елемента і елемента q.


1
Я збирався запропонувати зміни (h+1)до -~h. Тоді я зрозумів, що це не сенс цього виклику: P
ETHproductions

@ETHproductions Це все-таки було б неправильно через перевагу оператора.
Sp3000

@ Sp3000 Так, я не мав уявлення, що **має вищий пріоритет, ніж ~у Python. Я припускаю, що це краще, ніж у JS, де -~2**2викидається синтаксична помилка ("невизначений одинарний вираз не може з'являтися на лівій частині" ** "").
ETHproductions

@ETHproductions Вони насправді зробили це, щоб уникнути двозначностей, що, як я можу додати, дуже нехарактерно для більшості дизайну JS.
Esolanging Fruit

@ Challenger5 Насправді, мені доведеться не погодитися з вами там: останніми роками TC39 був надзвичайно обережним, щоб переконатися, що будь-які нові функції є максимально повністю **неясними (що включає оператора, доданого в ES2017)
ETHproductions

6

Javascript, 21 байт, Арнольд

Оригінал

b=>Math.pow(b,torc=3)

Тріщина

o=>Math.cbrt(o,pbw=3)

Повертає корінь куба.


Ось так! ;)
Арнальд

@Arnauld: Я вважаю трохи дивно, що JS дозволяє викликати функції з більшою кількістю аргументів, ніж вони визначені. Цікаво, яка думка за цим стоїть.
Емінья

6
Ви маєте рацію, JS дозволяє це зробити дизайн. Однак додаткові аргументи не втрачаються повністю, оскільки вони зберігаються в об'єкті аргументів, до якого функція може бути отримана вручну.
Арнольд

5

7, 9 байт, ais523

00000000: 0173 dc25 7e13 dcb6 1f                   .s.%~....

Бо груба сила завжди перемагає, і 9! становить лише 362880


4

Processing.js, 59 байт, Kritixi Lithos

Оригінал:

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

Тріщина:

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

Що ж, це було досить просто. Найважче було з’ясувати, куди наклеїти зайві коми та зірочки. На щастя, здається, що Processing дозволяє отримати додаткові невикористані параметри функції, а також вирази комами у стилі C.


1
Мабуть, перекладач, якого я пов’язував, був неправий. Насправді, більшість (або навіть усі) онлайн-перекладачів, ймовірно, помиляються, оскільки Processing-java попередньо компілюється до Processing.js. Зараз я думаю, що найкращим способом дій було б для мене і ви змінити наші відповіді на "Processing.js" замість Processing, тому що тоді ваша відповідь буде дійсною (Processing-java видає багато помилок). Я опублікую окрему відповідь з тим самим кодом, що і Processing-java, але для цього інтерпретатору гнізду було б встановити її з Process.org. Молодці все одно!
Kritixi Lithos

4

JavaScript (ES6), 63 байти, SLuck49

Оригінал:

x=>eval(atob`eCp4KzEvLyAgfXBModLS4TvEn4wp1iys9YRRKC85KLIhNMC=`)

Тріщина:

x=>eval(atob`CgpNYXRoLnBvdyh4LTEsMC41KSAvLw4589CEIKKMRefipyz=`)

Код base64 вище декодує для:



Math.pow(x-1,0.5) //...

де ...стоїть купа випадкового сміття, яке ігнорується перекладачем JS, оскільки це в коментарі.

Я знайшов це рішення шляхом спроб та помилок. Зрештою, тільки на самому ділі складна частина були дві нових рядків на початку коду, потрібно зробити інше лінії правильно і отримати Mв Mathдо base64-кодування в те , що було доступно в вихідному наборі символів. Я спершу спробував пробіли, але " M"base64-кодує, "ICBN"і мені знадобився єдиний доступний Bдля кодування ".po"пізніше код. "0+M", "1*M", "1?M"Або будь-які інші подібні до них не-оп префікси я міг думати не вийшли, але переклади рядка зробили.

Я підозрюю, що це може бути не саме намічене рішення, але все, що він працює. :)

Демонстрація:

var f = x=>eval(atob`eCp4KzEvLyAgfXBModLS4TvEn4wp1iys9YRRKC85KLIhNMC=`)
var g = x=>eval(atob`CgpNYXRoLnBvdyh4LTEsMC41KSAvLw4589CEIKKMRefipyz=`)
for (var i = -0; i <= 10; i++) console.log(i, '->', f(i), '->', g(f(i)))


Хороша робота, що знайде щось, що спрацювало, я сподівався, що введення додаткових символів на початку зробить це трохи складніше
SLuck49

Вражаюче :) Я взяв точно такий же підхід, але не думав спробувати новий рядок. Я намагався втратити С в іншому місці, але нікуди не потрапляв.
Кріс М





3

JavaScript (ES6), 46 байт, SLuck49

Оригінал (обчислює ln (x + 1))

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

Тріщина

x=>Math[(lg=19979699+55686).toString(9+25)](x)

Я б ніколи цього не зламав, якби не зрозумів, що інверс є Mathвбудованим . (lg=19979699+55686).toString(9+25)це лише звитий спосіб повернення "expm1".


Чудово зроблено! Так, я переглядав функції Math, щоб вирішити, що використовувати, бачив expm1і сказав: "Зачекайте, це річ?"
SLuck49

2

J, 10 байт, миль

1%:@*~>:[<

Я маю щось написати тут, бо відповідь занадто коротка.


2

J, 29 байт, Згарб

Оригінал

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

Тріщина

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

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

Ще один еквівалент тріщин

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

Пояснення

[:(](07-5)"3 #.-:&#$,)5#.inv]  Input: integer n
                            ]  Get n
                      5        The constant 5
                       #.inv   Get the digits of n in base 5
[:(                  )         Operate on those digits D
                    ,            Flatten D (does nothing since it is already a list)
                  #              Get the length of D
               -:&               Halve it
                   $             Reshape D to half its length (only the base 2 digits)
    (07-5)"3                     The constant 2 with rank 3
             #.                  Convert the front-half of D to a decimal from base 2
   ]                             Return the right result

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