Kode Konami Terpendek

15

Masalah

Anda harus menulis sebuah program yang, ketika Kode Konami diketik saat runtime, mencetak string " +30 lives" dan membunyikan suara pilihan Anda dari pengeras suara komputer.

Definisi

"Kode Konami" didefinisikan sebagai UUDDLRLRBAdiikuti dengan menekan tombol enter.

Aturan

  • Anda dapat memilih untuk menggunakan panah atas untuk U, bawah untuk D, kiri untuk L, dan kanan untuk R, selama kode Anda konsisten dengan panah atau huruf.
  • Masukan Anda mungkin diterima dari pengontrol atau keyboard, tetapi tidak perlu mendukung keduanya.
  • Jawaban yang ada dapat terus digunakan BABAsebagai ganti BA, tetapi juga dapat mempersingkat jika mereka ingin melakukannya. Semua jawaban di masa depan harus digunakan BAuntuk konsistensi.

  • Masukan kosong tidak perlu didukung.

Christopher
sumber
Komentar bukan untuk diskusi panjang; percakapan ini telah dipindahkan ke obrolan .
Martin Ender

Jawaban:

13

05AB1E , 33 byte (Fine on Empty Input)

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

Cobalah online!

05AB1E , 30 26 byte (Gagal pada Input Kosong)

-4 Terima kasih kepada Adnan

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

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

Penafian: Suara bel tidak diputar di TryItOnline, mungkin tanyakan pada Dennis apakah salah satu servernya sedang melakukan ping ketika Anda menjalankannya.

Guci Gurita Ajaib
sumber
Anda hampir menang! Hanya satu byte off
Christopher
2
Versi terkompresi "+30 lives"adalah “+30™‹“:)
Adnan
Ini selalu menghasilkan "+30 hidup" untuk saya di penerjemah online, bahkan dengan input kosong.
redstarcoder
2
@redstarcoder Only * dengan input kosong, omong kosong, perbaikan
Magic Octopus Mm
@carusocomputing dapatkah Anda memperbaiki ini BA hanya boleh sekali (salah saya maaf)
Christopher
7

JavaScript (ES6), 202 200 198 byte

Diuji hanya di Chrome dan Firefox. Menggunakan UDLRdaripada tombol panah. Pastikan CapsLock tidak aktif.

(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
sumber
Dapatkah Anda memperbaiki ini BA hanya boleh sekali (kesalahan saya maaf)
Christopher
7

Python 3,  55  53 byte

-1 byte terima kasih kepada isaacg (gunakan bitwise untuk tidak mengganti -10dengan ~9).
-1 byte berkat CalculatorFeline (dimungkinkan untuk menggunakan BELbyte literal ).

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

di mana yang 7ditunjukkan di atas adalah byte literal 0x07(yang tidak dicetak dalam blok kode).

Setelah masuk ditekan whilekondisi loop diperiksa. Jika yang terakhir ~9= 10 karakter (paling banyak) tidak cocok dengan kode perintah Contra maka no-op 1dieksekusi (penggantian passuntuk singkatnya); jika mereka lakukan sesuai maka sementara loop berakhir dan printpernyataan dieksekusi, yang menulis teks yang diperlukan bersama dengan karakter ASCII bel ( "alarm"), 0x07yang menghasilkan suara kecuali telah secara eksplisit dinonaktifkan (atau terminal tidak memiliki speaker !).

Jonathan Allan
sumber
Dapatkah Anda memperbaiki ini BA hanya boleh sekali (kesalahan saya maaf)
Christopher
Diperbaiki, terima kasih atas perhatiannya.
Jonathan Allan
1
-10= ~9, yang dapat menghemat satu byte.
isaacg
Tidak bisakah Anda meletakkan literal \ x07 dalam string untuk -1 byte?
CalculatorFeline
@ CalculatorFeline Saya tidak tahu, kan? Perhatikan bahwa orang sering menggunakan \nstring dalam golf Python, mengapa mereka tidak menggunakannya \x0a?
Jonathan Allan
5

Jelly, 33 30 29 27 byte

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

Ternyata, append ( ) tidak diperlukan, string secara otomatis digabungkan bersama- sama dicetak.

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

Tidak terkompresi

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

Cobalah online
Jika Anda menghapus semuanya setelah itu ¿, Anda dapat mengacaukan dengan input dan melihatnya hanya kembali ketika string input sudah benar.

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

Terima kasih @ JonathanAllan untuk membantu saya mencari kompresi string :)

