Kürzester Konami-Code

15

Das Problem

Sie müssen ein Programm schreiben, das, wenn der Konami-Code zur Laufzeit eingegeben wird, die Zeichenfolge " +30 lives" ausgibt und über den Lautsprecher des Computers ein Geräusch Ihrer Wahl ausgibt.

Definition

Der "Konami-Code" wird wie UUDDLRLRBAfolgt definiert : Drücken Sie die Eingabetaste.

Die Regeln

  • Sie können den Aufwärtspfeil für U, Abwärtspfeil für D, Linkspfeil für Lund Rechtspfeil für verwenden R, solange Ihr Code entweder mit Pfeilen oder Buchstaben übereinstimmt.
  • Ihre Eingabe wird möglicherweise von einem Controller oder einer Tastatur akzeptiert, muss jedoch nicht beide unterstützen.
  • Bestehende Antworten können weiterhin verwendet BABAwerden BA, sie können jedoch auch gekürzt werden, wenn sie dies wünschen. Zukünftige Antworten sollten alle aus Gründen der BAKonsistenz verwendet werden.

  • Leere Eingaben müssen nicht unterstützt werden.

Christopher
quelle
Kommentare sind nicht für längere Diskussionen gedacht. Diese Unterhaltung wurde in den Chat verschoben .
Martin Ender

Antworten:

13

05AB1E , 33 Byte (Fein bei leerer Eingabe)

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

Probieren Sie es online!

05AB1E , 30 26 Byte ( Fehler bei leerer Eingabe)

-4 Dank an Adnan

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

Probieren Sie es 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.

Haftungsausschluss: Der Klingelton wird in TryItOnline nicht wiedergegeben. Fragen Sie Dennis möglicherweise, ob einer seiner Server beim Ausführen einen Ping-Befehl ausgibt.

Magische Kraken-Urne
quelle
Du hast fast gewonnen! Nur noch ein Byte
Christopher
2
Eine komprimierte Version von "+30 lives"ist “+30™‹“:)
Adnan
Dies gibt für mich im Online-Interpreter immer "+30 Leben" aus, auch bei leerer Eingabe.
Redstarcoder
2
@redstarcoder Nur * mit leerer Eingabe, Mist, Fixing
Magic Octopus Urn
@ Carusocomputing können Sie dies beheben, die BA sollte nur einmal sein (mein Fehler tut mir leid)
Christopher
7

JavaScript (ES6), 202 200 198 Bytes

Nur unter Chrome und Firefox getestet. Verwendet UDLReher als die Pfeiltasten. Bitte stellen Sie sicher, dass CapsLock ausgeschaltet ist.

(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
quelle
Christopher
7

Python 3,  55  53 Bytes

-1 Byte dank isaacg (nicht bitweise ersetzen -10durch ~9).
-1 Byte dank CalculatorFeline (es ist möglich, ein BELLiteralbyte zu verwenden).

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

wobei das 7oben gezeigte 0x07ein Literalbyte ist (ein in einem Codeblock nicht druckbares Byte ).

Sobald die Eingabetaste gedrückt wird, wird die whileSchleifenbedingung überprüft. Wenn die letzten ~9= 10 Zeichen (höchstens) nicht mit dem Contra-Befehlscode übereinstimmen, wird das No-Op 1ausgeführt (aus Gründen der passKürze durch ein anderes ersetzt). wenn sie tun , passen dann die while - Schleife endet und die printAnweisung ausgeführt wird , was schreibt die gewünschten Text zusammen mit einem ASCII - Glocke - Zeichen ( „Alarm“) 0x07, die einen Ton erzeugt , wenn es ausdrücklich deaktiviert wurde (oder das Terminal hat keine Lautsprecher !).

Jonathan Allan
quelle
Christopher
Behoben, danke für die Köpfe hoch.
Jonathan Allan
1
-10= ~9, wodurch Sie ein Byte sparen können.
Isaacg
Können Sie kein Literal \ x07 für -1 Byte in die Zeichenfolge einfügen?
CalculatorFeline
@CalculatorFeline Ich habe keine Ahnung, kann ich? Beachten Sie, dass Menschen \nin Python-Golfspielen häufig Saiten verwenden. Warum sollten sie diese nicht verwenden \x0a?
Jonathan Allan
5

Jelly, 33 30 29 27 Bytes

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

Stellt sich heraus, das append ( ) wird nicht benötigt, Zeichenfolgen werden automatisch zusammengefügt und beide gedruckt.

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

Unkomprimiert

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

Online testen
Wenn Sie danach alles entfernen ¿, können Sie mit der Eingabe herumspielen und feststellen, dass sie nur dann zurückgegeben wird, wenn die Eingabezeichenfolge korrekt ist.

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

Vielen Dank an JonathanAllan, der mir geholfen hat, die String-Komprimierung herauszufinden :)

