Давайте играть в окарину

42

Как мы все знаем, серия Zelda - одна из лучших игр, когда-либо созданных. В честь этого давайте сыграем несколько песен на окарине.

Вызов:

Напишите программу, которая, учитывая песню, выводит счет на стандартный вывод для этой конкретной песни.

Входные данные:

Песня, для которой вам нужно будет вывести партитуру, будет представлена ​​уникальной комбинацией из трех символов, как показано ниже:

zel - Zelda's Lullaby
sas - Saria's Song
eps - Epona's Song
sos - Sun's Song
sot - Song of Time
sst - Song of Storms

Бонусные песни, -7% каждая:

mof - Minuet of Forest
bof - Bolero of Fire
sow - Serenade of Water
nos - Nocturne of Shadow
ros - Requiem of Spirit
pol - Prelude of Light

Бонусная песня 2, -8%:

scs - Scarecrow's song 

Как мы все знаем, песня Чучела - это песня, которую вы сочиняете сами. Эта песня должна иметь восемь нот. Выведите счет, который вы составляете сами, который отличается от всех остальных.

Если вы решите включить все песни, вы получите бонус -50% к вашему счету байтов.

Выход:

Примечания в выводе обозначены следующими символами:

^
<
>
V
A

Выведите оценку в следующем формате:

-^-^-^-^-^-^-^-^-
-<-<-<-<-<-<-<-<-
->->->->->->->->-
-V-V-V-V-V-V-V-V-
-A-A-A-A-A-A-A-A-

Разрешается только одна заметка на столбец. Для простоты я добавил еще одну строку к исходным четырем строкам.

Каждая нота соответствует отдельной строке:

^: ----------------
<: ----------------
>: ----------------
V: ----------------
A: ----------------

Выходные данные должны быть записаны на стандартный вывод. Конечные переводы строки разрешены.

Примеры:

Вход (Колыбельная Зельды):

zel

Выход:

---^-----^-------
-<-----<---------
----->----->-----
-----------------
-----------------

Вход (Болеро Огня):

bof

Выход:

-----------------
-----------------
--------->--->---
-V---V-----V---V-
---A---A---------

Примечание шпаргалка:

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
^>^><^

Поскольку мы играем в гольф с кодом окарины , выигрывает самая короткая программа в байтах!

Ссылки на песни:

http://www.thonky.com/ocarina-of-time/ocarina-songs

http://www.zeldadungeon.net/Zelda05-ocarina-of-time-ocarina-songs.php

sweerpotato
источник
4
Возможно, вам следует использовать бонус%, а не байтовый бонус. Практически невозможно закодировать любую из этих песен в <7 байтов, поэтому ни один из бонусов в настоящее время не стоил бы этого. Вы должны также упомянуть, что песня Пугало должна состоять из 8 фактических нот; в противном случае кто-то может просто напечатать пустой счет. Но кроме этого, хороший вызов!
ETHproductions
9
Тот факт, что я слышу эти песни в своей голове, читая этот вопрос, заставляет меня задуматься о том, что я делаю со своей жизнью. Я имею в виду, я на работе, когда я мог играть в OoT ...
MikeTheLiar
11
Я надеюсь, что это не лишит законной силы любые существующие ответы, но учтите, что в оригинальной Zelda песня чучела должна состоять из двух разных нот , поэтому, например, AAAAAAAA не будет действительной песней чучела.
января
4
Я думаю, строчные буквы vбудут выглядеть лучше.
mbomb007
3
Я действительно жду, когда кто-нибудь решит эту проблему в веллато или фуге и сыграет в нее на окарине
user902383

Ответы:

8

Pyth, 56,5 (113 байт - 6 × 7% - 8%)

VtJ" ^<>VA"+K\-sm+?qNdNKK@LJj@jC"þØí§V^G¤×¹z1«bëë¶ñRõr¤çM"1391423xcs@LGjC"cc0Á:xqç÷\rS  Íó׺:9"lG3z6

Он содержит непечатаемые символы, так что вот обратимый xxdhexdump:

