Najkrótszy kod Konami

15

Problem

Musisz napisać program, który po wpisaniu kodu Konami podczas uruchamiania wypisze ciąg „ +30 lives” i wyda wybrany przez ciebie dźwięk z głośnika komputera.

Definicja

„Kod Konami” definiuje się w UUDDLRLRBAnastępujący sposób, naciskając klawisz Enter.

Zasady

  • Możesz użyć strzałki w górę U, w dół D, w lewo Li w prawo R, pod warunkiem, że kod jest zgodny ze strzałkami lub literami.
  • Twój wkład może być zaakceptowany z kontrolera lub klawiatury, ale nie musi obsługiwać obu.
  • Istniejące odpowiedzi mogą nadal być używane BABAzamiast BA, ale mogą również skrócić je, jeśli chcą. Przyszłe odpowiedzi powinny wykorzystywać BAspójność.

  • Puste dane wejściowe nie muszą być obsługiwane.

Krzysztof
źródło
Komentarze nie są przeznaczone do rozszerzonej dyskusji; ta rozmowa została przeniesiona do czatu .
Martin Ender

Odpowiedzi:

13

05AB1E , 33 bajty (Fine przy pustym wejściu)

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

Wypróbuj online!

05AB1E , 30 26 bajtów ( przestaje działać przy pustym wejściu)

-4 dzięki Adnanowi

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

Wypróbuj online!

•ï“뙵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.

Uwaga: Dźwięk dzwonka nie jest odtwarzany na TryItOnline, może zapytaj Dennisa, czy któryś z jego serwerów gdzieś pinguje, gdy go uruchomisz.

Urna Magicznej Ośmiornicy
źródło
Prawie wygrałeś! Tylko jeden bajt
Christopher
2
Skompresowana wersja "+30 lives"to “+30™‹“:)
Adnan,
To zawsze wyświetla dla mnie „+30 żyć” w tłumaczu online, nawet przy pustym wejściu.
redstarcoder
2
@redstarcoder Tylko * z pustym wejściem, bzdury, utrwalanie
Magic Octopus Urn
@ carusocomputing czy możesz to naprawić BA powinien być tylko raz (moja wina, przepraszam)
Christopher
7

JavaScript (ES6), 202 200 198 bajtów

Testowane tylko w Chrome i Firefox. Używa UDLRraczej niż klawiszy strzałek. Upewnij się, że CapsLock jest wyłączony.

(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
źródło
czy możesz to naprawić BA powinien być tylko raz (moja wina przepraszam)
Christopher
7

Python 3,  55  53 bajtów

-1 bajt dzięki isaacg (stosowanie bitowe nie zastępuje -10się ~9).
-1 bajt dzięki CalculatorFeline (możliwe jest użycie dosłownego BELbajtu).

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

gdzie 7 pokazany powyżej to bajt dosłowny 0x07(nie można go wydrukować w bloku kodu).

Po naciśnięciu Enter whilesprawdzany jest stan pętli. Jeśli ostatnie ~9= 10 znaków (najwyżej) nie zgadza się z kodem polecenia Contra, wówczas 1wykonywana jest operacja no-op (zamiana passna zwięzłość); gdyby zrobić pasuje wtedy, gdy końce pętli i printwykonywana jest instrukcja, która pisze wymagane tekst wraz ze znaków ASCII Bell ( „Alarm”) 0x07, która produkuje dźwięk, chyba że zostało wyraźnie wyłączone (lub terminal ma głośnik !).

Jonathan Allan
źródło
czy możesz to naprawić BA powinien być tylko raz (moja wina przepraszam)
Christopher
Naprawiono, dziękuję za zgłoszenie się.
Jonathan Allan,
1
-10= ~9, co może zaoszczędzić bajt.
isaacg,
Nie możesz wstawić literału \ x07 w ciągu 1 bajtu?
CalculatorFeline
@CalculatorFeline Nie mam pojęcia, prawda? Zauważ, że ludzie często używają \nciągów w golfach Python, dlaczego nie mieliby używać \x0a?
Jonathan Allan,
5

Galaretka, 33 30 29 27 bajtów

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

Okazuje się, że append ( ) nie jest potrzebny, łańcuchy są automatycznie łączone razem drukowane.

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

Bez kompresji

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

Wypróbuj online
Jeśli usuniesz wszystko później ¿, możesz zepsuć dane wejściowe i zobaczyć, że zwrócą się one tylko wtedy, gdy ciąg wejściowy jest poprawny.

ɠ⁻“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

Dzięki @JonathanAllan za pomoc w ustaleniu kompresji ciągów :)

