Il codice Konami più corto


15

Il problema

È necessario scrivere un programma che, quando si digita il codice Konami durante il runtime, stampa la stringa " +30 lives" e emette un rumore di propria scelta dall'altoparlante del computer.

Definizione

Il "Codice Konami" è definito come UUDDLRLRBAseguito premendo il tasto Invio.

Le regole

  • Puoi scegliere di usare la freccia su per U, giù per D, sinistra per Le destra per R, purché il codice sia coerente con frecce o lettere.
  • Il tuo input potrebbe essere accettato da un controller o da una tastiera, ma non è necessario supportare entrambi.
  • Le risposte esistenti possono continuare a utilizzare al BABAposto di BA, ma possono anche accorciarle se lo desiderano. Le risposte future dovrebbero essere usate BAper coerenza.

  • L'input vuoto non deve essere supportato.


I commenti non sono per una discussione estesa; questa conversazione è stata spostata in chat .
Martin Ender,

Risposte:


13

05AB1E , 33 byte (Fine su input vuoto)

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

Provalo online!

05AB1E , 30 26 byte (errore su input vuoto)

-4 grazie ad Adnan

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

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

Disclaimer: il suono di Bell non viene riprodotto su TryItOnline, forse chiedere a Dennis se uno dei suoi server da qualche parte sta eseguendo il ping quando lo si esegue.


Hai quasi vinto! Solo un byte di distanza
Christopher,

2
Una versione compressa di "+30 lives"è “+30™‹“:)
Adnan il

Questo produce sempre "+30 vite" per me sull'interprete online, anche con input vuoti.
redstarcoder,

2
Solo @redstarcoder * con input vuoto, schifezze, correzioni
Magic Octopus Urn

@carusocomputing puoi risolvere questo BA dovrebbe essere solo una volta (mi dispiace colpa mia)
Christopher

7

JavaScript (ES6), 202 200 198 byte

Testato solo su Chrome e Firefox. Utilizza UDLRanziché i tasti freccia. Assicurati che CapsLock sia disattivato.

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


puoi aggiustarlo, il BA dovrebbe essere solo una volta (mi dispiace per colpa mia)
Christopher,

7

Python 3,  55  53 byte

-1 byte grazie a isaacg (usare bit a bit per non sostituirlo -10con ~9).
-1 byte grazie a CalculatorFeline (è possibile utilizzare un BELbyte letterale ).

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

dove quanto 7sopra è un byte letterale 0x07(un non stampabile in un blocco di codice).

Una volta premuto Invio, viene verificata la whilecondizione del loop. Se gli ultimi ~9= 10 caratteri (al massimo) non corrispondono al codice del comando Contra, 1viene eseguita la no-op (sostituzione di passper brevità); se lo fanno corrispondere quindi il tempo finisce loop e l' printistruzione viene eseguita, che scrive il testo richiesto insieme con un carattere campana ASCII ( "allarme"), 0x07che produce un suono che non sia stato esplicitamente disattivato (o il terminale non ha altoparlante !).


puoi aggiustarlo, il BA dovrebbe essere solo una volta (mi dispiace per colpa mia)
Christopher,

Risolto, grazie per l'heads up.
Jonathan Allan il

1
-10= ~9, che può farti risparmiare un byte.
Isaacg,

Non riesci a inserire un letterale \ x07 nella stringa per -1 byte?
Calcolatrice

@CalculatorFeline Non ne ho idea, posso? Nota che le persone usano spesso le \nstringhe nei golf Python, perché non dovrebbero usarle \x0a?
Jonathan Allan,

5

Gelatina, 33 30 29 27 byte

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

Si scopre che l'append ( ) non è necessario, le stringhe vengono automaticamente unite insieme entrambe stampate.

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

Non compresso

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

Provalo online
Se rimuovi tutto dopo ¿, puoi pasticciare con l'input e vedere che ritorna solo quando la stringa di input è corretta.

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

Grazie @JonathanAllan per avermi aiutato a capire la compressione delle stringhe :)