0000000: 5674 4a22 205e 3c3e 5641 222b 4b5c 2d73  VtJ" ^<>VA"+K\-s
0000010: 6d2b 3f71 4e64 4e4b 4b40 4c4a 6a40 6a43  m+?qNdNKK@LJj@jC
0000020: 2207 fe85 d880 ed0e a756 5e47 8ba4 d7b9  "........V^G....
0000030: 7a9e 0531 ab1b 62eb ebb6 f112 52f5 72a4  z..1..b.....R.r.
0000040: e74d 2231 3339 3134 3233 7863 7340 4c47  .M"1391423xcs@LG
0000050: 6a43 229a 6317 6330 c13a 9278 71e7 10f7  jC".c.c0.:.xq...
0000060: 5c72 5309 87cd f3d7 ba3a 3922 6c47 337a  \rS......:9"lG3z
0000070: 36                                       6

Вы также можете попробовать это онлайн .

объяснение

Я сохраняю песни в числах base-6, перекодированных в базу 1391423, а затем в базу 256 для экономии места. Мне пришлось выбирать базу 6, так как некоторые песни начинаются с ^, а цифры не могут начинаться с 0 после декодирования.

  J" ^<>VA"                                                      save characters in J
 t                                                               discard the space
V                                                                loop over all characters
                               C"..."                            parse base256 string (songs) to int
                              j      1391423                     convert to base 1391423 (separate songs)
                                                   C"..."        parse base256 string (codes) to int
                                                  j      lG      convert to base-26
                                               @LG               replace indices by corresponding letters
                                              s                  concatenate
                                             c             3     chop to 3-character codes
                                            x               z    find index of input code
                             @                                   get correct song
                            j                                6   convert to base 6
                         @LJ                                     replace indices by corresponding ^<>VA
                m                                                map d over the above
                  ?qNdNK                                         take the current character if at its row,
                                                                 otherwise a dash
                 +      K                                        add a dash
               s                                                 concatenate
           +K\-                                                  add a dash and print
PurkkaKoodari
источник
44

Funciton , 4322 - 50% = 2161

На самом деле не пытаюсь играть в гольф здесь. Собираюсь больше за угол красоты. Я думаю, что основная программа выглядит действительно аккуратно, идеальная прямоугольная коробка спрятана справа.

Как всегда, вы можете получить лучший рендеринг, выполнив $('pre').css('line-height',1)в консоли браузера.

                 ┌─────────────────────────┐
               ┌─┴─╖                     ┌─┴─╖
      ┌────────┤ · ╟─────────────────────┤ · ╟─────────────┐    ╔═════════╗   ╔════╗  ╔════╗
      │        ╘═╤═╝     ╔═════════╗     ╘═╤═╝ ╓───╖       │    ║ 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 ║
      ╘════╝ ╚════╝   ╚═══╝

Продолжая традицию давать имена функций Funciton, состоящие из одного странного, редко используемого символа Юникод, я подумал о том, что может лучше всего представлять эту проблему, и мне пришло в голову, что Линк и Зельда (или, если хотите, Легенда о Зельда ) даст тебе LZ , поэтому орграф строчных букв ʫ (U + 02AB, ʟᴀᴛɪɴ sᴍᴀʟʟ ʟᴇᴛᴛᴇʀ ʟᴢ ᴅɪɢʀᴀᴘʜ) кажется подходящим.

объяснение

Как объясняется в статье esolangs, программа Funciton получает вход, закодированный как то, что я бы назвал «UTF-21», но как одно целое число. Если бы я хотел использовать это число в качестве ключа к хэш-карте (словарь, ассоциативный массив), мне нужна хеш-функция, которая удовлетворяет двум критериям: один - достаточно простой для реализации в Funciton, и два - все 13 ожидаемых входные строки дают другое значение хеша. Самая простая хеш-функция, о которой я мог подумать, была input % mдля некоторого значения m. Поэтому я пробовал m= 13, 14, 15 и т. Д., Пока не получил наименьшее целое число, для которого все значения хеш-функции являются уникальными. Оказывается, это число 25.

