Кратчайший кодекс Konami

15

Проблема

Вы должны написать программу, которая при вводе кода Konami во время выполнения выводит на экран строку « +30 lives» и из динамика компьютера выбирает какой-либо шум по вашему выбору.

Определение

«Код Konami» определяется UUDDLRLRBAнажатием клавиши ввода.

Правила

  • Вы можете использовать стрелку вверх для U, вниз для D, влево Lи вправо R, если ваш код соответствует стрелкам или буквам.
  • Ваш ввод может быть принят от контроллера или клавиатуры, но не должен поддерживать оба.
  • Существующие ответы могут продолжать использовать BABAвместо BA, но могут также сократить его, если они захотят это сделать. Будущие ответы все должны использовать BAдля согласованности.

  • Пустой ввод не должен поддерживаться.

Кристофер
источник
Комментарии не для расширенного обсуждения; этот разговор был перенесен в чат .
Мартин Эндер

Ответы:

13

05AB1E , 33 байта (Fine на пустом входе)

Dg0Qiq}•ï“뙵yê!•36BQi7ç“+30™‹“J,

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

05AB1E , 30 26 байт ( )

-4 спасибо Аднану

•ï“뙵yê!•36BQi7ç,“+30™‹“,

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

•ï“뙵yê!•36B                  # UUDDLRLRBABA in base-214, converted back to base-36.
             Qi                # If implicit input is equal to...
               7ç,             # Print 7 converted to a character to the console (bell sound)...
                  “+30™‹“, # Print +30 lives.

Отказ от ответственности: Звук звонка не воспроизводится на TryItOnline, возможно, спросите Денниса, не пингует ли его сервер где-нибудь при запуске.

Урна волшебного осьминога
источник
Вы почти выиграли! Всего один байт
Кристофер
2
Сжатая версия "+30 lives"является “+30™‹“:)
Adnan
Это всегда выдает «+30 жизней» для меня на онлайн-переводчике, даже при пустом вводе.
redstarcoder
2
@redstarcoder Only * с пустым вводом, хрень, исправление
Волшебный осьминог Urn
@carusocomputing вы можете это исправить, BA должен быть только один раз (моя вина, извините)
Кристофер
7

JavaScript (ES6), 202 200 198 байт

Проверено только на Chrome и Firefox. Использует UDLRвместо клавиш со стрелками. Пожалуйста, убедитесь, что CapsLock выключен.

(o=(A=new AudioContext()).createOscillator()).connect(A.destination);s='';document.onkeyup=e=>{(s+=e.key[0]).slice(-11)=='uuddlrlrbaE'&&setTimeout('o.stop()',500,console.log('+30 lives'),o.start())}
Please click inside this area to make sure it gets focus.

Arnauld
источник
Вы можете это исправить, БА должен быть только один раз (моя вина, извините)
Кристофер
7

Python 3,  55  53 байта

-1 байт благодаря isaacg (используйте поразрядно, чтобы не заменять -10на ~9).
-1 байт благодаря CalculatorFeline (можно использовать буквальный BELбайт).

while'UUDDLRLRBA'!=input()[~9:]:1
print('+30 lives7')

где 7показанное выше является буквенным байтом 0x07(непечатным в блоке кода).

После нажатия Enter whileпроверяется состояние цикла. Если последние ~910 символов (не более) не соответствуют коду команды Contra, то выполняется no-op 1(замена passдля краткости); если они делают совпадают , то в то время как замкнйте и printвыполняются оператор, который записывает необходимый текст вместе с ASCII колокол символом ( «тревога») 0x07, который производит звук , если он не был явно запрещен (или терминал не имеет динамика !).

Джонатан Аллан
источник
Вы можете это исправить, БА должен быть только один раз (моя вина, извините)
Кристофер
Исправлено, спасибо за головы.
Джонатан Аллан
1
-10= ~9, который может сэкономить вам байт.
Исаак
Разве вы не можете поместить литерал \ x07 в строку для -1 байта?
CalculatorFeline
@ CalculatorFeline Понятия не имею, можно? Заметьте, что люди часто используют \nструны в гитаре Python, почему бы их не использовать \x0a?
Джонатан Аллан
5