“+30 lives”compresso è “¡}ʠƈ[ỵ»(per riferimento futuro ecco un post a riguardo, è collegato nel tutorial sul wiki Jelly).
Jonathan Allan,

dov'è il suono?
tuskiomi,

1
L'ho appena testato con l'interprete ufficiale e lo fa davvero fino a quando non viene inserito il codice Konami
JayDepp,

@JayDepp puoi risolvere questo BA dovrebbe essere solo una volta (colpa mia scusa)
Christopher

Io credo che non è tanto la concatenazione di stringhe automatico come una stampa implicita della LLC (leader costante catena) 7Ọseguita da una stampa implicita della Nilad “¡}ʠƈ[ỵ», apparendo in stdout come se fosse la concatenazione. Come vetrina puoi provare ad aggiungere un sonno di 2 secondi tra con ɠ⁻“UUDDLRLRBABA”$¿ṛ7Ọ2“+30 lives”œS.
Jonathan Allan il

5

Elaborazione, 161 157 155 byte

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

Il file audio deve essere salvato come sketchName/data/a.mp3. Nota: ho testato questo programma solo senza il file audio perché sono troppo pigro per scaricare un mp3file (poiché sono supportate solo estensioni limitate processing.sound.SoundFile).

La draw()funzione è necessaria per essere lì per keyTypedfunzionare.

Il motivo che stiamo utilizzando keyTypedè perché Processing non ha STDIN, può solo ascoltare i tasti che vengono premuti tramite lo schizzo in esecuzione.

Spiegazione

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

Tutte le sequenze di tasti dell'utente sono memorizzate come caratteri all'interno della stringa k. IlkeyTyped è una funzione incorporata che viene chiamata ogni volta che l'utente preme un tasto. Allo stesso tempo, stiamo controllando se questa stringa termina con i tasti. Quindi stampiamo +30 livese riproduciamo il file audio. E la drawfunzione è lì per l'aggiornamento continuo keyTyped. Dopo aver inserito il codice Konami, non verrà emesso nient'altro e non verrà riprodotto audio.


sembra che dovresti contare le dimensioni del tuo file mp3

L'elaborazione di @ricyje non ha altri modi per emettere suoni. Inoltre, la dimensione del .mp3file non ha molta importanza dal momento che, indipendentemente da ciò che è, l'elaborazione lo riprodurrà come un suono
Kritixi Lithos,

@KritixiLithos puoi risolvere questo BA dovrebbe essere solo una volta (mi dispiace colpa mia)
Christopher

@ChristopherPeart Done! (Sono felice di salvare altri 2 byte :)
Kritixi Lithos il

4

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

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

Provalo qui!

Questo si basa sul campanello (ascii 7) per il rumore alla fine (non ascoltato sull'interprete online).

Grazie a @TealPelican per aver salvato altri 15 byte!

Salvato due byte controllando BAinvece di BABA.


Questo emette un suono?
Kritixi Lithos,

@KritixiLithos, sì, vedrai nell'ultima riga alla fine è un "7", questo è il campanello.
redstarcoder

Ho modificato il codice un po 'perché non ho capito bene le prime righe? Provalo qui Questo link è per> <> ma funziona anche per *> <> (non usa il meccanico di immersione come hai fatto tu) - ha anche salvato su 19 byte! :)
Pellicano verde acqua

@Tealpelican, la prima riga è quindi continua a funzionare, in attesa di input! La tua versione collegata non lo fa; p.
redstarcoder,

Hai ragione! Ho perso questo! - Ho aggiunto una riga per ovviare al mio errore e ho sostituito alcune operazioni di inversione e stampa ridondanti Provate la nuova versione che ho ottenuto a 67 byte: D
Pellicano verde acqua

3

C 119 -1 - 2 = 116 byte

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/UUDDLRLRBABAper -1 byte e strcmp cercherà la stringa corretta!
redstarcoder

@Christopher, per favore, non apportare mai modifiche al codice delle persone su questo sito Stack Exchange. la tua modifica non avrebbe mai dovuto essere approvata.
cat

Mukul, puoi rimuovere lo spazio da solo.
cat

1
@MukulKumar Naturalmente :) è importante che il risponditore modifichi il proprio codice.
cat

1
@MukulKumar puoi risolvere questo BA dovrebbe essere solo una volta (mi dispiace colpa mia)
Christopher

3

Impilato , 41 byte

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

Legge l'input dalla tastiera.

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

Tasto di scelta automatica, 63 byte

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

Dopo aver eseguito questo script, controllerà se i prossimi 10 tasti sono il codice Konami e, se lo è, mostrerà una finestra di messaggio che dice "+30 vite" e dovrebbe emettere un segnale acustico (non ho altoparlanti ora per testare ).


Freddo! AutoHotkey è un programma interessante.
Christopher

3

GNU sed, 32 25 + 1 = 33 26 byte

+1 byte per -nflag.

/UUDDLRLRBA$/a+30 Lives\a

Provalo online!

Spiegazione

Ogni volta che si preme Invio ( $), il programma verifica se i 10 tasti precedenti erano il codice. In tal caso, il acomando mette in coda il testo +30 Livese il suono della campana ( \a) da stampare alla fine del ciclo corrente (che, in questo caso, è immediatamente).


puoi aggiustarlo, il BA dovrebbe essere solo una volta (mi dispiace per colpa mia)
Christopher,

Questo ha già BAsolo una volta.
Giordania,

Oh wow non me ne sono accorto
Christopher il

3

Mathematica, 50 byte

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

Inizialmente, xè solo un simbolo e non è quindi identico ( =!=) al simbolo UUDDLRLRBA, quindi x=Input[]viene valutato. Questo aprirà una finestra di dialogo con il cursore già nel campo di inserimento, in modo che l'utente possa iniziare immediatamente a digitare sulla tastiera.

Se Enterviene premuto o si OKfa clic senza digitare nulla, InputField[]verrà restituito Null, che non è identico aUUDDLRLRBA , quindi il ciclo continua e verrà aperta un'altra finestra di dialogo.

Se l'utente fa clic Cancelo esce in altro modo dalla finestra di dialogo, quindi InputFieldtornerà $Canceled, che non è identico a quello UUDDLRLRBA, quindi il ciclo continuerà.

L'utente può digitare nella finestra di dialogo il desiderio del proprio cuore. Quando colpiscono Enter, il loro input viene interpretato come un'espressione del linguaggio Wolfram (probabilmente solo caselle). Se quell'espressione è diversa dal simbolo UUDDLRLRBA, il ciclo continuerà.

"Deve essere eseguito il loop fino a quando non viene inserito il codice Konami" è un po 'vago, ma credo che questo lo soddisfi. Una volta che il Whileciclo è completato, .Beep[];"+30 lives"


puoi aggiustarlo, il BA dovrebbe essere solo una volta (mi dispiace per colpa mia)
Christopher,

1
UUDDLRLRB? Dov'è A?
Calcolatrice

@CalculatorFeline Fixed
ngenisis

3

Petit Computer BASIC, 91 byte

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

Finalmente una soluzione che utilizza effettivamente l'input del controller!

Ho usato Petit Computer anziché la versione più recente (SmileBASIC) perché ha accesso al pulsante Start ed BTRIG()è più breve di BUTTON().

Ho sostituito la stringa di dati con x"s", dovrebbe contenere caratteri con codici ascii 1,1,2,2,4,8,4,8,32,16

Versione noiosa, 46 byte

INPUT S$IF"UUDDLRLRBA"==S$THEN BEEP?"+30 lives

Consiglierei di usare SmileBASIC 2 per il nome delle voci Petit Computer e, se necessario, specificare SmileBASIC come SmileBASIC 3 .
snail_

Bel lavoro usando il controller!
Christopher

2

Powershell, 89 86 byte

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

invio invia la stringa a Read-Host, quindi dovrebbe .. funzionare?


2
Penso che devi solo controllare "UUDDLRLRBABA" e non "UUDDLRLR BABA" poiché non c'è "" nel codice Contra. Ti farebbe anche risparmiare un byte. Penso che assumere invio perché devono premere invio per inviare l'input sia valido.
redstarcoder

A proposito, io lavoro
Christopher,

1
@ChristopherPeart Per favore non apportare modifiche al codice altrui anche se sei l'OP o se stai salvando un byte.
cat

Ok lo farò. Ma è stata colpa mia
Christopher il

@ConnorLSW puoi risolvere questo BA dovrebbe essere solo una volta (mi dispiace colpa mia)
Christopher

2

C # (la versione noiosa), 80 byte

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

C # (quello interessante), 202 byte

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

Penso che funzioni, purtroppo i tester online non supportano l'esistenza di un input da console, quindi dovrò andare ai test che ho fatto

Molto probabilmente si può giocare a golf enormemente - non sono bravo in questo! :)

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

