Funciton , 4322 - 50% = 2161
Naprawdę nie próbuję tutaj grać w golfa. Więcej pod kątem piękna. Myślę, że główny program wygląda naprawdę schludnie, idealne prostokątne pudełko schowane po prawej stronie.
Jak zawsze, możesz uzyskać lepsze renderowanie, wykonując $('pre').css('line-height',1)
w konsoli przeglądarki.
┌─────────────────────────┐
┌─┴─╖ ┌─┴─╖
┌────────┤ · ╟─────────────────────┤ · ╟─────────────┐ ╔═════════╗ ╔════╗ ╔════╗
│ ╘═╤═╝ ╔═════════╗ ╘═╤═╝ ╓───╖ │ ║ 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 ║
╘════╝ ╚════╝ ╚═══╝
Kontynuując tradycję nadawania nazw funkcjom Funciton składającym się z jednego, dziwnego, rzadko używanego znaku Unicode, pomyślałem o tym, co może najlepiej reprezentować to wyzwanie, i przyszło mi do głowy, że Link i Zelda (lub, jeśli chcesz, Legenda o Zelda ) daje LZ , więc małe litery ʫ (U + 02AB, ʟᴀᴛɪɴ sᴍᴀʟʟ ʟᴇᴛᴛᴇʀ ʟᴢ ᴅɪɢʀᴀᴘʜ) wydają się odpowiednie.
Wyjaśnienie
Jak wyjaśniono w artykule esolangs, program Funciton odbiera dane wejściowe zakodowane jako coś, co nazwałbym „UTF-21”, ale jako pojedynczą ogromną liczbę całkowitą. Gdybym chciał użyć tego numeru jako klucza do mapy skrótów (słownik, tablica asocjacyjna), potrzebowałbym funkcji skrótu, która spełnia dwa kryteria: jedno, jest wystarczająco proste do zaimplementowania w Funciton i dwa, wszystkie 13 z oczekiwanych ciągi wejściowe dają inną wartość skrótu. Najprostsza funkcja skrótu, o której mogłem myśleć, dotyczyła input % m
pewnej wartości m
. Dlatego próbowałem m
= 13, 14, 15 itd., Aż dotarłem do najmniejszej liczby całkowitej, dla której wszystkie wartości skrótu są unikalne. Okazuje się, że ta liczba to 25.
Wartości skrótu to:
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
Kodujemy każdą piosenkę, tak aby jeden bit reprezentował obecność lub brak nuty. Na przykład Kołysanka Zelda byłaby kodowana w następujący sposób:
---^-----^------- = 01001000
-<-----<--------- = 10010000
----->----->----- = 00100100
----------------- = 00000000
----------------- = 00000000
z wyjątkiem tego, że bity są w odwrotnej kolejności; lewa górna komórka jest najmniej znacząca. Oznacza to, że każda piosenka ma 40 bitów.
W ten sposób tworzymy (umiarkowanie rzadką) tabelę skrótów, biorąc 40 × 25 = 1000-bitów i umieszczając wzór bitowy dla każdego utworu we właściwym miejscu zgodnie z jego wartością skrótu. Monstrualną liczbą w programie jest właśnie ta tabela skrótów.
Oto, co oznacza każda z pozostałych liczb:
45
= 0x2D
Jest Unicode -
.
1257283645609482190214660190
: To jest ciąg znaków ^<>VA
w UTF-21. Z perspektywy czasu mogłem użyć tutaj 7 bitów na znak, dzięki czemu liczba ta jest krótsza, ale UTF-21 jest tak głęboko tradycyjny w Funciton, że po prostu nie przyszło mi to do głowy.
2097151
= 0x1FFFFF
= (1 << 21) - 1. Służy do uzyskania pierwszego znaku z powyższego ciągu.
20971565
: To jest ciąg -\n
, który jest dołączany na końcu każdej linii.
- Może się wydawać dziwne, że ta liczba i poprzedni wyglądają tak podobnie, ale jeśli się nad tym zastanowić, to dlatego, że używamy dziesiętnych, a Unicode
\n
ma wartość 10. Ta ostatnia liczba to (10 << 21) + 45.
Program działa teraz w następujący sposób:
- Program główny wywołuje
ʫ
3 następujące parametry:
- B : Tabela skrótów przesunięta w prawo o 40 bitów razy wartość skrótu wejścia. Piosenka, którą chcemy wydać, zawiera teraz 40 najmniej znaczących bitów.
- c : ciąg
^<>VA
.
- Odp . : Liczba 8.
- W każdej iteracji
ʫ
,
- jeśli c nie jest puste,
- jeśli nie jest zero, spojrzenie na dolnym kawałku B . Wyjście , a następnie kolejne, jeśli w przeciwnym razie jest to zero lub pierwszy znak c . Przesuń w prawo B o jeden, aby usunąć jeden bit i zmniejszyć a .
-
-
- jeśli a wynosi zero, wyjdź
-\n
, a następnie odetnij pierwszy znak od c i rozpocznij kolejną pętlę z a = 8.
- jeśli c jest puste, to skończymy.