Código Konami más corto

15

El problema

Debe escribir un programa que, cuando se ingresa el Código Konami durante el tiempo de ejecución, imprime la cadena " +30 lives" y suena un ruido de su elección desde el altavoz de la computadora.

Definición

El "Código Konami" se define como UUDDLRLRBAseguido presionando la tecla enter.

Las normas

  • Puede optar por utilizar la flecha hacia arriba para U, hacia abajo, hacia la Dizquierda Ly hacia la derecha R, siempre que su código sea coherente con flechas o letras.
  • Su entrada puede ser aceptada desde un controlador o un teclado, pero no necesita admitir ambos.
  • Las respuestas existentes pueden seguir utilizándose en BABAlugar de hacerlo BA, pero también pueden acortarlo si lo desean. Las respuestas futuras deberían usarse BApor coherencia.

  • La entrada vacía no necesita ser compatible.

Christopher
fuente
Los comentarios no son para discusión extendida; Esta conversación se ha movido al chat .
Martin Ender

Respuestas:

13

05AB1E , 33 bytes (fino en entrada vacía)

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

Pruébalo en línea!

05AB1E , 30 26 bytes (falla en la entrada vacía)

-4 gracias a Adnan

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

Pruébalo en línea!

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

Descargo de responsabilidad: el sonido de la campana no se reproduce en TryItOnline, tal vez pregunte a Dennis si uno de sus servidores está haciendo ping cuando lo ejecuta.

Urna de pulpo mágico
fuente
¡Casi ganaste! Solo un byte apagado
Christopher
2
Una versión comprimida de "+30 lives"es “+30™‹“:)
Adnan
Esto siempre genera "+30 vidas" para mí en el intérprete en línea, incluso con una entrada vacía.
redstarcoder
2
@redstarcoder Only * con entrada vacía, basura, fijación
Urna de pulpo mágico
@carusocomputing, ¿puedes arreglar esto? El BA solo debería ser una vez (lo siento, mi culpa)
Christopher
7

JavaScript (ES6), 202 200 198 bytes

Probado solo en Chrome y Firefox. Utiliza en UDLRlugar de las teclas de flecha. Asegúrese de que CapsLock esté desactivado.

(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
fuente
¿Puedes arreglar esto? El BA solo debería ser una vez (lo siento, mi culpa)
Christopher
7

Python 3,  55  53 bytes

-1 byte gracias a isaacg (use bit a bit para no reemplazar -10con ~9).
-1 byte gracias a CalculatorFeline (es posible usar un BELbyte literal ).

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

donde lo que se 7muestra arriba es un byte literal 0x07(no imprimible en un bloque de código).

Una vez que se presiona Enter while, se verifica la condición del bucle. Si los últimos ~9= 10 caracteres (como máximo) no coinciden con el código de comando Contra, 1se ejecuta el no-op (reemplazo de passbrevedad); si se hacen coincidir entonces el mientras que los extremos del asa y la printsentencia se ejecuta, que escribe el texto deseado junto con un carácter ASCII de la campanilla ( "alarma"), 0x07que produce un sonido menos que se haya desactivado explícitamente (o el terminal no tiene altavoz !).

Jonathan Allan
fuente
¿Puedes arreglar esto? El BA solo debería ser una vez (lo siento, mi culpa)
Christopher
Solucionado, gracias por el aviso.
Jonathan Allan
1
-10= ~9, que puede ahorrarle un byte.
isaacg
¿No puedes poner un literal \ x07 en la cadena para -1 byte?
CalculatorFeline
@CalculatorFeline No tengo idea, ¿puedo? Tenga en cuenta que las personas a menudo usan \ncadenas en los campos de golf de Python, ¿por qué no las usan \x0a?
Jonathan Allan
5

Jalea, 33 30 29 27 bytes

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

Resulta que el append ( ) no es necesario, las cadenas se unen automáticamente y se imprimen.

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

Sin comprimir

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

Pruébelo en línea
Si elimina todo después ¿, puede meterse con la entrada y ver que solo vuelve cuando la cadena de entrada es correcta.

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

Gracias @JonathanAllan por ayudarme a descubrir la compresión de cadenas :)