Значения хэша:

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

Мы кодируем каждую песню, имея один бит, представляющий наличие или отсутствие ноты. Например, Колыбельная Зельды будет закодирована следующим образом:

---^-----^------- = 01001000
-<-----<--------- = 10010000
----->----->----- = 00100100
----------------- = 00000000
----------------- = 00000000

за исключением того, что биты находятся в обратном порядке; верхняя левая ячейка находится в младшем значащем бите. Это означает, что каждая песня имеет длину 40 бит.

Таким образом, мы создаем (умеренно разреженную) хеш-таблицу, беря 40 × 25 = 1000-битное число и размещая битовый шаблон для каждой песни в нужном месте в соответствии с ее хэш-значением. Чудовищное число в программе - именно эта хеш-таблица.

Вот что означает каждое из оставшихся чисел:

  • 45= 0x2DUnicode для -.
  • 1257283645609482190214660190: Это строка ^<>VAв UTF-21. Оглядываясь назад, я мог бы использовать здесь 7 бит на символ, делая число короче, но UTF-21 настолько глубоко традиционен в Funciton, что мне просто не пришло в голову.
  • 2097151= 0x1FFFFF= (1 << 21) - 1. Используется для получения первого символа из приведенной выше строки.
  • 20971565: Это строка -\n, которая добавляется в конец каждой строки.
    • Может показаться любопытным, что это число и предыдущий выглядят очень похожими, но если подумать, то это потому, что мы используем десятичное число, а Unicode for \nравен 10. Это последнее число (10 << 21) + 45.

Программа теперь работает следующим образом:

  • Основная программа вызывает ʫследующие 3 параметра:
    • B : Хеш-таблица, сдвинутая вправо на 40 бит, умноженная на хеш-значение ввода. Песня, которую мы хотим вывести, теперь состоит из 40 наименее значимых битов.
    • с : строка ^<>VA.
    • а : число 8.
  • В каждой итерации ʫ,
    • если с не пусто,
      • если не равен нулю, смотреть на нижней бит B . Выведите , а затем другой, если он равен нулю, или первый символ c в противном случае. Сдвиньте вправо B на единицу, чтобы убрать один бит и уменьшить a .--
      • если a равно нулю, выведите -\n, затем отрежьте первый символ от c и начните другой цикл с a = 8.
    • если с пусто, мы сделали.
Timwi
источник
Молодцы, это впечатляет!
Sweerpotato
6
<grumble> Эта чертова музыкальная квартира ... сбрасывающая моноспейс ... </ grumble>
Тейлор Лопес
1
@iAmMortos: Согласен. По этой причине я долгое время избегал символа and и убедил себя, что могу просто побитовый - нет, потом ♯, потом побитовый - нет. Но теперь я использую Deja Vu Sans Mono для редактирования Funciton, и у него есть ♭. Так что теперь все, что нам нужно, - это чтобы StackExchange переключился на этот шрифт и для кода ;-)
Timwi
4
Кроме того, вы, безусловно, должны признать, что нет лучшего подгонки символа Unicode для уменьшения и приращения, чем ♭ и ♯. Они просто идеальны .
Тимви
Хаха, полностью. Я ничего не знаю о функции, но это имеет смысл!
Тейлор Лопес
11

Python 2, 143,5 (287 байт - 50%)

i='^<>VA'
u=dict(zel="<^>"*2,sas="V><"*2,eps="^<>"*2,sos=">V^"*2,sot=">AV"*2,sst="AV^"*2,mof="A^<><>",bof="VAVA>V>V",sow="AV>><",nos="<>>A<>V",ros="AVA>VA",pol="^>^><^",scs="<"*8)[raw_input()]
r=[17*['-']for _ in[1]*5]
x=0
for g in u:r[i.find(g)][x*2+1]=g;x+=1
for h in r:print''.join(h)

Сетка создается штрихами; затем индексируется и заменяется заметками.

