Невізуалізація коду Парсонса


22

Вступ

Код Парсонса - це просто простий спосіб описати коливання звуку в музичному творі, будь то нота вище чи нижче, ніж попередня.

Навіть якщо ви хочете запам'ятати мелодії, ви все ще можете пригадати, якщо нота піднімається вгору чи вниз, таким чином код Парсонса може допомогти вам визначити музику за допомогою пошукової системи.


Опис

Кожна варіація представлена ​​одним символом, який є одним із наступних:

  • Rякщо примітка така ж, як і попередня (означає " R epeat" )
  • Uякщо примітка вище попередньої (означає " U p" )
  • Dякщо нота нижча за попередню (означає " власне D " )

Початкова примітка записується як *.


Приклад

Ось приклад коду Парсонса (початок "Оди радістю" ):

*RUURDDDDRUURDR

Ви можете насправді візуалізувати його так:

      *-*                    
     /   \                   
    *     *                  
   /       \                 
*-*         *         *-*    
             \       /   \   
              *     *     *-*
               \   /         
                *-*          

Ми будемо називати цей контур відтепер.

Правила оформлення таких countours розглядаються самостійно пояснено з допомогою наведеного вище прикладу.



Виклик

Тепер настає справжній виклик.

Напишіть програму, яка, задаючи контур як вхід, виводить відповідний код Парсонса.

Вас не просять намалювати контур, а насправді навпаки.
Від контуру знайдіть оригінальний код Парсонса.


Правила

  • Діють звичайні правила кодового гольфу
  • Виграє найкоротша програма в кількості байтів
  • Вхід є контурним, а вихід повинен бути дійсним кодом Парсонса
  • Деталі про додатковий пробіл для введення не мають значення. Робіть все, що найкраще підходить для вас
  • Вам заборонено вводити жорсткий код, так чи інакше, частини виводу та / або програми, використовуючи додатковий пробіл через попереднє правило

Примітки



Отже, треба починати з того, *що нічого не робить?
nicael

Що ви маєте на увазі? коли введення просто *? Ні. Мабуть, він має надрукувати *. Я додам цей кутовий корпус.
Гельге фон Кох

1
@nicael Так, це потрібно починати з *. Завжди.
Гельге фон Кох

Відповіді:


4

Pyth - 28 25 27 25 байт

2 бади збережено завдяки @Jakube.

s+\*@L"RDU"-VFtBxR\*%2C.z

Спробуйте його онлайн тут .


1
Це не працює *як вхід. Вихід є, *0поки він повинен бути справедливим *. З'явився злий дикий кінцевий нуль.
Гельге фон Кох

@HelgevonKoch виправлено
Мальтісен

@Jakube дякую!
Мальтісен

Ви обмінялися Uі Dдо речі. Інакше молодець.
Гельге фон Кох

@HelgevonKoch oops
Maltysen

24

CJam, 21 байт

