Разоружить бомбу!


214

Вы были наняты за свои технические знания в качестве помощника Секретного агента, чтобы гарантировать, что хороший парень сможет выполнить свою работу и спасти мир.

Это ваша последняя миссия перед уходом на пенсию с высокой зарплатой и благодарностью всего мира. Но прежде чем вы должны разоружить Большую Чрезмерную Бомбу Злого Гения (кажется, что злой гений - умная задница, которая любит рекурсивные сокращения). В любом случае, вы и ваш друг находитесь в самом центре секретной базы Злого Гения, готовой разоружить БОМБУ, которая может уничтожить континент. В предыдущей миссии вам удалось получить код снятия с охраны, который, к вашему удивлению, просто «ПАРОЛЬ_01». Вы подключаете клавиатуру к БОМБЕ, но когда вы готовы к работе, приспешники Злого Гения входят со множеством пуль. К сожалению, одна из этих пуль воздействует на вашу клавиатуру. «Завершите работу, пока я отвлекаю этих д * сголов!» говорит твой приятель, а затем начинает стрелять из пистолета.

SPECS

  1. Напишите программу, которая выводит любым способом строку PASSWORD_01(в верхнем регистре).
  2. Так как ваша клавиатура попала в пулю, вы можете использовать только эти клавиши:

    1 2 3 4 5

    Q W E R T

    A S D F G

    < > Z X C

    Ctrl Shift Tab Space

    Используя Shiftклавишу, ваша клавиатура позволяет использовать следующие символы:

    ! " · $ %

  3. У вас нет другого оборудования, кроме клавиатуры и экрана (например, мыши), а также файла с паролем, записанного на вашем компьютере.

  4. У вас нет подключения к интернету.

  5. Вы можете предположить, что у вас открыта оболочка интерпретатора / редактор исходного кода до того, как появились пули. К сожалению, вы ничего не написали до того, как нажали на клавиатуру.

  6. У вас нет виртуальной клавиатуры. На самом деле БОМБА имеет детектор TOO_FUNNY, который взорвется, если вы попытаетесь использовать стандартные лазейки .

  7. Поскольку ваш собеседник ждет, когда вы скоро закончите, чтобы сбежать с Секретной базы, вам придется написать наименьший возможный код (так что это и !).

Удачи, потому что обратный отсчет начался!

РЕЖИМ ПОМОЩИ: Также KEYчудесным образом выжил также (только одна Клавиша, которую вы хотите от клавиатуры, но не Shift + Клавиша или любая другая комбинация). Например: Вы можете использовать =, или 0или /... Этот дополнительный ключ не может быть любой из букв в PASSWORD_01(поэтому вы не можете добавить Pили O). Назовите этот ключ в своем ответе. У вас есть штраф в 10 символов за использование этого ключа, независимо от того, сколько раз вы используете ключ.


67
Могу ли я изменить раскладку клавиатуры на DVORAK?
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

42
Получим ли мы хотя бы ключ ввода?
Οurous

72
Пробел, вот ваш большой шанс!
german_guy

43
Почему пароль не мог быть stewardesses?
код взломщика

24
Ответ на шутку: я шпион, я переключаюсь на резервную клавиатуру, спрятанную в моих часах.
Nzall

Ответы:



136

bash, vim и dc (343)

Я сижу в приглашении bash, которое было настроено Злым Гением, и, конечно, он имеет VISUAL=vimв среде по умолчанию. Использование привязки bash по умолчанию для edit-and-execute-command( C-x C-e) bash вызывает $VISUALи выполняет содержимое буфера при выходе ( ZZ). Я набираю следующую последовательность (Примечание: kbd-mode - команды, выдаваемые в обычном режиме и управляющие последовательности):

  1. C-xC-e
  2. aкошка <<< 45 C-c4C-aaа

    Теперь буфер vim содержит cat<<<49a. Продолжая ...

  3. 45 C-c3C-aaа

  4. 54 C-c41C-aaа
  5. 55 C-c13C-aaа

    Теперь буфер vim содержит cat<<<49a48a95a68a. Продолжая ...

  6. 51 C-c31C-aaа

  7. 55 C-c24C-aaа
  8. 44 C-c43C-aaа
  9. 42 C-c41C-aaа
  10. 42 C-c41C-aaа
  11. 54 C-c11C-aaа
  12. 55 C-c25C-aaс> с

    Теперь буфер Vim содержит cat<<<49a48a95a68a82a79a87a83a83a65a80a>s

    Выйти из режима вставки, сохранить и выйти

  13. C-cZZ

    Теперь sфайл содержит dcскрипт, который генерирует нужную строку в стеке, теперь нам нужно добавить команды печати.

  14. C-xC-eadc <<< 55 C-c25C-aaa >> sC-cZZ

    Повторите вышеуказанную команду 9 раз.

  15. C-xC-eadc <<< 55 C-c25C-aaa >> sC-cZZ

  16. C-xC-eadc <<< 55 C-c25C-aaa >> sC-cZZ

  17. C-xC-eadc <<< 55 C-c25C-aaa >> sC-cZZ

  18. C-xC-eadc <<< 55 C-c25C-aaa >> sC-cZZ

  19. C-xC-eadc <<< 55 C-c25C-aaa >> sC-cZZ

  20. C-xC-eadc <<< 55 C-c25C-aaa >> sC-cZZ

  21. C-xC-eadc <<< 55 C-c25C-aaa >> sC-cZZ

  22. C-xC-eadc <<< 55 C-c25C-aaa >> sC-cZZ

  23. C-xC-eadc <<< 55 C-c25C-aaa >> sC-cZZ

  24. C-xC-eaкошка <<< е >> с

    Выполните скрипт dc:

  25. C-xC-eaDC SC-cZZ

