Найкоротший конамі Конамі


15

Проблема

Ви повинні написати програму, яка під час набору коду Konami друкує рядок " +30 lives" і видає шум на ваш вибір із динаміка комп'ютера.

Визначення

"Код Конамі" визначається так, як UUDDLRLRBAслід натискати клавішу введення.

Правила

  • Ви можете використовувати стрілку вгору для U, вниз D, ліворуч Lі праворуч до Rтих пір, поки ваш код відповідає стрілкам або літерам.
  • Вхід може бути прийнятий від контролера або клавіатури, але не потрібно підтримувати обидва.
  • Існуючі відповіді можуть продовжувати використовуватись BABAзамість BA, але можуть також скоротити їх, якщо вони цього хочуть. Майбутні відповіді слід використовувати BAдля послідовності.

  • Порожній ввід не потрібно підтримувати.


Коментарі не для розширеного обговорення; ця розмова була переміщена до чату .
Мартін Ендер

Відповіді:


13

05AB1E , 33 байти (Добре на порожній ввід)

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™‹“:)
Аднан

Це завжди виводить для мене "+30 життя" на онлайн-перекладача, навіть при порожньому введенні.
redstarcoder

2
@redstarcoder Тільки * з порожнім входом, лайно, виправлення
Magic Octopus 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.


Ви можете виправити це, БА повинен бути лише один раз (моя пробачення)
Крістофер

7

Python 3,  55  53 байти

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

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

де 7показане вище - буквальний байт 0x07(недрукований у кодовому блоці).

Після натискання клавіші Enter whileперевіряється стан циклу. Якщо останні ~9= 10 символів (щонайбільше) не відповідають коду команди Contra, тоді не 1виконується опція (заміна passна стислість); якщо вони роблять збігаються , то в той час як замкнйте і printвиконуються оператор, який записує необхідний текст разом з ASCII дзвін символом ( «тривога») 0x07, який виробляє звук , якщо він не був явно заборонений (або термінал не має динаміка !).


Ви можете виправити це, БА повинен бути лише один раз (моя пробачення)
Крістофер

Виправлено, спасибі за голови вгору.
Джонатан Аллан

1
-10= ~9, що може заощадити байт.
isaacg

Чи не можете ви поставити в рядку буквальний \ x07 на -1 байт?
CalculatorFeline

@CalculatorFeline Я поняття не маю, чи можу? Зауважте, люди часто використовують \nструни в гольфах Python, чому б вони не використовували \x0a?
Джонатан Аллан

5

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

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

Виявляється, додаток ( ) не потрібно, рядки автоматично з’єднуються разом як надруковані.

ɠ⁻“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 за допомогу мені розібратися у стисканні рядків :)


“+30 lives”стислий є “¡}ʠƈ[ỵ»(для подальшого ознайомлення тут - допис про нього, він пов’язаний у підручнику на вікі Джелі).
Джонатан Аллан

де звук?
tuskiomi

1
Я щойно перевірив його з офіційним перекладачем, і він дійсно циклічний, поки не буде введено код Конамі
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 більше нічого не буде виведено і аудіо не відтворюватиметься.


здається, вам слід порахувати розмір вашого mp3-файлу

@ricyje Обробка насправді не має іншого способу виведення звуків. Також розмір .mp3файлу насправді не має значення, оскільки незалежно від того, який він буде, Processing відтворюватиме його як звук
Kritixi Lithos

@KritixiLithos ви можете виправити це, BA повинен бути лише один раз (моя пробачення)
Крістофер

@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.


Це робить звук?
Kritixi Lithos

@KritixiLithos, так, ви побачите на другому останньому рядку в самому кінці "7", це дзвін дзвону.
redstarcoder

Я трохи відремонтував ваш код, тому що я не зовсім зрозумів використання перших рядків? Спробуйте тут Це посилання призначене для> <>, але працює і для *> <> (не використовує механізму занурення, як у вас) - воно також економило на 19 байтах! :)
Тіл пелікан

@Tealpelican, перший рядок такий, що він продовжує працювати, чекаючи введення! Ваша пов'язана версія не робить цього; p.
redstarcoder

Ти правий! Я пропустив це! - Я додав рядок для моєї помилки і замінив кілька зайвих реверсів і друку. Спробуйте нову версію, яку я звів до 67 байт: D
Teal pelican

3

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

Гольф

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");}  

Безумовно

#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

@Christopher, будь ласка, ніколи не вносити зміни до коду людей на цьому сайті Stack Exchange. ваша редакція ніколи не повинна була затверджуватися.
кіт

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

1
@MukulKumar Звичайно :) важливо, щоб відповідач редагував власний код.
кіт

1
@MukulKumar ви можете виправити це, BA повинен бути лише один раз (моя пробачення)
Крістофер

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

Математика, 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, цикл продовжується.

"Обов'язково цикл, поки не буде введено код Конамі", є дещо невиразним, але я вважаю, що це його задовольняє. Після того , як Whileцикл буде завершено, .Beep[];"+30 lives"


Ви можете виправити це, БА повинен бути лише один раз (моя пробачення)
Крістофер

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

Я б рекомендував використовувати 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, так що це повинно .. працювати?


2
Я думаю, вам просто потрібно перевірити "UUDDLRLRBABA", а не "UUDDLRLR BABA", оскільки в коду контракту немає "". Це також заощадить вам байт. Я думаю, якщо припустити введення, оскільки вони повинні натиснути клавішу Enter, щоб надіслати вхід, є дійсним.
redstarcoder

Я працюю до речі
Крістофер

1
@ChristopherPeart Будь-ласка, не вносити зміни до коду інших людей, навіть якщо ви ОП, або якщо ви зберігаєте їх у байті.
кіт

Добре, я це зроблю. Але я був винен
Крістофер

@ConnorLSW Ви можете виправити це, BA повинен бути лише один раз (моя пробачення)
Крістофер

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();}}

Я думаю, що це працює, на жаль, тестери в Інтернеті не підтримують існування консольного вводу, тому мені доведеться продовжувати тести, які я зробив

Можна, швидше за все, пограти в гольф величезно - я в цьому не великий! :)

Безголівки:

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 Ви можете виправити це, BA повинен бути лише один раз (моя пробачення)
Крістофер

@ChristopherPeart It originally was but I had to change it ;)
Alfie Goodacre

2

Wonder, 50 bytes

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

Replace with the character of code \x07 (the BEL control char). Takes input through STDIN.


can you fix this the BA should only be once (my fault sorry)
Christopher

Well I fixed. Thanks for the notice!
Mama Fun Roll

1

flex, 37 + 5 = 42 bytes

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

The code itself is 37 bytes, compile it with the "-main" option which adds 5 bytes. Naturally, you have to compile the resulting C file with your favorite C compiler, but I don't think that step should count toward the byte count.

I could save a byte by using a literal BEL character instead of \a, but I'd rather be able to read my own code.


4
You really don't need to be able to read the code. This is code golf
Christopher

Personally, I think I should get a bonus for using flex, due to how rarely it gets used here. :)
BenGoldberg

1
I believe you can reduce the penalty to 3 bytes via giving -ll as an option to the C compiler rather than -main as an option to flex.

1

C, 87 85 81 bytes

s[13];f(){for(;strcmp(s,"UUDDLRLRBA\n");fgets(s,12,stdin));puts("+30 Lives!\a");}

1

shortC, 52 bytes

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

Explanation:

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

Try it online!


1

C, 114 bytes

#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);}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.