最短的Konami码


15

问题

您必须编写一个程序,在运行时键入Konami代码时,该程序会打印字符串“ +30 lives”,并从计算机的扬声器中发出您选择的声音。

定义

定义“ Konami代码”,UUDDLRLRBA然后按Enter键。

规则

  • 只要您的代码与箭头或字母一致,就可以选择使用向上箭头U,向下箭头D,左箭头L和右R箭头。
  • 您的输入可以从控制器或键盘接受,但不需要同时支持这两种输入。
  • 现有答案可以BABA代替继续使用BA,但也可以根据需要将其缩短。将来的答案都应该BA用于保持一致性。

  • 不需要支持空输入。


评论不作进一步讨论;此对话已转移至聊天
Martin Ender '18

Answers:


13

05AB1E,33字节(精细于空输入)

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

在线尝试!

05AB1E30 26字节(空输入失败)

-4感谢Adnan

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

在线尝试!

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

免责声明:在TryItOnline上无法播放Bell声音,也许在运行时询问Dennis他的某个服务器是否在ping。


您几乎赢了!仅剩一个字节
Christopher

2
的压缩版本"+30 lives"“+30™‹“:)
Adnan

即使输入为空,这也总是在在线翻译器上为我输出“ +30条生命”。
redstarcoder '16

2
@redstarcoder仅*,具有空输入,废话,固定
魔术

@carusocomputing您能解决这个问题吗?BA应该只有一次(对不起,对不起)
Christopher

7

的JavaScript(ES6),202个 200 198字节

仅在Chrome和Firefox上进行过测试。使用UDLR而不是箭头键。请确保CapsLock已关闭。

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


您能解决这个问题吗?BA应该只有一次(对不起,对不起)
Christopher

7

Python  3,55  53字节

-1字节归功于isaacg(按位不可以替换-10~9)。
-1字节归功于CalculatorFeline(可以使用文字BEL字节)。

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

其中7如上所示是一个文字字节0x07(不可打印的代码块)。

按下Enter键后,将while检查循环条件。如果最后的~9= 10个字符(最多)与Contra命令代码不匹配,1则执行no-op (pass为简便起见,替换为of )。如果它们确实匹配,则while循环结束并print执行该语句,该语句将写入所需的文本以及ASCII铃声字符(“警报”)0x07,该声音会产生声音,除非已将其明确禁用(或终端没有扬声器) !)。


您能解决这个问题吗?BA应该只有一次(对不起,对不起)
Christopher

已修正,感谢您的注意。
乔纳森·艾伦

1
-10= ~9,可以节省一个字节。
isaacg

您不能在字符串中将文字\ x07放入-1个字节吗?
CalculatorFeline

@CalculatorFeline我不知道,可以吗?请注意,人们经常\n在Python高尔夫球中使用琴弦,为什么不使用\x0a
乔纳森·艾伦,

5

果冻,33 30 29 27字节

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

事实证明,不需要append(),字符串会自动连接在一起,并同时进行打印。

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

未压缩

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

在线尝试
如果您删除了之后的所有内容¿,则可以弄乱输入内容,并看到它仅在输入字符串正确时才返回。

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

感谢@JonathanAllan帮助我弄清楚字符串压缩:)