Выход:

PASSWORD_01

Содержание sфайла:

49a48a95a68a82a79a87a83a83a65a80a
P
P
P
P
P
P
P
P
P
P
f

4
Я думал сделать vimсценарий из-за Ctrlхарактера; хорошо подумать, чтобы соединить это с dc! Кроме того, отличное решение :)
nneonneo

2
Сколько времени вам понадобилось, чтобы написать все эти теги <kbd> </ kbd>?
justhalf

15
@justhalf: Я написал это в vim с таким <Leader>kпереплетом map <Leader>k i<kbd></kbd>^[F>a, так что это было не так плохо, как кажется :-).
Тор

18
Теперь очевидно, что агент Тор хорошо знает свой инструмент. Вы заслуживаете пенсию, сэр!
Половина

67

Рубин, 57 + 10 ( *) = 67

$*<<4*4*5<<214%135<<44%25*5<<1%1
$><<"%cASSW%cRD%c%d1"%$*

Этот ответ использует *и %для построения значений ASCII отсутствующих символов (и 0 как Fixnum) и помещает их в $*( ARGV). Этот массив затем используется в сочетании со строкой формата для генерации правильного пароля, который печатается с помощью $><<( $>is stdout).

Рубин, 62 + 10 ( .) = 72, без разрыва строки

$>.<< "%cASSW%cRD%c%d1".% %w%%<<311%231<<214%135<<321%113<<1%1

Примерно тот же принцип, что и в приведенной выше версии, за исключением того, что здесь массив построен из пустого массива literal ( %w%%). .Чтобы получить желаемый приоритет оператора, нужно немного поиграться с ним.


13
«Это ваша последняя миссия перед уходом на пенсию с высокой зарплатой и благодарностью всего мира». Поздравляем, мы все благодарим вас :)
Timtech

4
Окончательное доказательство того, что Perl является одним из главных источников вдохновения для Ruby.
Пьер Арло

11
Как вы сделали разрыв строки?
Головоногий

4
@Arian Точно так же nneonneo запускает свой код Python после ввода его в REPL ... Я добавлю версию без перевода строки.
Вентеро

Злой гений установил рубин?
Mhmd

36

Пробелы (148 + 10 = 158)

Enter ключ должен быть использован здесь.

SS+1010000L // Push code of P
TLSS        // Output character
SS+1000001L // Push code of A
TLSS        // Output character
SS+1010011L // Push code of S
SLS         // Duplicate top stack
TLSS
TLSS
SS+1010111L // Push code of W
TLSS
SS+1001111L // Push code of O
TLSS
SS+1010010L // Push code of R
TLSS
SS+1000100L // Push code of D
TLSS
SS+1011111L // Push code of _
TLSS
SS+0L       // Push 0
TLST        // Output number
SS+1L       // Push 1
TLST        // Output number
LLL         // End program

Объяснение моей нотации:

  • S, +, 0Пробелы.
  • T, 1являются вкладками.
  • L это новая линия.
  • // начинает комментировать.

Каждая строка - это команда на языке пробелов.

демонстрация


