Code Konami le plus court

15

Le problème

Vous devez écrire un programme qui, lorsque le code Konami est tapé pendant l'exécution, imprime la chaîne " +30 lives" et émet un bruit de votre choix depuis le haut-parleur de l'ordinateur.

Définition

Le "Code Konami" est défini comme UUDDLRLRBAsuit en appuyant sur la touche Entrée.

Les règles

  • Vous pouvez choisir d'utiliser la flèche vers le haut pour U, le bas pour D, la gauche pour Let la droite pour R, tant que votre code est cohérent avec des flèches ou des lettres.
  • Votre entrée peut être acceptée à partir d'un contrôleur ou d'un clavier, mais n'a pas besoin de prendre en charge les deux.
  • Les réponses existantes peuvent continuer à être utilisées à la BABAplace de BA, mais peuvent également les raccourcir si elles le souhaitent. Les réponses futures devraient toutes être utilisées BApour la cohérence.

  • L'entrée vide n'a pas besoin d'être prise en charge.

Christophe
la source
Les commentaires ne sont pas pour une discussion approfondie; cette conversation a été déplacée vers le chat .
Martin Ender

Réponses:

13

05AB1E , 33 octets (fin sur entrée vide)

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

Essayez-le en ligne!

05AB1E , 30 26 octets (échoue sur une entrée vide)

-4 merci à Adnan

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

Essayez-le en ligne!

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

Avertissement: le son de Bell ne joue pas sur TryItOnline, demandez peut-être à Dennis si l'un de ses serveurs quelque part cingle lorsque vous l'exécutez.

Urne de poulpe magique
la source
Tu as presque gagné! Un octet de moins
Christopher
2
Une version compressée de "+30 lives"is “+30™‹“:)
Adnan
Cela génère toujours "+30 vies" pour moi sur l'interpréteur en ligne, même avec une entrée vide.
redstarcoder
2
@redstarcoder uniquement * avec entrée vide, merde, correction
Urne Magic Octopus
@carusocomputing pouvez-vous résoudre ce problème, le BA ne devrait être qu'une seule fois (ma faute désolé)
Christopher
7

JavaScript (ES6), 202 200 198 octets

Testé uniquement sur Chrome et Firefox. Utilise UDLRplutôt que les touches fléchées. Veuillez vous assurer que CapsLock est désactivé.