JayDepp
fuente
“+30 lives”comprimido es “¡}ʠƈ[ỵ»(para referencia futura aquí hay una publicación al respecto, está vinculado en el tutorial en la wiki de Jelly).
Jonathan Allan
donde esta el sonido
tuskiomi
1
Acabo de probarlo con el intérprete oficial y, de hecho
repite
@ JayDepp, ¿puedes arreglar esto? El BA solo debería ser una vez (lo siento, mi culpa)
Christopher
Yo creo que no es tanto la concatenación de cadenas automática como impresión implícita de la LLC (la principal cadena constante) 7Ọseguido de una impresión implícita del nilad “¡}ʠƈ[ỵ», que aparece en la salida estándar como si se tratara de concatenación. Como escaparate, puede intentar agregar un sueño de 2 segundos entre con ɠ⁻“UUDDLRLRBABA”$¿ṛ7Ọ2“+30 lives”œS.
Jonathan Allan
5

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

El archivo de audio debe guardarse como sketchName/data/a.mp3. Nota: Solo he probado este programa sin el archivo de audio porque soy demasiado vago para descargar un mp3archivo (ya que solo se admiten extensiones limitadas processing.sound.SoundFile).

Se draw()necesita la función para estar allí para keyTypedpoder trabajar.

La razón por la que estamos usando keyTypedes porque Processing no tiene STDIN, solo puede escuchar las teclas presionadas a través del boceto que se está ejecutando.

Explicación

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

Todas las pulsaciones de teclas del usuario se almacenan como caracteres dentro de la Cadena k. La keyTypedes una función incorporada que se llama cada vez que el usuario escribe una clave. Simultáneamente, estamos verificando si esta Cadena termina con las pulsaciones de teclas. Luego imprimimos +30 livesy reproducimos el archivo de sonido. Y la drawfunción está ahí para actualizar continuamente keyTyped. Después de ingresar el código Konami, no se emitirá nada más y no se reproducirá ningún audio.

Kritixi Lithos
fuente
parece que debería contar el tamaño de su archivo mp3
@ricyje Processing realmente no tiene otra forma de emitir sonidos. Además, el tamaño del .mp3archivo realmente no importa, ya que no importa lo que sea, Processing lo reproducirá como un sonido
Kritixi Lithos
@ KritixiLithos, ¿puedes arreglar esto? El BA solo debería ser una vez (lo siento, mi culpa)
Christopher
@ChristopherPeart Done! (Me alegra guardar 2 bytes más :)
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

Pruébalo aquí!

Esto se basa en el timbre de la campana (ASCII 7 ) para el ruido al final (no se escucha en el intérprete en línea).

¡Gracias a @TealPelican por guardar otros 15 bytes!

Se guardaron dos bytes buscando en BAlugar de BABA.

Redstarcoder
fuente
¿Esto hace un sonido?
Kritixi Lithos
@KritixiLithos, sí, verás que en la penúltima línea al final hay un "7", ese es el timbre.
redstarcoder
He refactorizado su código un poco porque no entendí bien el uso de las primeras líneas. Pruébelo aquí Este enlace es para> <> pero también funciona para *> <> (no utiliza la mecánica de buceo como usted) - ¡también se guardó en 19 bytes! :)
Teal pelican
@Tealpelican, ¡la primera línea es para que siga funcionando, esperando la entrada! Su versión vinculada no hace eso; p.
redstarcoder
¡Tienes razón! ¡Me lo perdí! - Agregué una línea para acomodar mi error y reemplacé algunas copias e impresiones redundantes. Pruebe la nueva versión que obtuve en 67 bytes: D
Teal pelican
3

C 119 -1 - 2 = 116 bytes

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

Sin 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
fuente
s/UUDDLRLR BABA/UUDDLRLRBABA¡para -1 byte y el strcmp buscará la cadena correcta!
redstarcoder
@Christopher, por favor, nunca edite el código de las personas en este sitio de Stack Exchange. su edición nunca debería haber sido aprobada.
gato
Mukul, puedes eliminar el espacio tú mismo.
gato
1
@MukulKumar Por supuesto :) es importante que el respondedor edite su propio código.
gato
1
@MukulKumar, ¿puedes arreglar esto? El BA solo debería ser una vez (lo siento, mi culpa)
Christopher
3

Apilado , 41 bytes

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

Lee la entrada del teclado.

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

AutoHotkey, 63 bytes

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

Después de ejecutar este script, verificará si las siguientes 10 teclas son el código Konami y, si lo es, mostrará un cuadro de mensaje que dice "+30 vidas" y debería sonar un pitido (ahora no tengo altavoces para probar )

Kodos Johnson
fuente
¡Frio! AutoHotkey es un programa interesante.
Christopher
3

GNU sed, 32 25 + 1 = 33 26 bytes

+1 byte para -nbandera.

/UUDDLRLRBA$/a+30 Lives\a

Pruébalo en línea!

Explicación

Cada vez que se presiona enter ( $), el programa verifica si las 10 teclas anteriores fueron el código. Si lo fueran, el acomando pone en cola el texto +30 Livesy el sonido de la campana ( \a) para que se imprima al final del ciclo actual (que, en este caso, es inmediato).

Jordán
fuente
¿Puedes arreglar esto? El BA solo debería ser una vez (lo siento, mi culpa)
Christopher
Esto ya tiene BAsolo una vez.
Jordania
Oh wow, no lo noté
Christopher
3

Mathematica, 50 bytes

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

Inicialmente, xes solo un símbolo y, por lo tanto, no es idéntico ( =!=) al símbolo UUDDLRLRBA, por lo que x=Input[]se evalúa. Esto abrirá un cuadro de diálogo con el cursor ya en el campo de entrada, para que el usuario pueda comenzar a escribir inmediatamente en el teclado.

