음악 :이 화음의 이름은 무엇입니까?


9

이것은 음악 의 반대입니다 .이 화음에는 무엇이 있습니까? 주어진 화음에 음표를 인쇄하는 것입니다. 이번에는 입력이 코드의 음표 목록이며, 작업은 코드를 출력하는 것입니다.

귀하의 프로그램은 다음의 3 가지 코드를 지원해야합니다. 예는 근음 C로 제공됩니다. 다른 근음이있는 코드는 모든 음이 회전 된 동일한 코드이므로 C는 해당 근음이됩니다. 예를 들어 Dmaj는 D, F # 및 A로 구성됩니다.

        C C#D D#E F F#G G#A A#B
          Db  Eb    Gb  Ab  Bb
Cmaj    C       E     G
Cm      C     D#      G
Caug    C       E       G#
Cdim    C     D#    F#
Csus4   C         F   G
Csus2   C   D         G

Caug는 Eaug 및 G # aug와 동일하며 Csus4는 Fsus2와 동일합니다. 둘 중 하나를 출력 할 수 있지만 모두 출력하면 보너스가 있습니다.

보너스에 대한 일곱 번째 화음은 다음 표에 나열되어 있습니다.

        C C#D D#E F F#G G#A A#B
          Db  Eb    Gb  Ab  Bb
C7      C       E     G     A#
Cm7     C     D#      G     A#
Cmmaj7  C     D#      G       B
Cmaj7   C       E     G       B
Caug7   C       E       G#  A#
Cdim7   C     D#    F#    A

규칙

  • 완전한 프로그램이나 함수를 작성할 수 있습니다.
  • 입력은 공백 또는 다른 편리한 문자로 구분 된 메모 목록입니다. 또한 문자열 배열 (함수 인수에서 입력을받는 경우) 또는 해당 배열의 문자열 표현 일 수 있습니다.
  • 입력이 특정 순서 일 필요는 없습니다.
  • 입력에 메모가 중복되었을 수 있습니다. 그것들 중 하나만있는 것과 같은 방식으로 취급해야합니다.
  • 출력은 코드의 이름입니다. 여러 개의 이름을 출력 할 경우 동일한 입력 규칙이 적용됩니다.
  • 입력이 지원되는 코드가 아닌 경우에는 그대로 메모를 인쇄해야합니다. 귀하의 프로그램은 위의 표에없는 다른 코드도 지원할 수 있습니다 (유효하지만 보너스는 없습니다).
  • Wikipedia 기사에 나열된 다른 표기법을 사용할 수 있습니다 . 그러나 CC 메이저로 선택한 경우 , 어느 쪽이든 사람이 읽을 수있는 접두사를 추가하여 단일 음표로 코드를 구별해야합니다.
  • 이 작업에 내장 기능을 사용할 수 없습니다 (있는 경우).
  • 이것은 코드 골프입니다. 바이트 단위의 최단 코드가 이깁니다.

  • 입력 : C D# G출력 : Cm.
  • 입력 : C Eb G출력 : Cm.
  • 입력 : C Eb F#출력 : Cdim.
  • 입력 : F A C#출력 : Faug, Aaug, C#aug, Dbaug또는 Faug Aaug C#aug, Faug Aaug Dbaug임의의 순서로한다.
  • 입력 : F D F F F F A A F출력 : Dm.
  • 입력 : C D출력 : C D.

보너스

  • 해석이 둘 이상인 경우 모두 인쇄하면 -30 (aug, sus4 / sus2 및 dim7).
  • 일곱 번째 화음도 지원하는 경우 -70입니다.
  • MIDI 입력을 받아들이고 수신 한 각 코드를 인쇄하면 -200입니다. 노트를 동시에 시작하거나 종료 할 필요는 없습니다. 충돌하거나 작동을 멈추지 않는 한 중간 상태에서 발생하는 일을 결정합니다. 퍼커션 채널에 음표가 없다고 가정 할 수 있습니다 (또는 편리한 경우 하나의 채널 만 있음). 특히 플랫폼에 따라 다를 경우 테스트를 위해 텍스트 (또는 배열) 버전을 제공하는 것이 좋습니다.

입력이 평평하거나 날카로운 것만 사용할 수 있습니까? B #와 같은 메모를 처리해야합니까?
feersum

@feersum 아파트를 가질 수 있습니다 (-200 보너스를 청구하지 않는 한). 몇 가지 예를 추가했습니다. 당신은 핸들이 필요하지 않습니다 B#, Cb
jimmy23013