(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
la source
pouvez-vous résoudre ce problème, le BA ne devrait être qu'une seule fois (ma faute désolé)
Christopher
7

Python 3,  55  53 octets

-1 octet grâce à isaacg (utilisez au niveau du bit pour ne pas remplacer -10par ~9).
-1 octet grâce à CalculatorFeline (il est possible d'utiliser un BELoctet littéral ).

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

où l' illustration 7ci-dessus est un octet littéral 0x07(non imprimable dans un bloc de code).

Une fois la touche Entrée enfoncée, la whilecondition de boucle est vérifiée. Si les derniers ~9= 10 caractères (tout au plus) ne correspondent pas au code de commande Contra, alors le no-op 1est exécuté (remplacement de passpar souci de concision); si elles font correspondre alors le tout en fin de boucle et l' printexécution de l' instruction, qui écrit le texte requis avec un caractère de cloche ASCII ( « alarme »), 0x07qui produit un son à moins qu'il ait été explicitement désactivé (ou le terminal n'a pas haut - parleur !).

Jonathan Allan
la source
pouvez-vous résoudre ce problème, le BA ne devrait être qu'une seule fois (ma faute désolé)
Christopher
Fixé, merci pour les avertissements.
Jonathan Allan
1
-10= ~9, ce qui peut vous faire économiser un octet.
isaacg
Vous ne pouvez pas mettre un littéral \ x07 dans la chaîne pour -1 octet?
CalculatorFeline
@CalculatorFeline Je n'en ai aucune idée, puis-je? Notez que les gens utilisent souvent des \ncordes dans les golfs Python, pourquoi ne les utiliseraient-ils pas \x0a?
Jonathan Allan
5

Gelée, 33 30 29 27 octets

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

Il s'avère que l'ajout ( ) n'est pas nécessaire, les chaînes sont automatiquement jointes les deux imprimées.

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

Non compressé

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

Essayez-le en ligne
Si vous supprimez tout après ¿, vous pouvez jouer avec l'entrée et voir qu'elle ne revient que lorsque la chaîne d'entrée est correcte.

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

Merci @JonathanAllan de m'avoir aidé à comprendre la compression des chaînes :)

JayDepp
la source
“+30 lives”compressé est “¡}ʠƈ[ỵ»(pour référence future voici un article à ce sujet, il est lié dans le tutoriel sur le wiki Jelly).
Jonathan Allan
où est le son?
tuskiomi
1
Je viens de le tester avec l'interprète officiel et il boucle en effet jusqu'à ce que le code Konami soit entré
JayDepp
@JayDepp pouvez-vous résoudre ce problème, le BA ne devrait être qu'une seule fois (ma faute désolé)
Christopher
Je crois que ce n'est pas tant une concaténation automatique de chaînes qu'une impression implicite de la LLC (chaîne constante principale) 7Ọsuivie d'une impression implicite de la nilade “¡}ʠƈ[ỵ», apparaissant sur stdout comme s'il s'agissait d'une concaténation. Comme vitrine, vous pouvez essayer d'ajouter un sommeil de 2 secondes entre avec ɠ⁻“UUDDLRLRBABA”$¿ṛ7Ọ2“+30 lives”œS.
Jonathan Allan
5

Traitement, 161 157 155 octets

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

Le fichier audio doit être enregistré sous sketchName/data/a.mp3. Remarque: J'ai uniquement testé ce programme sans le fichier audio car je suis trop paresseux pour télécharger un mp3fichier (car seules des extensions limitées sont prises en charge à partir de processing.sound.SoundFile).

La draw()fonction doit être là pour keyTypedfonctionner.

La raison pour laquelle nous l'utilisons keyTypedest que le traitement n'a pas STDIN, il ne peut écouter que les touches enfoncées via l'esquisse en cours d'exécution.

Explication

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

Toutes les frappes de l'utilisateur sont stockées sous forme de caractères dans la chaîne k. La keyTypedest une fonction intégrée qui est appelée chaque fois que l'utilisateur tape une clé. Simultanément, nous vérifions si cette chaîne se termine par les frappes. Ensuite, nous imprimons +30 liveset lisons le fichier son. Et la drawfonction est là pour se mettre à jour en permanence keyTyped. Une fois le code Konami entré, rien d'autre ne sera émis et aucun son ne sera lu.

Kritixi Lithos
la source
il semble que vous devriez compter la taille de votre fichier mp3
@ricyje Processing n'a pas vraiment d'autre moyen de produire des sons. De plus, la taille du .mp3fichier n'a pas vraiment d'importance car peu importe ce qu'il est, le traitement le jouera comme un son
Kritixi Lithos
@KritixiLithos pouvez-vous résoudre ce problème, le BA ne devrait être qu'une seule fois (ma faute désolé)
Christopher
@ChristopherPeart Done! (Je suis heureux d'économiser 2 octets supplémentaires :)
Kritixi Lithos
4

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

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

Essayez-le ici!

Cela repose sur le carillon de la cloche (ascii 7) pour le bruit à la fin (non entendu sur l'interprète en ligne).

Merci à @TealPelican d'avoir économisé encore 15 octets!

Enregistrement de deux octets à la recherche BAde BABA.

redstarcoder
la source
Est-ce que cela fait du bruit?
Kritixi Lithos
@KritixiLithos, oui, vous verrez sur l'avant-dernière ligne à la fin est un "7", c'est le carillon de la cloche.
redstarcoder
J'ai un peu refactorisé votre code parce que je ne comprenais pas très bien l'utilisation des premières lignes? Essayez-le ici Ce lien est pour> <> mais fonctionne aussi pour *> <> (n'utilise pas le mécanisme de plongée comme vous l'avez) - il a également enregistré sur 19 octets! :)
Pélican bleu canard
@Tealpelican, la première ligne est donc elle continue de fonctionner, en attendant la saisie! Votre version liée ne fait pas cela; p.
redstarcoder
Tu as raison! J'ai manqué ça! - J'ai ajouté une ligne pour tenir compte de mon erreur et remplacé certaines inversions et impressions redondantes Essayez la nouvelle version que j'ai réduite à 67 octets: D
Pélican bleu canard
3

C 119 -1 - 2 = 116 octets

Golfé

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

Non golfé

#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
la source
s/UUDDLRLR BABA/UUDDLRLRBABApour -1 octet et le strcmp recherchera la chaîne correcte!
redstarcoder
@Christopher, veuillez ne jamais modifier le code des personnes sur ce site Stack Exchange. votre modification n'aurait jamais dû être approuvée.
chat
Mukul, vous pouvez supprimer l'espace vous-même.
chat
1
@MukulKumar Bien sûr :) il est important que le répondeur édite son propre code.
chat
1
@MukulKumar pouvez-vous résoudre ce problème, le BA ne devrait être qu'une fois (ma faute désolé)
Christopher
3

Empilé , 41 octets

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

Lit l'entrée du clavier.

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

AutoHotkey, 63 octets

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

Après avoir exécuté ce script, il vérifiera si les 10 touches suivantes sont le code Konami et si c'est le cas, il affichera une boîte de message disant "+30 vies" et il devrait émettre un bip (je n'ai pas de haut-parleurs maintenant pour tester ).