JayDepp
quelle
“+30 lives”komprimiert ist “¡}ʠƈ[ỵ»(zum späteren Nachschlagen gibt es hier einen Beitrag darüber, der im Tutorial im Jelly-Wiki verlinkt ist).
Jonathan Allan
Wo ist der Ton?
Tuskiomi
1
Ich habe es gerade mit dem offiziellen Interpreter getestet und es wiederholt sich tatsächlich , bis der Konami-Code eingegeben wird
JayDepp
@ JayDepp können Sie dies beheben, die BA sollte nur einmal sein (meine Schuld sorry)
Christopher
Ich glaube , es ist nicht so sehr die automatische Verkettung von Strings, sondern ein impliziter Ausdruck der LLC (führende konstante Kette), 7Ọgefolgt von einem impliziten Ausdruck des Nilads “¡}ʠƈ[ỵ», der auf stdout erscheint, als wäre es eine Verkettung. Als Schaufenster können Sie versuchen, zwischen mit einen 2 Sekunden Schlaf hinzuzufügen ɠ⁻“UUDDLRLRBABA”$¿ṛ7Ọ2“+30 lives”œS.
Jonathan Allan
5

Verarbeitung, 161 157 155 Bytes

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

Die Audiodatei muss gespeichert werden als sketchName/data/a.mp3. Hinweis: Ich habe dieses Programm nur ohne die Audiodatei getestet, da ich zum Herunterladen einer mp3Datei zu faul bin (da nur begrenzte Erweiterungen von unterstützt werden processing.sound.SoundFile).

Die draw()Funktion muss vorhanden sein, damit keyTypedsie funktioniert.

Der Grund, den wir verwenden, keyTypedist, dass die Verarbeitung nicht über STDIN verfügt, sondern nur auf das Drücken von Tasten über die ausgeführte Skizze warten kann.

Erläuterung

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

Alle Tastenanschläge des Benutzers werden als Zeichen in der Zeichenfolge gespeichert k. Das keyTypedist eine eingebaute Funktion, die immer dann aufgerufen wird, wenn der Benutzer einen Schlüssel eingibt. Gleichzeitig prüfen wir, ob dieser String mit den Tastenanschlägen endet. Dann drucken wir die Sounddatei +30 livesund spielen sie ab. Und die drawFunktion ist dazu da, ständig zu aktualisieren keyTyped. Nachdem der Konami-Code eingegeben wurde, wird nichts anderes ausgegeben und es wird kein Audio abgespielt.

Kritixi Lithos
quelle
anscheinend solltest du die größe deiner mp3-datei zählen
@ricyje Processing hat keine andere Möglichkeit, Sounds auszugeben. Auch die Größe der .mp3Datei spielt keine Rolle, da die Verarbeitung sie als Sound
wiedergibt
@KritixiLithos können Sie dies beheben, die BA sollte nur einmal sein (meine Schuld sorry)
Christopher
@ChristopherPeart Fertig! (Ich bin froh, 2 weitere Bytes zu speichern :)
Kritixi Lithos
4

> <>, 132 69 64 62 Bytes *> <> , 84 Bytes

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

Probieren Sie es hier aus!

Dies beruht auf dem Klingelton (ascii 7) für das Rauschen am Ende (nicht im Online-Dolmetscher zu hören).

Vielen Dank an @TealPelican für das Speichern von weiteren 15 Bytes!

Gespeichert zwei Bytes für die Überprüfung BAstatt BABA.

redstarcoder
quelle
Macht das ein Geräusch?
Kritixi Lithos
@KritixiLithos, ja, du wirst in der vorletzten Zeile ganz am Ende eine "7" sehen, das ist das Glockenspiel.
Redstarcoder
Ich habe Ihren Code ein wenig überarbeitet, weil ich die ersten Zeilen nicht richtig verstanden habe. Versuchen Sie es hier Dieser Link ist für> <>, funktioniert aber auch für *> <> (verwendet nicht die Tauchmechanik wie Sie) - er ist auch auf 19 Bytes gespeichert! :)
Teal Pelikan
@Tealpelican, die erste Zeile läuft weiter und wartet auf Eingaben! Ihre verlinkte Version macht das nicht; p.
Redstarcoder
Sie haben Recht! Das habe ich vermisst! - Ich habe eine Zeile hinzugefügt, um meinen Fehler auszugleichen, und einige redundante Umkehr- und Druckvorgänge ersetzt. Probieren Sie die neue Version aus, die ich auf 67 Byte reduziert habe: D
Teal
3