1
Ах, чувак ... Я просто работал над этим :(
Теун Пронк

1
Я тоже, но я отказался от этого, зная, что кто-то будет быстрее
german_guy

Я думал, что «L» не было доступно?
500 - Внутренняя ошибка сервера

@ 500-InternalServerError: На самом деле Lозначает символ новой строки. Проверьте Демо для реального кода. То, что я отправил, является читаемой версией.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

Ах, теперь я понял.
500 - Внутренняя ошибка сервера

25

Питон ( 2200 395 + 10)

exec"""exec"exec"+"%ca"%34+"%c52+53"""+"%c55+55"%44+"%c34"%44+"%c45+35"%44+"%c"%44+"""34%%cexec"%"""+"%c"%54+"""1+"%c"%34+"%%5%c+"%5"""+"%c"%55+"""+"%c"%34+"%c"""+"%c"%112+"""r%%c%%ct%%c%%cASSW"+"%c%%34+"%34+"%c%%cRD"%34+"%c%%"""+"%c"%55+""""%34+"%c+"%5"""+"%c"%55+"""+"%c%%c"%34+"%c%%"%34+"%c5+"%5"""+"%c"%55+"""+"%c"%34+"%c1%%c"+"%c%%4"%34+"%c+"%5"""+"%c"%54+"""+"%c"%34+"%c%%a"+"%c%%34"%34"""

Мне понадобился +персонаж (стоимостью +10), который можно получить из цифровой клавиатуры (или на некоторых раскладках клавиш).

Да, БОМБА, вероятно, сработала, когда я печатал это.

Основной подход заключается в создании все больших наборов символов с использованием execи "%c"%(number). Есть четыре execвложенных друг в друга. Постепенно мой набор цифр прогрессирует от

  1. 12345
  2. 1234567 (6 = ASCII 54, 7 = ASCII 55)
  3. 123456789 (8 = ASCII 56, 9 = ASCII 57)
  4. 0x0123456789abcdef

так что в последней итерации можно выразить любой символ (так что самая внутренняя версия может вообще запустить любую программу).

Около 50% программы - это просто символы кавычек ( "%c"%34это двойные кавычки), потому что вложенная природа execоператоров требует агрессивного «экранирования» символов кавычек.


Если вы используете «+» на цифровой клавиатуре, вы не зависите от языка клавиатуры.
celtschk

@celtschk: Хорошая мысль! Я отредактирую это в.
nneonneo

1
Вместо того, чтобы строить наборы цифр с помощью вложенных программ, не могли бы вы получить числа с помощью арифметики? Ex. exec '%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c'%(112,114,51+54,55+55,1+115,32,4+35,25+55,11+54,31+52,31+52,32+55,24+55,31+51,13+55,41+54,3+45,4+45,4+35)
Кевин

2
Потому что вы не можете получить оба парана. (Я
учел

Кроме того, в Python не так много операторов, которые связываются сильнее, чем%. ** один, но он имеет тенденцию быть довольно бесполезным для построения большинства терминов.
nneonneo

25

Бессонница 39 35 31 29

Этот язык появился, когда я искал язык, который кодирует свои инструкции одним символом ASCII. Язык на самом деле работает с десятичным ASCII-кодом символа, поэтому он все еще достаточно гибок с половиной разрушенной клавиатуры.

Опустите его до 29 символов, что возможно после сокращения использования памяти и увеличения пространства поиска:

FdFzt%dF<rGdt>tt Gtreeet t%4s

Я решил запустить свою настроенную программу на полном наборе разрешенных символов и сократить решение до 31 символа:

FdFGt dtreeC>tt FFdx<Fdtr ztq4s

Я использовал программу для поиска этого решения. Это одно из многих решений, возвращаемых моей программой, с одинаковым размером.

Fddx>"eCeezdC>CefCdddzCzzfCqred>r4s

Старая версия построена вручную. Я помню, что не ложился спать до утра, чтобы сделать это.

Fddx>"eCeezdC>Cef>dx"dCezeeedeCrqeeC%4s

Вот переводчик Бессонницы для тестирования.


3
+1 за "просыпаться до утра" в соответствии с выбором языка программирования.
полугодие

20

Vim + PHP на некоторых оконных менеджерах

65 клавиш за 44 удара, с штрафом в 10 очков за использование =.

aEACE<Alt+Tab>z=5<Alt+Tab>$xxxxaASSWRD<Alt+Tab>z=1<Alt+Tab>
$a$aA<Alt+Tab>==wxx$r1<^X>a1

Разбивка:

  • Alt+Tabпохоже, работает как Escс Vim, или, возможно, с этим эмулятором терминала. Спасибо за то, что научили меня чему-то новому!
  • aEACE<Alt+Tab>: Войдите в режим добавления и вставьте «EACE». Выход.
  • z=5<Alt+Tab>: Выполнить исправление орфографии. Выберите 5, «МИР». Выход. ( Escкажется, работает как Enterздесь!)
  • $xxxxaASSWRD<Alt+Tab>: Перейти к концу строки. Удалить 4 символа и добавить ASSWRD, в результате PASSWRD. Вернуться в нормальный режим. (Нет, 4xне сработает.)
  • z=1<Alt+Tab>: PASSWORDЭто , вероятно , станет первой коррекцией для этого. Выберите это.
  • $a$aA<Alt+Tab>: Перейти к концу строки и добавить $aA. Вернуться в нормальный режим.
  • ==: Хорошо отформатируйте эту строку PHP, изменив значение camelCase $aAна $a_a. Это также перемещает курсор назад к началу строки.
  • wxx: Вперед слово; Курсор теперь раньше $. Удалите два символа - $и a-, чтобы сделать PASSWORD_a.
  • $r1: Перейти к концу строки и заменить текущий символ (т. Е. a) На 1, в результате чего PASSWORD_1.
  • ^X: Уменьшить целое число под курсором, в результате чего PASSWORD_0.
  • a1: Наконец, добавить 1, для PASSWORD_01!

Я не могу воспроизвести ==команду, она просто переключает режим большого отступа в моей установке vi (debian 7, v7.3.547)
Cengiz Can

11

Python 2, 75889 байт

Никакого лишнего персонажа!

К сожалению, код очень длинный. Вместо этого вот код для генерации программы:

x=[2**n for n in xrange(16)]
y=-5
print('exec"""exec'+x[7]*'%'+'c""'+x[6]*'%'+'cr'+x[-2]*'%'+'c'+x[-1]*'%'+'ct'+x[8]*'%'+'c'+x[-4]*'%'+'cASSW'+x[-5]*'%'+'cRD'+x[-3]*'%'+'c'+x[0]*'%'+'s1'+x[10]*'%'+'c '+x[9]*'%'+'c""'+x[y]*'%'+x[1]*'%'+'s'+x[y]*'%'+x[2]*'%'+'s'+x[y]*'%'+x[3]*'%'+'s'+x[y]*'%'+x[4]*'%'+'s'+x[y]*'%'+x[5]*'%'+'s"""'+'%`1>>1`%`2531>>5`%`321>>2`%`1521>>4`%`211>>1`%`221>>1`%112%34%34%34%34')

Попробуйте онлайн

(чтобы запустить код, измените внешний printвexec . Или, сгенерируйте программу, затем вставьте и запустите. Или скопируйте из ссылки, указанной ниже.)

Объяснение:

Цель состоит в том, чтобы выполнить:

print"PASSWORD_01"

Чтобы избежать использования ()+символов, мы должны использовать несколько операций формата строки, соединенных вместе. Это означает, что каждый добавленный шаг эффективно удваивает количество %символов, необходимых для каждого предыдущего шага:

print"%cASSW%%cRD%%%%c%%%%%%%%c1"%80%79%95%48

Однако этого недостаточно, потому что некоторые из требуемых чисел не могут быть созданы, и мы не можем их создать print. Поэтому мы добавляем уровень абстракции с помощью execfor printи уровень для кодовых точек ASCII, которые мы не можем создать для форматирования. Следующее по сути является моим ответом, но с каждой строкой, %уменьшенной до одной (обратите внимание, что %s%s%s%s%sэто не точное представление, не учитывающее обязательные литералы %перед каждым):

exec"""exec%c""%cr%c%ct%c%cASSW%cRD%c%s1%c %c""%s%s%s%s%s""" % `1>>1`%`2531>>5`%`321>>2`%`1521>>4`%`211>>1`%`221>>1`%112%34%34%34%34

Первый шаг: Наружная exec:

exec""" ... ASSW%cRD ... %s%s%s%s%s""" % `1>>1` % `2531>>5` % `321>>2` % `1521>>4` % `211>>1` % `221>>1`
  1. 1>>1: 0, используется для 0вPASSWORD_01
  2. 2531>>5: 79, используется для внутреннего exec для созданияO
  3. 321>>2: 80, используется для внутреннего exec для созданияP
  4. 1521>>4: 95, используется для внутреннего exec для создания_
  5. 211>>1: 105, используется для внутреннего exec для созданияi
  6. 221>>1: 110, используется для внутреннего exec для созданияn

Второй шаг: подготовить внутренний exec

После всего вышесказанного внутреннее execвыглядит примерно так:

exec%c""%cr%c%ct%c%cASSWORD%c01%c %c""%79%80%95%105%110

За исключением того, что вы не совсем поняли бы это. Тем не менее, с упрощениями, вы получите это:

exec%c""%cr%c%ct%c%cASSWORD%c01%c %c""798095105110

Литерал %должен быть включен. Так что в основном мне пришлось добавить кучу из них перед каждым, %sчтобы в итоге %осталось буквальное после всего форматирования. 2**11из них. Раз пять.

Остальные внешние execоперации форматирования строки являются %112%34%34%34%34. 112Для p, и другие кавычки. После их применения результат будет примерно таким:

exec"""pr%c%ct"%cASSW%cRD%c01" """%79%80%95%105%110

Но на самом деле это имеет кучу больше %. Это так:

exec"""pr%%%%%%%%c%%%%%%%%%%%%%%%%ct"%%cASSW%cRD%%%%c01" """%79%80%95%105%110

Последний шаг - просто запустить его, после чего вы получите необходимый вывод.


Полный код здесь: http://pastebin.com/rSFs6DiH


7
Впечатляет! Вы напечатали все это вручную, прежде чем взорвалась бомба? Без ошибок (без клавиши возврата)? Вы, сэр или мадам, заслуживаете вашей пенсии. ; D
DLosc

10

Баш + Вим (56)

Заимствуя Ctrl-XCtrl-Eтрюк bash из решения Тора, вот как я бы это сделал в bash + vim:

C-XC-E запускает редактор по умолчанию (обычно vim)

a запускает режим вставки

.space ASSW

C-Vx4f вставки O

RD

C-Vx5f вставки _

1

C-3эквивалентно escape(не только в vim, но и в любом месте терминала)

C-Xвычитает 1 из 1я только что набрал

a снова вставьте режим

1 C-3

содержимое буфера сейчас . ASSWORD_01

<< строка без отступа (без операции, поскольку строка не имеет отступа) и переместите курсор в 1-й столбец

a

C-X начать завершение слова

C-V в комплекте с бывшей командой

C-V Еще 9 раз выбирает запись Print

C-3 вернуться в нормальный режим

XXXxx удалений rint 

< < вернуться к столбцу 1

sудалить ., запустить режим вставки

e c C-X C-Vеще раз завершение команды ex, запись echoуже выбрана, потому что ecя только что набрал

space C-3 содержимое буфера сейчас echo PASSWORD_01

Z Z сохранить буфер, закрыть vim, bash выполняет содержимое файла, т.е. echo PASSWORD_01

Кстати: C-3имеет много полезных братьев: C-Jесть Enter, C-Iесть Tab, C-Hесть Backspace, C-2есть C-@(то есть нулевой байт). А для пользователей emacs приятно знать, что следующий Escapeза ним ключ соответствует Alt+ этому ключу. Таким образом, даже без, Escapeи Altвы все еще можете набрать Meta-x, как это:C-3x


9

Perl, (31 + 10/41 + 10/64 + 10)

( ^ключ используется, 3 способа)

exec"easswsrdcqw"^"5    <  <AF"                   # exec "PASSWORD_01"

  • Действителен, если выполняется как системная команда, квалифицируется как «вывод».

exec"QQZSqeasswsrdcqw"^"422<Q5    <  <AF"         # exec "echo PASSWORD_01"
  • Действительно, если мне разрешено использовать внешние команды / команды ОС. (Беги сюда)

exec"EQAXqwQqQZQxqeasswsrdcqwxqq"^q!5434QZ4S534$S5    <  <AF$SS! 
                  # exec "perl -e\"die\\\"PASSWORD_01\\\"\""
  • Действительно, если я могу выполнить Perl через систему. (Беги сюда) <- этот использует printвместоdie

Скрипты используют битовый оператор XOR в Perl ^ , который выполняет XOR для символьных битов двух строк. Это позволяет мне воссоздать пропущенные символы для PASSWORD_01 и создать символы для системной команды.

Я сделал три варианта в зависимости от того, насколько мягкими являются правила. Я предполагаю, что, поскольку варианты 2 и 3 фактически выводят слова на Ideone, решения являются действительными. Я удалил небольшую историю, которая была у меня здесь, так как я подумал, что никто не будет читать ее, но вы можете прочитать ее в редакции, если вам интересно!


4

oOo код (300)

QwerTaSdfGzxCqwertAsDfgZxCQwerTasDfgZxcQweRtaSDfgZxCqwertAsDFgZXcQWeRtaSdFGzxcQwERTasdfGzxc
QwErtAsdFgzxcqWeRtaSdFGzxcQweRtaSDfGZxCqWErTAsDFgZXCqWerTasDfgZxcQweRtaSdfGzxCQwErTAsDFgZXC
qWertAsDfgzxcQwERtASdFGzXcqWeRTasdFGzXcQWeRtAsDfgzxcQwERtASdFGzXCqWerTaSDfgzXcQWErTaSdFgZxc
QwertaSdFgzXcQWertASdFgZXCq

Легко. (Перевод строки не является обязательным, и просто здесь, чтобы сделать код «более читабельным») Используемый генератор кода:

o=lambda b,c:"".join(i.upper()if j else i for i,j in zip(__import__('itertools').cycle(c),map(int,"".join((3-len(i))*'0'+i for i in(bin('><[]-+.,'.index(i))[2:]for i in b)))))

Тот же код в менее глупой кодировке:

EeeeEeEeeEeeEeeeeeEeEeeEeEEeeeEeeEeeEeeEeeEeeEEeeEeEeeeeeEeEEeEEeEEeEeeEeEEeeeEeEEEeeeeEeee
EeEeeEeeEeeeeeEeEeeEeEEeeeEeeEeeEEeEEeEeEEeEEeEEeEEEeEeeEeeEeeEeeEeeEeeEeeEeeEEeEeEEeEEeEEE
eEeeeEeEeeeeeEeEEeEEeEEeEeeEeEEeeeEEeEeEEeEeEeEeeeeeEeEEeEEeEEeEEeEeeEeEEeeeEeEEEeEeEeEeEee
EeeeeeEeEeeEeEEeeeEEeEeEEEe


3

ferNANDo, 179 + 10 = 189 байт

2 1
1 2 1 2 1 1 1 1
1 2 1 1 1 1 1 2
1 2 1 2 1 1 2 2
1 2 1 2 1 1 2 2
1 2 1 2 1 2 2 2
1 2 1 1 2 2 2 2
1 2 1 2 1 1 2 1
1 2 1 1 1 2 1 1
1 2 1 2 2 2 2 2
1 1 2 2 1 1 1 1
1 1 2 2 1 1 1 2

Попробуйте онлайн!

Enterиспользуемый. Я бы использовал 0и 1сделать код более читабельным, но я не могу использовать 0.


Я думаю, что вход разрешен.
Конор О'Брайен,

2
ОП не сказал, что Ввод разрешен.
Акролит

3

JS-Forth, 103 байта

Строка будет возвращена в стек в виде массива символов.

12544 1 3 << >> 24 1 << 1521 4 >> 34 1 << 41 1 << 2531 5 >> 351 2 >> 332 2 >> 32 2 >> 131 1 >> 321 2 >>

Попробуйте онлайн - Комментируемая версия


Объяснение:

Сначала я нашел список разрешенных слов . По сути, единственное, что я мог бы использовать, это было бы полезно:

  • 12345 Числовые константы
  • << Сдвиг влево
  • >> Сдвиг вправо
  • s>f Нажмите сингл на стек
  • f>d Поп удвоить с поплавка
  • fsqrt Квадратный корень на стеке поплавка

Так что я мог бы использовать числовые константы, сдвиг битов и вычислить квадратный корень, используя следующее ( >>заменяет drop, сдвигая на, 0чтобы удалить 0):

s>f fsqrt f>d >>

К счастью, я нашел возможные сдвиги битов для каждой необходимой мне константы, которые короче, чем использование квадратных корней. По большей части я искал, просто печатая каждое число в квадрате, или большую степень двух, если какая-либо из них содержала цифру 6-0. Затем я понял, что могу использовать потерю точности, f>dчтобы найти больше возможностей. (Я мог бы добавить к числу, но все равно получить тот же самый квадратный корень из целых чисел.) Чуть позже я начал использовать сдвиг битов, чтобы найти некоторые, а затем и все константы. Чем больше >>битовое смещение, тем больше я могу добавить к «магическому числу» и все равно получить тот же результат. Поэтому я нашел самые маленькие битовые сдвиги, которые я мог использовать, чтобы получить необходимые результаты. Иногда можно было использовать <<четные числа, пришлось использовать шансы >>.

Код комментария ( \начинается комментарий):

\ 49
12544 1 3 << >>

\ 48
24 1 <<

\ 95
1521 4 >>

\ 68
34 1 <<

\ 82
41 1 <<

\ 79
2531 5 >>

\ 87
351 2 >>

\ 83 (x2)
332 2 >> 332 2 >>

\ 65
131 1 >>

\ 80
321 2 >>

gForth не имеет слов <<или >>. Вместо этого есть lshiftи то rshift, что я не мог использовать .


3

Десятичный , 190 180 + 10 = 190 байт

12055D12025D41D301212055D12010D41D301212055D12025D41D12003D41D30130112004D41D301212055D12024D41D30112003D41D301212055D12013D41D301212055D12040D41D301212045D12003D41D30112001D41D301

Попробуйте онлайн! Десятичный это эзотерический язык, который использует только десятичные дроби и буквы D. Однако мне потребовался штраф +10, потому что почти каждая команда использует 0.

К счастью, все команды, необходимые для печати PASSWORD_01, не требуют никаких чисел сверх 6:

  • 12...D - нажать персонажа
  • 2 - введите значение
  • 41D - вытолкнуть два верхних значения стека, умножить и сдвинуть результат
  • 301 - вывести DSI (индекс стека по умолчанию)

Повторно нажимая символьные значения, которые используют только цифры от 1 до 5, затем добавляя их, я могу сделать символьные значения для каждой буквы в PASSWORD_01.

Развернулся и прокомментировал:

12055D     ; push char 55 to stack
12025D     ; push char 25 to stack
41D        ; pop [DSI] and [DSI-1], add and push result
3012       ; print from stack to output, pop
12055D     ; push char 55 to stack
12010D     ; push char 10 to stack
41D        ; pop top two stack values, add and push result
3012       ; print from stack to output, pop
12055D     ; push char 55 to stack
12025D     ; push char 25 to stack
41D        ; pop x2, add, push
12003D     ; push char 3 to stack
41D        ; pop x2, add, push
301301     ; print, print
12004D     ; push char 4 to stack
41D        ; pop x2, add, push
3012       ; print, pop
12055D     ; push char 55 to stack
12024D     ; push char 24 to stack
41D        ; pop x2, add, push
301        ; print
12003D     ; push char 4 to stack
41D        ; pop x2, add, push
3012       ; print, pop
12055D     ; push char 55 to stack
12013D     ; push char 13 to stack
41D        ; pop x2, add, push
3012       ; print, pop
12055D     ; push char 55 to stack
12040D     ; push char 40 to stack
41D        ; pop x2, add, push
3012       ; print, pop
12045D     ; push char 45 to stack
12003D     ; push char 3 to stack
41D        ; pop x2, add, push
301        ; print
12001D     ; push char 1 to stack
41D        ; pop x2, add, push
301        ; print

3

Пробел , оценка: 111 (101 байт + 10 за Enter)

[S S T  T   T   T   T   T   N
_Push_-31_1][S S T  T   S S S S S N
_Push_-32_0][S S S T    T   T   T   N
_Push_15__][S S T   T   T   S S N
_Push_-12_D][S S S T    S N
_Push_2_R][S S T    T   N
_Push_-1_O][S S S T T   T   N
_Push_7_W][S S S T  T   N
_Push_3_S][S N
S _Duplicate_3_S][S S T T   T   T   T   N
_Push_-15_A][S S S N
_Push_0_P][N
S S N
_Create_Label_LOOP][S S S T S T S S S S N
_Push_80][T S S S _Add][T   N
S S _Output_as_character][N
S N
N
_Jump_to_Label_LOOP]

Буквы S(пробел), T(табуляция) и N(новая строка) добавляются только как подсветка.
[..._some_action]добавлено только для пояснения.

Попробуйте онлайн (только с необработанными пробелами, вкладками и новыми строками).

Объяснение в псевдокоде:

Это решение короче, чем в существующем ответе « Пробел» ( @ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ попросил меня опубликовать его как отдельный ответ, когда я предложил его в качестве гольфа), используя этот мой совет «Пробел» .

Push the code-points for the characters of "10_DROWSSAP" minus constant 80 to the stack
Start LOOP:
  Add 80 to the current code-point
  Pop and output it as character
  Go to the next iteration of LOOP

Константа 80была сгенерирована с помощью этой Java-программы , которую я создал и использовал для моих предыдущих ответов о пробельных символах.


2

Stax , 91 + 10 байт

"W"EEEd$"$"1 !$Re]"$""ASSW"R"$""a"EEE$"$"a$Re]R"$""RD"R"$""a"EEEd$"$""5"Re]R"$"1 !$R"$""1"R

