Консонанс чи дисонанс?


36

З огляду на два назви нот, ви повинні написати програму, яка визначає, чи інтервал, утворений цими двома нотами, є співзвучним чи дисонансним.

Вступ

У західній музиці є лише 12 "різних" тонів. Їх імена, відсортовані від нижчого до вищого, є наступні: C, C#, D, D#, E, F, F#, G, G#, A, A#, B. Послідовність є циклічною, тобто вона продовжується іншою Cпісля B, нескінченно.

Відстань між двома тонами називається інтервалом . Інтервал між будь-якими двома нотами, які суміжні у ряді вище (наприклад, C — C#або E — F), називається півтоном . Інтервал між більш віддаленими нотами визначається як кількість півтонових кроків, необхідних для проходження від першого до другого (при цьому, можливо, обертання навколо послідовності). Деякі приклади: D to E= 2 семітона, C to G= 7 семітонів, B to D#= 4 семітона (це обертається навколо послідовності). 1

Тепер ці інтервали поділяються на дві категорії: приголосні (приємно звучать, якщо відтворити дві ноти одразу) та дисонансні (не так багато).

Давайте визначимо приголосні інтервали, які мають бути: 0, 3, 4, 5, 7, 8 і 9 півтонів.

Решта з них є дисонансними, а саме: 1, 2, 6, 10 та 11 півтонів.

Змагання

Напишіть "програму" (у звичайному широкому сенсі цього слова: функція цілком нормальна), щоб зробити наступне:

  • Візьміть два імена примітки (рядки з послідовності, наведеної вище) як вхід. Ви можете приймати їх як завгодно (від stdin, як аргументи, розділені на все, що завгодно, навіть сміливо приймати їх як список символів (наприклад ["C","#"]). Однак ви не можете призначати нотатки будь-які інші імена (особливо ви не може нумерувати їх від 0 до 11 і використовувати числа).

  • Для вас музичні вигуки там, ноти будуть вказані без октави. У цьому випадку також не має значення, в якому порядку надходять ноти, а який нижчий і який вище. Нарешті, вам не потрібно обробляти будь-які імена, які не вказані у списку вище. Ніяких інших енхармоній, як E#, ні квартир, подвійних переробок тощо.

  • Виберіть будь-які два різних значення. Ваша програма повинна виводити одну з них, коли інтервал, утворений двома нотами на вході, є співзвучним, а інший, якщо вони відсутні. (Може бути Trueі False, але навіть π і e, якщо ви хочете :))

  • Це код-гольф. Виграє найкоротша програма в байтах на кожній мові. Веселіться!

Приклади та тестові випадки

Note 1    Note 2    Output    Interval [semitones]
  C          D     Dissonant   2
  A#         A#    Consonant   0
  G          D     Consonant   7 (wraparound)
  D#         A     Dissonant   6
  F          E     Dissonant   11
  A          C     Consonant   3

Я більше не додаю їх, оскільки в цьому немає жодних особливо підступних випадків.

Це мій перший виклик, тому будь-яка конструктивна критика щиро вітається :—). Якщо ви вважаєте, що пояснення теорії неохайне, не соромтеся задавати питання. Нарешті, будь ласка , не кажіть мені , що це боян з цього або цього . Я переконався, що це не так. (Останній досить схожий, але складніший. Я думав, що поставити трохи простіший виклик полегшить людям приєднання.)


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

Відповіді:


12

Желе , 21 байт

Вводиться як список двох рядків. Повертається 0за дисонансним або 1приголосним.

OḢ6×%21_Lµ€IA“¬ɠṘ’æ»Ḃ

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

OḢ6×%21_Lµ€IA“¬ɠṘ’æ»Ḃ   - main link
         µ€             - for each note             e.g. ["A#", "C"]