Zach Gates
источник
Не слишком много изучал, но вы можете сохранить байты в объявлении j, заменяя каждую запятую пробелом и вызывая splitбез аргументов
подземный
Я не думаю, что вам нужно было это делать, это все еще ваш алгоритм, поэтому я думаю, что вы заслуживаете представителя, но в любом случае мне удалось избавиться от него range. К сожалению, вы не можете просто умножить внутренний список на 5, потому что все они являются одним и тем же объектом, и изменение одного из них приводит к изменению других: / Хотя мы пока победили perl (пока)!
FryAmTheEggman
Не могли бы вы удалить 6 байтов (по 1 для каждой из первых шести песен), выполнив что-то вроде "<^><^>"=> "<^>"*2?
El'endia Starman
scs="<"*8 Мне не нравится твоя песня Пугало.
Кейси Кубалл
Когда я пытаюсь запустить это, он просто останавливается на строке 2 и никогда не заканчивается.
Кори Кляйн
7

Perl 5, 125 ( 320 260 250 байтов -6x7% бонусных песен -8% песни чучела)

Да, наконец-то появилась возможность поэкспериментировать с синтаксисом Perlish hash.

$_=pop;@B={qw(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 ^>^><^ scs <^V>>V^<)}->{$_}=~/./g;map{@L=('-')x17;for$i(0..@B){$L[1+2*$i]=$_,if$B[$i]eq$_}say@L}qw(^ < > V A)

Тест

$ perl -M5.010 ocarina.pl scs
---^---------^---
-<-------------<-
------->->-------
-----V-----V-----
-----------------
LukStorms
источник
1
Используйте qw()синтаксис вместо жирных запятых ( %h=qw(zel <^><^> sas >'V><' ...)чтобы сохранить несколько байтов
моб
1
@mob Этот совет побрил больше, чем просто «некоторые» байты. :) Благодарность!
LukStorms
1
@Lможет быть написано более кратко, как @L=('-')x17. Также основной хеш можно оставить как анонимный @B={qw(zel <^><^> ... scs <^V>>V^<)}->{$_}=~/./g.
Примо
1
Я вижу, это хорошие уловки, чтобы избежать слегка многословной функции разбиения. Еще десять байт были принесены в жертву. падает
LukStorms
5

Perl 75 (150 байт - 50%)

#!perl -nl
$i=vec~$_,0,32;print+qw(- - ^ < > V A)[0,map{vec('w2$$W4F4w7DeweTFwR$Ew$C2wVdeVe3cw4B#EEVVwC5Tw44bwR&e',$i/480%15*8-$_,4)==$.&&$.,0}1..8]while$.++<6

Считая Шебанг как 2, ввод берется из стандартного ввода.

Пример использования

$ echo zel | perl zelda.pl
---^-----^-------
-<-----<---------
----->----->-----
-----------------
-----------------

$ echo bof | perl zelda.pl
-----------------
-----------------
--------->--->---
-V---V-----V---V-
---A---A---------

$ echo scs | perl zelda.pl
-----------------
---<-<-<---------
-----------------
-----------V-V---
-A-------A-----A-
Примо
источник
1
Используете для этого функцию бит-сдвига vec? Удивительно.
LukStorms
@LukStorms Я бы хотел, чтобы он мог делать 3 бита, а не только 2 степени;)
прим.
4

Haskell, 344 - 50% = 172 байта

import Data.List
s"zel"=82
s"sas"=69
s"eps"=86
s"sos"=48
s"sot"=128
s"sst"=50
z"mof"=11055
z"bof"=373854
z"sow"=1720
z"nos"=73217
z"ros"= -12730
z"pol"=4791
z"scs"=304236
z n=s n*126
p n|n*n== -n="   "|0<1="A^<>V"!!(n`mod`5):p(n`div`5)
o=putStr.unlines.transpose.(l:).concatMap(\c->[map(e c)"^<>VA",l]).take 8.p.z
e c d|c==d=c|0<1='-'
l="-----"

o делает работу

