संगीत: इस राग का नाम क्या है?


9

यह संगीत का विपरीत है : इस राग में क्या है? , जो दिए गए कॉर्ड में नोटों को प्रिंट करना है। इस बार इनपुट एक कॉर्ड में नोटों की एक सूची है, और आपका कार्य आउटपुट करना है कि यह किस कॉर्ड में है।

आपके कार्यक्रम को निम्नलिखित त्रैमासिक chords का समर्थन करना चाहिए। जड़ सी के साथ उदाहरण दिए गए हैं। अन्य जड़ों के साथ जीवा समान हैं, सभी नोटों के साथ एक ही तार होते हैं, इसलिए 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

नियम

  • आप या तो एक पूरा कार्यक्रम या एक फ़ंक्शन लिख सकते हैं।
  • इनपुट नोटों की एक सूची है, जो एक स्थान या किसी अन्य सुविधाजनक चरित्र द्वारा अलग किया गया है। यह स्ट्रिंग्स का एक सरणी भी हो सकता है (यदि यह फ़ंक्शन तर्क से इनपुट लेता है) या ऐसे ऐरे का स्ट्रिंग प्रतिनिधित्व।
  • इनपुट को विशिष्ट क्रम में नहीं होना चाहिए।
  • इनपुट में नकली नोट हो सकते हैं। उनके साथ वैसा ही व्यवहार किया जाना चाहिए जैसा कि उनमें से एक है।
  • आउटपुट कॉर्ड का नाम है। यदि यह कई नामों का उत्पादन करेगा, तो इनपुट के लिए एक ही नियम लागू होगा।
  • यदि इनपुट एक समर्थित कॉर्ड नहीं है, तो आपको नोट्स को इस तरह प्रिंट करना चाहिए। आपका कार्यक्रम ऊपर दी गई तालिकाओं में सूचीबद्ध नहीं किए गए अन्य रागों का भी समर्थन कर सकता है (जो कि मान्य है लेकिन कोई बोनस नहीं है)।
  • आप विकिपीडिया लेख में सूचीबद्ध अन्य सूचनाओं का उपयोग कर सकते हैं । लेकिन यदि आप Cसी प्रमुख के लिए चुनते हैं , तो आपको एकल नोट के साथ कॉर्ड को अलग करने के लिए किसी भी मामले में एक मानव पठनीय उपसर्ग जोड़ना चाहिए।
  • आप इस कार्य के लिए बिल्ट-इन फ़ंक्शन का उपयोग नहीं कर सकते हैं (यदि कोई हो)।
  • यह कोड-गोल्फ है। बाइट्स में सबसे छोटा कोड जीतता है।

उदाहरण

  • इनपुट: 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 यदि यह उन सभी को प्रिंट करता है यदि एक से अधिक व्याख्याएं हैं (ईजी, एसयूएस 4 / एसयूएस 2 और डिम 7 के लिए)।
  • -70 यदि यह सातवें तार का भी समर्थन करता है।
  • -200 अगर यह मिडी इनपुट को स्वीकार करता है और इसे प्राप्त प्रत्येक कॉर्ड को प्रिंट करता है। ध्यान दें कि नोट्स एक ही समय में शुरू या समाप्त नहीं होने चाहिए। आप तय करते हैं कि मध्यवर्ती राज्यों में क्या होता है (जब तक यह दुर्घटना नहीं करता है या काम करना बंद नहीं करता है)। आप मान सकते हैं कि टक्कर चैनलों में कोई नोट नहीं हैं (या यदि सुविधाजनक है तो केवल एक ही चैनल है)। यह परीक्षण के लिए एक पाठ (या सरणी) संस्करण प्रदान करने की भी सिफारिश की जाती है, खासकर अगर यह प्लेटफ़ॉर्म-निर्भर है।

क्या इनपुट में फ्लैट्स हो सकते हैं या यह केवल तेज उपयोग कर रहा है? क्या बी # जैसे नोटों को संभाला जाना चाहिए?
feersum

@ फ़र्सम इसमें फ्लैट्स हो सकते हैं (जब तक कि आप -200 बोनस का दावा न करें)। कुछ उदाहरण जोड़े। आप को संभाल की जरूरत नहीं है B#, Cbआदि
jimmy23013

आप कहते हैं Csus4 is the same as Gsus2। मुझे लगता है कि आपका मतलब Csus2 is the same as Gsus4यह नहीं है?
गारेथ

@ गारेथ ... हां। फिक्स्ड।
jimmy23013

जवाबों:


2

पायथ 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

वास्तव में इससे खुश नहीं हैं। हार्ड कोडेड कॉर्ड का इस्तेमाल किया।

उपयोग:

इसे यहाँ आज़माएँ: पायथ कंपाइलर / एक्ज़ीक्यूटर । डिबग मोड को अक्षम करें और "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

टिप्पणियाँ:

  • मैंने अंतरिक्ष को बचाने के लिए विकी पेज (लंबी लाइन के अंत देखें) से वैकल्पिक कॉर्ड नामों का इस्तेमाल किया।
  • कॉर्ड्स को 3 हेक्स ऑफ़सेट्स द्वारा दर्शाया जाता है (प्रत्येक की आवश्यकता नहीं है लेकिन उन्हें लाइन अप करने के लिए ट्रायड्स के लिए शामिल किया गया है)।
  • "#"। ढूंढना (n [1:]) "#" के बाद से काम करता है। ("b") -1 और "#" है। खोजें ("") 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.