Желе, 33 30 29 27 байт

ɠ⁻“UUDDLRLRBA”$¿ṛ7Ọ“¡}ʠƈ[ỵ»

Оказывается, append ( ) не нужен, строки автоматически объединяются и распечатываются.

ɠ⁻“UUDDLRLRBABA”$¿ṛ7Ọṭ“¡}ʠƈ[ỵ»

несжатого

ɠ⁻“UUDDLRLRBABA”$¿ṛ7Ọṭ“+30 lives”

Попробуйте онлайн.
Если вы удалите все после ¿, вы можете связываться с вводом и видеть, что он возвращается только тогда, когда введенная строка верна.

ɠ⁻“UUDDLRLRBABA”$¿ṛ7Ọṭ“+30 lives” - main link
ɠ                                 - takes a line of input
 ⁻“UUDDLRLRBABA”$                 - $ groups it into a monadic !="UUDDLRLRLRBABA"
                 ¿                - while (the inequality, which takes from the getline)
                  ṛ               - take the right argument (to ignore the input string)
                   7Ọ             - chr(7), the bell character
                     ṭ“+30 lives” - append that bell character to the output

Спасибо @JonathanAllan за помощь в определении сжатия строк :)

JayDepp
источник
“+30 lives”Сжатие есть “¡}ʠƈ[ỵ»(для дальнейшего использования здесь есть пост об этом, он связан в учебнике на вики Jelly).
Джонатан Аллан
где звук?
Tuskiomi
1
Я только что проверил его с официальным интерпретатором, и он действительно зацикливается, пока не будет введен код Konami
JayDepp
@JayDepp вы можете это исправить, BA должен быть только один раз (моя вина, извините)
Кристофер
Я считаю, что это не столько автоматическая конкатенация строк, сколько неявная печать LLC (ведущая цепочка констант), 7Ọза которой следует неявная печать nilad “¡}ʠƈ[ỵ», появляющаяся в stdout, как если бы это была конкатенация. В качестве демонстрации вы можете попробовать добавить 2-секундный сон между с ɠ⁻“UUDDLRLRBABA”$¿ṛ7Ọ2“+30 lives”œS.
Джонатан Аллан
5

Обработка, 161 157 155 байтов

String k="";void keyTyped(){if(match(k+=key,"uuddlrlrba\\n$")!=null){print("+30 lives");new processing.sound.SoundFile(this,"a.mp3").play();}}void draw(){}

Аудио файл должен быть сохранен как sketchName/data/a.mp3. Примечание. Я тестировал эту программу только без аудиофайла, потому что мне лень скачивать mp3файл (поскольку из него поддерживаются только ограниченные расширения processing.sound.SoundFile).

draw()Функция необходима , чтобы быть там для того , чтобы keyTypedработать.

Причина, по которой мы используем, keyTypedзаключается в том, что в Processing нет STDIN, он может прослушивать только нажатия клавиш во время запуска эскиза.

объяснение

String k="";
void keyTyped(){
  if(match(k+=key,"uuddlrlrba\\n$")!=null){
    print("+30 lives");
    new processing.sound.SoundFile(this,"a.mp3").play();
  }
}
void draw(){
}

Все нажатия клавиш пользователя хранятся в виде символов в строке k. Это keyTypedвстроенная функция, которая вызывается всякий раз, когда пользователь вводит ключ. Одновременно мы проверяем, заканчивается ли эта строка нажатиями клавиш. Затем мы печатаем +30 livesи воспроизводим звуковой файл. И drawфункция существует для постоянного обновления keyTyped. После ввода кода Konami больше ничего выводиться не будет, и звук не будет воспроизводиться.

Kritixi Lithos
источник
Похоже, вы должны посчитать размер вашего mp3 файла
@ricyje Обработка на самом деле не имеет никакого другого способа вывода звука. Кроме того, размер .mp3файла на самом деле не имеет значения, поскольку независимо от того, что это такое, обработка будет воспроизводить его как звук
Kritixi Lithos
@KritixiLithos вы можете это исправить, БА должен быть только один раз (моя вина, извините)
Кристофер
@ChristopherPeart Готово! (Я рад сохранить еще 2 байта :)
Kritixi Lithos
4

> <>, 132 69 64 62 байта *> <> , 84 байта

i:1+?\0[
:1+?!\i
BA"a~/"UUDDLRLR
{v!?l/!?=
7/"+30 lives"
o<;!?l

Попробуй это здесь!

Это зависит от звонка колокола (ASCII 7 ) для шума в конце (не слышно в онлайн-переводчике).

Спасибо @TealPelican за сохранение еще 15 байтов!

Сохранены два байта для проверки BAвместо BABA.

redstarcoder
источник
Это издает звук?
Критиси Литос
@KritixiLithos, да, вы увидите, что на второй-последней строке в самом конце стоит «7», это колокольный звон.
Redstarcoder
Я немного переработал ваш код, потому что не совсем понял, как используются первые строки? Попробуйте здесь. Эта ссылка для> <>, но работает и для *> <> (не использует механику погружения, как у вас) - она ​​также сэкономила 19 байт! :)
Тил пеликан
@Tealpelican, первая строка, так что он продолжает работать, ожидая ввода! Ваша связанная версия не делает этого; с.
redstarcoder
Вы правы! Я пропустил это! - Я добавил строку, чтобы учесть мою ошибку, и заменил некоторые избыточные реверсирование и печать. Попробуйте новую версию, которую я получил до 67 байт: D
Teal pelican
3

C 119 -1 - 2 = 116 байт

Golfed

i;f(){char a[14];a[13]=0;while(strcmp(a,"UUDDLRLRBA"))for(i=0;i<12;a[i]=a[i+++1]);a[i]=getch();puts("+30 Lives\a");}  

Ungolfed

#include<stdlib.h>
#include<conio.h>

i;
f()
{
    char a[14];
    a[13]=0;
    while(strcmp(a,"UUDDLRLRBA"))
    {
        for(i=0;i<12;a[i]=a[i+++1]);
        a[i]=getch();
        puts(a); //This is to print every step in the runtime
    }
    puts("+30 Lives\a"); // '\a' is the acsii char that makes sound when passed to STDOUT
}

main()
{
    f();
}
Мукул Кумар
источник
s/UUDDLRLR BABA/UUDDLRLRBABAдля -1 байта и strcmp будет искать правильную строку!
Redstarcoder
@ Кристофер, пожалуйста, никогда не вносите изменения в код людей на этом сайте Stack Exchange. Ваше редактирование никогда не должно быть одобрено.
кот
Мукул, ты можешь убрать пространство самостоятельно.
кот
1
@MukulKumar Конечно :) важно, чтобы ответчик редактировал свой собственный код.
кот
1
@MukulKumar вы можете это исправить, БА должно быть только один раз (моя вина, извините)
Кристофер
3

С накоплением , 41 байт

['+30 lives'BEL+out]prompt'UUDDLRLRBA'=if

Читает ввод с клавиатуры.

['+30 lives'BEL+out]prompt'UUDDLRLRBA'=if
[                  ]prompt'UUDDLRLRBA'=if  if the input is the desired string,
 '+30 lives'BEL+out                           output '+30 lives' and the BEL character. 
Конор О'Брайен
источник
3

AutoHotkey, 63 байта

Input,K,L10
if(K="UUDDLRLRBA"){
MsgBox,"+30 lives" 
SoundBeep
}

После запуска этого скрипта он проверит, являются ли следующие 10 ключей кодом Konami, и если это так, он покажет окно с сообщением «+30 жизней» и должен подать звуковой сигнал (у меня нет ораторов для тестирования ).

Кодос Джонсон
источник
Здорово! AutoHotkey - интересная программа.
Кристофер
3

GNU sed, 32 25 + 1 = 33 26 байт

+1 байт за -nфлаг.

/UUDDLRLRBA$/a+30 Lives\a

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

объяснение

При каждом нажатии клавиши ввода ( $) программа проверяет, были ли предыдущие 10 нажатий клавиш кодом. Если это так, aкоманда ставит в очередь текст +30 Livesи звук колокольчика ( \a) для печати в конце текущего цикла (что в данном случае происходит немедленно).

Иордания
источник
Вы можете это исправить, БА должен быть только один раз (моя вина, извините)
Кристофер
Это уже есть BAтолько один раз.
Джордан
Ух ты, не заметил
Кристофер
3

Mathematica, 50 байтов

While[x=!=UUDDLRLRBA,x=Input[]];Beep[];"+30 lives"

Первоначально, xэто просто символ и, следовательно, не совпадает ( =!=) с символом UUDDLRLRBA, поэтомуx=Input[] оценивается. Это откроет диалоговое окно с курсором уже в поле ввода, так что пользователь может сразу же начать печатать на клавиатуре.

Если Enterнажата или OKнажата без ввода чего-либо, то InputField[]вернется Null, который не идентиченUUDDLRLRBA , поэтому цикл продолжается, и открывается другое диалоговое окно.

Если пользователь щелкнет Cancelили иным образом выйдет из диалогового окна, он InputFieldвернется $Canceled, что также не совпадает сUUDDLRLRBA , поэтому цикл будет продолжен.

Пользователь может ввести в диалоговом окне по своему желанию. Когда они нажимают Enter, их ввод интерпретируется как выражение языка Wolfram (возможно, просто блоки). Если это выражение отличается от символа UUDDLRLRBA, цикл будет продолжен.

«Зацикливание до тех пор, пока не будет введен код Konami», немного расплывчато, но я считаю, что это удовлетворяет его. После завершения Whileцикла .Beep[];"+30 lives"

ngenisis
источник
Вы можете это исправить, БА должно быть только один раз (моя вина, извините)
Кристофер
1
UUDDLRLRB? Где A?
CalculatorFeline
@CalculatorFeline Исправлено
ngenisis
3

Petit Computer BASIC, 91 байт

@L
WAIT 1S$=S$+CHR$(B)*!!B
B=BTRIG()IF B<1024GOTO@L
IF"xxxxxxxxxx"==S$THEN BEEP?"+30 lives

Наконец, решение, которое фактически использует вход контроллера!

Я использовал Petit Computer, а не более новую версию (SmileBASIC), потому что он имеет доступ к кнопке «Пуск» и BTRIG()короче, чем BUTTON().

Я заменил строку данных на x's', она должна содержать символы с кодами ascii 1,1,2,2,4,8,4,8,32,16

Скучная версия, 46 байт

INPUT S$IF"UUDDLRLRBA"==S$THEN BEEP?"+30 lives
12Me21
источник
Я бы порекомендовал использовать SmileBASIC 2 для имени записей Petit Computer, и при необходимости укажите SmileBASIC как SmileBASIC 3 .
улитка
Хорошая работа с использованием контроллера!
Кристофер
2

Powershell, 89 86 байт

if((Read-Host)-eq"UUDDLRLRBABA"){"+30 Lives";[System.Media.SystemSounds]::Beep.Play()}

Enter отправляет строку в Read-Host, так что это должно .. работать?

colsw
источник
2
Я думаю, вам просто нужно проверить «UUDDLRLRBABA», а не «UUDDLRLR BABA», поскольку в коде Contra нет «». Это также сэкономит вам байт. Я думаю, предполагая ввод, потому что они должны нажать Enter, чтобы отправить ввод действителен.
Redstarcoder
Я работаю, кстати
Кристофер
1
@ChristopherPeart Пожалуйста, не вносите изменения в чужой код, даже если вы являетесь OP или сохраняете их в байтах.
кот
Хорошо, я сделаю это. Но это была моя вина
Кристофер
@ConnorLSW вы можете это исправить, БА должен быть только один раз (моя вина, извините)
Кристофер
2

C # (скучная версия), 80 байт

void n(){while(Console.ReadLine()!="UUDDLRLRBA"){}Console.Write("+30 Lives\a");}

C # (интересный), 202 байта

void n(){t();Console.Write("+30 Lives\a");}void t(){var k="UUDDLRLRBA";var s="";while(s!=k){s+=Console.ReadKey().Key.ToString();s=k.StartsWith(s)?s:"";}if(Console.ReadKey().Key!=ConsoleKey.Enter){t();}}

Я думаю, что это работает, к сожалению, онлайн-тестеры не поддерживают существование консольного ввода, поэтому мне придется пройти тесты, которые я сделал

Скорее всего, можно играть в гольф - я не очень хорош в этом! :)