C 119-1-2 = 116 Bytes

Golf gespielt

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();
}
Mukul Kumar
quelle
s/UUDDLRLR BABA/UUDDLRLRBABAfür -1 Byte und der strcmp sucht nach dem richtigen String!
Redstarcoder
@Christopher Bitte nehmen Sie auf keinen Fall Änderungen am Code dieser Stack Exchange-Site vor. Ihre Bearbeitung sollte niemals genehmigt worden sein.
Katze
Mukul, Sie können den Raum selbst entfernen.
Katze
1
@MukulKumar Natürlich :) Es ist wichtig, dass der Antwortende seinen eigenen Code bearbeitet.
Katze
1
@ MukulKumar können Sie dies beheben, die BA sollte nur einmal sein (meine Schuld sorry)
Christopher
3

Gestapelt , 41 Bytes

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

Liest Eingaben von der Tastatur.

['+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
quelle
3

AutoHotkey, 63 Bytes

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

Nach dem Ausführen dieses Skripts wird geprüft, ob die nächsten 10 Tasten der Konami-Code sind. Wenn dies der Fall ist, wird ein Meldungsfeld mit der Aufschrift "+30 Leben" angezeigt und es sollte ein Piepton abgespielt werden (ich habe jetzt keine Lautsprecher zum Testen ).

Kodos Johnson
quelle
Cool! AutoHotkey ist ein interessantes Programm.
Christopher
3

GNU sed, 32 25 + 1 = 33 26 Bytes

+1 Byte für -nFlag.

/UUDDLRLRBA$/a+30 Lives\a

Probieren Sie es online!

Erläuterung

Bei jedem Drücken der Eingabetaste ( $) prüft das Programm, ob die vorhergehenden 10 Tastenanschläge der Code waren. Wenn dies der Fall ist , werden mit dem aBefehl der Text +30 Livesund der Klingelton ( \a) in die Warteschlange gestellt, der am Ende des aktuellen Zyklus gedruckt werden soll (in diesem Fall sofort).

Jordan
quelle
Christopher
Das hat das BAgerade schon einmal.
Jordanien
Oh wow hat es nicht bemerkt
Christopher
3

Mathematica, 50 Bytes

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

Ist anfänglich xnur ein Symbol und ist somit nicht identisch ( =!=) mit dem Symbol UUDDLRLRBA, so x=Input[]wird ausgewertet. Dadurch wird ein Dialogfeld geöffnet, in dem sich der Cursor bereits im Eingabefeld befindet, sodass der Benutzer sofort mit dem Tippen auf der Tastatur beginnen kann.

Wenn Entergedrückt oder OKgeklickt wird, ohne etwas einzugeben, InputField[]wird zurückgegeben Null, was nicht identisch ist UUDDLRLRBA, sodass die Schleife fortgesetzt und ein weiteres Dialogfeld geöffnet wird.

Wenn der Benutzer auf Canceldas Dialogfeld klickt oder es auf andere Weise beendet, InputFieldkehrt das Dialogfeld zurück $Canceled, was ebenfalls nicht mit identisch ist UUDDLRLRBA, sodass die Schleife fortgesetzt wird.

Der Benutzer kann das Dialogfeld nach Herzenslust eingeben. Wenn sie treffen Enter, wird ihre Eingabe als Wolfram-Sprachausdruck interpretiert (möglicherweise nur Kästchen). Wenn dieser Ausdruck etwas anderes als das Symbol ist UUDDLRLRBA, wird die Schleife fortgesetzt.

"Muss Schleife, bis der Konami-Code eingegeben wird" ist ein wenig vage, aber ich glaube, das befriedigt es. Sobald die WhileSchleife abgeschlossen ist, .Beep[];"+30 lives"

Genisis
quelle
Können Sie dies beheben, die BA sollte nur einmal sein (meine Schuld sorry)
Christopher
1
UUDDLRLRB? Wo ist A?
CalculatorFeline
@CalculatorFeline Behoben
ngenisis
3

Petit Computer BASIC, 91 Bytes

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

Endlich eine Lösung, die tatsächlich den Controllereingang nutzt!

Ich habe eher Petit Computer als die neuere Version (SmileBASIC) verwendet, da sie Zugriff auf die Schaltfläche Start hat und BTRIG()kürzer ist als BUTTON().

Ich habe die xDatenzeichenfolge durch 's ersetzt, sie sollte Zeichen mit den ASCII-Codes 1,1,2,2,4,8,4,8,32,16 enthalten

Langweilige Version, 46 Bytes

INPUT S$IF"UUDDLRLRBA"==S$THEN BEEP?"+30 lives
12Me21
quelle
Ich würde empfehlen, SmileBASIC 2 für den Namen von Petit Computer-Einträgen zu verwenden und SmileBASIC bei Bedarf als SmileBASIC 3 anzugeben .
snail_
Gute Arbeit mit dem Controller!
Christopher
2

Powershell, 89 86 Bytes

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

enter übergibt die Zeichenkette an die Read-Host, also sollte es funktionieren?

colsw
quelle
2
Ich denke, Sie müssen nur nach "UUDDLRLRBABA" und nicht nach "UUDDLRLR BABA" suchen, da der Contra-Code kein "" enthält. Das würde dir auch ein Byte sparen. Ich gehe davon aus, dass die Eingabe gültig ist, weil sie die Eingabetaste drücken müssen, um die Eingabe zu senden.
Redstarcoder
Ich arbeite übrigens
Christopher
1
@ChristopherPeart Bitte nehmen Sie keine Änderungen am Code anderer vor, auch wenn Sie das OP sind oder ein Byte speichern.
Katze
OK werde ich tun. Aber es war meine Schuld
Christopher
@ConnorLSW können Sie dies beheben, die BA sollte nur einmal sein (mein Fehler sorry)
Christopher
2

C # (die langweilige Version), 80 Bytes

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

C # (das Interessante), 202 Bytes

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

Ich denke , dass dies funktioniert. Leider unterstützen Online-Tester die Existenz einer Konsolen-Eingabe nicht. Daher muss ich die von mir durchgeführten Tests fortsetzen

Kann höchstwahrscheinlich enorm golfen werden - ich bin nicht so toll darin! :)

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();
    }
}
Alfie Goodacre
quelle
Hmm, hat C # eine Möglichkeit zu lesen, bis eine neue Zeile erkannt wird? Das erspart Ihnen die Suche nach der Eingabetaste. Schauen Sie sich hier an, wie es in Python implementiert ist .
Redstarcoder
Es gibt Console.Readlineaber ich dachte, das könnte der Geist der Herausforderung sein! Wenn das in Ordnung ist, kann ich das viel kürzer machen
Alfie Goodacre
@redstarcoder hat eine Console.ReadLine()Version hinzugefügt
Alfie Goodacre
@AlfieGoodacre können Sie dies beheben, die BA sollte nur einmal sein (mein Fehler tut mir leid)
Christopher
@ChristopherPeart Es war ursprünglich, aber ich musste es ändern;)
Alfie Goodacre
2

