Müzik: Bu akorun adı ne?


9

Müziğin tersi : bu akorda ne var? verilen akordaki notaları basmaktır. Bu kez girdi bir akordaki notaların bir listesidir ve göreviniz hangi akorun çıktısını almaktır.

Programınız aşağıdaki triadik akorları desteklemelidir. Örnekler kök C ile verilir. Diğer köklere sahip akorlar, tüm notalar döndürülmüş olarak aynı akorlardır, bu nedenle C bu kök nota haline gelir, örneğin Dmaj, D, F # ve A'dan oluşur.

        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'un Eaug ve G # aug ile aynı olduğunu ve Csus4'ün Fsus2 ile aynı olduğunu unutmayın. İkisinden birini çıktı alabilirsiniz, ancak hepsini çıkarırsanız bir bonus vardır.

Ve bonus için yedinci akorlar aşağıdaki tabloda listelenmiştir:

        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

kurallar

  • Tam bir program veya işlev yazabilirsiniz.
  • Giriş, boşluk veya başka bir uygun karakterle ayrılmış notların bir listesidir. Ayrıca bir dizi dizisi (işlev bağımsız değişkeninden girdi alırsa) veya bu dizinin dize olarak temsili olabilir.
  • Girişin belirli bir sırada olması gerekmez.
  • Girişte yinelenen notlar olabilir. Onlardan sadece bir tanesiyle aynı şekilde muamele edilmelidir.
  • Çıktı akorun adıdır. Birden fazla ad çıkarması durumunda, giriş için aynı kural geçerlidir.
  • Giriş desteklenen bir akor değilse, notları olduğu gibi yazdırmalısınız. Programınız ayrıca yukarıdaki tablolarda listelenmeyen diğer akorları da destekleyebilir (bu geçerlidir, ancak bonusu yoktur).
  • Wikipedia makalesinde listelenen diğer gösterimleri kullanabilirsiniz . Ancak CC major'u seçerseniz , bir akoru tek bir nota ile ayırt etmek için her iki durumda da insan tarafından okunabilir bir önek eklemeniz gerekir.
  • Bu görev için yerleşik işlevleri kullanamazsınız (varsa).
  • Bu kod golfü. Bayt cinsinden en kısa kod kazanır.

Örnekler

  • Girdi: C D# GÇıktı: Cm.
  • Girdi: C Eb GÇıktı: Cm.
  • Girdi: C Eb F#Çıktı: Cdim.
  • Girdi: F A C#Çıktı: Faug, Aaug, C#aug, Dbaugveya Faug Aaug C#aug, Faug Aaug Dbaugherhangi bir sırada.
  • Girdi: F D F F F F A A FÇıktı: Dm.
  • Girdi: C DÇıktı: C D.

Bonuslar

  • Birden fazla yorum varsa (aug, sus4 / sus2 ve dim7 için) hepsini yazdırırsa -30.
  • Yedinci akorları da destekliyorsa -70.
  • MIDI girişini kabul ederse ve aldığı her akoru yazdırırsa -200. Notların aynı anda başlaması veya bitmesi gerekmediğini unutmayın. Ara durumlarda ne olacağına siz karar verirsiniz (çökmediği veya çalışmayı durdurmadığı sürece). Perküsyon kanallarında not olmadığını varsayabilirsiniz (ya da uygunsa yalnızca bir kanal vardır). Ayrıca, özellikle platforma bağlıysa, test için bir metin (veya dizi) sürümü sağlamanız önerilir.

Girişte daireler olabilir mi yoksa yalnızca keskin mi kullanılıyor? B # gibi notlar işlenmeli mi?
feersum

@feersum Daireler olabilir (-200 bonusunu talep etmediğiniz sürece). Bazı örnekler eklendi. Sen kolu gerekmez B#, Cbvb
jimmy23013

Diyorsun Csus4 is the same as Gsus2. Bence demek Csus2 is the same as Gsus4istiyorsun değil mi?
Gareth

@Gareth ... Evet. Sabit.
jimmy23013

Yanıtlar:


2

Pyth 190 karakteri - 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

Bundan gerçekten memnun değil. Kullanılan sabit kodlu akorlar.

Kullanımı:

Burada deneyin: Pyth Derleyici / Yönetici . Hata ayıklama modunu devre dışı bırakın ve "C D# G"giriş olarak kullanın .

Açıklama:

İlk olarak bazı hazırlıklar:

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

Sonra notları tamsayıya dönüştüren bir işlev

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)

Sonra her bir not için koordinatı kaydırın ve bir tabloya bakın

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

Düzenleme: Ben de ekstra karakter kesmek başardı böylece ben de Python çözümü gibi akor isimlerini değiştirdim, bu yüzden ben önde gelen bir an gibi davranabilirsiniz.

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

Misal:

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

0

Python 2,335 bayt - 30 - 70 = 235

İlk denemem biraz daha uzun bir golf, bu yüzden bazı belirgin hileler eksik olabilir.

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

Yorumlar:

  • Yer kazanmak için Wiki sayfasındaki alternatif akor adlarını kullandım (uzun satırın sonuna bakın).
  • Akorlar, her biri 3 onaltılık ofset ile temsil edilir (0 gerekli değildir, ancak triadların sıralanması için dahil edilir).
  • "#". find (n [1:]), "#" olduğu için çalışır. find ("b") -1 ve "#". find ("") 0'dır.

Örnek çıktı

>>> 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.