Ungolfed:

void n()
{
    t();
    Console.WriteLine("+30 Lives\a");
}

void t()
{
    var k = "UUDDLRLRBA";
    var s = "";
    while(s != k)
    {
        s += Console.ReadKey().Key.ToString();
        s = k.StartsWith(s) ? s : "";
    }
    if(Console.ReadKey().Key != ConsoleKey.Enter)
    {
        t();
    }
}
Альфи Гудэйкр
источник
Хм, есть ли в C # способ чтения, пока не будет обнаружена новая строка? Это спасло бы вас от поиска ключа ввода. Посмотрите, как это реализовано в Python здесь .
redstarcoder
Есть, Console.Readlineно я подумала, что это может быть аганистом духа вызова! Если это хорошо, я могу сделать это намного короче
Alfie Goodacre
@redstarcoder добавил Console.ReadLine()версию
Alfie Goodacre
@AlfieGoodacre вы можете это исправить, БА должно быть только один раз (моя вина, извините)
Кристофер
@ChristopherPeart Первоначально было, но я должен был изменить это;)
Alfie Goodacre
2

Чудо , 50 байтов

ol"•";f\@[="UUDDLRLRBA"rl0?ol"+30 lives•"?f0];f0

Заменить на символ кода \x07(контрольный символ BEL). Принимает ввод через STDIN.

