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.


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.


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.


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 !).


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 :)


“+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.


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.


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

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. 

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 )


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


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


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

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?


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

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.


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.


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

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!


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);}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.