Código Konami mais curto

15

O problema

Você deve escrever um programa que, quando o Código Konami for digitado durante o tempo de execução, imprima a string " +30 lives" e emita um ruído de sua escolha no alto-falante do computador.

Definição

O "Código Konami" é definido como UUDDLRLRBAseguido pressionando a tecla Enter.

As regras

  • Você pode optar por usar a seta para Ucima, para baixo, para Desquerda Le direita para R, desde que seu código seja consistente com setas ou letras.
  • Sua entrada pode ser aceita de um controlador ou teclado, mas não precisa suportar os dois.
  • As respostas existentes podem continuar a ser usadas em BABAvez de BA, mas também podem ser reduzidas, se assim o desejarem. Todas as respostas futuras devem ser usadas BApara obter consistência.

  • Entrada vazia não precisa ser suportada.

Christopher
fonte
Comentários não são para discussão prolongada; esta conversa foi movida para o bate-papo .
Martin Ender

Respostas:

13

05AB1E , 33 bytes (multa na entrada vazia)

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

Experimente online!

05AB1E , 30 26 bytes (falha na entrada vazia)

-4 graças a Adnan

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

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

Exoneração de responsabilidade: O som de Bell não é reproduzido no TryItOnline, talvez pergunte a Dennis se um de seus servidores em algum lugar está tocando quando você o executa.

Urna de polvo mágico
fonte
Você quase ganhou! Apenas um byte de diferença
Christopher
2
Uma versão compactada do "+30 lives"is “+30™‹“:) #
Adnan
Isso sempre gera "+30 vidas" para mim no intérprete on-line, mesmo com entradas vazias.
Reddarcoder 13/12/16
2
@redstarcoder Only * com entrada vazia, porcaria, conserto #
Magic Octopus Urn
@carusocomputing você pode corrigir isso a BA só deve ser uma vez (minha culpa sorry)
Christopher
7

JavaScript (ES6), 202 200 198 bytes

Testado apenas no Chrome e Firefox. Usa UDLRem vez das teclas de seta. Verifique se o CapsLock está desativado.

(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
fonte
você pode corrigir isso a BA só deve ser uma vez (minha culpa sorry)
Christopher
7

Python 3,  55  53 bytes

-1 byte graças à utilização isaacg (bit a bit para não substituir -10com ~9).
-1 byte graças ao CalculatorFeline (é possível usar um BELbyte literal ).

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

onde o 7mostrado acima é um byte literal 0x07(um não imprimível em um bloco de código).

Uma vez pressionado enter, a whilecondição do loop é verificada. Se os últimos ~9= 10 caracteres (no máximo) não corresponderem ao código de comando Contra, o no-op 1será executado (substituindo passpor brevidade); se fazer corresponder, em seguida, o tempo loop termina e a printinstrução é executada, que grava o texto necessário junto com um carácter sino ASCII ( "alarme"), 0x07que produz um som menos que tenha sido explicitamente desativado (ou o terminal tem nenhum alto-falante !).

Jonathan Allan
fonte
você pode corrigir isso a BA só deve ser uma vez (minha culpa sorry)
Christopher
Corrigido, obrigado pelo aviso.
Jonathan Allan
1
-10= ~9, que pode economizar um byte.
Isaacg
Você não pode colocar um literal \ x07 na string para -1 byte?
CalculatorFeline
@CalculatorFeline Não faço ideia, posso? Observe que as pessoas costumam usar \ncordas em campos de golfe em Python, por que não usariam \x0a?
Jonathan Allan
5

Geléia, 33 30 29 27 bytes

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

Acontece que o append ( ) não é necessário, as strings são automaticamente unidas e impressas.

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

Descomprimido

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

Experimente online
Se você remover tudo depois ¿, poderá mexer na entrada e ver que ela só retornará quando a sequência de entrada estiver correta.

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

Obrigado @ JonathanAllan por me ajudar a descobrir a compactação de cadeias :)