Hmm, C # ha un modo di leggere fino a quando non viene rilevata una nuova riga? Ciò ti salverebbe dalla ricerca del tasto Invio. Guarda come è implementato in Python qui .
redstarcoder,

C'è Console.Readlinema ho pensato che potrebbe essere aganista lo spirito della sfida! Se va bene posso renderlo molto più breve
Alfie Goodacre,

@redstarcoder ha aggiunto una Console.ReadLine()versione
Alfie Goodacre il

@AlfieGoodacre puoi aggiustare questo BA dovrebbe essere solo una volta (mi dispiace colpa mia)
Christopher

@ChristopherPeart Inizialmente era ma dovevo cambiarlo;)
Alfie Goodacre,

2

Meraviglia , 50 byte

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

Sostituire con il carattere del codice \x07(il carattere di controllo BEL). Riceve input tramite STDIN.


puoi aggiustarlo, il BA dovrebbe essere solo una volta (mi dispiace per colpa mia)
Christopher,

Beh, ho risolto. Grazie per l'avviso!
Mama Fun Roll

1

flex, 37 + 5 = 42 byte

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

Il codice stesso è di 37 byte, compilarlo con l'opzione "-main" che aggiunge 5 byte. Ovviamente, devi compilare il file C risultante con il tuo compilatore C preferito, ma non credo che questo passaggio debba essere conteggiato nel conteggio dei byte.

Potrei salvare un byte usando un carattere BEL letterale invece di \a, ma preferirei poter leggere il mio codice.


4
Non devi davvero essere in grado di leggere il codice. Questo è il codice golf
Christopher

Personalmente, penso che dovrei ottenere un bonus per l'utilizzo del flex, a causa della rarità con cui viene utilizzato qui. :)
BenGoldberg,

1
Credo che tu possa ridurre la penalità a 3 byte dando -llcome opzione al compilatore C piuttosto che -maincome opzione per flettere.

1

C, 87 85 81 byte

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

1

shortC, 52 byte

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

Spiegazione:

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

Provalo online!


1

C, 114 byte

#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);}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.