JayDepp
źródło
“+30 lives”Skompresowany jest “¡}ʠƈ[ỵ»(do wglądu tutaj jest post o tym, jest link w samouczku na wiki Jelly).
Jonathan Allan,
gdzie jest dźwięk?
tuskiomi
1
Właśnie przetestowałem go z oficjalnym tłumaczem i rzeczywiście
zapętla się,
@JayDepp czy możesz to naprawić BA powinien być tylko raz (moja wina przepraszam)
Christopher
Uważam , że nie tyle automatyczna konkatenacja łańcuchów, co niejawny wydruk LLC (wiodącego stałego łańcucha), 7Ọpo którym następuje niejawny wydruk niladu “¡}ʠƈ[ỵ», pojawiający się na standardowym odcinku , jakby to był konkatenacja. Jako wizytówkę możesz spróbować dodać 2-sekundowy sen pomiędzy ɠ⁻“UUDDLRLRBABA”$¿ṛ7Ọ2“+30 lives”œS.
Jonathan Allan,
5

Przetwarzanie, 161 157 155 bajtów

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

Plik audio należy zapisać jako sketchName/data/a.mp3. Uwaga: przetestowałem ten program tylko bez pliku audio, ponieważ jestem zbyt leniwy, aby pobrać mp3plik (ponieważ obsługiwane są tylko ograniczone rozszerzenia processing.sound.SoundFile).

Ta draw()funkcja musi być dostępna, abykeyTyped do działania.

Powodem, dla którego używamy jest keyTypedto, że Przetwarzanie nie ma STDIN, może jedynie nasłuchiwać naciśnięć klawiszy podczas uruchamiania szkicu.

Wyjaśnienie

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

Wszystkie naciśnięcia klawiszy użytkownika są przechowywane jako znaki w ciągu znaków k. keyTypedJest wbudowana funkcja, która jest wywoływana zawsze, gdy użytkownik wpisze klucz. Jednocześnie sprawdzamy, czy ten ciąg kończy się na naciśnięciu klawisza. Następnie drukujemy +30 livesi odtwarzamy plik dźwiękowy. A drawfunkcja jest tam stale aktualizować keyTyped. Po wprowadzeniu kodu Konami nic więcej nie będzie generowane i nie będzie odtwarzany żaden dźwięk.

Kritixi Lithos
źródło
wygląda na to, że powinieneś policzyć rozmiar pliku mp3
@ricyje Przetwarzanie tak naprawdę nie ma innego sposobu generowania dźwięków. Również rozmiar .mp3pliku nie ma tak naprawdę znaczenia, ponieważ bez względu na to, co to jest, Processing odtworzy go jako dźwięk
Kritixi Lithos
@KritixiLithos możesz to naprawić BA powinien być tylko raz (moja wina, przepraszam)
Christopher
@ChristopherPeart Done! (Cieszę się, że mogłem zaoszczędzić jeszcze 2 bajty :)
Kritixi Lithos
4

> <>, 132 69 64 62 bajtów *> <> , 84 bajtów

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

Wypróbuj tutaj!

Jest to zależne od dzwonka (ascii 7) hałasu na końcu (nie słyszanego przez tłumacza online).

Dzięki @TealPelican za uratowanie kolejnych 15 bajtów!

Zapisano dwa bajty BAzamiast BABA.

redstarcoder
źródło
Czy to wydaje dźwięk?
Kritixi Lithos
@KritixiLithos, tak, na końcu ostatniego wiersza zobaczysz „7”, czyli dzwonek.
redstarcoder,
Odrobiłem trochę kodu, ponieważ nie do końca rozumiem użycie pierwszych wierszy? Wypróbuj tutaj Ten link jest dla> <>, ale działa również dla *> <> (nie używa mechaniki nurkowania tak jak ty) - zapisano również na 19 bajtach! :)
Teal pelikan
@ Tealpelican, pierwsza linia jest więc uruchomiona, czekając na dane wejściowe! Wersja z linkami tego nie robi; s.
redstarcoder,
Masz rację! Tęsknie za tym! - Dodałem wiersz w celu dostosowania do mojego błędu i zastąpiłem zbędne cofanie i drukowanie Wypróbuj nową wersję, którą sprowadziłem do 67 bajtów: D
Pelikan Teal
3

