En Kısa Konami Kodu


15

Sorun

Konami Kodu çalışma sırasında yazıldığında, " +30 lives" dizesini yazdıran ve istediğiniz sesi bilgisayarın hoparlöründen çalan bir program yazmalısınız .

Tanım

"Konami Kodu", UUDDLRLRBAenter tuşuna basılarak tanımlanır .

Kurallar

  • Kodunuz oklarla veya harflerle tutarlı olduğu sürece yukarı okunu U, aşağı için D, sol için Lve sağ için kullanmayı seçebilirsiniz R.
  • Girişiniz bir denetleyiciden veya klavyeden kabul edilebilir, ancak her ikisini de desteklemesi gerekmez.
  • Mevcut cevaplar BABAbunun yerine kullanılmaya devam edebilir BA, ancak bunu yapmak istiyorlarsa da kısaltabilir. Gelecekteki cevapların hepsi BAtutarlılık için kullanılmalıdır .

  • Boş girişin desteklenmesi gerekmez.


Yorumlar uzun tartışmalar için değildir; bu görüşme sohbete taşındı .
Martin Ender

Yanıtlar:


13

05AB1E , 33 bayt (Boş Girişte İyi)

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

Çevrimiçi deneyin!

05AB1E , 30 26 bayt (Boş Girişte Başarısız)

-4 Adnan sayesinde

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

Çevrimiçi deneyin!

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

Yasal Uyarı: Bell sesi TryItOnline'da çalmıyor, belki Dennis'e çalıştırdığınızda sunucularından birinin bir yere ping atıp atmadığını soruyor.


Neredeyse kazandınız! Sadece bir bayt kapalı
Christopher

2
Bir sıkıştırılmış versiyonu "+30 lives"olan “+30™‹“:)
Adnan

Bu, boş girdi olsa bile, çevrimiçi tercümanda benim için her zaman "+30 can" üretir.
redstarcoder

2
@redstarcoder Only * boş giriş, bok, sabitleme ile
Sihirli Ahtapot Urn

@ carusocomputing BA bunu sadece bir kez olmalıdır (benim hatam üzgünüm)
Christopher

7

JavaScript (ES6), 202 , 200 198 bayt

Yalnızca Chrome ve Firefox'ta test edilmiştir. UDLROk tuşları yerine kullanır . Lütfen CapsLock'un kapalı olduğundan emin olun.

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


bunu düzeltmek eğer BA sadece bir kez olmalıdır (benim hatam üzgünüm)
Christopher

7

Python 3,  55  53 bayt

-1 isaacg bayt sayesinde (kullanımı bit düzeyinde yerine değil -10ile ~9).
CalculatorFeline sayesinde -1 bayt (değişmez BELbayt kullanmak mümkündür ).

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

burada 7yukarıda gösterilen değişmez bir bayttır 0x07(kod bloğunda yazdırılamaz).

Enter tuşuna basıldığında whiledöngü durumu kontrol edilir. Son ~9= 10 karakter (en fazla) Contra komut koduyla eşleşmezse, no-op 1yürütülür ( passkısaltma yerine); Onlar eğer do maç sonra döngü bitip ederken printdeyimi yürütüldüğünde, hangi yazar bir ASCII çan karakteri ( "alarm") ile birlikte gerekli metin 0x07açıkça devre dışı bırakılmıştır (veya terminal hiçbir hoparlörü olmadıkça bir ses üretir, !).


bunu düzeltmek eğer BA sadece bir kez olmalıdır (benim hatam üzgünüm)
Christopher

Düzeltildi, kafalar için teşekkürler.
Jonathan Allan

1
-10= ~9, ki bu size bayt kazandırır.
isaacg

-1 baytlık bir dizeye değişmez \ x07 koyamaz mısınız?
CalculatorFeline

@CalculatorFeline Hiçbir fikrim yok, değil mi? İnsanların \nPython golflerindeki dizelerde sıklıkla kullandıklarını , neden kullanmayacaklarını unutmayın \x0a.
Jonathan Allan

5

Jöle, 33 30 29 27 bayt

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

