Seperti kita ketahui, seri Zelda adalah salah satu seri game terbaik yang pernah dibuat. Untuk menghormati itu, mari kita memainkan beberapa lagu di ocarina.
Tantangan:
Tulis program yang, diberi lagu, menampilkan skor untuk stdout untuk lagu tertentu.
Memasukkan:
Lagu yang Anda harus hasilkan skor akan diberikan oleh kombinasi tiga karakter yang unik seperti yang terlihat di bawah ini:
zel - Zelda's Lullaby
sas - Saria's Song
eps - Epona's Song
sos - Sun's Song
sot - Song of Time
sst - Song of Storms
Lagu bonus, -7% masing-masing:
mof - Minuet of Forest
bof - Bolero of Fire
sow - Serenade of Water
nos - Nocturne of Shadow
ros - Requiem of Spirit
pol - Prelude of Light
Lagu bonus 2, -8%:
scs - Scarecrow's song
Seperti yang kita semua tahu, lagu Scarecrow adalah lagu yang Anda buat sendiri. Lagu ini perlu memiliki delapan not. Keluarkan skor yang Anda buat sendiri yang berbeda dari semua skor lainnya.
Jika Anda memutuskan untuk memasukkan semua lagu, total bonus -50% akan menjadi nilai byte Anda.
Keluaran:
Catatan dalam output disimbolkan dengan karakter berikut:
^
<
>
V
A
Keluarkan skor pada format berikut:
-^-^-^-^-^-^-^-^-
-<-<-<-<-<-<-<-<-
->->->->->->->->-
-V-V-V-V-V-V-V-V-
-A-A-A-A-A-A-A-A-
Hanya satu catatan per kolom yang dibolehkan. Demi kesederhanaan, saya telah menambahkan baris lain ke empat baris asli.
Setiap nada berhubungan dengan baris yang berbeda:
^: ----------------
<: ----------------
>: ----------------
V: ----------------
A: ----------------
Hasil akan ditulis ke stdout. Trailing newlines diperbolehkan.
Contoh:
Masukan (Zulla Lullaby):
zel
Keluaran:
---^-----^-------
-<-----<---------
----->----->-----
-----------------
-----------------
Input (Bolero Api):
bof
Keluaran:
-----------------
-----------------
--------->--->---
-V---V-----V---V-
---A---A---------
Catatan lembar contekan:
zel
<^><^>
sas
V><V><
eps
^<>^<>
sos
>V^>V^
sot
>AV>AV
sst
AV^AV^
mof
A^<><>
bof
VAVA>V>V
sow
AV>><
nos
<>>A<>V
ros
AVA>VA
pol
^>^><^
Karena kita memainkan golf kode ocarina , program terpendek dalam byte menang!
Referensi lagu:
http://www.thonky.com/ocarina-of-time/ocarina-songs
http://www.zeldadungeon.net/Zelda05-ocarina-of-time-ocarina-songs.php
v
akan terlihat lebih baik.Jawaban:
Pyth, 56,5 (113 byte - 6 × 7% - 8%)
Ini berisi karakter yang tidak patut
xxd
dicetak , jadi di sini adalah hexdump yang dapat dibalik:Anda juga dapat mencobanya online .
Penjelasan
Saya menyimpan lagu dalam basis-6 angka, disandikan ulang ke basis 1391423 dan kemudian basis 256 untuk menghemat ruang. Saya harus memilih base 6 karena beberapa lagu mulai dengan
^
, dan angka tidak dapat benar-benar dimulai dengan 0 setelah decoding.sumber
Funciton , 4322 - 50% = 2161
Tidak benar-benar mencoba bermain golf di sini. Pergi lebih untuk sudut keindahan. Saya pikir program utama terlihat sangat rapi, kotak persegi panjang yang sempurna tersimpan di sebelah kanan.
Seperti biasa, Anda bisa mendapatkan rendering yang lebih baik dengan mengeksekusi
$('pre').css('line-height',1)
di konsol browser Anda.Melanjutkan tradisi memberikan nama fungsi Funciton yang terdiri dari karakter Unicode tunggal, aneh, jarang digunakan, saya berpikir tentang apa yang paling bisa mewakili tantangan ini, dan terpikir oleh saya bahwa Link dan Zelda (atau, jika Anda mau, Legend of Zelda ) memberi Anda LZ , sehingga digraf huruf kecil ʫ (U + 02AB, ʟᴀᴛɪɴ sᴍᴀʟʟ ʟᴇᴛᴛᴇʀ ʟᴢ ᴅɪɢʀᴀᴘʜ) tampaknya tepat.
Penjelasan
Seperti dijelaskan dalam artikel esolangs, program Funciton menerima input yang dikodekan sebagai apa yang saya sebut "UTF-21", tetapi sebagai bilangan bulat tunggal. Jika saya ingin menggunakan nomor ini sebagai kunci untuk hashmap (kamus, array asosiatif), saya memerlukan fungsi hash yang memenuhi dua kriteria: satu, itu cukup sederhana untuk diterapkan di Funciton, dan dua, semua dari 13 yang diharapkan string input memberikan nilai hash yang berbeda. Fungsi hash paling sederhana yang bisa saya pikirkan adalah
input % m
untuk beberapa nilaim
. Oleh karena itu, saya mencobam
= 13, 14, 15, dll. Sampai saya mendapatkan integer terkecil yang semua nilai hashnya unik. Ternyata angka ini adalah 25.Nilai hash adalah:
Kami menyandikan setiap lagu dengan memiliki satu bit mewakili ada atau tidak adanya catatan. Misalnya, Lullaby Zelda akan dikodekan sebagai berikut:
kecuali bahwa bit berada dalam urutan yang berlawanan; sel kiri atas berada dalam bit paling tidak signifikan. Ini berarti setiap lagu memiliki panjang 40 bit.
Kami dengan demikian membuat tabel hash (agak jarang) dengan mengambil 40 × 25 = angka 1000-bit dan menempatkan pola bit untuk setiap lagu di tempat yang tepat sesuai dengan nilai hash-nya. Angka mengerikan dalam program ini persis tabel hash ini.
Inilah yang dimaksud masing-masing angka yang tersisa:
45
=0x2D
adalah Unicode untuk-
.1257283645609482190214660190
: Ini adalah string^<>VA
di UTF-21. Kalau dipikir-pikir saya bisa menggunakan 7 bit per karakter di sini, membuat jumlahnya lebih pendek, tetapi UTF-21 sangat tradisional di Funciton sehingga tidak terpikir oleh saya.2097151
=0x1FFFFF
= (1 << 21) - 1. Digunakan untuk mendapatkan karakter pertama dari string di atas.20971565
: Ini adalah string-\n
, yang ditambahkan ke akhir setiap baris.\n
kebetulan 10. Angka terakhir itu adalah (10 << 21) + 45.Program sekarang melanjutkan sebagai berikut:
ʫ
dengan 3 parameter berikut:^<>VA
.ʫ
,-
, diikuti oleh yang lain-
jika nol atau karakter pertama dari c sebaliknya. Geser ke kanan B per satu untuk menghapus satu bit dan mengurangi a .-\n
, kemudian matikan karakter pertama dari c dan mulai loop lain dengan a = 8.sumber
Python 2, 143,5 (287 byte - 50%)
Grid dihasilkan dengan tanda hubung; kemudian diindeks dan diganti dengan catatan.
sumber
j
dengan mengganti setiap koma dengan spasi dan memanggilsplit
tanpa argumenrange
. Sayangnya Anda tidak bisa hanya mengalikan daftar dalam dengan 5 karena mereka semua adalah objek yang sama dan mengubah satu perubahan yang lain: / Kami mengalahkan perl (untuk saat ini)!"<^><^>"
=>"<^>"*2
?scs="<"*8
Saya tidak suka lagu Scarecrow Anda.Perl 5, 125 (
320260250 Bytes -6x7% lagu bonus -8% lagu orang-orangan sawah)Yay, akhirnya kesempatan untuk bereksperimen dengan sintaks hash Perlish itu.
Uji
sumber
qw()
sintaks alih-alih koma lemak (%h=qw(zel <^><^> sas >'V><' ...)
untuk menyimpan beberapa byte@L
dapat ditulis lebih ringkas sebagai@L=('-')x17
. Juga, hash utama dapat dibiarkan anonim sebagai@B={qw(zel <^><^> ... scs <^V>>V^<)}->{$_}=~/./g
.Perl, 75 (150 byte - 50%)
Menghitung shebang sebagai 2, input diambil dari stdin.
Penggunaan sampel
sumber
Haskell, 344 - 50% = 172 byte
o
melakukan pekerjaan.Kupikir aku bisa mengalahkan Python dengan menggunakan penyandian ini (butuh waktu lama ._.), Tapi tidak. Mereka belum benar-benar menyimpan banyak byte. Ada saran?
Ya, itu minus di depan pengkodean untuk
"ros"
. Itu karena 'sheet' nya berakhir dengan karakter yang berarti0
di base-5 saya, karena trik negatif ini tidak akan bekerja untuk 'lagu-lagu mudah' yang dikodekan dengan menggandakan apa yang dikodekans
. Kecuali jika Anda menggunakanquot
mungkin, tetapi kemudian Anda tidak dapat menanganip (-1)
secara khusus, karena ituquot (-5) = 0
, negativitas akan hilang. Terserah.sumber
PHP: 130 byte (260
270279byte - 6 × 7% - 8%)Terima kasih kepada Ismael Miguel dan Blackhole untuk beberapa ide hebat untuk menghemat lebih banyak byte!
Setelah itu
print"-
, ini adalah penyisipan literal dari carriage return. Mungkin menerjemahkan ke dua byte di Windows.Semua lagu bonus termasuk lagu Scarecrow disertakan.
Setiap lagu direpresentasikan dalam tujuh byte kode. Saya suka skor baru karena dengan skor lama saya akan mendapatkan hanya satu poin bonus sedikit saja secara keseluruhan!
Pengeditan baru-baru ini membuat PHP menghasilkan banyak peringatan, jadi untuk menjaga hal-hal tetap bagus dan rapi, semuanya dialihkan
/dev/null
.Simpan sebagai
zelda.php
dan jalankan di baris perintah:sumber
main.php
"?()
sekitar($i-$c)
padaecho($i-$c)?'--':'-'.$z[$c-0];
. Juga, string Anda di dalam Andasplit
dapat digunakan tanpa'
. Dan'/^'.$argv[1].'/'
dapat ditulis sebagai"/^$argv[1]/"
Python 3 - 138.5 (
292280277 byte - 50%)Memotong beberapa byte dari pemimpin Python saat ini sambil melakukan metode print-as-you-go daripada metode ganti.
Coba Online
Menjalankan:
Keluaran:
sumber
['--',c+'-'][s[x]==c]
alih-alih persyaratanRuby, rev 1, 192 - 50% = 96
Golf meliputi:
penghapusan spasi putih antara kelompok huruf dalam string ajaib (dan revisi penyebut pada akhir baris untuk
/4
.) Penghapusan beberapa spasi putih yang tidak perlu lainnya.konversi urutan pelarian menjadi karakter tunggal (pertukaran stack tidak akan menampilkannya, jadi saya telah menaruh
?
sebagai penampung)redefinisi
g
sebagai string tunggal yang berisi lima run dari 17-
diikuti oleh baris baru, bukan array dari lima string dari 17-
Ruby, rev 0, 223 - 50% = 111,5 (ungolfed)
Kode input dikurangi menjadi 2 huruf. Jika dimulai dengan huruf
s
,s
dihapus, jika dimulai dengan huruf setelahs
(hanya berlaku untukzel
huruf terakhir dihapus, dan jika dimulai dengan huruf sebelums
huruf tengah dihapus.String sihir (yang dalam versi tidak mengandung serang berisi spasi untuk kejelasan) berisi kode 2 huruf diikuti oleh data musik. Itu dicari menggunakan operator pertandingan
=~
yang mengembalikan posisi dalam string.Ada persis satu lagu masing-masing 5, 7, dan 8 catatan (ditambah scs yang juga memiliki 8 catatan.) Ini, bersama dengan satu lagu 6-catatan sewenang-wenang
ros
yang dibundel pada awal string ajaib sehingga nilai yangn
diberikan oleh posisi dalam string dapat digunakan untuk menghitung jumlah not untuk dimainkan.cs
diperas sebelumnyabf
, dan dengan pemotongan ketika angkan
dibulatkan kita hanya pergi dengan perhitungan yang benar untuk keduanya. Setelah cluster keempat, semua lagu memiliki 6 catatan jadi jikan
besar jumlah catatan dikurangi menjadi default 6.Array
-
diatur untuk output dan catatan diganti satu per satu. Data musik yang diperlukan diekstraksi dari variabel$'
yang berisi bagian dari string sihir asli ke kanan pertandingan. Dengan cara ini, data yang tidak relevan diabaikan.Catatan dikodekan 3 pada satu waktu ke dalam senar ajaib, tepat setelah kode lagu 2 huruf yang relevan. Mereka diekstraksi dengan pembagian oleh
5**(i%3)
dan karakter dalamg
diperbarui sesuai. Pada akhir programg
dicetak.sumber
Python 2, 141,5 Bytes -50% (283 Bytes)
Menyimpan setiap not sebagai byte karena setiap baris memiliki 8 note. Ingat representasi biner dan kemudian gantikan dengan karakter yang tepat.
sumber
Lua, 249 byte - 50% = 124,5
Cukup sederhana, hanya membaca kembali lagu-lagu yang dikodekan sebagai angka dasar-6.
sumber