JayDepp
sumber
“+30 lives”terkompresi adalah “¡}ʠƈ[ỵ»(untuk referensi di masa depan di sini adalah posting tentang itu, itu tertaut dalam tutorial tentang wiki Jelly).
Jonathan Allan
dimana suaranya?
tuskiomi
1
Saya baru saja mengujinya dengan juru bahasa resmi dan itu memang loop sampai kode Konami dimasukkan
JayDepp
@JayDepp dapatkah Anda memperbaikinya BA seharusnya hanya sekali (kesalahan saya maaf)
Christopher
Saya percaya bahwa itu tidak begitu banyak rangkaian string otomatis sebagai cetakan implisit dari LLC (rantai konstan terkemuka) 7Ọdiikuti oleh cetakan implisit dari nilad “¡}ʠƈ[ỵ», muncul di stdout seolah-olah itu adalah gabungan. Sebagai etalase, Anda dapat mencoba menambahkan waktu tidur 2 detik di antaranya ɠ⁻“UUDDLRLRBABA”$¿ṛ7Ọ2“+30 lives”œS.
Jonathan Allan
5

Memproses, 161 157 155 byte

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

File audio harus disimpan sebagai sketchName/data/a.mp3. Catatan: Saya hanya menguji program ini tanpa file audio karena saya terlalu malas untuk mengunduh mp3file (karena hanya ekstensi terbatas yang didukung processing.sound.SoundFile).

The draw()fungsi yang dibutuhkan untuk berada di sana dalam rangka untuk keyTypedbekerja.

Alasan kami menggunakan keyTypedini karena Pemrosesan tidak memiliki STDIN, hanya dapat mendengarkan tombol yang ditekan melalui sketsa yang sedang dijalankan.

Penjelasan

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

Semua penekanan tombol pengguna disimpan sebagai karakter di dalam String k. Ini keyTypedadalah fungsi bawaan yang dipanggil setiap kali pengguna mengetik kunci. Secara bersamaan, kami memeriksa apakah String ini diakhiri dengan penekanan tombol. Kemudian kami mencetak +30 livesdan memutar file suara. Dan drawfungsinya ada untuk terus memperbarui keyTyped. Setelah kode Konami dimasukkan, maka tidak ada lagi yang akan dikeluarkan dan tidak ada audio yang diputar.

Kritixi Lithos
sumber
sepertinya Anda harus menghitung ukuran file mp3 Anda
@ricyje Memproses tidak benar-benar memiliki cara lain untuk mengeluarkan suara. Juga, ukuran .mp3file tidak terlalu penting karena tidak peduli apa pun itu, Memproses akan memainkannya sebagai suara
Kritixi Lithos
@KritixiLithos dapatkah Anda memperbaiki ini BA hanya boleh sekali (kesalahan saya maaf)
Christopher
@ChristopherPeart Selesai! (Saya senang menyimpan 2 byte lagi :)
Kritixi Lithos
4

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

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

Coba di sini!

Ini bergantung pada lonceng lonceng (ascii 7) untuk suara di akhir (tidak terdengar pada penerjemah online).

Terima kasih kepada @TealPelican untuk menyimpan 15 byte lagi!

Disimpan dua byte untuk memeriksa BAbukannya BABA.

redstarcoder
sumber
Apakah ini menghasilkan suara?
Kritixi Lithos
@ KritixiLithos, ya Anda akan melihat pada baris kedua terakhir di akhir adalah "7", itulah bel berbunyi.
redstarcoder
Saya sedikit refactored kode Anda karena saya tidak mengerti penggunaan baris pertama? Coba di sini. Tautan ini untuk> <> tetapi juga berfungsi untuk *> <> (tidak menggunakan mekanik menyelam seperti yang Anda miliki) - itu juga disimpan dalam 19 byte! :)
Teal pelican
@Tealpelican, baris pertama adalah agar tetap berjalan, menunggu input! Versi tertaut Anda tidak melakukan itu;
redstarcoder
Kamu benar! Saya melewatkan itu! - Saya telah menambahkan baris untuk mengakomodasi kesalahan saya dan mengganti beberapa pembalikan dan pencetakan yang berlebihan. Coba versi baru yang saya dapatkan hingga 67 byte: D
Teal pelican
3