Anlaşılan, append ( ) gerekli değil, dizeler her iki basılı otomatik olarak birleştirilir .

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

sıkıştırılmamış

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

Çevrimiçi deneyin
Sonra ¿olan her şeyi kaldırırsanız , girdiyle karışıklık yapabilir ve yalnızca girdi dizesi doğru olduğunda geri döndüğünü görebilirsiniz.

ɠ⁻“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 dize sıkıştırmasını bulmama yardım ettiğin için teşekkürler :)


“+30 lives”sıkıştırılmış “¡}ʠƈ[ỵ»(gelecekteki referans için burada bir yazı, Jelly wiki öğretici ile bağlantılı).
Jonathan Allan

ses nerede
tuskiomi

1
Resmi tercümanla test ettim ve Konami kodu girilene kadar gerçekten döngü yapıyor
JayDepp

@JayDepp bunu düzeltmek olabilir BA sadece bir kez olmalıdır (benim hatam üzgünüm)
Christopher

Ben inanıyorum o kadar çok (sabit zincirini lider) LLC örtük bir baskı gibi otomatik dize birleştirme olmadığını 7Ọnilad örtülü bir baskı izledi “¡}ʠƈ[ỵ»o birleştirme sanki stdout'ta görünen. Bir vitrin olarak ile arasında 2 saniyelik bir uyku eklemeyi deneyebilirsiniz ɠ⁻“UUDDLRLRBABA”$¿ṛ7Ọ2“+30 lives”œS.
Jonathan Allan

5

, İşlenmesi 161 157 155 bayt

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

Ses dosyası olarak kaydedilmelidir sketchName/data/a.mp3. Not: Bu programı yalnızca ses dosyası olmadan test ettim, çünkü bir mp3dosyayı indirmek için çok tembelim (sadece sınırlı uzantılar desteklendiğinden processing.sound.SoundFile).

İşin draw()çalışması için orada olması gerekir keyTyped.

Kullanmamızın keyTypednedeni, İşleme'nin STDIN olmamasıdır, yalnızca çalıştırılan çizim yoluyla basılan tuşları dinleyebilir.

açıklama

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

Kullanıcının tuş vuruşlarının tümü Dize içinde karakter olarak saklanır k. Kullanıcı keyTyped, her anahtar yazdığında çağrılan dahili bir işlevdir. Aynı zamanda, bu String'in tuş vuruşlarıyla bitip bitmediğini kontrol ediyoruz. Sonra +30 livesses dosyasını yazdırır ve oynatırız. Ve drawfonksiyon sürekli güncellenmek için orada keyTyped. Konami kodu girildikten sonra başka hiçbir şey verilmeyecek ve ses çalınmayacaktır.


mp3 dosyanızın boyutunu saymanız gerekiyor gibi görünüyor

@ricyje Processing'in ses çıkışı için başka bir yolu yoktur. Ayrıca, .mp3dosyanın boyutu gerçekten önemli değil, ne olursa olsun, İşleme bir ses olarak çalacak
Kritixi Lithos

@KritixiLithos bunu düzeltmek olabilir BA sadece bir kez olmalıdır (benim hatam üzgünüm)
Christopher

@ChristopherPeart Yapıldı! (2 bayt daha kaydetmek
isterim

4

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

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

Burada deneyin!

Bu 7, sondaki gürültü için çan ziline (ascii ) dayanır ( çevrimiçi yorumlayıcıda duyulmaz).

@TealPelican'a 15 bayt kazandığı için teşekkürler!

BABunun yerine iki bayt kontrolü kaydedildi BABA.


Bu bir ses çıkarıyor mu?
Kritixi Lithos

@KritixiLithos, evet en sonda ikinci satırda göreceksiniz "7", bu çan zili.
redstarcoder

Ben ilk satırları kullanımı oldukça anlamadım çünkü biraz kod refactored? Burada deneyin Bu bağlantı> <> içindir ancak *> <> için de geçerlidir (dalış teknisyenini sizin gibi kullanmaz) - 19 baytta da kaydedildi! :)
Teal pelican

@Tealpelican, ilk satır böylece çalışmaya devam ediyor, girdi bekliyor! Bağlantılı sürümünüz bunu yapmaz; s.
redstarcoder

Haklısın! Onu özledim! - Hataya uyum sağlamak için bir satır ekledim ve yedekli tersine çevirme ve yazdırmanın yerini aldım. 67 bayta indirdiğim yeni sürümü deneyin : D
Teal pelican

3

C 119 -1-2 = 116 bayt

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

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/UUDDLRLRBABA-1 bayt ve strcmp için doğru dize arıyor olacak!
redstarcoder

@Christopher, lütfen bu Stack Exchange sitesinde insanların kodlarında asla düzenleme yapmayın. düzenlemenizin hiçbir zaman onaylanmamış olması gerekir.
kedi

Mukul, alanı kendiniz kaldırabilirsiniz.
kedi

1
@MukulKumar Elbette :) Yanıtlayıcının kendi kodunu düzenlemesi önemlidir.
kedi

