ЗБЕРІГУЙТЕ БОМБУ!


214

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

Це ваша остання місія перед відставкою з високою зарплатою та вдячністю всього світу. Але перед тим, як вам змусити роззброїти Велику надмірно масивну BOMB злого генія (здається, злий геній - розумна дупа, яка любить рекурсивні абревіатури). У будь-якому разі ви з вашим приятелем перебуваєте в самому ядрі таємної бази Evil Genius, готової роззброїти BOMB, яка може знищити континент. У попередній місії вам вдалося отримати код роззброєння, який, на ваш подив, є просто "PASSWORD_01". Ви підключаєте клавіатуру до BOMB, але коли ви готові йти, прихильники Evil Genius заходять із кулями. На жаль, одна з цих куль впливає на вашу клавіатуру. "Закінчіть роботу, поки я відволікаю ці d * ckheads!" каже твій приятель, а потім починає стріляти з рушниці.

СПЕЦІ

  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. У вас немає віртуальної клавіатури. Насправді у BOMB є детектор TOO_FUNNY, який змусить його вибухнути, якщо ви спробуєте скористатись лазівками Standard .

  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)

Я сиджу в підказці, яка була налаштована злим генієм, і, звичайно, він є 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кіт <<< f >> s

    Виконати сценарій 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
Тепер очевидно, що агент Тор добре знає свій інструмент. Ви заслуговуєте на пенсію, сер!
justhalf

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

Приблизно той самий принцип, що і у наведеній вище версії, за винятком того, що тут масив побудований з пустого буквального масиву (%w%% ). .Для отримання бажаного переваги оператора потрібне деяке пограбування .


13
"Це ваша остання місія, перш ніж вийти на пенсію з високою зарплатою та вдячністю всього світу". Вітаємо, всі ми дякуємо :)
Timtech

4
Кінцевим доказом того, що Perl є одним з найбільших натхненників Рубі.
П'єр Арло

11
Як ви зробили рядок?
Головоногі

4
@Arian Так само, як nneonneo запускає свій код Python після введення його у відповідь ... Я додаю версію без рядкового рядка.
Вентеро

Чи встановлений злий геній рубіну?
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
Ах, людина ... Я тільки працював над цим :(
Teun Pronk,

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), який можна отримати з numpad (або на певних макетів ключів).

Так, BOMB, ймовірно, пішов, поки я це набирав.

Основний підхід - побудувати все більші набори символів за допомогою 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
Замість того, щоб побудувати розрядні множини з вкладеними execs, ви не могли отримати числа за допомогою арифметики? Вих. 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
Тому що ви не можете отримати обох паренів. (Я це врахував!)
nneonneo

Крім того, у 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

Ось перекладач Insomnia для тестування.


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

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, "PEACE". Вхід. ( 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,

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на anexec . Або генеруйте програму, потім вставте та запустіть. Або скопіюйте з приєднаної нижче пасти.)

Пояснення:

Мета - виконати:

print"PASSWORD_01"

Щоб уникнути використання ()+символів, ми повинні використовувати кілька операцій формату рядків, пов'язаних між собою. Це означає, що кожен доданий крок ефективно подвоює кількість %знаків, необхідних для кожного попереднього кроку:

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

Однак цього недостатньо, оскільки деякі необхідні номери неможливо створити, і ми не можемо створити print. Таким чином, ми додаємо рівень абстракції з execдля printing, і рівень для 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, використовується для внутрішнього виконання для створенняO
  3. 321>>2: 80, використовується для внутрішнього виконання для створенняP
  4. 1521>>4: 95, використовується для внутрішнього виконання для створення_
  5. 211>>1: 105, використовується для внутрішнього виконання для створенняi
  6. 221>>1: 110, використовується для внутрішнього виконання для створення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
Вражає! Ви набрали все це вручну, перш ніж BOMB вибухнув? Не допускаючи помилок (немає зворотної клавіші)? Ви, пане чи пані, заслуговуєте на свою пенсію. ; D
DLosc

10

bash + vim (56)

Запозичення Ctrl-XCtrl-Eбаш-трюку з рішення Тор, ось як я це зробив у 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 доповнити команду ex

C-V Ще 9 разів вибирає запис Print

C-3 повернення до звичайного режиму

XXXxx видаляє rint 

< < повернутися до колонки 1

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

e c C-X C-Vex команда завершення ще раз, запис 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.


Я думаю, що вхід дозволений.
Conor O'Brien

2
ОП не сказали, що Enter було дозволено.
акроліт

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 Поп-двійник з float stack
  • fsqrt Квадратний корінь на float стек

Тож я міг використовувати числові константи, зсув бітів та обчислити квадратний корінь за допомогою наступного ( >>замінює 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]додано лише як пояснення.

Спробуйте його в режимі он-лайн (лише з просторами, вкладками та новими рядками).

Пояснення в псевдокоді:

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

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 , яку я створив і використовував для деяких попередніх моїх відповідей Whitespace.


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 байти)

Час дорогоцінний, тому немає часу на багаторазове спілкування з упорядниками чи перекладачами! Просто відкрийте текстовий редактор на вибір та введіть наступне (замініть \tTAB):

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

Як шестикутник:

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"<"decrement Q to get P"

Мій додатковий ключ - це В.

Завдяки @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 

Для порівняння: найкоротший спосіб друку "PASSWORD_01" - 6 байт

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


" Можливо, найдовший код 05AB1E коли-небудь? " Ні, цей мій майже в 6 разів більший . ; p Приємна відповідь незалежно. Важко використовувати лише певну кількість дозволених символів ASCII. Стільки зручних вбудованих не допускаються до цього завдання. :(
Кевін Круїссен

1
-1 байт, використовуючи TRзамість того , 1<1для 01частини вихідного сигналу.
Kevin Cruijssen

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; для цієї відповіді потрібна цитата-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, ми, ймовірно, можемо кодувати команду "викликати перевірку орфографії" як єдиний байт, a4а не прописувати її як 1b 24; вона з’являється двічі, що призводить до двох байтів економії. (Більшість сучасних терміналів використовують 1b 24для кодування Alt- $щоб уникнути сутичок з UTF-8, але a4кодування також зустрічається час від часу, іноді доступне як варіант конфігурації.)

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

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