O                       -   convert to ASCII codes  -->  [[65, 35], 67]
 Ḣ                      -   keep the first element  -->  [65, 67]
  6×                    -   multiply by 6           -->  [390, 402]
    %21                 -   modulo 21               -->  [12, 3]
       _L               -   subtract the length     -->  [12, 3] - [2, 1] = [10, 2]
           IA           - absolute difference       -->  8
             “¬ɠṘ’      - the integer 540205
                  æ»    - right-shift               -->  540205 >> 8 = 2110
                    Ḃ   - isolate the LSB           -->  2110 & 1 = 0

Виготовлення

Спершу слід зазначити, що функція F, яку ми шукаємо, є комутативною: для будь-якої пари приміток (A, B) ми маємо F (A, B) = F (B, A) .

Оскільки існує не надто багато можливих входів і лише 2 можливі виходи для вирішення, необхідно мати можливість знайти досить просту хеш-функцію H , таку, що | H (A) - H (B) | створює обмежений діапазон значень і не є зіткненням для всіх можливих пар нот (A, B) щодо очікуваного виходу.

Ми перевіримо набір функцій H (mul, mod) , які визначаються як:

H(mul, mod)(s) = ((ORD(s[0]) * mul) MOD mod) - LEN(s)

Де ORD(s[0])це ASCII код першого символу ноти і LEN(s)довжина записки ( 2 , якщо є '#'і 1 , якщо ні).

Нижче наведена коментована версія коду JS, який використовувався для пошуку пари дійсних пар (mul, mod) та отриманих бітових масок. Є багато можливих рішень, але * 6 % 21найкоротший з цим методом.


3
Як ви навіть придумуєте ці речі? .. Ви отримуєте такі «алгоритми» вручну чи грубою силою? І незалежно від відповіді на друге питання: як?! ..: S " буквальне ціле число 540205; праворуч зміщено на (код ASCII; помножити на 6; модуль 21; зберегти перше; відняти довжину ...); порозрядно-І 1 ". Ваші відповіді мене щоразу вражають ...
Кевін Круїйсен

@KevinCruijssen Я додав оригінальний код JS, який використовувався для пошуку цих значень.
Арнольд

Дякую за додане пояснення. Я досі такий же вражений, як і перший, але ви дали чітке пояснення, як ви це придумали. Шкода, що я можу підняти лише один раз.
Kevin Cruijssen

9

APL (Діалог) , 62 39 байт

Використання ⎕IO←0; 0 приголосний, 1 - дисонансний. Список ліній базових нотаток вважається лівим аргументом, а список різкостей - правильним аргументом.