1
@ MukulKumar bunu düzeltebilir miyim BA sadece bir kez olmalı (benim hatam üzgünüm)
Christopher

3

Yığılmış , 41 bayt

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

Klavyeden girişi okur.

['+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 bayt

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

Bu komut dosyasını çalıştırdıktan sonra önümüzdeki 10 tuşları Konami kodu ise, onu kontrol eder ve eğer varsa, bu "30 hayatlarını" diyerek bir ileti kutusu gösterecektir ve gerektiği Ben teste şimdi hoparlörleri yok (bip oynamak ).


Güzel! AutoHotkey ilginç bir programdır.
Christopher

3

GNU sed, 32 25 + 1 = 33 26 bayt

-nBayrak için +1 bayt .

/UUDDLRLRBA$/a+30 Lives\a

Çevrimiçi deneyin!

açıklama

Enter tuşuna her basıldığında ( $), program önceki 10 tuş vuruşunun kod olup olmadığını kontrol eder. Eğer öyleyse, akomut geçerli döngünün sonunda yazdırılacak metni +30 Livesve zil sesini ( \a) sıralar (bu durumda hemen).


bunu düzeltmek eğer BA sadece bir kez olmalıdır (benim hatam üzgünüm)
Christopher

Bu zaten BAsadece bir kez var.
Ürdün

Oh wow fark etmedi
Christopher

3

Mathematica, 50 bayt

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

Başlangıçta, xsadece bir semboldür ve dolayısıyla sembolle özdeş ( =!=) değildir UUDDLRLRBA, dolayısıyla x=Input[]değerlendirilir. Bu, imleç zaten giriş alanındayken bir iletişim kutusu açar, böylece kullanıcı hemen klavyede yazmaya başlayabilir.

Herhangi bir şey yazmadan Enterbasılırsa veya OKtıklanırsa, özdeş olmayan InputField[]geri döner , böylece döngü devam eder ve başka bir iletişim kutusu açılır.NullUUDDLRLRBA

Kullanıcı Canceliletişim kutusunu tıklar veya başka bir şekilde çıkarsa, InputFieldgeri dönecektir $Canceled;UUDDLRLRBA nedenle döngü devam edecektir.

Kullanıcı iletişim kutusuna kalbin arzusuna yazabilir. Vurduklarında Enter, girdileri bir Wolfram dili ifadesi (muhtemelen sadece kutular) olarak yorumlanır. Bu ifade sembol dışında bir şeyse UUDDLRLRBA, döngü devam eder.

"Konami kodu girilene kadar döngü gerekir" biraz belirsiz, ama bunun tatmin edici olduğuna inanıyorum. Bir kez Whiledöngü tamamlandığında, .Beep[];"+30 lives"


bunu düzeltmek eğer BA sadece bir kez olmalıdır (benim hatam üzgünüm)
Christopher

1
UUDDLRLRB? Nerede A?
CalculatorFeline

@CalculatorFeline Sabit
ngenisis

3

Petit Computer BASIC, 91 bayt

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

Sonunda kontrolör girişini kullanan bir çözüm!

Petit düğmesine daha yeni bir sürüm (SmileBASIC) yerine kullandım çünkü Başlat düğmesine erişebiliyor ve BTRIG()daha kısadır BUTTON().

Veri dizesini x's ile değiştirdim, ascii kodları olan karakterler içermelidir 1,1,2,2,4,8,4,8,32,16

Sıkıcı versiyon, 46 bayt

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

Petit Computer girişlerinin adı için SmileBASIC 2'yi kullanmanızı tavsiye ederim ve gerektiğinde SmileBASIC'i SmileBASIC 3 olarak belirtin .
snail_

Denetleyiciyi kullanarak iyi iş çıkardın!
Christopher

2

Powershell, 89 86 Bayt

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

enter, dizeyi gönderir Read-Host, bu yüzden çalışması gerekir mi?


2
Contra kodunda "" olmadığı için "UUDDLRLRBABA" değil "UUDDLRLR BABA" için kontrol etmeniz gerektiğini düşünüyorum. Bu size bir bayt kazandırır. Sanırım enter varsaymak, çünkü girişi göndermek için enter tuşuna basmak zorundalar.
redstarcoder

Bu arada çalışıyorum
Christopher

1
@ChristopherPeart Lütfen OP olsanız veya bayt kaydediyor olsanız bile başkalarının kodunda düzenlemeler yapmayın.
kedi

Tamam yapacağım. Ama bu benim hatamdı
Christopher

@ConnorLSW bunu düzeltmek olabilir BA sadece bir kez olmalıdır (benim hatam üzgünüm)
Christopher

2

C # (sıkıcı sürüm), 80 bayt

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

C # (ilginç olanı), 202 bayt

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

Ben düşünüyorum böyle ben yaptım testlerinde gitmek zorunda kalacak bu eserler, ne yazık ki çevrimiçi test, bir konsol girişi varlığını desteklemez

Büyük olasılıkla golf olabilir - Ben bu konuda iyi değilim! :)

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, C # bir satırsonu tespit edilene kadar okumak için bir yolu var mı? Bu, enter tuşunu aramanızı engeller. Python diliyle nasıl uygulandığı bak burada .
redstarcoder

