Ваша задача - взять последовательность символов (музыку) в качестве входных данных (в функции или программе) и напечатать (или вернуть) музыку так, как она выглядит в музыкальной шкатулке.
Вы получите только символы в ABCDEFG.()
качестве входных данных, а ввод никогда не будет пустым. Вы также можете получать буквы в нижнем регистре, если вы этого хотите.
Это пустая музыкальная шкатулка длиной 3:
.......
.......
.......
Как видите, длина строки составляет 7 символов, а поскольку длина музыкальной шкатулки равна 3, у нас есть 3 строки. Здесь есть только .
s, так как музыкальная шкатулка пуста. Давайте добавим немного музыки в это!
Сначала мы создаем музыкальную шкатулку. В этом примере вход будет CDAG.DAG
.
Длина CDAG.DAG
8, поэтому нам нужна музыкальная шкатулка длиной 8:
.......
.......
.......
.......
.......
.......
.......
.......
Затем мы читаем ввод, по одному символу за раз, и помещаем O
его в соответствующую позицию.
Первый символ C
, и расположение каждой заметки эквивалентно этому (я добавил пробелы для ясности):
A B C D E F G
. . . . . . .
. . . . . . .
(and so on)
Если входной символ является .
, то мы просто печатаем пустую строку.......
Таким образом, C
будет 3-й персонаж. Давайте поместим это в нашу музыкальную шкатулку наверху:
..O....
.......
.......
.......
.......
.......
.......
.......
Мы повторим этот процесс для всех остальных символов (текст в скобках просто для того, чтобы показать вам примечание, вы не должны выводить это):
..O.... (C)
...O... (D)
O...... (A)
......O (G)
....... (.)
...O... (D)
O...... (A)
......O (G)
Из-за того, как работают музыкальные шкатулки, если мы используем символ, отличный от O
, .
и <insert newline here>
, например, пробел, в нашем выводе, он не будет воспроизводить правильную музыку!
Это аккорд:
(ACE)
Этот аккорд инструктирует нас играть ноты A
, C
и E
в то же время. Там никогда не будет паузы (то есть .
) в аккорде.
Вот как это будет написано:
O.O.O...
И вот как это может выглядеть в музыке: B(ACE)D
Вы никогда не получите аккорд в аккорде, т.е. это не будет действительным: (AB(CD)EF)
или this:, A(B())
и аккорд не будет пустым, т.е. это не будет действительным:A()B
Вы никогда не получите неверный ввод.
Примеры:
B(ACE)D
.O.....
O.O.O..
...O...
B
.O.....
GGABC
......O
......O
O......
.O.....
..O....
...
.......
.......
.......
A..F.C(DA).
O......
.......
.......
.....O.
.......
..O....
O..O...
.......
.(ABCDEF)
.......
OOOOOO.
Конечный / ведущий пробел на выходе разрешен.
Поскольку это код-гольф , выигрывает самый короткий код!
()
дважды (напримерAB(CD)E(FG)
:)?Ответы:
Пип , 29 байт
28 байт кода, +1 для
-l
флага.Принимает ввод в нижнем регистре в качестве аргумента командной строки. Попробуйте онлайн!
объяснение
Вот пример того, как преобразуется вход:
источник
Python 2 ,
9594 байта-1 байт благодаря Value Ink
Попробуйте онлайн! или попробуйте все тестовые случаи
объяснение
'@'<i
чтобы проверить , еслиi
это письмо, заменив.
наO
на правильном положении.'*'>i
чтобы проверить,i
является скобкой, если онx=i>'('
поставит0
на ,x
чтобы предотвратить печать / очисткуo
, когдаi==')'
он будет ставить1
наx
повторном включении печати / очисткиo
.Когда
i=='.'
ничего не изменится и'.......'
будет напечатано.Порядок charater определяется кодом ASCII, где
'('<')'<'*'<'.'<'@'<'A'
источник
['.']*7
. Возможно, это пережиток того времени, когда вы использовали кортеж, который потребовал бы запятую. Кроме того, я могу ошибаться, но, похоже, это выводит массив['O', '.', '.', '.', '.', '.', '.']
на строку, и я не уверен, разрешено ли это?Пакетный, 209 байтов
Работает путем накопления букв и вывода строки, если последний увиденный символ не был
(
.источник
Röda ,
977876 байтПопробуйте онлайн!
Это анонимная функция, которая читает входные данные из потока. Используйте его так:
main { f={...}; push("ABCD") | f() }
. Он использует регулярное выражение из ответа ETHproductions.Ungolfed:
Предыдущий ответ:
Попробуйте онлайн!
Он работает, разбивая данную строку в местах, где следующая строка содержит только совпадающие скобки. Затем для каждого аккорда он просматривает возможные ноты и печатает,
O
если нота является членом аккорда, и в.
противном случае.источник
JavaScript (ES6),
868576 байтСохранено 9 байтов благодаря @Neil
объяснение
Сначала мы сопоставляем то, что будет формировать каждую строку выходных данных: аккорды и символы, которые не являются частью аккорда. Затем для каждой строки мы берем строку
ABCDEFG\n
и заменяем каждый символ, не являющийся символом новой строки, на нее,O
если строка содержит ее, и на.
иное.источник
s=>s.replace(r=/\(\w+\)|./g,x=>`ABCDEFG\n`.replace(r,c=>x.match(c)?"O":"."))
.\)
быть.
?JavaScript (ES6),
118116114 байтКонтрольные примеры
Показать фрагмент кода
источник
Рубин,
787571 байтВозвращает массив строк.
Ungolfed + объяснение
источник
x.gsub(...){l=?.*7;$&.bytes{...};l+$/}
(свопscan
сgsub
, REMOVEmap
, и пропустить первый ,|x|
так как вы можете использовать ,$&
чтобы получить доступ последнего матча регулярного выражения) , чтобы сохранить 3 байт и возвращает строку из нескольких строк вместо этого. ($/
По умолчанию также отображается на новуюPHP, 171 байт
Сломать :
Попробуй это здесь!
источник
Сетчатка , 120 байт
Я уверен, что есть место для игры в гольф, но теперь это работает, поэтому я попробую играть в гольф позже.
Попробуйте онлайн!
Как это работает
По сути, программа работает, изменяя каждый символ на число, а затем назначая
O
эту позицию в строке. Это сопоставляетсяABCDEFG.
с01234569
.Чтобы сгенерировать одиночные строки примечания, все, что нужно сделать, это поставить
O
после соответствующего числа.
s, а затем добавить строку длиной до 7 символов.Тем не менее, аккорды немного сложнее сделать. Аналогичный процесс используется, но числа должны быть переведены в приращения, то есть первая нота в аккорде (что угодно), вторая позиция X после первой, третья позиция Y после этого и т. Д.
Код
Начните с сортировки всех символов в аккордах.
Выполните транслитерацию (отображение) от букв к цифрам.
Замените все цифры в скобках унарным представлением (используя
x
s), а затем пробел.Замените все закрывающие скобки с
m
последующим переводом строки.m
Будет использоваться в качестве маркеров сортов для предстоящего цикла:Это этап замены, который повторяется до тех пор, пока он больше не сможет заменить. Он принимает последние две последовательности
x
s перед anm
и вычитает первую из второй, перемещаяm
назад. Маркерm
необходим, потому что он должен выполнять эту операцию справа налево.Удалите первое
x
в каждой последовательности, кроме первого.T
ransliterate путем заменыx
с.
, с пространствомO
, и удалениеm
и(
.На данный момент все строки для аккордов были созданы. Теперь должны быть созданы одиночные ноты.
Замените каждую цифру таким количеством
.
s, за которым следуютO
и новая строка.Дополните каждую строку длиной 7, добавив
.
s справа. Это работает, добавляя 6.
с в конце каждой строки (каждая строка будет иметь по крайней мере 1 другой символ), затем заменяя каждый символ после первых 7 в каждой строке ничем. (Поскольку.
карты на 9,O
будут вырезаны на этих линиях)источник
Perl,
877145 + 2 (-nl
флаг) = 47 байтС помощью:
Попробуйте это на Ideone.
источник
Perl 5 - 78 + 1 (флаг) + 2 (входные кавычки) = 81 байт
Можно запустить так:
источник
Рубин, 68 байт
Идея состоит в том, чтобы изменять строку
.......
каждый раз, когда мы находим букву, затем выводить и сбрасывать ее, но только когда мы находимся вне скобок.(
выключает вывод.)
и.
оба включают / оставляют вывод включенным, но последнее несущественно, так как оно никогда не будет найдено внутри скобки.Неуправляемый в тестовой программе
источник
Python 3, 94 байта
Анонимная функция
источник
Haskell , 101 байт
Попробуйте онлайн! Использование:
p "AB.(CA)D"
. Возвращает список строк.Объяснение:
Функция
p
повторяется по строке. Если он находит открывающую скобку,'('
то(x,_:t)<-span(')'<)r
разделяет оставшуюся строкуr
на строкиx
до появления закрывающей скобки')'
иt
после нее. В противном случае текущий символx
превращается в строку[x]
. В обоих случаях функция?
вызывается с текущей строкой примечаний и оставшейся строкой.?
отображает функцию#
на строку"ABCDEFG"
, где#
заменяет все символы, которых нет в текущей строке заметок, на'.'
. Результирующая строка музыкальной шкатулки добавляется к рекурсивному вызовуp
в списке отдыхаr
.источник
Сетчатка 0.8.2 , 52 байта
Попробуйте онлайн! Принимает ввод в нижнем регистре. Объяснение:
Разделите музыку на аккорды или ноты и начните формировать вывод, добавив список эквивалентов ноты.
Для каждой ноты в каждом аккорде измените вывод на
O
и удалите ноту из аккорда.Удалите всю постороннюю музыку и измените все несопоставленные заметки на пустые.
источник
PHP, 93 байта
Запустите как трубу с
-nR
или попробуйте онлайн .сломать
источник