Попробуйте онлайн!

Использует ]для изготовления синглетонов.

объяснение

Давайте посмотрим, как "P"генерируется и как "ASSW"добавляется без использования обычного +.

"W"                             Push "W", or [87]
   E                            Convert to a scalar, 87
    E                           Convert to an array of digits, [8,7]
     E                          Push 8 on the stack, then push 7.
      d                         Pop the 7 and discard it.

                                Start making components of regex substitution
       $                        Pop 8, push "8"
        "$"                     Push "$"
           1 !                  Push 0. The space is necessary because normally one doesn't do 1! to obtain 0
              $                 Pop 0, push "0"
               R                Do regex substitution 's/$/0/g' on the string "8"

                                Basically doing "8"+"0" without using +
                e               Pop "80", push 80
                 ]              Singleton. Pop 80, push [80], or "P"
                  "$""ASSW"R    Use the same trick again to append "ASSW" to "P"

Остальные просто повторяют один и тот же трюк.

"a"EEE$"$"a$Re]Rменяет местами цифры "a"или [97]для создания [79]или "O"и добавляет их в строку.

"$""RD"R appends "RD",

"$""a"EEEd$"$""5"Re]R"a"снова использует для получения "9"и отбрасывания "7", затем комбинирует "9"с литералом "5"для формирования [95]или "_"и добавляет его к строке.