Kodos Johnson
la source
Cool! AutoHotkey est un programme intéressant.
Christopher
3

GNU sed, 32 25 + 1 = 33 26 octets

+1 octet pour le -ndrapeau.

/UUDDLRLRBA$/a+30 Lives\a

Essayez-le en ligne!

Explication

Chaque fois que la touche Entrée est enfoncée ( $), le programme vérifie si les 10 touches précédentes étaient le code. Si tel était le cas, la acommande met en file d'attente le texte +30 Liveset le son de la cloche ( \a) à imprimer à la fin du cycle en cours (qui, dans ce cas, est immédiatement).

Jordan
la source
pouvez-vous résoudre ce problème, le BA ne devrait être qu'une seule fois (ma faute désolé)
Christopher
Cela a déjà BAune seule fois.
Jordan
Oh wow n'a pas remarqué
Christopher
3

Mathematica, 50 octets

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

Initialement, xest juste un symbole et n'est donc pas identique ( =!=) au symboleUUDDLRLRBA , il x=Input[]est donc évalué. Cela ouvrira une boîte de dialogue avec le curseur déjà dans le champ de saisie, afin que l'utilisateur puisse immédiatement commencer à taper sur le clavier.

Si Enterest pressé ou OKcliqué sans rien taper, alors InputField[]reviendra Null, qui n'est pas identique àUUDDLRLRBA , donc la boucle continue et une autre boîte de dialogue sera ouverte.

Si l'utilisateur clique Cancelou quitte la boîte de dialogue, il InputFieldreviendra $Canceled, ce qui n'est pas non plus identique àUUDDLRLRBA , donc la boucle continuera.

L'utilisateur peut taper dans la boîte de dialogue au gré de ses envies. Lorsqu'ils frappent Enter, leur entrée est interprétée comme une expression du langage Wolfram (peut-être juste des cases). Si cette expression est autre chose que le symboleUUDDLRLRBA , la boucle continuera.

"Doit boucler jusqu'à ce que le code Konami soit entré" est un peu vague, mais je crois que cela le satisfait. Une fois la Whileboucle terminée ,.Beep[];"+30 lives"

ngenisis
la source
pouvez-vous résoudre ce problème, le BA ne devrait être qu'une seule fois (ma faute désolé)
Christopher
1
UUDDLRLRB? O's est A?
CalculatorFeline
@CalculatorFeline Fixed
ngenisis
3

Petit ordinateur BASIC, 91 octets

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

Enfin une solution qui utilise réellement l'entrée du contrôleur!

J'ai utilisé Petit Computer plutôt que la version plus récente (SmileBASIC) car elle a accès au bouton Démarrer et BTRIG()est plus courte queBUTTON() .