C 119 -1 - 2 = 116 bajtów

Grał w golfa

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

Nie golfił

#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();
}
Mukul Kumar
źródło
s/UUDDLRLR BABA/UUDDLRLRBABAdla -1 bajtów, a strcmp będzie szukał poprawnego ciągu!
redstarcoder,
@Christopher, proszę, nigdy nie wprowadzaj zmian do kodu osób na tej stronie Stack Exchange. Twoja edycja nigdy nie powinna była zostać zatwierdzona.
kot
Mukul, możesz sam usunąć przestrzeń.
kot
1
@MukulKumar Oczywiście :) ważne jest, aby odpowiadający edytował własny kod.
kot
1
@MukulKumar czy możesz to naprawić BA powinien być tylko raz (moja wina, przepraszam)
Christopher
3

Ułożone , 41 bajtów

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

Odczytuje dane wejściowe z klawiatury.

['+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. 
Conor O'Brien
źródło
3

AutoHotkey, 63 bajty

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

Po uruchomieniu tego skryptu sprawdzi, czy kolejne 10 klawiszy to kod Konami, a jeśli tak, wyświetli się okno komunikatu „+30 żyć” i powinien odtworzyć sygnał dźwiękowy (nie mam teraz głośników do przetestowania ).

Kodos Johnson
źródło
Chłodny! AutoHotkey to ciekawy program.
Christopher
3

GNU sed, 32 25 + 1 = 33 26 bajtów

+1 bajt dla -nflagi.

/UUDDLRLRBA$/a+30 Lives\a

Wypróbuj online!

Wyjaśnienie

Za każdym naciśnięciem klawisza enter ( $) program sprawdza, czy kodem było 10 poprzednich naciśnięć klawiszy. Jeśli tak, apolecenie umieszcza w kolejce tekst +30 Livesi dźwięk dzwonka ( \a), które zostaną wydrukowane na końcu bieżącego cyklu (co w tym przypadku następuje natychmiast).

Jordania
źródło
czy możesz to naprawić BA powinien być tylko raz (moja wina przepraszam)
Christopher
To już ma BAtylko jeden raz.
Jordania
Och, wow nie zauważył
Christopher
3

Mathematica, 50 bajtów

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

Początkowo xjest tylko symbolem, a zatem nie jest identyczny ( =!=) z symbolem UUDDLRLRBA, więcx=Input[] jest oceniany. Otworzy się okno dialogowe z kursorem już w polu wprowadzania, dzięki czemu użytkownik może od razu zacząć pisać na klawiaturze.

Jeśli Enterzostanie naciśnięty lub OKkliknięty bez wpisywania czegokolwiek, InputField[]nastąpi powrót Null, co nie jest identyczne zUUDDLRLRBA , więc pętla będzie kontynuowana i otworzy się kolejne okno dialogowe.

Jeśli użytkownik kliknie Cancellub w inny sposób opuści okno dialogowe, InputFieldnastąpi powrót $Canceled, który również nie jest identyczny zUUDDLRLRBA , więc pętla będzie kontynuowana.

Użytkownik może wpisać w oknie dialogowym pożądanie swojego serca. Kiedy trafią Enter, ich dane wejściowe są interpretowane jako wyrażenie języka Wolfram (prawdopodobnie tylko pola). Jeśli to wyrażenie jest czymkolwiek innym niż symbol UUDDLRLRBA, pętla będzie kontynuowana.

„Musi zapętlać, dopóki nie zostanie wprowadzony kod Konami” jest trochę niejasne, ale wierzę, że to spełnia. Gdy Whilepętla zakończeniu .Beep[];"+30 lives"

ngenisis
źródło
czy możesz to naprawić BA powinien być tylko raz (moja wina przepraszam)
Christopher
1
UUDDLRLRB? Gdzie jest A?
CalculatorFeline,
@CalculatorFeline Naprawiono
ngenisis
3

Petit Computer BASIC, 91 bajtów

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

Wreszcie rozwiązanie wykorzystujące dane wejściowe kontrolera!

Użyłem Petit Computer zamiast nowszej wersji (SmileBASIC), ponieważ ma on dostęp do przycisku Start i BTRIG()jest krótszy niż BUTTON().

Zamieniłem ciąg danych na x„s”, powinien on zawierać znaki o kodach ascii 1,1,2,2,4,8,4,8,32,16

Nudna wersja, 46 bajtów

INPUT S$IF"UUDDLRLRBA"==S$THEN BEEP?"+30 lives
12Me21
źródło
Polecam używanie SmileBASIC 2 jako nazwy wpisów w Petit Computer i, w razie potrzeby, podaj SmileBASIC jako SmileBASIC 3 .
snail_
Dobra robota za pomocą kontrolera!
Christopher
2

PowerShell, 89 86 bajtów

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

Enter przesyła ciąg znaków do Read-Host, więc powinien .. działać?

colsw
źródło
2
Myślę, że musisz po prostu sprawdzić „UUDDLRLRBABA”, a nie „UUDDLRLR BABA”, ponieważ w kodzie Contra nie ma znaku „”. To by także zaoszczędziło bajt. Wydaje mi się, że zakładanie Enter jest konieczne, ponieważ muszą nacisnąć Enter, aby wysłać dane wejściowe.
redstarcoder
Nawiasem mówiąc, pracuję
Christopher,
1
@ChristopherPeart Nie wprowadzaj zmian w kodzie innych osób, nawet jeśli jesteś OP lub zapisujesz bajt.
kot
Ok, zrobię to. Ale to była moja wina
Christopher
@ConnorLSW czy możesz to naprawić BA powinien być tylko raz (moja wina przepraszam)
Christopher
2

C # (nudna wersja), 80 bajtów

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

C # (Interesujący), 202 bajtów

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

ja że to działa, niestety testerzy online nie obsługują wejścia konsoli, dlatego będę musiał przejść testy, które przeprowadziłem

Można najprawdopodobniej grać w golfa ogromnie - nie jestem w tym świetny! :)