“+30 lives”压缩是“¡}ʠƈ[ỵ»(以供将来参考这里是一个关于它的帖子,它是在对果冻维基教程链接)。
乔纳森·艾伦

声音在哪里?
tuskiomi

1
我刚刚使用官方解释程序进行了测试,并且确实会一直循环直到输入Konami代码为止
JayDepp 2016年

@JayDepp您能解决这个问题吗?BA应该只有一次(对不起,对不起)
Christopher

相信这不是自动字符串串联,而是LLC(7Ọ隐式打印)(前​​导常量链)后面是nilad的隐式打印“¡}ʠƈ[ỵ»,出现在stdout上,好像是串联的一样。作为展示,您可以尝试在之间添加2秒的睡眠ɠ⁻“UUDDLRLRBABA”$¿ṛ7Ọ2“+30 lives”œS
乔纳森·艾伦

5

处理,161个 157 155字节

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

音频文件必须另存为sketchName/data/a.mp3。注意:我只在没有音频文件的情况下测试了该程序,因为我懒得下载mp3文件(因为从中仅支持有限的扩展名processing.sound.SoundFile)。

draw()功能需要在那里才能keyTyped工作。

我们使用的原因keyTyped是,Processing没有STDIN,它只能侦听正在运行的草图所按下的键。

说明

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

用户的所有击键都以char形式存储在String中k。该keyTyped是被称为每当用户键入一个关键的内置功能。同时,我们正在检查此String是否以击键结尾。然后我们打印+30 lives并播放声音文件。并且该draw功能可以持续更新keyTyped。输入Konami代码后,将不会再输出任何其他内容且不会播放音频。


看来您应该算一下mp3档案的大小

@ricyje Processing实际上没有任何其他输出声音的方式。此外,.mp3文件的大小并不重要,因为无论它是什么,Processing都会将其作为声音播放
Kritixi Lithos

@KritixiLithos您能解决这个问题吗?BA应该只有一次(对不起,对不起)
Christopher

@ChristopherPeart完成!(我很高兴再节省2个字节:)
Kritixi Lithos

4

> <>,132 69 64 62字节*> <>,84字节

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

在这里尝试!

这依赖于钟声(ascii 7)来消除最后的噪音(在线解释器上没有听到)。

感谢@TealPelican节省了另外15个字节!

保存了两个字节,BA而不是进行检查BABA


这会发出声音吗?
Kritixi Lithos

@KritixiLithos,是的,您会在倒数第二行的最后看到一个“ 7”,这是铃声。
redstarcoder '16

我对您的代码进行了一些重构,因为我不太了解第一行的用法?尝试该链接适用于> <>,​​但也适用于*> <>(不像您一样使用潜水机械师)-它还保存了19个字节!:)
蓝绿色鹈鹕

@Tealpelican,第一行是这样,它继续运行,等待输入!您的链接版本不执行该操作; p。
redstarcoder

你是对的!我错过了!-我已添加一行以解决我的错误,并替换了一些多余的反转和打印功能尝试将新版本缩减至67个字节:D
蓝绿色鹈鹕

3

C 119 -1-2 = 116字节

打高尔夫球

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

不打高尔夫球

#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/UUDDLRLRBABA为-1个字节,strcmp将寻找正确的字符串!
redstarcoder

@Christopher请勿在此Stack Exchange网站上编辑人员的代码。您的修改永远都不会被批准。
2016年

Mukul,您可以自己移除空间。
2016年

1
@MukulKumar当然:)答题者编辑自己的代码很重要。
2016年

1
@MukulKumar您能解决这个问题吗?BA应该只有一次(对不起,对不起)
Christopher

3

堆叠,41字节

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

从键盘读取输入。

['+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个字节

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

运行此脚本后,它将检查接下来的10个键是否为Konami代码,如果是,它将显示一个消息框,显示“ +30生活”,并且应该发出哔声(我现在没有扬声器可以测试) )。


凉!AutoHotkey是一个有趣的程序。
Christopher

3

GNU sed,32 25 +1 = 33 26字节

+1字节的-n标志。

/UUDDLRLRBA$/a+30 Lives\a

在线尝试!

说明

每次按下Enter键($),程序都会检查前面的10次击键是否为代码。如果是的话,该a命令将在当前循环结束时将文本+30 Lives和铃声(\a)排入队列(在本例中为立即)。


您能解决这个问题吗?BA应该只有一次(对不起,对不起)
Christopher

这已经BA只有一次了。
乔丹

哦,哇,没有注意到
Christopher

3

Mathematica,50个字节

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

最初,x它只是一个符号,因此与=!=symbol 不同()UUDDLRLRBA,因此x=Input[]需要进行评估。这将打开一个对话框,光标已位于输入字段中,因此用户可以立即开始在键盘上键入内容。

