Це зупиниться? (Розбійники)


46

Це нитка розбійників. Нитка поліцейських тут .

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

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

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

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


Шукаєте подані невдалі матеріали?

fetch("https://api.stackexchange.com/2.2/questions/135363/answers?order=desc&sort=activity&site=codegolf&filter=!.Fjs-H6J36vlFcdkRGfButLhYEngU&key=kAc8QIHB*IqJDUFcjEF1KA((&pagesize=100").then(x=>x.json()).then(data=>{var res = data.items.filter(i=>!i.body_markdown.toLowerCase().includes("cracked")).map(x=>{const matched = /^ ?##? ?(?:(?:(?:\[|<a href ?= ?".*?">)([^\]]+)(?:\]|<\/a>)(?:[\(\[][a-z0-9/:\.]+[\]\)])?)|([^, ]+)).*[^\d](\d+) ?\[?(?:(?:byte|block|codel)s?)(?:\](?:\(.+\))?)? ?(?:\(?(?!no[nt][ -]competing)\)?)?/gim.exec(x.body_markdown);if(!matched){return;}return {link: x.link, lang: matched[1] || matched[2], owner: x.owner}}).filter(Boolean).forEach(ans=>{var tr = document.createElement("tr");var add = (lang, link)=>{var td = document.createElement("td");var a = document.createElement("a");a.innerText = lang;a.href = link;td.appendChild(a);tr.appendChild(td);};add(ans.lang, ans.link);add(ans.owner.display_name, ans.owner.link);document.querySelector("tbody").appendChild(tr);});});
<html><body><h1>Uncracked Submissions</h1><table><thead><tr><th>Language</th><th>Author</th></tr></thead><tbody></tbody></table></body></html>


2
Чи означають різні значення різних входів (скажімо, всі вхідні дані, які закінчуються на 2, зламають посаду поліцейського - чи можете ви різні люди розміщувати різні цифри, що закінчуються на 2?) Або різні сімейства входів, або різні типи входів?
Стівен

1
Кілька людей можуть публікувати тріщини для одного і того ж подання поліцейських ... Будь ласка, визначте різні .
Денніс

Відповіді:


49

Мальбодж, дверна ручка

Спробуйте в Інтернеті (спасибі Деннісе !)

Вхід для Windows: F_⌠1234567890

Введення даних на базі системи Linux за допомогою ISO-8559-1: F_ô1234567890

Основою роботи програми Malbolge є те, що вона залежала від поведінки інтерпретатора Malbolge, який викликає нескінченний цикл, якщо він стикається з будь-якою інструкцією, яка не знаходиться між 33 і 126. Програма була побудована таким чином, що ваш вхід дозволить вам змінити єдину інструкцію.

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

Переглядаючи нормалізований дамп коду та пам’яті (та дотик довідки про налагодження), я створив наступне:

a = op (вхід 1, 29524)

b = op (вхід 3, а)

c = op (486, b)

d = op (c, 37)

e = d / 4 + d% 3 * 3 ^ 9

e має бути від 33 до 126

Де opзнаходиться так званий тріталіус "op", який описаний у специфікації. Використовуючи цю інформацію, ви можете написати просту програму, яка перебирає можливі входи (від 0 до 255) і знаходить усі рішення, які відповідають зазначеним вище критеріям. Я знайшов 2219 можливих рішень, деякі з яких, ймовірно, не будуть робочими рішеннями (ви не можете ввести потрібні символи). Зокрема, вищевказані матеріали базуються на рішенні:

(Input 1 = 70, Input 3 = 244)


У мене немає коментаря, щоб коментувати тріщину на посаді поліцейських. Може хтось зробив це для мене?
KBRON111

4
Ласкаво просимо до PPCG! Хороша робота! Я думаю, що з цим тріском у вас незабаром буде достатньо респ :)
Стівен

1
Я коментував поперек. І так, відмінна робота; Я наполовину очікував, що Малболге протримається тиждень!
Ведрак

6
Хороша робота! TIO використовує UTF-8, але, загорнувши його в Bash, тріщину все ще можна перевірити. tio.run/… Вам, здається, нічого не потрібно F_ô, до речі.
Денніс

1
Тепер я можу спати знову
Хуан Тоніна


13

JS (ES6), Хуан Тоніна

+0,-0

Трохи заглянув, Object.isщоб знайти. В основному, +0 === -0оскільки ===перевіряє їх як числа, і 0є кінцевими, але Object.isбачить +0і -0як різні об'єкти. Дуже розумний коп :)

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


Ніндзя отримав це під час входу в систему. Стріляй.
користувач3033745

Чорт, вирішився швидше, ніж час, який я витратив на роздуми над кодом: D
Хуан Тоніна

11

Пітон, Сифон

class A:
    i = True
    def __eq__(self, a):
        self.i = not self.i
        return self.i

a = A()
f(a)

Ми просто переосмислюємо рівність, щоб поводитись так, як потрібно для припинення програми.


Хоча я гадаю, що я міг би просто визначитись __eq__з raise...
g.rocket

Я збирався подати лише повернення 0: p
Джонатан Аллан

@JonathanAllan Як це працює?
g.rocket

1
Досить впевнений просто class A:__eq__=lambda s,o:0і f(A())робить свою роботу.
Джонатан Аллан

1
Ага так потрібне заперечення> _ <
Джонатан Аллан


8

PHP, Сизіф

(-0[0)> deal with it=1

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

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


WTF ?! Це божевільно ...
Ведрак

7

JavaScript (Node.js), Adnan

[]і, []здається, працює. Я перепробував купу з них в тому числі null, undefined, NaN...

[] >= [] && [] <= [] && [] != [] оцінює до істинного.

Мораль історії: JavaScript дивний .

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


Так, масиви - це лише об’єкти.
програміст5000

І об'єкти накидаються на рядки для цих типів порівнянь.
Conor O'Brien

7

JavaScript (ES7), Arnauld

Стандартний

"8e7" це рішення

var crack_me = (x=0)=>{for(;~x/x.length**3!=-2962963;);}

var key = "8e7"

crack_me(key)
console.log("stopped :)")

Рубати

Не потрібно обчислювати цю кількість, ми можемо переглядати lengthвластивість

Це налаштовано ~x/x.length**3!=-2962963наfalse

var crack_me = (x=0)=>{for(;~x/x.length**3!=-2962963;);}

var key = {toString:()=>"2962962",length:"1"}

crack_me(key)
console.log("stopped :)")

Пріоритет операторів

~ розрядне не є першим

** exponentiation другий

/ division третій


6

Баш, Ведрак

LD_TRACE_LOADED_OBJECTS

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

На сторінці сторінки ld.so(8):

LD_TRACE_LOADED_OBJECTS

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


Я думав, це триватиме довше! Відмінна робота.
Ведрак

1
@Veedrac: Я думаю, оскільки ви вказали bash, навряд чи ви знайдете статично пов'язаний (наприклад, зайнятий?) /bin/yes, Але це можливо, і в цьому випадку цей env var буде ігнорований.
Пітер Кордес

6

Математика, Мін Юван Хван

Unevaluated@Throw@"hammertime"

Немає поняття, чи є це задумане рішення, але воно передається в виразі, який не оцінюється, поки не буде #позначено як всередині функції, що призведе до того, що він повернеться з функції негайно, не роблячи додаткової оцінки. Ви можете бачити, що функція насправді викликається (замість того, щоб просто кидати виняток, перш ніж навіть викликати функцію), змінивши функцію на:

#0[Print@"stop";#;$IterationLimit=∞]&

Що дійсно буде надрукувати stopраніше, ніж викинути помилку.


Бінго! (Я насправді збирався Unevaluated[Abort[]], але те саме.)
JungHwan Min


5

Рубін

exit

без нового рядка 3.send('exit')напевно не дорівнює 5, але він виконує Kernel#exit:

Ініціює припинення сценарію Ruby, піднявши виняток SystemExit

Можна зателефонувати exitна , 3 тому що :

Модуль Kernel включений до класу Object, тому його методи доступні у кожному об'єкті Ruby [як приватні методи].

abort також працює:

Негайно припиніть виконання, викликаючи Kernel.exit (false). Якщо дано msg, він записується до STDERR до завершення.


5

JavaScript (Node.js) , програміст5000

Уже поламаний, але мій трохи інший :) Не вистачає респ для коментарів у поліцейських. Також сміливо редагуйте, щоб виправити форматування, моє перше повідомлення тут.

В основному я встановлюю __proto__рівну функції, яка кидає. Взяте з перегляду прототипу на сторінці Mozilla. (Вибачте, низький представник, посилання не вдається.)

x = {}
let No = function () { throw 'halted' }
x.__proto__ = new No()
f = x=>{while(x.__proto__);}

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

EDIT: Отримав респ., Ось ось посилання: Mozilla__proto__


Я прокоментував для вас поліцейського.
Стівен

1
Дякую! Також дякую всім за ups, здогадуюсь, я можу коментувати зараз!
Хаумед Рахмані

1
Ласкаво просимо на PPCG: D
Conor O'Brien


5

R, Jarko Dubbeldam

function(x)if(is.list(x))return(1)

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

Досить впевнений, що це дійсно. Просто перезапис is.list (), правда?


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

Прокоментував вас.
TheLethalCoder

Не задумане рішення, але працює. Хороша робота.
JAD

5

Javascript, програміст5000

Максимальна довжина рядка

Використовується рядок довжиною на одну менше, ніж підтримує ваш двигун. При додаванні "h"до цього рядка видається помилка. Спробуйте в Інтернеті!

function getAlmostMaxLenStr() {
  var prevBases = [];
  var base = "a";
  try {
    while(true) {
      prevBases.push(base);
      base += base;
    }
  } catch(e) {}
  for (var i = prevBases.length-1; i>=0; --i) {
    try {
      base += prevBases[i];
    } catch (e) {}
  }
  return base;
}
f(getAlmostMaxLenStr());

Блок перехресного походження

Дуже натхненний відповіддю від @ jadkik94 , але працює скрізь. Створює перехресне походження iframe, а потім передає .contentWindowзгаданий iframe. Це не вдається, коли функція намагається використовувати значення через безпеку перехресного походження.

let f=x=>{
  try {
    console.log(x+"h"); // we don't want to lock up your browser, do we ;)
  } catch (e) { console.log("Halted!\n",e); }
}
let iframe=document.createElement("iframe");
const url = location.host.indexOf("google") === -1 ? "https://google.com" : "https://stackexchange.com";
iframe.src=url;
iframe.onload=a=>f(iframe.contentWindow);
document.body.appendChild(iframe);

Первісне значення

Варіант .toString()відповідей - це просто використовується toPrimitiveзамість цього. Він повертає об'єкт як примітивне значення, з яким Javascript не знає, як обробити (тому він видає помилку). Спробуйте в Інтернеті!

f({
  [Symbol.toPrimitive](){return {}}
});

Приємна робота, але все ж не призначене рішення! Дуже розумний!
програміст5000

4

Node.js, Adnan

{}і {}або будь-які 2 об'єкти є двома входами. Я навіть не розумію, як це працює.

Ось дивовижний об'єкт порівняння логіки JS:

console.log({} == {});
console.log({} === {});
console.log({} > {});
console.log({} < {});
console.log(!!{});

console.log({} >= {});
console.log({} <= {});


Так, це було призначене рішення :)
Аднан

4

JavaScript (вузол Бабеля) , Conor O'Brien

(Репост, випадково поміщений у поліцейських.) Не впевнений, що було призначено, але позитивні десятичні знаки, які не дуже великі, здається, працюють.

Крім того, я думаю, я все ще не можу коментувати в Cops.

f(0.1)
console.log('done')

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


Забув і про це, хороший.
Conor O'Brien

4

Javascript (НЕ node.js) , програміст5000

Це неможливо додати, оскільки він створює об'єкт, який не має toString, оскільки новий Setне притаманний прототипам від Object.

вхід:

new Set()

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


Це, мабуть, було намічене рішення, я буду тримати це в мішку голови відтепер: P
Стівен

Вибачте, це, здається, не працює для мене? Спробуйте в Інтернеті!
Хаумед Рахмані

@HaumedRahmani додав кнопку спробувати онлайн. Я використовував павукову мавпу, а не дівочку.
Грант Девіс

Не задумане рішення, але приємна робота!
програміст5000



4

Python 2, Foon

__import__("os")._exit(0)

Те, що написано на бляшанці, в основному.

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


Цікаво, що на TIO цей раз вийшов для мене; під Windows (конкретно з winpty python inputbad.py та вставкою у рядку) він робить вихід за бажанням ... і так, не дивно, що мій schtict експлуатував "вхід під Python 2 зростає під кришкою" біт
Foon

@Foon Хм, для мене TIO працює чудово. Дивіться посилання у відповідь.
Ведрак

Дивно ... Я, мабуть, натиснув гру, а потім набрав вхід на моєму посиланні TIO і не зрозумів цього
Foon

Я впевнений, що це
зламає

@enderland Тільки якщо вони оцінюють ваш внесок, чого більшість з них не робить.
Ведрак


4

Пітон 3, Сифон

Це було весело. Нам потрібно зробити type(x) != strконтрольний пропуск, тому нам потрібно контролювати повернене значення type(). Ми повинні перекрити __class__атрибут і замінити його на спеціальний об'єкт, який розширюється type, а __ne__метод замінений на той, який завжди повертає помилковим. Це змушує пройти перевірку типу, але пошук не вдасться, оскільки oце не str.

class m(type):
    def __ne__(a,b):
        return False
class c:pass
o=c()
o.__class__=m("",(c,),{})
f(o)

Ласкаво просимо на сайт! :)
DJMcMayhem

4

C #, TheLethalCoder

System.Nullable`1[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]

Або будь-який інший нульовий клас.


3

Сітківка

Новий рядок, за яким слідують 1твори. Я знайшов це відразу.


1

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


Ninja'd на хвилину
Kritixi Lithos

@Cowsquack У запитанні вказано, що допускається кілька тріщин для однієї і тієї ж посади копа.
mbomb007

Я знав, що я мав би видалити нові рядки зі введення як перший крок
PunPun1000

3

JS (ES6)

"   "

Будь-який символ з кодом менше 10 повинен працювати; Я використав tabсимвол вище, який SE перетворює на пробіли.



Вибачте :( плюс я думаю, вам знадобляться цитати навколо нього, щоб це було рядок
Stephen

@ programmer5000, тому я бачу :(
Shaggy

Без проблем, @StepHen; характер гри. Я вважав, що цитати є неявними, але я їх відредагую.
Shaggy

@Shaggy Я не знаю, що є правилом, але f(<tab>)це дійсний синтаксис (порожній ввід), і нам доведеться розмежувати між собою f(1)і f("1")все одно
Стівен


3

cQuents, Step Hen

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

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


Я ось-ось збирався публікувати a 1! Ви ніндзя ви мене: /
Містер Xcoder

@ Mr.Xcoder Я набрав це на мобільний, сподіваючись, що мене ніхто не буде ніндзя: P
PurkkaKoodari

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