Я думал, что смогу победить Python, используя эти кодировки (это заняло у меня много времени ._.), Но нет. Они еще не экономят много байтов. Какие-либо предложения?

Да, это минус перед кодировкой для "ros". Это потому, что его «лист» заканчивается символом, который означает 0в моей базе 5, потому что этот отрицательный трюк не сработает для «простых песен», закодированных путем удвоения того, что закодировано в s. Если вы не используете, quotможет быть, но тогда вы не можете обращаться p (-1)с этим quot (-5) = 0, так как отрицательность исчезнет. Без разницы.

Лейф Виллертс
источник
4

PHP: 130 байтов (260 270 279 байтов - 6 × 7% - 8%)

Спасибо Измаилу Мигелю и Блэкхолу за отличные идеи по экономии байтов!

<?php $f=str_split;for($z='*^<>VA';++$i<6;print"-
")foreach($f(base_convert(substr(current(preg_grep("/^$argv[1]/",$f(bofttmmeps8jf0mofvff0nosfnfopol99d0rosyxt0sasrgk0scs8m8msosm9p0sotnry0sowylc0sstybp0zeldk90,7))),-4),36,6),1)as$c)echo$i-$c?'--':'-'.$z[$c-0];

После print"-этого это буквальная вставка возврата каретки. Может переводиться в два байта в Windows.

Все бонусные песни, включая песню Пугало, включены.

Каждая песня представлена ​​семью байтами кода. Мне нравится новая оценка, потому что со старой оценкой я бы получил всего один скудный бонусный балл в целом!

Недавние изменения заставляют PHP генерировать много предупреждений, поэтому, чтобы они были аккуратными и аккуратными, к ним обращались /dev/null.

Сохранить как zelda.phpи запустить в командной строке:

$ php zelda.php zel 2> /dev/null
---^-----^-------                                                                                                                                   
-<-----<---------                                                                                                                                   
----->----->-----                                                                                                                                   
-----------------                                                                                                                                   
-----------------

$ php zelda.php bof 2> /dev/null                                                                                                                            
-----------------                                                                                                                                   
-----------------                                                                                                                                   
--------->--->---                                                                                                                                   
-V---V-----V---V-                                                                                                                                   
---A---A--------- 

$ php zelda.php scs 2> /dev/null                                                                                                                          
-^-------^-------                                                                                                                                   
---<-------<-----                                                                                                                                   
----->------->---                                                                                                                                   
-------V-------V-                                                                                                                                   
-----------------

источник
Вы имели в виду «сохранить как main.php»?
Зак Гейтс,
@ZachGates - Спасибо, что поймали это, сделали изменения.
Вам не нужно ()вокруг ($i-$c)на echo($i-$c)?'--':'-'.$z[$c-0];. Кроме того, ваша строка внутри splitможет быть использована без '. И '/^'.$argv[1].'/'может быть записано как"/^$argv[1]/"
Исмаэль Мигель
1
Спасибо! Я думаю, что в CGSE разрешено передавать предупреждения в / dev / null для очистки вывода?
@ Blackhole - спасибо! Это связано с представлением Perl 5, довольно хорошо ...
4

Python 3 - 138,5 ( 292 280 277 байт - 50%)

Урезал несколько байтов от текущего лидера Python, выполняя метод print-as-you-go, а не метод replace.

Попробуйте онлайн

s=dict(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="^>^><^",scs="AV><^AV>")[input()]
s+=" "*8
for c in "^<>VA":
 o="-"
 for x in range(8):o+=["--",c+"-"][s[x]==c]
 print(o)

Бег:

> python3 loz.py
bof [return]

Выход:

-----------------
-----------------
--------->--->---
-V---V-----V---V-
---A---A---------
Тейлор Лопес
источник
Вы можете сэкономить несколько байтов, используя ['--',c+'-'][s[x]==c]вместо условных
Рут Франклин
О, хороший звонок, спасибо!
Тейлор Лопес
3

Ruby, rev 1, 192 - 50% = 96

Гольф включает в себя:

удаление пробелов между группами букв в магической строке (и ревизия знаменателя в конце строки к /4.) удаление некоторых других ненужных пробелов.

преобразование escape-последовательностей в отдельные символы (обмен стека не будет отображать их, поэтому я поместил их ?в качестве заполнителя)

переопределение gв виде одной строки, содержащей пять строк по 17, -за которыми следуют символы новой строки вместо массива из пяти строк по 17-

s=gets.chop
s[?s<=>s[0]]=''
n=("owEkrswuns=;gcsbfbYuze33as&&es77os??otaast??mf?9pl
?"=~/#{s}/)/4
g=(?-*17+'
')*5
(n<4? n+5:6).times{|i|x=$'[i/3].ord/5**(i%3)%5;g[x*18+i*2+1]='^<>VA'[x]}
puts g

Рубин, рев 0, 223 - 50% = 111,5 (без золота)

Код ввода сокращается до 2 букв. Если он начинается с s, то sудаляется, если начинается с буквы после s( zelудаляется только последняя буква, и если он начинается с буквы до sудаления средней буквы).

Волшебная строка (которая в версии без гольфа содержит пробелы для ясности) содержит двухбуквенные коды, за которыми следуют музыкальные данные. Поиск осуществляется с помощью оператора соответствия, =~который возвращает позицию в строке.

Существует ровно одна песня, каждая из 5, 7 и 8 нот (плюс scs, которая также имеет 8 нот). Они вместе с одной произвольной песней из 6 нот rosобъединяются в начале магической строки, так что значение, nзаданное Положение в строке может быть использовано для расчета количества играемых нот. csсжимается в ранее bf, и с усечением, когда число в nокругляется в меньшую сторону, мы просто уходим с правильным расчетом для обоих. После четвертого кластера все песни имеют 6 нот, поэтому, если nоно велико, количество нот уменьшается до 6 по умолчанию.

Массив -настроен для вывода, и примечания заменяются один за другим. Необходимые музыкальные данные извлекаются из переменной, $'которая содержит часть оригинальной магической строки справа от совпадения. Таким образом, нерелевантные данные игнорируются.

Ноты кодируются по 3 за раз в волшебную строку, сразу после соответствующего двухбуквенного кода песни. Они извлекаются с делением на, 5**(i%3)и символ в gобновляется соответственно. В конце программы gпечатается.

s=gets.chop
s[?s<=>s[0]]=''
n=("owEk rswu ns=;g csbfbYu ze33 as&& es77 os\21\21 otaa st\23\23 mf\35\71 pl\n\a"=~/#{s}/)/5

g=(0..4).map{'-'*17}
(n<4? n+5 : 6).times{|i|x=$'[i/3].ord/5**(i%3)%5;g[x][i*2+1]='^<>VA'[x]}
puts g
Уровень реки St
источник
2

Python 2, 141,5 байт -50% (283 байт)

s='D  2)AE0*  A2)D  AD )2 A  )D2A 0,"!A D2) A  (2EA"4H !A )2D A 1F`(A)2D  A  p\xc5*'.split("A")['sst pol zel sos sot sow sas ros mof scs nos eps bof'.split().index(raw_input())]
for c,n in zip(s,"^<>VA"):print"-".join([("-"+n)[i>"0"]for i in bin((ord(c)-32)%255)[2:].zfill(8)][::-1])

Сохраняет каждую ноту как байт, поскольку каждая строка имеет длину 8 нот. Вызывает двоичное представление и затем заменяет правильные символы.

синий
источник
1

Lua, 249 байт - 50% = 124,5

w=io.write for j=1,5 do n={sst=41881,pol=44915,zel=30814,sos=42315,sot=17577,sow=5953,sas=35588,ros=11065,mof=29335,nos=122170,eps=29729,bof=719576,scs=999999}[...]for i=1,8 do d=n%6 n=(n-d)/6 c=d==6-j and'AV><^':sub(d,d)or'-'w('-',c)end w('-\n')end

Довольно просто, просто читает песни, закодированные в виде цифр base-6.

Криптих стоит с Моникой
источник