Wunder , 50 Bytes

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

Ersetzen Sie durch das Zeichen des Codes \x07(das BEL-Steuerzeichen). Übernimmt die Eingabe über STDIN.

Mama Fun Roll
quelle
Können Sie dies beheben, die BA sollte nur einmal sein (meine Schuld sorry)
Christopher
Nun habe ich behoben. Danke für die Bemerkung!
Mama Fun Roll
1

Flex, 37 + 5 = 42 Bytes

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

Der Code selbst ist 37 Bytes, kompilieren Sie ihn mit der Option "-main", die 5 Bytes hinzufügt. Natürlich müssen Sie die resultierende C-Datei mit Ihrem bevorzugten C-Compiler kompilieren, aber ich denke nicht, dass dieser Schritt für die Byteanzahl zählen sollte.

Ich könnte ein Byte speichern, indem \aich stattdessen ein buchstäbliches BEL-Zeichen verwende , aber ich wäre lieber in der Lage, meinen eigenen Code zu lesen.

BenGoldberg
quelle
4
Sie müssen den Code wirklich nicht lesen können. Dies ist Code Golf
Christopher
Persönlich denke ich, dass ich einen Bonus für die Verwendung von Flex bekommen sollte, da es hier nur selten verwendet wird. :)
BenGoldberg
1
Ich glaube, Sie können die Strafe auf 3 Bytes reduzieren, indem Sie -lldem C-Compiler -maineine Option geben, anstatt eine Option zum Flexen.
1

C 87 85 81 Bytes

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

shortC, 52 Bytes

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

Erläuterung:

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

Probieren Sie es online!

MD XF
quelle
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);}
user12707
quelle