Mama Fun Roll
источник
Вы можете это исправить, БА должно быть только один раз (моя вина, извините)
Кристофер
Ну, я исправил. Спасибо за уведомление!
Мама Fun Roll
1

flex, 37 + 5 = 42 байта

%%
UUDDLRLRBA puts("+30 lives\a");

Сам код составляет 37 байтов, скомпилируйте его с опцией "-main", которая добавляет 5 байтов. Естественно, вы должны скомпилировать полученный C-файл с вашим любимым C-компилятором, но я не думаю, что этот шаг должен учитываться при подсчете байтов.

Я мог бы сохранить байт, используя вместо него буквенный символ BEL \a, но я бы предпочел прочитать свой собственный код.

BenGoldberg
источник
4
Вам действительно не нужно уметь читать код. Это код гольфа
Кристофер
Лично я думаю, что должен получить бонус за использование flex, из-за того, как редко он используется здесь. :)
BenGoldberg
1
Я полагаю, что вы можете уменьшить штраф до 3 байт, передавая -llкомпилятору C опцию, а не -mainопцию flex.
1

C 87 85 81 байт

s[13];f(){for(;strcmp(s,"UUDDLRLRBA\n");fgets(s,12,stdin));puts("+30 Lives!\a");}
MD XF
источник
1

shortC, 52 байта

s[13];AO;Ms,"UUDDLRLRBA\n");Ys,12,N));J"+30 Lives!\a

Объяснение:

s[13];                                                // declare array with 13 members
      A                                               // main function
       O;Ms,"UUDDLRLRBA\n");                          // for loop while input is not equal to the Konami Code
                            Ys,12,N));                // read 12 characters of input into array
                                      J"+30 Lives!\a  // print the string

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

MD XF
источник
1

C, 114 байтов

#define X "UUDDLRLRBA"
main(i,j){for(i=j=0;!j;)(getchar()==X[i++])&&((j=1?!X[i]|puts("+30 lives\a"):0)|1)||(i=0);}
user12707
источник