JayDepp
fonte
“+30 lives”compactado é “¡}ʠƈ[ỵ»(para referência futura, aqui está um post sobre o assunto, ele está vinculado no tutorial no wiki do Jelly).
Jonathan Allan
onde esta o som
tuskiomi
1
Eu só testei com o intérprete oficial e que faz de fato loop até que o código Konami é inserido
JayDepp
@JayDepp você pode corrigir isso a BA só deve ser uma vez (minha culpa sorry)
Christopher
Eu acredito que não é tanto concatenação automática como uma cópia implícita da LLC (levando cadeia constante) 7Ọseguido por uma impressão implícita do nilad “¡}ʠƈ[ỵ», aparecendo na stdout como se fosse concatenação. Como uma vitrine, você pode tentar adicionar um sono de 2 segundos entre com ɠ⁻“UUDDLRLRBABA”$¿ṛ7Ọ2“+30 lives”œS.
Jonathan Allan
5

Processando, 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(){}

O arquivo de áudio deve ser salvo como sketchName/data/a.mp3. Nota: Eu testei este programa apenas sem o arquivo de áudio porque tenho preguiça de fazer o download de um mp3arquivo (uma vez que apenas extensões limitadas são suportadas processing.sound.SoundFile).

A draw()função é necessária para estar lá, a fim de keyTypedtrabalhar.

O motivo pelo qual estamos usando keyTypedé que o Processing não possui STDIN, ele só pode ouvir as teclas pressionadas pelo esboço sendo executado.

Explicação

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

Todos os pressionamentos de tecla do usuário são armazenados como caracteres dentro da String k. A keyTypedé uma função incorporada que é chamada sempre que o usuário digita uma tecla. Simultaneamente, estamos verificando se essa String termina com as teclas digitadas. Em seguida, imprimimos +30 livese reproduzimos o arquivo de som. E a drawfunção existe para atualizar continuamente keyTyped. Depois que o código Konami for inserido, nada mais será emitido e nenhum áudio será reproduzido.

Kritixi Lithos
fonte
parece que você deve contar o tamanho do seu arquivo mp3 #
O @ricyje Processing realmente não tem outra maneira de emitir sons. Além disso, o tamanho do .mp3arquivo realmente não importa, pois, não importa o que seja, o Processing o reproduzirá como um som
Kritixi Lithos
@KritixiLithos você pode corrigir isso a BA só deve ser uma vez (minha culpa sorry)
Christopher
@ChristopherPeart Done! (Eu estou contente para salvar mais 2 bytes :)
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

Experimente aqui!

Isso depende do toque da campainha (ascii 7) para o ruído no final (não ouvido no intérprete on-line).

Agradecemos ao @TealPelican por salvar outros 15 bytes!

Salva dois bytes procurando em BAvez de BABA.

redstarcoder
fonte
Isso soa?
Kritixi Lithos
@KritixiLithos, sim, você verá que a segunda e última linha no final é um "7", esse é o toque da campainha.
Redstarcoder 9/16
Refatorei seu código um pouco, porque não entendi direito as primeiras linhas usadas? Experimente aqui Este link é para> <> mas também funciona para *> <> (não usa a mecânica de mergulho como você possui) - ele também salvou em 19 bytes! :)
Teal pelican
@Tealpelican, a primeira linha é para que continue funcionando, aguardando entrada! A sua versão vinculada não faz isso; p.
Reddarcoder 13/12
Você está certo! Eu senti falta disso! - Adicionei uma linha para acomodar o meu erro e substitui algumas reversões e impressões redundantes. Experimente a nova versão que cheguei a 67 bytes: D
Teal pelican
3

C 119 -1 - 2 = 116 bytes

Golfe

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
fonte
s/UUDDLRLR BABA/UUDDLRLRBABApara -1 byte e o strcmp procurará a string correta!
Redstarcoder 9/12/16
@Christopher, por favor, nunca faça edições no código das pessoas neste site do Stack Exchange. sua edição nunca deveria ter sido aprovada.
gato
Mukul, você pode remover o espaço você mesmo.
gato
1
@MukulKumar Claro :) é importante que o atendedor edite seu próprio código.
gato
1
@MukulKumar can you fix this the BA should only be once (my fault sorry)
Christopher
3

Stacked, 41 bytes

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

Reads input from keyboard.

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

AutoHotkey, 63 bytes

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

