Âm nhạc: Tên của hợp âm này là gì?


9

Đây là mặt trái của Âm nhạc: những gì trong hợp âm này? , đó là in các nốt trong một hợp âm nhất định. Lần này, đầu vào là một danh sách các nốt trong hợp âm và nhiệm vụ của bạn là xuất ra hợp âm đó.

Chương trình của bạn nên hỗ trợ các hợp âm bộ ba sau đây. Các ví dụ được đưa ra với root C. Hợp âm với các gốc khác là các hợp âm giống nhau với tất cả các nốt được xoay để C sẽ trở thành nốt gốc đó, ví dụ Dmaj bao gồm D, F # và 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

Lưu ý rằng Caug giống với Eaug và G # aug và Csus4 giống với Fsus2. Bạn có thể xuất một trong hai nhưng có phần thưởng nếu bạn xuất tất cả.

Và hợp âm thứ bảy cho phần thưởng được liệt kê trong bảng sau:

        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

Quy tắc

  • Bạn có thể viết một chương trình hoàn chỉnh hoặc một chức năng.
  • Đầu vào là một danh sách các ghi chú, được phân tách bằng khoảng trắng hoặc ký tự thuận tiện khác. Nó cũng có thể là một chuỗi các chuỗi (nếu nó lấy đầu vào từ đối số hàm) hoặc biểu diễn chuỗi của mảng đó.
  • Đầu vào không phải theo thứ tự cụ thể.
  • Có thể có ghi chú trùng lặp trong đầu vào. Họ phải được đối xử theo cùng một cách vì chỉ có một trong số họ.
  • Đầu ra là tên của hợp âm. Trong trường hợp nó sẽ xuất nhiều tên, áp dụng quy tắc tương tự cho đầu vào.
  • Nếu đầu vào không phải là hợp âm được hỗ trợ, bạn nên in ghi chú nguyên trạng. Chương trình của bạn cũng có thể hỗ trợ các hợp âm khác không được liệt kê trong các bảng trên (hợp lệ nhưng không có tiền thưởng).
  • Bạn có thể sử dụng các ký hiệu khác được liệt kê trong bài viết Wikipedia . Nhưng nếu bạn chọn CC chính, bạn nên thêm tiền tố có thể đọc được trong cả hai trường hợp để phân biệt hợp âm với một nốt.
  • Bạn không thể sử dụng các hàm dựng sẵn cho tác vụ này (nếu có).
  • Đây là môn đánh gôn. Mã ngắn nhất trong byte thắng.

Ví dụ

  • Đầu vào: C D# GĐầu ra : Cm.
  • Đầu vào: C Eb GĐầu ra : Cm.
  • Đầu vào: C Eb F#Đầu ra : Cdim.
  • Input: F A C#Output: Faug, Aaug, C#aug, Dbaughay Faug Aaug C#aug, Faug Aaug Dbaugtrong bất kỳ thứ tự.
  • Đầu vào: F D F F F F A A FĐầu ra : Dm.
  • Đầu vào: C DĐầu ra : C D.

Tiền thưởng

  • -30 nếu nó in tất cả nếu có nhiều hơn một cách hiểu (đối với aug, sus4 / sus2 và dim7).
  • -70 nếu nó cũng hỗ trợ hợp âm thứ bảy.
  • -200 nếu nó chấp nhận đầu vào MIDI và in từng hợp âm mà nó đã nhận được. Lưu ý rằng các ghi chú không phải bắt đầu hoặc kết thúc cùng một lúc. Bạn quyết định những gì xảy ra ở các trạng thái trung gian (miễn là nó không bị sập hoặc ngừng hoạt động). Bạn có thể cho rằng không có ghi chú nào trong các kênh bộ gõ (hoặc chỉ có một kênh nếu thuận tiện). Bạn cũng nên cung cấp một phiên bản văn bản (hoặc mảng) để thử nghiệm, đặc biệt nếu nó phụ thuộc vào nền tảng.

Đầu vào có thể có căn hộ hoặc chỉ sử dụng sắc nét? Có nên xử lý các ghi chú như B # không?
frageum

@feersum Nó có thể có căn hộ (trừ khi bạn yêu cầu tiền thưởng -200). Đã thêm một số ví dụ. Bạn không cần phải xử lý B#, Cbvv
jimmy23013

Bạn nói Csus4 is the same as Gsus2. Tôi nghĩ bạn có nghĩa là Csus2 is the same as Gsus4bạn không?
Gareth

@Gareth ... Vâng. Đã sửa.
jimmy23013

Câu trả lời:


2

Ký tự 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

Không thực sự hài lòng với nó. Hợp âm được sử dụng cứng.

Sử dụng:

Hãy thử ở đây: Trình biên dịch / thực thi Pyth . Tắt chế độ gỡ lỗi và sử dụng "C D# G"làm đầu vào.

Giải trình:

Đầu tiên một số chuẩn bị:

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

Sau đó, một hàm chuyển đổi ghi chú thành số nguyên

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)

Sau đó, cho mỗi ghi chú, thay đổi tọa độ và tìm kiếm nó trong một bảng

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

Perl 5: 183 - 100 = 83

Chỉnh sửa: Tôi đã quản lý để cắt một số ký tự phụ vì vậy tôi cũng đã thay đổi tên hợp âm như trong giải pháp Python, vì vậy tôi có thể giả vờ một lúc mà tôi đang dẫn đầu.

#!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

Thí dụ:

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

0

Python 2, 335 byte - 30 - 70 = 235

Lần thử đầu tiên tại một sân golf dài hơn một chút, vì vậy tôi có thể thiếu một số thủ thuật rõ ràng.

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

Bình luận:

  • Tôi đã sử dụng tên hợp âm thay thế từ trang Wiki (xem phần cuối của dòng dài) để tiết kiệm không gian.
  • Hợp âm được thể hiện bằng 3 offset hex mỗi (0 không bắt buộc nhưng được bao gồm cho các bộ ba để sắp xếp chúng).
  • "#". find (n [1:]) hoạt động vì "#". find ("b") là -1 và "#". find ("") là 0.

Sản lượng mẫu

>>> 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.