Var Console.Readlineama bunun meydan okuma ruhuna karşı olabileceğini düşündüm! Eğer iyiyse bunu daha kısa yapabilirim
Alfie Goodacre

@redstarcoder bir Console.ReadLine()sürüm ekledi
Alfie Goodacre

@AlfieGoodacre bunu düzeltmek olabilir BA sadece bir kez olmalıdır (benim hatam üzgünüm)
Christopher

@ChristopherPeart Başlangıçta öyleydi ama değiştirmek zorunda kaldım;)
Alfie Goodacre

2

Harika , 50 bayt

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

Kod karakteri ile değiştirin \x07(BEL kontrol karakteri). STDIN üzerinden girdi alır.


bunu düzeltmek eğer BA sadece bir kez olmalıdır (benim hatam üzgünüm)
Christopher

Ben düzelttim. Uyarı için teşekkürler!
Mama Fun Roll

1

esnek, 37 + 5 = 42 bayt

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

Kodun kendisi 37 bayttır, 5 bayt ekleyen "-main" seçeneğiyle derleyin. Doğal olarak, ortaya çıkan C dosyasını en sevdiğiniz C derleyicisiyle derlemeniz gerekir, ancak bu adımın bayt sayısına sayılması gerektiğini düşünmüyorum.

Bunun yerine gerçek bir BEL karakteri kullanarak bir bayt kaydedebilirim \a, ancak kendi kodumu okuyabilirim.


4
Kodu gerçekten okuyabilmenize gerek yok. Bu kod golf
Christopher

Şahsen, burada ne kadar nadir kullanıldığından, flex kullanmak için bonus almam gerektiğini düşünüyorum. :)
BenGoldberg

1
-llC derleyicisine -mainesneklik yerine seçenek olarak vererek cezayı 3 bayta düşürebileceğinize inanıyorum .

1

C, 87 85 81 bayt

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

1

shortC, 52 bayt

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

Açıklama:

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

Çevrimiçi deneyin!


1

C, 114 bayt

#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);}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.