{⎕A[|-/('C D EF G A '⍳⍺)+⍵=⍕#]∊'BCGKL'}

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

{} Анонімна функція, де є лівий аргумент і правий аргумент

⎕A[… Чи ]∊'BCGKL' є A lphabet, індексований наступним, членом рядка?

  ⍕# відформатувати кореневу область імен (дає різкий символ)

  ⍵= чи рівні правильні символи аргументів (гострі)?

  ()+ Додати наступне:

   'C D EF G A '⍳⍺ індекси лівих аргументів у рядку

  -/ різниця між тими

  | абсолютне значення


Ви не проти додати пояснення тим, хто нам незнайомий з APL?
Драконіс

@Draconis Пояснення додано.
Адам

9

MATL , 30 27 26 байт

,j'DJEFPGIALBC'&mQs]ZP7Mdm

Вводить дві примітки в різні рядки. Виходи 0для приголосних, 1для дисонансних.

Спробуйте в Інтернеті! Або перевірити всі тестові випадки .

Пояснення

11-символьний рядок

DJEFPGIALBC

кодує як ноти, так і дисонансні інтервали, наступним чином.

Програма спочатку знаходить на основі 1 індекси вхідних символів у наведеному вище рядку. Негострий вклад на зразок Dдасть 1, Eдасть 3, ..., Cдасть 11. Ці числа також можна вважати числовими масивами 1 × 1. Різке введення подібне C#дасть масив 1 × 2 [11 0], що означає, що він Cбув знайдений у положенні 11та #не знайдений.

Зауважте, що літери JPILніколи не будуть присутні у введенні. Наразі вони використовуються лише як заповнювачі, так що, наприклад, примітка Eє на два півтони нагорі D. Але вони також будуть корисні для визначення дисонансних інтервалів.

Числа в першому введенні масиву 1 × 1 або 1 × 2 відповідають тону відмітки у півтонах, не рахуючи різких символів (поки що). Зауважте, що масштаб, визначений цими числами, не починається з C; але це не має значення, тому що ми хочемо лише інтервалів, тобто відмінності між нотами. Віднімання отриманих чисел дасть або інтервал, або 12 мінус інтервал. Але спочатку нам потрібно розглянути гострий символ.

Для розгляду гострих нотаток, гофрованим способом (в MATL) є додавання 1до кожного запису масиву 1 × 1 або 1 × 2, отриманого раніше, а потім підсумовування масиву (2 байти). Таким чином, різкі ноти збільшуються на, 1а різкі - на 2. Це робить гострі ноти на 1 півтону вищими за неточні, якщо потрібно. Ми також додаємо додатковий півтон до всіх нотаток, але це не змінює інтервали між ними. Тож тепер примітка Dдасть номер тону 2, D#дасть 3, ..., Cдасть 12, C#дасть 13.

Дисонуючі інтервали 1, 2, 6, 10, або 11. Вони мають модульову симетрію 12 : інтервал між двома нотами є дисонансним лише тоді, коли інтервал із нотами у зворотному порядку, модуль 12, є дисонансним.

Якщо обчислити послідовні відмінності рядка, 'DJEFPGIALBC'отримаємо числовий вектор

6 -5 1 10 -9 2 -8 11 -10 1

який містить точно дисонансні інтервали, крім деяких негативних значень, які не будуть ні корисними, ні шкідливими. Зауважте, що вибір додаткових літер JPILу рядку 'DJEFPGIALBC'визначає (через послідовні відмінності) дисонансні інтервали.

Щоб побачити, чи є дві вхідні ноти дисонансними, ми візьмемо абсолютну різницю числа їх тону. Наприклад, Cі D#дасть числа 12і 3відповідно, і абсолютна різниця є 9. Фактична різниця була б -9і фактичний інтервал був би 3(отриманий як -9модуль 12). Але завдяки згаданій симетрії ми можемо розглядати 9замість цього 3. Оскільки 9немає у векторі послідовних відмінностей, ноти є співзвучними.


2
Мені подобається, як ви кодували і нотатки, і дисонансні інтервали в одному рядку.
celtschk

8

JavaScript (ES6), 68 64 байт

Приймає нотатки як два рядки в синтаксисі currying (a)(b). Повертається 0за дисонансним або 1приголосним.

a=>b=>488055>>(g=s=>'C D EF G A'.search(s[0])-!s[1])(a)-g(b)+9&1

Тестові справи

Відформатовано та прокоментовано

a => b =>                       // given the two notes 'a' and 'b'
  488055 >>                     // 19-bit lookup bitmask: 1110111001001110111
    (g = s =>                   // we use g() to convert a note 's' into a semitone index
      'C D EF G A'.search(s[0]) // position of the note: -1 for 'B' (not found) to 9 for 'A'
      - !s[1]                   // subtract 1 semitone if the '#' is not there
    )(a)                        // compute the result for 'a'  --> [ -2 ...  9]
    - g(b)                      // subtract the result for 'b' --> [-11 ... 11]
    + 9                         // add 9                       --> [ -2 ... 20]
  & 1                           // test the bitmask at this position (0 if negative or > 18)

7

Желе , 26 байт

i@€ØAo.SḤ’d5ḅ4µ€ạ/“¢£©½¿‘ċ

Монадійне посилання, що містить список двох нот (як списки символів) і повертається як 0для приголосного, так і 1для дисонансного.

Спробуйте в Інтернеті! або переглянути всі входи в наборі тестів .

Як?

i@€ØAo.SḤ’d5ḅ4µ€ạ/“¢£©½¿‘ċ - Link: list of lists of characters, notes
              µ€           - for €ach note in notes: (call the resulting list x)
   ØA                      -   yield the uppercase alphabet
i@€                        -   first index of c in ^ for €ach character, c
                           -     ...note '#' is not there so yields 0 (A->1, B->2,...)
      .                    -   literal one half
     o                     -   or (vectorised)  - e.g. "C#" -> [3, 0] -> [3, 0.5]
       S                   -   sum
        Ḥ                  -   double - that is ...  C C#  D D#  E  F F#  G G#  A A#  B
                                                 ->  6  7  8  9 10 12 13 14 15  2  3  4
         ’                 -   decrement         ->  5  6  7  8  9 11 12 13 14  1  2  3
           5               -   literal five
          d                -   divmod                (e.g. 9 -> [1,4] or 11 -> [2,1])
             4             -   literal four
            ḅ              -   convert from base     (e.g. [1,4] -> 8 or [2,1] -> 9)
                                                 ->  4  5  6  7  8  9 10 11 12  1  2  3
                 /         - reduce x with:
                ạ          -   absolute difference   (e.g. ["G#", "A"] -> [12, 1] -> 11)
                  “¢£©½¿‘  - code-page indices = [1, 2, 6, 10, 11]
                         ċ - count occurrences (1 if in the list, 0 if not)

5

Желе , 31 байт

O_65ị“¢[ḋṃ’b⁴¤+L$€Ḣ€ạ/e“cṾ’b12¤

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

wheeeeee 32 байти занадто довго

Пояснення

O_65ị“¢[ḋṃ’b⁴¤+L$€Ḣ€ạ/e“cṾ’b12¤  Main link
O                                Cast each character to an int using Python `ord`
 _65                             Subtract 65 (A is 0, G is 7)
     “¢[ḋṃ’b⁴¤                   [2, 3, 5, 7, 9, 10, 0]
     “¢[ḋṃ’                      37058720
           b                     Digits in base
            ⁴                    16
    ị                            Index into this list; this creates the gaps for sharps
                 €               For each sublist
              +L$                Add the length to each element (Sharpens sharp notes)
              +                  Add
               L                 Length
                   €             For each sublist
                  Ḣ              Take the first element
                    ạ/           Absolute difference between the two (unoctaved) pitches # It's convenient that every interval's inverse (?) has the same consonance/dissonance
                      e          Is the semitone difference in
                       “cṾ’b12¤  [1, 2, 6, 10, 11]?
                       “cṾ’      25178
                           b     base
                            12   12

Гей, це чудова відповідь! Мені було цікаво, чи хтось використовує симетрію, і ви. І мені подобається ваш метод зіставлення імен нот і цифр! +1.
Раміллі

Різниця напівтону може бути симетричною, але ви все одно отримуєте сумнівні результати - наприклад "G#", "A"(дисонансний) дає різницю, в 11якій немає[1,2,6] .
Джонатан Аллан

@JonathanAllan о, ну, це бентежно; Я думав, що абсолютна різниця фіксувала це ... ._. виправимо lol
HyperNeutrino

1
@JonathanAllan зафіксував на пару зайвих байтів (3 IIRC)
HyperNeutrino

4

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

function                                                  arguments        bytes

FreeQ[1|2|6|10|11]@Abs[#-#2&@@Sound`PitchToNumber/@#]&    [{"C","F#"}]     55

Зобразіть внутрішній вбудований Sound`PitchToNumberна вході (список двох рядків), візьміть абсолютну різницю, а потім відповідність шаблону для дисонансних інтервальних чисел.


Просто для розваги (неконкуренто)

Ось декілька коротших функцій, які порушують обмеження "ви не можете присвоювати жодним іншим іменам нотатки". Рудиментарний Music`пакет має заздалегідь визначені константи примітки (наприклад A4 = 440.) та функцію HertzToCents(яку можна взяти в гольф). Замість рядків ми будемо використовувати константи примітки як аргументи, але подані в різному форматі для кожної функції.

FreeQ[1|2|6|10|11]@Abs@@Round[.01HertzToCents@#]&         [{C3,Fsharp3}]   50+9=59
FreeQ[1|2|6|10|11]@Abs@Round[17Log[#2/#]]&                [C3,Fsharp3]     43+9=52
FreeQ[1|2|6|10|11]@Abs@Round[17Log@#]&                    [C3/Fsharp3]     39+9=48

Імпорт пакета <<Music`;займає 9 байт.

Ця функція перетворює рядок (як "F#") у константу примітки (як Fsharp3):

Symbol[StringReplace[#,"#"->"sharp"]<>"3"]&                                44

Щоб прийняти інтервали, більші за октаву, замініть Abs[…]на Mod[…,12].


Чому деякі інтервали вважаються дисонансними? Інтервал - це відношення двох частот. Якщо співвідношення має "простий" чисельник і знаменник, воно, як правило, є більш приголосним. У 5-лімітній настройці співвідношення можна розподілити на цілі потужності лише простих чисел, менших або рівних 5. Жоден інтервал з рівним темпераментом, крім октави, не є справедливим інтервалом ; вони є просто близькими наближеннями, використовуючи сили 12-го кореня з 2.

Замість жорсткого кодування, які інтервальні числа є дисонансними, ми можемо знайти раціональне наближення інтервалу, а потім визначити, чи є його чисельник та знаменник «простими» (мається на увазі, що знаменник менше 5, а відношення не ділиться на 7).

У цій таблиці показано кожен із етапів цього процесу.

Table[
  Module[{compoundInterval,simpleInterval,rationalApprox,denomLeq5,div7,consonant},
    compoundInterval = Power[2, i/12];
    simpleInterval   = 2^Mod[Log2[compoundInterval], 1];
    rationalApprox   = Rationalize[N@simpleInterval, 1/17];
    denomLeq5        = Denominator[rationalApprox]<=5;
    div7             = Denominator[rationalApprox]>1 && rationalApprox\[Divides]7;
    consonant        = FreeQ[1|2|6|10|11][Mod[i,12]];

    InputForm/@{
      i, simpleInterval, rationalApprox, 
      denomLeq5, div7, denomLeq5 && !div7,
      consonant
    }
  ], {i, 0, 12}
]

i   sInterval  ratio   denomLeq5  div7       den&&!div  | consonant?

0   1          1       True       False      True       | True
1   2^(1/12)   17/16   False      False      False      | False
2   2^(1/6)    9/8     False      False      False      | False
3   2^(1/4)    6/5     True       False      True       | True
4   2^(1/3)    5/4     True       False      True       | True
5   2^(5/12)   4/3     True       False      True       | True
6   Sqrt[2]    7/5     True       True       False      | False
7   2^(7/12)   3/2     True       False      True       | True
8   2^(2/3)    8/5     True       False      True       | True
9   2^(3/4)    5/3     True       False      True       | True
10  2^(5/6)    7/4     True       True       False      | False
11  2^(11/12)  11/6    False      False      False      | False
12  1          1       True       False      True       | True

Раціональне наближення лежить в 1/17інтервалі, оскільки це найбільший поріг, який розрізняє всі 12 рівних загартованих інтервалів. Ми порівнюємо раціональні числа спочатку з малюнком Rational[a_,b_](або просто a_~_~b_), а потім зіставляємо лише цілі числа _.

Це завершується наступною досить короткою функцією, яка визначає, чи довільне співвідношення частот (більше 1) є приголосним або дисонансним.

Rationalize[#,1/17]/.{a_~_~b_:>b<=5&&!a∣7,_->True}&       [Fsharp3/C3]     51+9=60

1
Боже, не кажи мені, що Mathematica має вбудований навіть для цього ...: D
Ramillies

3

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

FreeQ[{1,2,6,10,11},Min@Mod[Differences[Min@Position["C|C#|D|D#|E|F|F#|G|G#|A|A#|B"~StringSplit~"|",#]&/@{#,#2}],12]]&


Форма введення

["A #", "D"]

Виходи

True->Consonant  
False->Dissonant   

дякую @JonathanFrech -16 байт


Просто зауваження: вам не потрібно виводити рядки Consonantта Dissonant. Ви можете вивести будь-які два значення замість них (0/1, ... що завгодно). Це може врятувати кілька байт.
Рамілья

1
Ви не можете опустити If[...,0,1]та визначити True->Consonant; False->Dissonant?
Джонатан Фрех

1
StringCases["CC#DD#EFF#GG#AA#B",_~~"#"...]- 42 байт
кельтщ

1
Також 2 байти можна зберегти, замінивши {1,2,6,10,11}на1|2|6|10|11
celtschk

1
@Skyler Дивіться відповідь нижче.
hftf

3

Вугілля деревне , 30 байт

≔B#A#G#FE#D#C槔o∧⌈ς”⁻⌕ζ⮌θ⌕ζ⮌η

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Виходи 1 для приголосних, 0 для дисонансних. Пояснення:

≔B#A#G#FE#D#Cζ                  Store reversed note names in z
                        θ       First input
                       ⮌        Reversed
                     ⌕ζ         Find index in z
                            η   Second input
                           ⮌    Reversed
                         ⌕ζ     Find index in z
                     ⁻          Subtract
               ”o∧⌈ς”           Compressed string 100111011100
              §                 Circularly index
                                Implicitly print

з цікавості, чи є мнемонічна причина, за якою гліф ⌕ζвикористовується для "пошуку індексу"?
Йона

@Jonah ζ- це змінна, призначена раніше.
Ніл

2

J, 68 байт

[:e.&1 2 6 10 11[:(12| -~/)(<;._1',C,C#,D,D#,E,F,F#,G,G#,A,A#,B')i.]

пояснення

Проста, не супер-гольф реалізація в J:

  • Введення подається у вигляді коробкових деталізованих приміток (виготовлених за допомогою вирізання) в порядку.

  • Знайдіть їх індекси в діапазоні приміток: (<;._1',C,C#,D,D#,E,F,F#,G,G#,A,A#,B')i.]

  • Відняти перше з другого: -~/

  • Залиште решту, поділившись на 12: 12|

  • Перевірте, чи це одна з дисонансних приміток: e.&1 2 6 10 11

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


2

/// , 90 88 байт

/^/"\///^\/\///C^D/##"E/DD"F/E#"G/FD"A/GD"B/AD"#,#/,"B#^B/#"A#/#"A^G#^G^F#/#"F^E^D#^D/#/

Спробуйте в Інтернеті!(всі тестові випадки одразу)

  • Введіть введення після коду.
  • Відокремте назви нот за допомогою ,B# у кожному тестовому випадку.
  • Вихід є , для приголосного, ,#для дисонансного.
  • Підтримка подвійних змін ( ##) або E#в деяких конкретних випадках. Інакше вихід є, для приголосного, #,для дисонансного (завдяки модулю 12 симетрії)
  • Може обробляти декілька тестових випадків одночасно (якщо вони розділені розумно)
  • Малі символи друкуються точно.

2

C (gcc) , 91 байт

g(char*s){return (s[1]&1|2**s&15)*4/5;}f(char*x,char*y){return (1952220<<g(x)>>g(y))&2048;}

дзвінок: f("A#", "D")

Повернене значення:

  • Приголосний: 2048 рік
  • Дисонанс: 0

Бонус: Функція нечутлива до регістру.

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


Чи немає двох зайвих пробілів в обох return (s?
Джонатан Фрех

Ви можете спробувати g(char*s){s=(s[1]&1|2**s&15)*4/5;}f(char*x,char*y){x=1952220<<g(x)>>g(y)&2048;}і приємне рішення!
Кейу Ган

1

Python 2, 125 117 83 78 77 байт

a,b=map("C C#D D#E F F#G G#A A#B".index,input())
print chr(abs(a-b))in""

Там, де ""в кінці насправді є символи"\x02\x04\x0c\x14\x16"

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

(+3 тому, що я забув 11 або 22 у списку для початку)

-8 байт Джонатана Фреха і перехід на Python 2 .

-34 байти з пропозиціями Джонатана Фреха та використанням strіндексу list' замість '.

-4 байти від вбудовування iта Нейла повернення рядкової пропозиції (лише -2 дійсно, як я забув() навколо генератора)

-5 байт від видалення iта зміни формату введення

-1 байт від Джонатана Фреха с map() та недрукованими версіями.

Вводиться в одному рядку stdin у форматі:

'C','C#'

True є дисонансним, False приголосним.

Старе пояснення:

i='C C#D D#E F F#G G#A A#B'.index
a,b=input()
print abs(i(a)-i(b))in[2,4,12,20]

Python str.indexповертає найнижчий (позитивний) стартовий індекс відповідного підрядка, так "ABACABA".index("A") == 0і "ABACABA".index("BA") == 1. Через це ми можемо помістити імена нот рівномірно розміщеними в рядку, і поки (наприклад) Aприходить раніше A#, спільне Aвикористання не буде проблемою.

i='C C#D D#E F F#G G#A A#B'.index

iтепер функція, яка повертає індекс у 'C C#D D#E F F#G G#A A#B'своєму аргументі (ім'я нотатки), який становить 2 * (кількість півтонів, з яких нота вища C)

a,b=input()

Python 2 input()(в основному) еквівалентний eval(input())в Python3, тому з коректним введенням формату 'C#','F'(наприклад), a='C#'іb='F'

print abs(i(a)-i(b))in[2,4,12,20]

Якщо відстань між першою нотою та другою нотою в рядку не дорівнює 2, 4, 12 або 20 (оскільки назви нот представлені двома символами), то інтервал є дисонансним, надрукуйте True, інакше це співзвучний, Друк помилковий.


Оскільки формат введення не є строгим, ви можете використовувати eval(input())(13 байт) замість input().split()(15 байт).
Джонатан Фрех




1
Ви можете використовувати символи Unicode ( ) замість рядка emtpy.
Джонатан Фрех

1

C (gcc) , 115117 120 байт

g(char*a){a=*a-65+!!a[1]*(7-*a/70-*a/67);}f(x,y)char*x,*y;{x="(pP$HL<lt<X"[g(x)]*32+"=ZukW-^h1F6"[g(x)]>>g(y)&1;}

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

Повернення 1/0 для приголосних і дисонатів. Завжди цікаво проводити маніпуляції з рядком з чистою С. Візьміть вклад якf("A#", "C")


0

PowerShell , 107 байт

param($a,$b)[math]::abs(($x=-split'C C# D D# E F F# G G# A A# B').indexof($b)-$x.indexof($a))-in1,2,6,10,11

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

Виходи Trueдля дисонансних та Falseприголосних.

Вводить $aі $bдві ноти як рядки. Виконує -splitоперацію в масштабі, який розбивається на пробіл, щоб створити масив приміток, що зберігає в $x. Знаходить .indexof $bв цьому масиві, віднімає індекс $a, а потім приймає його absзначення олюта. Перевіряє, чи є це число -inдисонансних діапазонів.



0

SQL, 582 байти

SQL Fiddle

У мене ще є трохи гольфу, щоб зробити на ньому, але я хотів, щоб це було тут, перш ніж я врешті-решт зламав його повністю.

Якщо введення є у форматі літер, то введення цих букв у таблицю зі значеннями нормально, правда?

CREATE TABLE N(N char(2),v int)
Insert Into N values('A',1),('A#',2),('B',3),('C',4),('C#',5),('D',6),('D#',7),('E',8),('F',9),('F#',10),('G',11),('G#',12);
CREATE TABLE D(D char(9),v int) 
Insert Into D values('C',0),('D',1),('D',2),('C',3),('C',4),('C',5),('D',6);
CREATE FUNCTION I(@A char(2),@B char(2))
RETURNS char(9) as
BEGIN
DECLARE @E int=(SELECT v from N where n=@A),@F int=(SELECT v from N where n=@B)
DECLARE @C char(9) = (SELECT case D when 'D' then 'Dissonant' when 'C' then 'Consonant' END from D where v in(abs(@e-@f),12-abs(@e-@f)))
RETURN isnull(@C,'NotANote')
END

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.