J'ai remplacé la chaîne de données par x 's, elle devrait contenir des caractères avec les codes ascii 1,1,2,2,4,8,4,8,32,16

Version ennuyeuse, 46 octets

INPUT S$IF"UUDDLRLRBA"==S$THEN BEEP?"+30 lives
12Me21
la source
Je recommanderais d'utiliser SmileBASIC 2 pour le nom des entrées Petit Computer et, si nécessaire, spécifiez SmileBASIC comme SmileBASIC 3 .
snail_
Beau travail en utilisant le contrôleur!
Christopher
2

Powershell, 89 86 octets

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

enter soumet la chaîne au Read-Host, donc elle devrait .. fonctionner?

colsw
la source
2
Je pense que vous avez juste besoin de vérifier "UUDDLRLRBABA" et non "UUDDLRLR BABA" car il n'y a pas de "" dans le code Contra. Cela vous ferait également économiser un octet. Je pense que supposer entrer parce qu'ils doivent appuyer sur Entrée pour envoyer l'entrée est valide.
redstarcoder
Je travaille d'ailleurs
Christopher
1
@ChristopherPeart Veuillez ne pas modifier le code des autres, même si vous êtes l'OP, ou si vous les enregistrez un octet.
chat
D'accord je ferai ça. Mais c'était ma faute
Christopher
@ConnorLSW pouvez-vous résoudre ce problème, le BA ne devrait être qu'une seule fois (ma faute désolé)
Christopher
2

C # (la version ennuyeuse), 80 octets

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

C # (L'intéressant), 202 octets

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

Je pense que cela fonctionne, malheureusement les testeurs en ligne ne prennent pas en charge l'existence d'une entrée de console, en tant que tel, je devrai passer les tests que j'ai effectués

Peut très probablement être énormément joué au golf - je ne suis pas doué pour ça! :)

Non golfé:

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
la source
Hmm, C # a-t-il un moyen de lire jusqu'à ce qu'une nouvelle ligne soit détectée? Cela vous éviterait de chercher la clé d'entrée. Regardez comment cela est implémenté en Python ici .
redstarcoder
Il y en a Console.Readlinemais je pensais que cela pourrait être l'esprit du défi! Si ça va, je peux faire ça beaucoup plus court
Alfie Goodacre
@redstarcoder a ajouté une Console.ReadLine()version
Alfie Goodacre
@AlfieGoodacre pouvez-vous résoudre ce problème, le BA ne devrait être qu'une seule fois (ma faute désolé)
Christopher
@ChristopherPeart C'était à l'origine mais je devais le changer;)
Alfie Goodacre
2

Wonder , 50 octets

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

Remplacez par le caractère du code \x07( le caractère de contrôle BEL). Prend entrée via STDIN.

Mama Fun Roll
la source
pouvez-vous résoudre ce problème, le BA ne devrait être qu'une seule fois (ma faute désolé)
Christopher
Eh bien, j'ai corrigé. Merci pour l'avis!
Mama Fun Roll
1

flex, 37 + 5 = 42 octets

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

Le code lui-même fait 37 octets, compilez-le avec l'option "-main" qui ajoute 5 octets. Naturellement, vous devez compiler le fichier C résultant avec votre compilateur C préféré, mais je ne pense pas que cette étape devrait compter pour le nombre d'octets.

Je pourrais enregistrer un octet en utilisant un caractère BEL littéral au lieu de \a, mais je préférerais pouvoir lire mon propre code.

BenGoldberg
la source
4
Vous n'avez vraiment pas besoin de pouvoir lire le code. Ceci est le golf de code
Christopher
Personnellement, je pense que je devrais obtenir un bonus pour l'utilisation de flex, car il est rarement utilisé ici. :)
BenGoldberg
1
Je crois que vous pouvez réduire la pénalité à 3 octets en donnant -llcomme option au compilateur C plutôt que -maincomme option de flexion.
1

C, 87 85 81 octets

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

shortC, 52 octets

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

Explication:

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

Essayez-le en ligne!

MD XF
la source
1

C, 114 octets

#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
la source