Depois de executar este script, ele verificará se as próximas 10 teclas são o código da Konami e, se for, mostrará uma caixa de mensagem dizendo "+30 vidas" e deve emitir um sinal sonoro (não tenho alto-falantes agora para testar )

Kodos Johnson
fonte
Legal! AutoHotkey é um programa interessante.
Christopher
3

GNU sed, 32 25 + 1 = 33 26 bytes

+1 byte para -nsinalizador.

/UUDDLRLRBA$/a+30 Lives\a

Experimente online!

Explicação

Every time enter is pressed ($), the program checks if the preceding 10 keystrokes were the code. If they were, the a command queues the text +30 Lives and the bell sound (\a) to be printed at the end of the current cycle (which, in this case, is immediately).

Jordan
fonte
can you fix this the BA should only be once (my fault sorry)
Christopher
This already has the BA just once.
Jordan
Oh wow didn't notice
Christopher
3

Mathematica, 50 bytes

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

Initially, x is just a symbol and is thus not identical (=!=) to the symbol UUDDLRLRBA, so x=Input[] is evaluated. This will open a dialog box with the cursor already in the input field, so the user can immediately start typing on the keyboard.

If Enter is pressed or OK is clicked without typing anything, then InputField[] will return Null, which is not identical to UUDDLRLRBA, so the loop continues and another dialog box will be opened.

If the user clicks Cancel or otherwise exits the dialog box, then InputField will return $Canceled, which is also not identical to UUDDLRLRBA, so the loop will continue.

The user can type in the dialog box to their heart's desire. When they hit Enter, their input is interpreted as a Wolfram language expression (possibly just boxes). If that expression is anything other than the symbol UUDDLRLRBA, the loop will continue.

"Must loop until the Konami code is entered" is a little vague, but I believe this satisfies it. Once the While loop is completed, Beep[];"+30 lives".

ngenisis
fonte
can you fix this the BA should only be once (my fault sorry)
Christopher
1
UUDDLRLRB? Where's A?
CalculatorFeline
@CalculatorFeline Fixed
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

Finally a solution that actually uses controller input!

I used Petit Computer rather than the newer version (SmileBASIC) because it has access to the Start button, and BTRIG() is shorter than BUTTON().

I've replaced the data string with x's, it should contain characters with ascii codes 1,1,2,2,4,8,4,8,32,16

Boring version, 46 bytes

INPUT S$IF"UUDDLRLRBA"==S$THEN BEEP?"+30 lives
12Me21
fonte
I would recommend using SmileBASIC 2 for the name of Petit Computer entries, and where necessary specify SmileBASIC as SmileBASIC 3.
snail_
Nice job using controller!
Christopher
2

Powershell, 89 86 Bytes

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

enter submits the string to the Read-Host, so it should.. work?

colsw
fonte
2
I think you just need to check for "UUDDLRLRBABA" not "UUDDLRLR BABA" as there's no " " in the Contra code. That'd also save you a byte. I think assuming enter because they have to press enter to send the input is valid.
redstarcoder
I does work by the way
Christopher
1
@ChristopherPeart Please don't make edits to others' code even if you are the OP, or if you are saving them a byte.
cat
Ok I will do that. But It was my fault
Christopher
@ConnorLSW can you fix this the BA should only be once (my fault sorry)
Christopher
2

C# (the boring version), 80 bytes

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

C# (The interesting one), 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();}}

I think this works, sadly online testers do not support the existence of a console input, as such I will have to go on the tests I have done

Can most likely be golfed hugely - I'm not great at this! :)

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
fonte
Hmm, does C# have a way to read until a newline is detected? That'd save you from looking for the enter key. Look at how it's implemented in Python here.
redstarcoder
There's Console.Readline but I thought that might be aganist the spirit of the challenge! If that's fine I can make this much shorter
Alfie Goodacre
@redstarcoder added a Console.ReadLine() version
Alfie Goodacre
@AlfieGoodacre can you fix this the BA should only be once (my fault sorry)
Christopher
@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.

Mama Fun Roll
fonte
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.

BenGoldberg
fonte
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");}
MD XF
fonte
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!

MD XF
fonte
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
fonte