"$"1 !$R получает ноль по логическому значению, отличному от 1, и добавляет его в строку.

"$""1"Rдобавляем финал "1"и все готово.

Неявный вывод.


1
О_О ... это умно.
рекурсивный

Спасибо за благодарность. Я считаю, что его можно сделать короче (возможно, выбрав другой ключ?).
Вейцзюнь Чжоу

2

бред , 400 + 10 ( +) = 410 байт

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.<.>>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++..++++.<<++++++++++++++.+++.>>>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.<++++++++.>>>>++++++++++++++++++++++++++++++++++++++++++++++++.+.<

Попробуйте онлайн!


2

MS-DOS .COM 8086 машинный код (72 байта)

Время драгоценно, так что нет времени на компиляцию или интерпретацию! Просто откройте текстовый редактор по вашему выбору и введите следующее (замените \tна TAB):

451D<1DAQX1D11D3AQX4c1DDQX4<SZ!Gq\tGq3WqEEEEESX5\t\t2!<<<<<<<<<eASSWzRD<11$

Как hexdump:

00000000 : 34 35 31 44 3C 31 44 41 51 58 31 44 31 31 44 33 : 451D<1DAQX1D11D3
00000010 : 41 51 58 34 63 31 44 44 51 58 34 3C 53 5A 21 47 : AQX4c1DDQX4<SZ!G
00000020 : 71 09 47 71 33 57 71 45 45 45 45 45 53 58 35 09 : q.Gq3WqEEEEESX5.
00000030 : 09 32 21 3C 3C 3C 3C 3C 3C 3C 3C 3C 65 41 53 53 : .2!<<<<<<<<<eASS
00000040 : 57 7A 52 44 3C 31 31 24                         : WzRD<11$