C 119 -1 - 2 = 116 byte

Golf

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

Tidak disatukan

#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
sumber
s/UUDDLRLR BABA/UUDDLRLRBABAuntuk -1 byte dan strcmp akan mencari string yang benar!
redstarcoder
@Christopher tolong jangan pernah mengedit kode orang di situs Stack Exchange ini. hasil edit Anda seharusnya tidak pernah disetujui.
kucing
Mukul, Anda bisa menghapus ruang sendiri.
kucing
1
@MukulKumar Tentu saja :) penting bahwa penjawab mengedit kode mereka sendiri.
kucing
1
@MukulKumar dapatkah Anda memperbaiki ini BA hanya boleh sekali (kesalahan saya maaf)
Christopher
3

Ditumpuk , 41 byte

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

Membaca input dari 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
sumber
3

AutoHotkey, 63 byte

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

Setelah menjalankan skrip ini, ia akan memeriksa apakah 10 kunci berikutnya adalah kode Konami dan jika ya, itu akan menampilkan kotak pesan bertuliskan "+30 live" dan itu akan memainkan bunyi bip (saya tidak punya speaker sekarang untuk menguji ).

Kodos Johnson
sumber
Keren! AutoHotkey adalah program yang menarik.
Christopher
3

GNU sed, 32 25 + 1 = 33 26 byte

+1 byte untuk -nbendera.

/UUDDLRLRBA$/a+30 Lives\a

Cobalah online!

Penjelasan

Setiap kali enter ditekan ( $), program akan memeriksa apakah 10 penekanan tombol sebelumnya adalah kode. Jika ya, aperintah akan mengantri teks +30 Livesdan suara bel ( \a) untuk dicetak pada akhir siklus saat ini (yang, dalam hal ini, segera).

Yordania
sumber
Dapatkah Anda memperbaiki ini BA hanya boleh sekali (kesalahan saya maaf)
Christopher
Ini sudah memiliki BAsekali saja.
Jordan
Oh wow tidak memperhatikan
Christopher
3

Mathematica, 50 byte

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

Awalnya, xhanya sebuah simbol dan karenanya tidak identik ( =!=) dengan simbol UUDDLRLRBA, jadi x=Input[]dievaluasi. Ini akan membuka kotak dialog dengan kursor sudah ada di bidang input, sehingga pengguna dapat segera mulai mengetik di keyboard.

Jika Enterditekan atau OKdiklik tanpa mengetik apa pun, maka InputField[]akan kembali Null, yang tidak identik dengan UUDDLRLRBA, sehingga loop berlanjut dan kotak dialog lain akan dibuka.

Jika pengguna mengklik Cancelatau keluar dari kotak dialog, maka InputFieldakan kembali $Canceled, yang juga tidak identik UUDDLRLRBA, sehingga loop akan terus berlanjut.

Pengguna dapat mengetik di kotak dialog sesuai keinginan hati mereka. Ketika mereka menekan Enter, input mereka ditafsirkan sebagai ekspresi bahasa Wolfram (mungkin hanya kotak). Jika ungkapan itu selain simbol UUDDLRLRBA, perulangan akan berlanjut.

"Harus diulang sampai kode Konami dimasukkan" agak kabur, tapi saya yakin ini memuaskan. Setelah ituWhile loop selesai ,.Beep[];"+30 lives"

ngenisis
sumber
dapatkah Anda memperbaiki ini BA hanya boleh sekali (salah saya maaf)
Christopher
1
UUDDLRLRB? Di mana A?
CalculatorFeline
@CalculatorFeline Tetap
ngenisis
3

Petit Computer BASIC, 91 byte

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

Akhirnya solusi yang benar-benar menggunakan input pengontrol!

Saya menggunakan Petit Computer daripada versi yang lebih baru (SmileBASIC) karena memiliki akses ke tombol Start, dan BTRIG()lebih pendek dari BUTTON().