qN/:.e>(o2%:i"DRXU"f=

Складіть рядки ( :), векторизуючи ( .) символьну максимальну операцію e>. Оскільки у кожному стовпці є лише один символ, який не є пробілом, це буде результатом, оскільки простір має менший код ASCII, ніж усі друковані символи, що не є пробілами.

Зніміть зміну та надрукуйте першу зірочку (o, а потім перетасуйте всі інші ( 2%) знаки, що залишилися, з UDRвикористанням модульної індексації.

Старе рішення (29 байт)

'*qN/z2%'*f#0+2ew);::-"RDU"f=

qN/отримує рядки введення. zтранспонує цю матрицю символів. 2%скидає кожен непарний ряд. '*f#знаходить індекс зірочки в кожному рядку. 0+2ew);отримує всі послідовні пари індексів. ::-обчислює їх відмінності, і "RDU"f=відображає їх на листи ( з допомогою модульної індексації: 0 → R, 2 → U, -2 ≡ 1 → D). Ведучий '*претендує на зірочку.

EDIT : Я змінився, 2ewщоб 0+2ew);працювати навколо CJam, не обробляючи ew(послідовні фрагменти) у списках, які занадто короткі. Це змушує код працювати для вхідного рядка *.

Спробуйте тут або подивіться це в дії:

              

7
Це справді дивовижно дивитися.
Jeel Shah

2
Я згоден! +1 для коду, бажаю, щоб я міг +10 для GIF.
ETHproductions

До речі, мені подобається смайлик за кодом 17:-p
ETHproductions

1
Я згоден, це дивовижно дивитись. Він не працює з *вхідним сигналом. RuntimeExceptionНатомість я отримую приємне .
Гельге фон Кох

Фу, я вважаю, що помилка CJam: [X]2ewповинна повернутися, []а не помилятися. Я додам рішення.
Лін

4

Python 3, 129 108 98 86 байт

Напевно, існує кілька способів пограти в цей гольф, але мені більше подобається, що я все це звів до однієї лінії.

Редагувати: зараз використовується''.translate()

Редагувати: Дякую wnnmaw .

Редагувати: я змінив формат введення на масив рядків замість рядка, розділеного новим рядком, щоб зберегти байти. Також в останньому редагуванні я змішав UіR , тому я це виправив.

lambda a:'*'+"".join(('UR'[j<'/']+'D')[j>'/']for l in zip(*a)for j in l if j in'-/\\')

Вхід повинен бути масивом рядків. У наведеному вище прикладі це виглядає приблизно так:

["      *-*                    ","     /   \                   ","    *     *                  ","   /       \                 ","*-*         *         *-*    ","             \       /   \   ","              *     *     *-*","               \   /         ","                *-*          "]

Безголівки:

def f(a):
    s = ''
    for c in zip(*a):           # transpose
        for d in c:             # for each letter in column c
            if e in "-/\\":     # if that letter is either -,/,\
                if e < '/':     # if < '/' (same as if == '-')
                    s += "R"
                elif e > '/':   # if > '/' (same as if == '\')
                    s += "D"
                else:           # if == '/'
                    s += "U"
        return "*" + s          # in the code we ''.join() it all together
                                # in this ungolfing, we add to an empty string

Я не хочу робити нову відповідь, тому що я багато позичив у вас, але lambda s:'*'+"".join((('D','R')[j=='-'],'U')[j=='/']for l in zip(*s.split('\n'))for j in l if j in'\\/-')годинник у 105 байт. Основна відмінність полягає в використанні кортежу умовно, а не перекладати
wnnmaw

Дякую @wnnmaw! Я думаю, що можу ще більше пограти в гольф!
Шерлок9

Хороший гольф на умовному фронті, це супер розумно!
wnnmaw

Ах хитає. Дякую за пораду @wnnmaw
Sherlock9

3

Рубі, 87 байт

Потрібні пробіли у вході, щоб усі рядки були однакової довжини.

$><<?*+$<.readlines.map(&:chars).transpose.join.gsub(/./,{?-=>:R,?/=>:U,?\\=>:D}).strip

4
Безумовно, це шкідливий код, оскільки він містить >:D.
Олексій А.

3

Japt, 38 байт 40 41 45 46 48

Збережено 2 байти завдяки @ETHproductions

'*+U·y £Yu ?"RUD"g1+(XrS c -47 g):P} q

Якби була команда обрізки, це було б лише 38 байт; -; додасть пояснення, коли я закінчу гольф. The:P не програма, яка намагається бути смішною, це насправді програма, яка ігнорує символів, які не важливі.

Спробуйте в Інтернеті


Коли я побачив, що існує виклик, що практично вимагає переміщення масиву, і що Доу відповів на це, я зрозумів, що це повинен бути Japt.
ETHproductions

До речі, я додаю функцію обрізки на xта переміщую та обертаю функції на yта z(розділяйте на нові рядки, використовуйте функцію масиву, приєднуйтесь до нових рядків)
ETHproductions

Ви можете зберегти два байти таким чином:Yu ?"RUD"g1+(XrS c -47 g):P
ETHproductions

@ETHproductions спасибі, до менш ніж 40 байт!
Пуховик

3

Haskell, 89 байт

import Data.List
m '/'="U"
m '-'="R"
m '\\'="D"
m _=""
('*':).(>>=(>>=m)).transpose.lines

Приклад використання:

*Main> ('*':).(>>=(>>=m)).transpose.lines $ "      *-*                    \n     /   \\                   \n    *     *                  \n   /       \\                 \n*-*         *         *-*    \n             \\       /   \\   \n              *     *     *-*\n               \\   /         \n                *-*          "
"*RUURDDDDRUURDR"

*Main> ('*':).(>>=(>>=m)).transpose.lines $ "*"
"*"

Перемістіть введення та замініть символи // -/ \однорядними рядками "U"/ "R"/ "D". Усі інші символи замінюються порожніми рядками "", які згодом зникають, об'єднуючи все. Нарешті, додайте зірочку *.


2

Математика, 103 байти

"*"<>(Differences@Position[Thread@Characters@StringSplit[#,"
"],"*"][[;;,2]]/.{-2->"U",0->"R",2->"D"})&

Коротко кажучи, враховуючи, що це складне завдання обробки.


2

JavaScript (ES6) 90

Анонімна функція. Він сканує вхідний рядок char за допомогою char, враховуючи позицію в поточному рядку. Роблячи це, він будує вихідний масив subsituting U D Rдля / \ -в потрібному місці

c=>[...c].map(c=>c>'*'?t[i++]=c>'/'?'D':c<'/'?'R':'U':c<' '?i=0:++i,t=['*'],i=0)&&t.join``

2

Матлаб, 62 байти

r=@(s)[85-(s<14)*3-(s>59)*17,''];@(p)r(sum(p(:,2:2:end)-32))

Для цього потрібно ввести прямокутний (однакова кількість символів у кожному рядку). Напр

    ['      *-*                    ';    '     /   \                   ';    '    *     *                  ';    '   /       \                 ';    '*-*         *         *-*    ';    '             \       /   \   ';    '              *     *     *-*';    '               \   /         ';    '                *-*          '];

Пояснення

sum(p(:,2:2:end)-32)        % exctract every second column, substract 32 (spaces->zeros) 
                            % and sum column wise (results in a vector of 3 different values)
[85-(s<14)*3-(s>59)*17,'']  % map each of the values to the corresponding value of the letter and convert back to characters
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.