Сохраните как файл .COM и запустите его, чтобы сохранить день.

Код предполагает определенные начальные значения для регистров , поэтому может не работать для всех разновидностей DOS. Просто надеюсь, что кто-то рискует быть уволенным, не купив IBM.

Чуть более понятное представление:

org 0x100
bits 16
cpu 8086

; Assumes the following start values for registers (as per http://www.fysnet.net/yourhelp.htm):
;
;   AX = 0
;   BX = 0
;   CX = 0x00ff
;   SI = 0x100

; Change e => P and z => O
    xor al, 0x35
    xor [si+0x3c], ax
    xor [si+0x41], ax

; Fix int 0x21 and ret
    push cx
    pop ax              ; AX = 0xFF
    xor [si+0x31], ax
    xor [si+0x33], ax

; Change <1 => _0
    inc cx              ; CX = 0x100
    push cx
    pop ax              ; AX = 0x100
    xor al, 0x63        ; AX = 0x163
    xor [si+0x44], ax

; We're using DOS interrupt 0x21, function 0x09 to output the final string.

; AH must equal 0x09 to select the function.
; DS:DX must point to the $-terminated string we want to output.

; Get DX to the correct value (0x13c)
    push cx
    pop ax              ; AX = 0x100
    xor al, 0x3c        ; AX = 0x13c
    push bx
    pop dx              ; DX = 0

; We use part of the Program Segment Prefix to temporarily store the value,
; since MOVing or PUSHing AX is impossible.
; The part in question is the second File Control Block, which we will not use anyway.
    and [bx+0x71], ax
    or [bx+0x71], ax
    xor dx, [bx+0x71]   ; DX = 0x13c

; NOPs to get int 0x21 and ret on high enough addresses
    inc bp
    inc bp
    inc bp
    inc bp
    inc bp

; Set AH to the correct value. AL is set too, but is ignored by the DOS interrupt.
    push bx
    pop ax              ; AX = 0
    xor ax, 0x0909      ; AX = 0x0909

; What will become instructions int 0x21 and ret
    db 0x32, 0x21
    db 0x3c

; Padding to have the password at an address we can refer to.
    times 60-($-$$) db '<'

; Password
    pw  db  "eASSWzRD<11$"

1

Befunge-98, 43 +10 = 53 байта

"1qA·DR·WSSA·g"%,$,,,,$"s"%,,,$"c"%,%,,q

Попробуйте онлайн!

10-байтовый штраф за использование ,ключа (не уверен, почему это не может быть выполнено с Shift+ <, но это, кажется, правило). И хотя технически источником является 40 символов, эти три ·символа вносят дополнительные три байта из-за их кодировки UTF-8.


1

05AB1E , 87 86 байт

"."A1.$R24.$AT<.$R15>.$A21<.$R5.$.V.VD21s.V.V15>X.V"ASSW"15X.V"RD"122D<s2X.V.VTRTX.V.V

Попробуйте онлайн!

Может быть, самый длинный код 05AB1E?

К сожалению, язык не поддерживает такие вещи, как "Q"<«декремент Q, чтобы получить P»

Мой дополнительный ключ V.

Спасибо @Kevin Cruijssen за -1 байт.

Код:

Build the string ".b". This is the code to turn integers to upper case letters:
"."             push "."
A               push the lower case alphabet
1.$             drop the first letter of that
R               reverse the remaining string 
24.$            drop the first 24 letters of that, so only "b" remains
AT<.$R15>.$     do the same trick for "j"
A21<.$R5.$      and for "u" 
.V              run "u" as code to turn "j" to "J"
.V              run "J" as code, to join ".", "b" to ".b"

Save that string for later use:
D               duplicate
21              push 21
s               switch the top two elements [".b", 21, ".b"]
.V              run ".b" as code, to get "U"
.V              run "U" as code, to save ".b" in X

Build password string:
15>X.V          push the 16th letter of the alphabet ("P")
"ASSW"          push "ASSW"
15X.V           push "O"
"RD"            push "RD"
122D<s2X.V      push 121, 122, "B"
.V              run that as code to push "_"
TR              push 01
TX.V            push "J"
.V              run that as code, to join everything to the desired string 

Для сравнения: самый короткий способ печати "ПАРОЛЬ_01" - это 6 байтов

Попробуйте онлайн!


« Может быть, самый длинный код 05AB1E? » Нет, этот мой почти в 6 раз больше . ; p Хороший ответ независимо. Трудно использовать только определенное количество разрешенных символов ASCII. Так много удобных встроенных функций не разрешены для этой задачи. :(
Кевин Круйссен

1
-1 байт, используя TRвместо того , 1<1для 01части выходного сигнала.
Кевин Круйссен

1

Emacs, 26 байт (возможно, + 10 = 36 или - 2 = 24)

Дополнительный ключ , который необходим в этом ответе есть Esc. Это половина клавиатуры, которая все еще не повреждена, но по какой-то причине не упоминается в этом вопросе, поэтому может давать или не давать штраф к счету. ( Escи Altэквивалентны в Emacs; Altон также находится на неповрежденной половине клавиатуры, но не упоминается в вопросе, но его нужно удерживать, а не постукивать, чтобы я не мог использовать его в качестве дополнительной клавиши. Это сохранит два байта тем не менее, потому что у него более короткая кодировка, чем Escу.)

Сама программа (запятые ограничивают границы между байтами в формате «на проводе», который Emacs использует для приема ввода):

W, S, Esc, $, D, A, Ctrl- T, S, R, W, D, Esc, $, 5, Ctrl- Q, 5, f, Ctrl- X, r, Ctrl- Space, 1, Ctrl- X, r, g, 1, Ctrl-T

Кодирование этого как необработанные байты, чтобы доказать количество байтов:

00000000: 5753 1b24 4441 1453 5257 441b 2435 1135  WS.$DA.SRWD.$5.5
00000010: 6618 7200 3118 7267 3114                 f.r.1.rg1.

(Примечание: некоторые детали могут различаться в зависимости от того, как сконфигурирован Emacs; для этого ответа необходимо установить значение quoted-char-radix равным 16, а для Emacs использовать словарь проверки орфографии, который по умолчанию установлен в моей системе британского английского языка. как разумные настройки конфигурации, но возможно, что ваша копия Emacs может быть настроена по-другому. Другой словарь, вероятно, все равно будет содержать 26-байтовую программу, но, возможно, придется использовать несколько иные орфографические ошибки, чтобы требуемые исправления могли быть приняты ключи без пули.)

объяснение

Я не уверен, должно ли это иметь какое-либо влияние на войны редакторов, но Emacs, кажется, побеждает vim, по крайней мере, в случае этого вопроса. Emacs довольно подходит для редактора гольфа, измеряемого в байтах, потому что он в значительной степени опирается на аккорды, которые занимают несколько нажатий клавиш, но только один байт (таким образом, программа Emacs часто медленнее набирает текст, чем эквивалентная программа Vim, но короче на диске). Кроме того, большинство наиболее важных команд Emacs находятся в левом нижнем углу клавиатуры, чтобы быть очень близкими Ctrl, очень полезными для такого вопроса, как этот.

«Вы можете предположить, что у вас открыта оболочка интерпретатора / редактор исходного кода до того, как появились пули. К сожалению, вы ничего не написали до того, как нажали на клавиатуру», поэтому я предполагаю, что у нас есть открытый файл в Emacs и Нужно ввести пароль в него. (Затем нам нужно сохранить файл и, возможно, выйти из Emacs, но байты для этого не учитываются в ответах других людей, поэтому я их здесь тоже не считаю. Это вполне выполнимо, используя левую часть клавиатура, хотя, Ctrl- X, Ctrl- S, Ctrl- X, Ctrl- C.)

Принимая команду (или блок похожих команд) одновременно:

  • W, S: Введите WSв документ.
  • Esc, $: Вызвать проверку орфографии. WSне настоящее слово, но оно находит много похожих двухбуквенных слов.
  • D: Использование проверки орфографии, правильно WSк PS. (Когда проверка орфографии вызывается с помощью Alt- $, как это произошло здесь ( Escи Altэквивалентно Emacs), он проверяет только одно слово, поэтому после этого он деактивируется.)
  • A: вставка A, подача PSA.
  • Ctrl- T: поменяйте местами два предыдущих символа, давая PAS.
  • S, R, W, D: Тип SRWD, даяние PASSRWD.
  • Esc, $, 5: Мы призываем к орфографии , опять же , потому что мы хотим , чтобы исправить нашу опечатку PASSRWDв PASSWORD. Обратите внимание, что мы не можем угадать слово, которое мы хотим с нашей первой попытки, как это было бы с PASSWRD, потому что ключом для принятия ближайшего реального слова является то, 0что мы не можем нажать. В результате, чуть более экстремальное неправильное написание PASSRWDиспользуется для перевода нужного слова в положение 5, где мы можем его принять.
  • Ctrl- Q, 5, f: Вставить символ с кодом символа U + 5f, то есть _. Теперь документ читает PASSWORD_(или будет, когда мы начнем вводить следующую команду; до этого подчеркивание не появляется в случае, если мы вводим другую шестнадцатеричную цифру).
  • Ctrl- X, r, Ctrl- Space, 1: Сохранение текущей позиции курсора (относительно начала файла) в регистре 1. По какой - то странной причине, это 1-индексируется, так (написав 9 символов до сих пор) курсор находится в положении 10.
  • Ctrl- X, r, g, 1: Скопируйте содержимое регистра 1 в документ. Это теперь читает PASSWORD_10.
  • Ctrl- T: поменяйте местами два символа перед курсором. Теперь у нас есть PASSWORD_01, как вопрос просит.

Если нам разрешено использовать Alt, мы, вероятно, можем закодировать команду «invoke spellchecker» как один байт, a4а не записывать ее как 1b 24; он появляется дважды, что приводит к экономии двух байтов. (Большинство современных терминалов используют 1b 24в качестве кодировки для Alt- $чтобы избежать конфликтов с UTF-8, но время a4от времени также встречается кодирование, иногда доступное в качестве опции конфигурации.)

Возможная экономия байтов, вероятно, связана с ошибками игроков в гольф для исправления. PSASWRDбыло бы на байт короче, но, к сожалению, проверка орфографии, кажется, не способна PASSWORDизвлечь из этого пользу , так PASSRWDчто это лучший подход, который я нашел до сих пор. Подход на основе регистров к получению 10также смехотворно громоздок, но в Emacs не так много способов создавать числа из ниоткуда, и 0это болезненный характер, чтобы заполучить иное. (По крайней мере, было несколько удивительно полезных совпадений: курсор, как оказалось, оказался в положении 10, которое содержит 0, когда это необходимо, и тот факт, что Emacs принимает избыточную gоперацию с регистром, чтобы вставить содержимое регистра в документ , в дополнение к более интуитивнымi.)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.