Si Enterse presiona o OKse hace clic sin escribir nada, InputField[]volverá Null, lo que no es idéntico UUDDLRLRBA, por lo que el bucle continúa y se abrirá otro cuadro de diálogo.

Si el usuario hace clic Cancelo sale del cuadro de diálogo, InputFieldregresará $Canceled, que tampoco es idéntico aUUDDLRLRBA , por lo que el ciclo continuará.

El usuario puede escribir en el cuadro de diálogo al deseo de su corazón. Cuando golpean Enter, su entrada se interpreta como una expresión del lenguaje Wolfram (posiblemente solo cuadros). Si esa expresión no es el símbolo UUDDLRLRBA, el ciclo continuará.

"Debe repetir hasta que se ingrese el código de Konami" es un poco vago, pero creo que esto lo satisface. Una vez que el Whilese ha completado bucle, .Beep[];"+30 lives"

ngenisis
fuente
¿Puedes arreglar esto? El BA solo debería ser una vez (lo siento, mi culpa)
Christopher
1
UUDDLRLRB? ¿Dónde está 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

Finalmente, una solución que realmente utiliza la entrada del controlador.

Utilicé Petit Computer en lugar de la versión más reciente (SmileBASIC) porque tiene acceso al botón de Inicio y BTRIG()es más corto que BUTTON().

He reemplazado la cadena de datos con x's, debe contener caracteres con códigos ascii 1,1,2,2,4,8,4,8,32,16

Versión aburrida, 46 bytes

INPUT S$IF"UUDDLRLRBA"==S$THEN BEEP?"+30 lives
12Me21
fuente
Recomendaría usar SmileBASIC 2 para el nombre de las entradas de Petit Computer y, cuando sea necesario, especifique SmileBASIC como SmileBASIC 3 .
caracol_
Buen trabajo usando el controlador!
Christopher
2

Powershell, 89 86 bytes

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

enter envía la cadena a Read-Host, por lo que debería ... ¿funciona?

colsw
fuente
2
Creo que solo necesita verificar "UUDDLRLRBABA" no "UUDDLRLR BABA" ya que no hay "" en el código Contra. Eso también te ahorraría un byte. Creo que asumir enter porque tienen que presionar enter para enviar la entrada es válido.
redstarcoder
Por cierto
Christopher
1
@ChristopherPeart Por favor, no realice modificaciones en el código de otros, incluso si usted es el OP, o si está guardando un byte.
gato
Ok, haré eso. Pero fue mi culpa
Christopher
@ConnorLSW, ¿puedes arreglar esto? El BA solo debería ser una vez (lo siento, mi culpa)
Christopher
2

C # (la versión aburrida), 80 bytes

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

C # (El interesante), 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();}}

Creo que esto funciona, lamentablemente los probadores en línea no admiten la existencia de una entrada de consola, por lo que tendré que pasar por las pruebas que he realizado.

Lo más probable es que pueda jugar al golf enormemente. ¡No soy bueno en esto! :)

Sin 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
fuente
Hmm, ¿C # tiene una manera de leer hasta que se detecte una nueva línea? Eso te salvaría de buscar la tecla Intro. Mira cómo se implementa en Python aquí .
redstarcoder
¡ Console.ReadlinePero pensé que podría ser contra el espíritu del desafío! Si eso está bien, puedo hacerlo mucho más corto
Alfie Goodacre
@redstarcoder agregó una Console.ReadLine()versión
Alfie Goodacre
@AlfieGoodacre, ¿puedes arreglar esto? El BA solo debe ser una vez (lo siento, mi culpa)
Christopher
@ChristopherPeart Originalmente era pero tuve que cambiarlo;)
Alfie Goodacre
2

Maravilla , 50 bytes

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

Reemplace con el carácter del código \x07(el carácter de control BEL). Toma entrada a través de STDIN.

Mama Fun Roll
fuente
¿Puedes arreglar esto? El BA solo debería ser una vez (lo siento, mi culpa)
Christopher
Pues lo arreglé. ¡Gracias por la noticia!
Mama Fun Roll
1

flex, 37 + 5 = 42 bytes

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

El código en sí es de 37 bytes, compílelo con la opción "-main" que agrega 5 bytes. Naturalmente, debe compilar el archivo C resultante con su compilador de C favorito, pero no creo que ese paso deba contar para el recuento de bytes.

Podría guardar un byte usando un carácter BEL literal en lugar de \a, pero prefiero poder leer mi propio código.

BenGoldberg
fuente
44
Realmente no necesitas poder leer el código. Este es el código de golf
Christopher
Personalmente, creo que debería obtener una bonificación por usar flex, debido a que rara vez se usa aquí. :)
BenGoldberg
1
Creo que puede reducir la penalización a 3 bytes al dar -llcomo opción al compilador de C en lugar de -maincomo una opción para flexionar.
1

C, 87 85 81 bytes

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

shortC, 52 bytes

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

Explicación:

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

Pruébalo en línea!

MD XF
fuente
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);}
usuario12707
fuente