Nie golfowany:

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();
    }
}
Alfie Goodacre
źródło
Hmm, czy C # ma sposób na odczyt, dopóki nie zostanie wykryty nowy wiersz? Dzięki temu nie będziesz musiał szukać klawisza Enter. Zobacz, jak jest zaimplementowany w Pythonie tutaj .
redstarcoder
Jest Console.Readline, ale myślałem, że to może być aganist duchu wyzwanie! Jeśli to w porządku, mogę to zrobić znacznie krócej
Alfie Goodacre,
@redstarcoder dodał Console.ReadLine()wersję
Alfie Goodacre
@AlfieGoodacre czy możesz to naprawić BA powinien być tylko raz (moja wina, przepraszam)
Christopher
@ChristopherPeart Pierwotnie było, ale musiałem to zmienić;)
Alfie Goodacre
2

Cud , 50 bajtów

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

Zamień na znak kodu \x07(znak kontrolny BEL). Pobiera dane wejściowe przez STDIN.

Mama Fun Roll
źródło
czy możesz to naprawić BA powinien być tylko raz (moja wina przepraszam)
Christopher
Cóż, naprawiłem. Dzięki za powiadomienie!
Mama Fun Roll
1

flex, 37 + 5 = 42 bajty

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

Sam kod ma 37 bajtów, skompiluj go z opcją „-main”, która dodaje 5 bajtów. Oczywiście, musisz skompilować wynikowy plik C za pomocą swojego ulubionego kompilatora C, ale nie sądzę, że ten krok powinien się liczyć do liczby bajtów.

Mógłbym zaoszczędzić bajt, używając dosłownie znaku BEL zamiast \a, ale wolałbym móc odczytać własny kod.

BenGoldberg
źródło
4
Naprawdę nie musisz być w stanie odczytać kodu. To jest kod golfowy
Christopher
Osobiście uważam, że powinienem otrzymać premię za korzystanie z flexu, ponieważ rzadko się tu stosuje. :)
BenGoldberg,
1
Wierzę, że możesz zmniejszyć karę do 3 bajtów, podając -lljako opcję kompilatora C, a nie -mainjako opcję flex.
1

C, 87 85 81 bajtów

s[13];f(){for(;strcmp(s,"UUDDLRLRBA\n");fgets(s,12,stdin));puts("+30 Lives!\a");}
MD XF
źródło
1

shortC, 52 bajty

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

Wyjaśnienie:

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

Wypróbuj online!

MD XF
źródło
1

C, 114 bajtów

#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);}
użytkownik12707
źródło