如果Enter按下或OK单击时未输入任何内容,InputField[]则将返回Null,与并不相同UUDDLRLRBA,因此循环继续进行,将打开另一个对话框。

如果用户单击Cancel或以其他方式退出对话框,InputField则将返回$Canceled,它也与UUDDLRLRBA,因此循环将继续。

用户可以根据自己的意愿在对话框中输入内容。当他们点击时Enter,他们的输入将被解释为Wolfram语言表达(可能只是方框)。如果该表达式不是符号UUDDLRLRBA,则循环将继续。

“必须循环直到输入Konami代码”才有点模糊,但我相信这可以满足要求。一旦While循环完成,。Beep[];"+30 lives"


您能解决这个问题吗?BA应该只有一次(对不起,对不起)
Christopher

1
UUDDLRLRB?哪里A
CalculatorFeline

@CalculatorFeline已修复
ngenisis

3

Petit Computer BASIC,91字节

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

最后是一个实际使用控制器输入的解决方案!

我使用Petit Computer而不是较新版本(SmileBASIC),因为它可以访问“开始”按钮,并且BTRIG()比短BUTTON()

我已将数据字符串替换为x,它应包含ASCII代码为1,1,2,2,4,8,4,8,32,16的字符

无聊的版本,46字节

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

我建议使用SmileBASIC 2作为Petit Computer条目的名称,并在必要时将SmileBASIC指定为SmileBASIC 3
snail_

使用控制器做得好!
Christopher

2

Powershell,89 86字节

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

输入提交字符串到Read-Host,所以它应该..工作?


2
我认为您只需要检查“ UUDDLRLRBABA”而不是“ UUDDLRLR BABA”,因为在Contra代码中没有“”。那也可以节省您一个字节。我认为假设输入是因为他们必须按Enter才能发送输入内容是有效的。
redstarcoder '16

我不工作的方式
克里斯托弗

1
@ChristopherPeart即使您是OP或将其保存一个字节,也请不要对其他人的代码进行编辑。
2016年

好的,我会做的。但这是我的错
Christopher

@ConnorLSW您能解决这个问题吗?BA应该只有一次(对不起,对不起)
Christopher

2

C#(无聊的版本),80字节

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

C#(有趣的一个),202字节

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

一世 认为这可行,但不幸的是,在线测试人员不支持控制台输入,因此我将不得不继续进行已完成的测试

最有可能打出大量高尔夫球-我对此并不擅长!:)

取消高尔夫:

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

嗯,C#是否可以读取直到检测到换行符?这样可以避免您寻找Enter键。在这里查看如何在Python中实现。
redstarcoder '16

Console.Readline,但我认为这可能是aganist挑战的精神!如果这很好,我可以让这个短得多
阿尔菲古达克

@redstarcoder添加了一个Console.ReadLine()版本
Alfie Goodacre,

@AlfieGoodacre您能解决这个问题吗?BA应该只有一次(对不起,对不起)
Christopher

@ChristopherPeart原来是,但是我必须更改它;)
Alfie Goodacre

2

难怪,50个字节

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

替换为代码字符\x07(BEL控制字符)。通过STDIN输入。


您能解决这个问题吗?BA应该只有一次(对不起,对不起)
Christopher

好吧,我固定了。感谢您的通知!
Mama Fun Roll

1

flex,37 + 5 = 42字节

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

该代码本身为37个字节,请使用“ -main”选项进行编译,该选项将增加5个字节。当然,您必须使用自己喜欢的C编译器来编译生成的C文件,但我认为这一步不应该计入字节数。

我可以使用文字BEL字符而不是来保存一个字节\a,但是我希望能够读取自己的代码。


4
您确实不需要阅读代码。这是代码高尔夫球
Christopher

就个人而言,我认为使用flex应该会有所收获,因为在这里很少使用它。:)
BenGoldberg 2013年

1
我相信您可以通过-ll作为C编译器的-main一个选项而不是flex的一个选项将惩罚减少到3个字节。

1

C,87 85 81字节

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

1

shortC,52个字节

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

说明:

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

在线尝试!


1

C,114字节

#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);}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.