당신은 말합니다 Csus4 is the same as Gsus2. 당신은 Csus2 is the same as Gsus4그렇지 않나요?
Gareth

@Gareth ... 예. 결정된.
jimmy23013

답변:


2

Pyth 190 문자-30-70 = 90

=Q{cQdL+x"C D EF G A B"hb&tlbt%hx" #b"eb3FZQJx[188 212 199 213 200 224 2555 2411 2412 2556 2567 2398)u+*G12hHSm%-dyZ12mykQ0IhJ+Z@c"sus2 maj dim aug m sus4 7 m7 mmaj7 maj7 aug7 dim7"dJ=T0;ITQ

정말 행복하지 않습니다. 하드 코드 화음 사용.

용법:

Pyth Compiler / Executor 에서 사용해보십시오 . 디버그 모드를 비활성화 "C D# G"하고 입력으로 사용하십시오 .

설명:

먼저 몇 가지 준비 :

=Q{cQd
   cQd  split chord into notes "C D# G" -> ["C", "D#", "G"]
  {     set (eliminate duplicates)
=Q      Q = ...

그런 다음 노트를 정수로 변환하는 함수

L+x"C D EF G A B"hb&tlbt%hx" #b"eb3
defines a function g(b),
  returns the sum of 
     index of "D" in "C D EF G A B"
     and the index of "#" in " #b" 
       (if b than use -1 instead of 2)

그런 다음 각 음표에 대해 좌표를 이동하고 표에서 찾아보십시오.

FZQJx[188 ...)u+*G12hHSm%-dyZ12mykQ0IhJ+Z@c"sus2 ..."dJ=T0;ITQ
               implicit T=10
FZQ            for note Z in chord Q:
   mykQ         map each note of Q to it's integer value
   m%-dyZ12     shift it by the integer value of Z modulo 12 
   S            sort it
   u+*G12hH 0   convert it to an integer in base 12
   x[188 ...)   look it up in the list (-1 if not in list)
   J            and store the value in J

   IhJ               if J>=0:
   +Z@c"sus2 ..."dJ   print the note Z and the chord in the list
=T0                   and set T=0
;            end loop
ITQ          if T:print chord (chord not in list)

2

펄 5 : 183-100 = 83

편집 : 추가 문자를 잘라내어 파이썬 솔루션과 같은 화음 이름을 변경 했으므로 내가 이끌어 가고있는 순간을 가장 할 수 있습니다.

#!perl -pa
for$z(0..11){$x=0;$x|=1<<((/#/-/b/+$z+1.61*ord)%12or$o=$_)for@F;$x-/\d+_?/-$_*4||push@r,$o.$'
for qw(36M 34- 68+ 18o 40sus2 33sus4 292_7 290-7 546-M7 548M7 324+7 146o7)}$_="@r
"if@r

예:

$ perl chord.pl <<<"C D# G"
C-

0

파이썬 2, 335 바이트-30-70 = 235

약간 더 긴 골프를 먼저 시도하기 때문에 몇 가지 명백한 트릭이 누락 될 수 있습니다.

def f(s,N="C D EF G A B",r=range,u=1):
 for i in r(12):
  for t in r(12):
   if(set((N.find(n[0])+" #".find(n[1:]))%12for n in s.split())==set(map(lambda n:(int(n,16)+i)%12,"0"+"47037048036057027047A37A37B47B48A369"[3*t:3*t+3]))):print(N[i],N[i+1]+"b")[N[i]==" "]+"M - + o sus4 sus2 7 -7 -M7 M7 +7 o7".split()[t];u=0
 if(u):print s

코멘트:

  • 공간을 절약하기 위해 Wiki 페이지 (긴 줄의 끝 참조)에서 대체 코드 이름을 사용했습니다.
  • 코드는 각각 3 개의 16 진수 오프셋으로 표시됩니다 (0은 필요하지 않지만 트라이어드가 정렬되도록 포함).
  • "#". find (n [1 :])는 "#". find ( "b")가 -1이고 "#". find ( "")가 0이므로 작동합니다.

샘플 출력

>>> f("C D# G")
C-
>>> f("C Eb G")
C-
>>> f("C Eb F#")
Co
>>> f("F A C#")
Db+
F+
A+
>>> f("F D F F F F A A F")
D-
>>> f("C D")
C D
>>> f("C Eb Gb A")
Co7
Ebo7
Gbo7
Ao7
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.