Saya telah mengganti string data dengan x, itu harus berisi karakter dengan kode ascii 1,1,2,2,4,8,4,8,32,16

Versi membosankan, 46 byte

INPUT S$IF"UUDDLRLRBA"==S$THEN BEEP?"+30 lives
12Me21
sumber
Saya akan merekomendasikan menggunakan SmileBASIC 2 untuk nama entri Petit Computer, dan jika perlu tentukan SmileBASIC sebagai SmileBASIC 3 .
snail_
Kerja bagus menggunakan pengontrol!
Christopher
2

Powershell, 89 86 Bytes

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

masukkan mengirimkan string ke Read-Host, jadi seharusnya .. bekerja?

colsw
sumber
2
Saya pikir Anda hanya perlu memeriksa "UUDDLRLRBABA" bukan "UUDDLRLR BABA" karena tidak ada "" dalam kode Contra. Itu juga akan menghemat satu byte. Saya pikir anggap masuk karena mereka harus menekan enter untuk mengirim input yang valid.
redstarcoder
Christopher
1
@ChristopherPeart Tolong jangan mengedit kode orang lain bahkan jika Anda OP, atau jika Anda menyimpannya satu byte.
kucing
Baiklah saya akan melakukannya. Tapi itu salahku
Christopher
@ConnorLSW dapatkah Anda memperbaikinya BA hanya boleh sekali (kesalahan saya maaf)
Christopher
2

C # (versi membosankan), 80 byte

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

C # (Yang menarik), 202 byte

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

Saya pikir ini berfungsi, sayangnya penguji online tidak mendukung keberadaan input konsol, karena itu saya harus mengikuti tes yang telah saya lakukan

Kemungkinan besar bisa bermain golf sangat - saya tidak hebat dalam hal ini! :)

Tidak Disatukan:

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
sumber
Hmm, apakah C # punya cara membaca sampai baris baru terdeteksi? Itu akan menyelamatkan Anda dari mencari kunci enter. Lihatlah bagaimana ini diterapkan di Python di sini .
redstarcoder
Ada Console.Readlinetapi saya pikir itu mungkin menjadi roh tantangan! Jika itu bagus saya bisa membuat ini lebih pendek
Alfie Goodacre
@redstarcoder menambahkan Console.ReadLine()versi
Alfie Goodacre
@AlfieGoodacre dapatkah Anda memperbaiki ini BA hanya boleh sekali (kesalahan saya maaf)
Christopher
@ChristopherPeart Awalnya adalah tetapi saya harus mengubahnya;)
Alfie Goodacre
2

Heran , 50 byte

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

Ganti dengan karakter kode \x07(karakter kontrol BEL). Mengambil input melalui STDIN.

Mama Fun Roll
sumber
dapatkah Anda memperbaiki ini BA hanya boleh sekali (salah saya maaf)
Christopher
Ya saya sudah perbaiki. Terima kasih atas pemberitahuannya!
Mama Fun Roll
1

fleksibel, 37 + 5 = 42 byte

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

Kode itu sendiri adalah 37 byte, kompilasi dengan opsi "-main" yang menambahkan 5 byte. Tentu saja, Anda harus mengkompilasi file C yang dihasilkan dengan kompiler C favorit Anda, tetapi saya tidak berpikir langkah itu harus diperhitungkan terhadap jumlah byte.

Saya bisa menyimpan byte dengan menggunakan karakter BEL literal alih-alih \a, tetapi saya lebih suka bisa membaca kode saya sendiri.

BenGoldberg
sumber
4
Anda benar-benar tidak perlu bisa membaca kode. Ini adalah kode golf
Christopher
Secara pribadi, saya pikir saya harus mendapatkan bonus untuk menggunakan flex, karena jarang digunakan di sini. :)
BenGoldberg
1
Saya percaya Anda dapat mengurangi penalti menjadi 3 byte melalui memberi -llsebagai opsi ke kompiler C daripada -mainsebagai opsi untuk melenturkan.
1

C, 87 85 81 byte

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

shortC, 52 byte

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

Penjelasan:

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

Cobalah online!

MD XF
sumber
1

C, 114 byte

#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);}
pengguna12707
sumber