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.
┌─────────────────────────┐
┌─┴─╖ ┌─┴─╖
┌────────┤ · ╟─────────────────────┤ · ╟─────────────┐ ╔═════════╗ ╔════╗ ╔════╗
│ ╘═╤═╝ ╔═════════╗ ╘═╤═╝ ╓───╖ │ ║ 1257283 ║ ┌─╢ 40 ║ ║ 25 ║
│ │ ║ 2097151 ║ ├───╢ ʫ ╟───┐ │ ║ 6456094 ║ │ ╚════╝ ╚══╤═╝
┌─┴─╖ │ ╚════╤════╝ ┌─┴─╖ ╙─┬─╜ ┌─┴─╖ │ ║ 8219021 ║ │ ┌───╖ ┌─┴─╖
┌───┤ · ╟────────┴────┐ └─────┬────┤ · ╟───┴───┤ · ╟─┤ ║ 4660190 ║ └──┤ × ╟───┤ % ║
│ ╘═╤═╝ │ ┌┴┐ ╘═╤═╝ ╘═╤═╝ │ ╚════════╤╝ ╘═╤═╝ ╘═╤═╝
│ │ │ └┬┘ │ │ │ ╔═══╗ ┌─┴─╖ ┌──┴─╖ ╔═╧═╗
│ │ ╔═══╗ ┌────╖ │ ┌─┴─╖ ┌┐ │ │ │ ║ 8 ╟──┤ ʫ ╟──┤ >> ║ ║ ║
│ │ ║ 1 ╟─┤ >> ╟─┘ ┌───┤ ? ╟─┤├─┤ │ │ ╚═══╝ ╘═╤═╝ ╘══╤═╝ ╚═══╝
│ │ ╚═══╝ ╘══╤═╝ │ ╘═╤═╝ └┘ │ │ │ ╔════════════════╧═════════╗
│ │ ┌─┴─╖ ┌───╖ ┌─┴─╖ ┌─┴─╖ ╔═╧═╗ │ │ ║ 609678112368778425678534 ║
│ ┌─┴─────────┤ ʫ ╟─┤ ‼ ╟─┤ · ╟─┤ ‼ ║ ║ 1 ║ │ │ ║ 616189712722605554111376 ║
│ │ ╘═╤═╝ ╘═╤═╝ ╘═╤═╝ ╘═╤═╝ ╚═══╝ │ │ ║ 461573643915077926310571 ║
│ │ │ │ │ ╔═╧══╗ │ │ ║ 355541007599150245813976 ║
│ │ ╔══════╗ │ │ └───╢ 45 ║ │ │ ║ 426564826002362964111793 ║
│ │ ║ 2097 ║ │ ┌─┴─╖ ┌───╖ ╚════╝ │ │ ║ 714054902293682079346275 ║
│ │ ║ 1565 ║ └───┤ · ╟─┤ ♭ ╟─┐ │ │ ║ 663973372550500581508544 ║
│ │ ╚═╤════╝ ╘═╤═╝ ╘═══╝ ├────────────────────┘ │ ║ 874263187322344354338195 ║
│ │ ┌─┴─╖ ┌─┴─╖ │ │ ║ 642609790172899326178321 ║
│ │ │ ‼ ╟─────────┤ ? ╟───────┘ │ ║ 071643306454414932126243 ║
│ │ ╘═╤═╝ ╘═╤═╝ │ ║ 308860823981077902637848 ║
│ ┌─┴─╖ ┌─┴─╖ ╔═══╗ ┌─┴─╖ │ ║ 322657399386789617074176 ║
└─┤ · ╟─┤ ʫ ╟─╢ 8 ║ ┌─┤ ? ╟────────────────────────────────┘ ╚══════════════════════════╝
╘═╤═╝ ╘═╤═╝ ╚═══╝ │ ╘═╤═╝
│ ┌───┴╖ ╔════╗ │ ╔═══╗
└─┤ >> ╟─╢ 21 ║ └─╢ 0 ║
╘════╝ ╚════╝ ╚═══╝
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 nilai m
. Oleh karena itu, saya mencoba m
= 13, 14, 15, dll. Sampai saya mendapatkan integer terkecil yang semua nilai hashnya unik. Ternyata angka ini adalah 25.
Nilai hash adalah:
zel = 6
sas = 19
eps = 10
sos = 22
sot = 1
sst = 9
mof = 14
bof = 3
sow = 13
nos = 17
ros = 21
pol = 16
scs = 23
Kami menyandikan setiap lagu dengan memiliki satu bit mewakili ada atau tidak adanya catatan. Misalnya, Lullaby Zelda akan dikodekan sebagai berikut:
---^-----^------- = 01001000
-<-----<--------- = 10010000
----->----->----- = 00100100
----------------- = 00000000
----------------- = 00000000
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.
- Mungkin terlihat aneh bahwa angka ini dan yang sebelumnya terlihat sangat mirip, tetapi jika Anda memikirkannya, itu karena kami menggunakan desimal dan Unicode
\n
kebetulan 10. Angka terakhir itu adalah (10 << 21) + 45.
Program sekarang melanjutkan sebagai berikut:
- Panggilan program utama
ʫ
dengan 3 parameter berikut:
- B : Tabel hash, bergeser ke kanan dengan 40 bit kali nilai hash input. Lagu yang ingin kami output sekarang dalam 40 bit paling tidak signifikan.
- c : Tali
^<>VA
.
- a : Angka 8.
- Dalam setiap iterasi
ʫ
,
- jika c tidak kosong,
- jika seorang tidak nol, lihat sedikit bawah B . Keluaran
-
, 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 .
- jika a adalah nol, keluaran
-\n
, kemudian matikan karakter pertama dari c dan mulai loop lain dengan a = 8.
- jika c kosong, kita selesai.