Введение
Код Парсонса - это просто простой способ описать изменения высоты звука в музыкальном произведении, независимо от того, выше или ниже нота по сравнению с предыдущей.
Даже если вы не любите запоминать мелодии, вы все равно можете вспомнить, идет ли нота вверх или вниз, поэтому код Парсонса может помочь вам идентифицировать музыку с помощью поисковой системы.
Описание
Каждый вариант представлен одним символом, который является одним из следующих:
R
если примечание то же , чем предыдущий (означает « R EPEAT» )U
если нота выше, чем предыдущая (означает « U p» )D
если нота ниже, чем предыдущая (означает « D own» )
Начальная нота написана как *
.
пример
Вот пример кода Парсонса (начало «Ода радости» ):
*RUURDDDDRUURDR
Вы можете фактически визуализировать это, как это:
*-*
/ \
* *
/ \
*-* * *-*
\ / \
* * *-*
\ /
*-*
Теперь мы будем называть это контуром .
Правила рисования таких графов считаются самоочевидными в приведенном выше примере.
Вызов
Теперь наступает настоящий вызов.
Напишите программу, которая, учитывая входной контур, выводит соответствующий ему код Парсонса.
Вас не просят нарисовать контур, а наоборот.
Из контура найдите оригинальный код Парсонса.
правила
- Применяются обычные правила для игры в гольф
- Победит самая короткая программа по количеству байтов
- Вход является контуром, а выход должен быть действительным кодом Парсонса.
- Подробности о лишних пробелах для ввода не имеют значения, делайте все, что лучше для вас
- Вы не можете жестко, так или иначе, жестко кодировать части вывода и / или программу, используя дополнительные пробелы из-за предыдущего правила
Заметки
- Это может быть полезно для тестирования
- Соответствующий код Парсонс для
*
IS*
- Пустая строка не является допустимым контуром
- Код Парсонса всегда начинается с
*
*
что ничего не делает?*
? Нет. Это должно напечатать,*
я полагаю. Я добавлю этот угловой случай.*
. Всегда.Ответы:
Pyth -
28252725 байт2 байта спасены благодаря @Jakube.
Попробуйте это онлайн здесь .
источник
*
как вход. Вывод*0
пока что должен быть просто*
. Появился злой дикий конечный ноль.U
иD
, кстати. В остальном молодец.CJam, 21 байт
Сложите линии (
:
) путем векторизации ().
) максимально символьной операцииe>
. Поскольку в каждом столбце есть только один непробельный символ, он будет результатом, так как пробел имеет меньший код ASCII, чем все печатные непробельные символы.Снимите и напечатайте первую звездочку
(o
, затем сопоставьте все остальные (2%
) оставшиеся символы сUDR
использованием модульной индексации.Старое решение (29 байт)
qN/
получает входные строки.z
транспонирует эту матрицу символов.2%
падает каждый нечетный ряд.'*f#
находит индекс звездочки в каждой строке.0+2ew);
получает все последовательные пары индексов.::-
вычисляет их различия, и"RDU"f=
отображает их на письма ( с помощью модульной индексации:0 → R
,2 → U
,-2 ≡ 1 → D
). Ведущий'*
стоит перед звездочкой.EDIT : Я изменил
2ew
к0+2ew);
труду вокруг CJ не обрабатываетew
(последовательные фрагменты) в слишком короткие списки. Это заставляет код работать для входной строки*
.Попробуй здесь или посмотрите в действии:
источник
:-p
*
как вход, хотя. Я получаю хорошийRuntimeException
вместо этого.[X]2ew
должна возвращаться,[]
а не выдавать ошибку. Я добавлю обходной путь, хотя.Python 3,
1291089886 байтВероятно, есть несколько способов сыграть в гольф, но мне скорее нравится, что все сводится к одной линии.
Изменить: теперь с помощью
''.translate()
Редактировать: Большое спасибо wnnmaw .
Редактировать: я изменил формат ввода на массив строк вместо строки, разделенной новой строкой, чтобы сохранить байты. Кроме того, в последнем редактировании я перепутал
U
иR
, таким образом, я исправил это.Входные данные должны быть массивом строк. Для приведенного выше примера это выглядит примерно так:
Ungolfed:
источник
lambda s:'*'+"".join((('D','R')[j=='-'],'U')[j=='/']for l in zip(*s.split('\n'))for j in l if j in'\\/-')
получил 105 байтов. Основное отличие заключается в использовании условного кортежа вместо translateРубин, 87 байт
Требует в конце входных пробелов, чтобы все строки имели одинаковую длину.
источник
>:D
.Japt, 38 байт
40 41 45 46 48Сохранено 2 байта благодаря @ETHproductions
Если бы была команда обрезки, это было бы только 38 байтов; -; добавлю объяснение, когда я закончу играть в гольф. Это
:P
не программа, которая пытается быть забавной, это программа, которая игнорирует символы, которые не важны.Попробуйте онлайн
источник
x
а также транспонирую и вращаю функции вy
иz
(разделить на новые строки, использовать функцию массива, объединить сYu ?"RUD"g1+(XrS c -47 g):P
Haskell, 89 байт
Пример использования:
Перенесите ввод и замените символы
/
/-
/\
одиночными строками"U"
/"R"
/"D"
. Все другие символы заменяются пустыми строками""
, которые позже исчезают при объединении всего. Наконец, добавьте звездочку*
.источник
Mathematica, 103 байта
Короче говоря, учитывая, что это проблема обработки строк.
источник
JavaScript (ES6) 90
Анонимная функция. Сканирует входную строку char по char, учитывая положение в текущей строке. Делая это, он строит выходной массив subsituting
U D R
для/ \ -
в нужном местеисточник
Matlab, 62 байта
Это требует, чтобы ввод был прямоугольным (одинаковое количество символов в каждой строке). Например
объяснение
источник