ग्रेगोरियन चर्च का संगीत व्यवस्थित करें


19

वर्ष 930 है, और ग्रेगोरियन चर्च को समस्या हो रही है। उनके हजारों गाने हैं, जो कि संगीत के हैं, लेकिन समस्या यह है कि सभी शीट संगीत को किसी भी वास्तविक संगठन प्रणाली के बजाय एक ढेर पर फेंक दिया गया है:

चादर संगीत की छवि
कार्टोग्राफर्स गिल्ड में उपयोगकर्ता गेमरप्रिनट द्वारा छवि ।

चर्च को सभी शीट संगीत को व्यवस्थित करने की आवश्यकता है, इसलिए उन्होंने उनके लिए इसे आयोजित करने के लिए एक कार्यक्रम लिखने के लिए एक मध्यकालीन सॉफ्टवेयर इंजीनियर को काम पर रखा है। आप सॉफ्टवेयर इंजीनियर हैं जिन्हें काम पर रखा गया है। हालाँकि, मध्ययुगीन समय में संकलन प्रक्रिया में धीमी बाइबिल ग्रंथों की एक टीम द्वारा कार्यक्रम को कागज पर लिखा जाना शामिल है। अपने कोड को संकलित करने के लिए स्क्राइब की टीम के लिए समय कम करने के लिए, आपको कार्यक्रम को यथासंभव छोटा करना चाहिए।

चर्च चाहता है कि उनके द्वारा लिखे गए संगीत पैमाने के आधार पर जप संगीत का आयोजन किया जाए। चर्च के सभी राग संगीत डोरियन पैमानों में लिखे गए हैं । संगीत के एक निश्चित टुकड़े के नोट्स को देखते हुए, आपका प्रोग्राम डोरियन स्केल को आउटपुट करेगा जो कि इसमें है। यहां, मैं वास्तव में समझाऊंगा कि डोरियन स्केल क्या है। यदि आप पहले से जानते हैं, तो आप इस अनुभाग को छोड़ सकते हैं।

किसी भी राग में 12 संभव नोट हैं। यहाँ वे क्रम में हैं:

C C# D D# E F F# G G# A A# B

एक अर्धविराम ( एक का उपयोग करके दर्शाया गया S) एक कदम दाईं ओर बढ़ रहा है, चारों ओर लपेटता है (इसलिए बी से एक अर्धांश वापस C पर होगा)। एक टोन ( एक का उपयोग करके दर्शाया गया T) दो सेमिटोन है। उदाहरण के लिए, F # से एक सेमीिटोन G होगा। F # से एक टोन G # होगा।

डोरियन स्केल बनाने के लिए, हम सूची में किसी भी नोट से शुरू करते हैं, और फिर निम्नलिखित पैटर्न में आगे बढ़ते हैं, उन नोटों को सूचीबद्ध करते हैं जिन्हें हम सामना करते हैं:

T, S, T, T, T, S

एक उदाहरण। मैं ए से शुरू करता हूं। मेरे डोरियन पैमाने के नोट बन जाते हैं:

A
B  (up a tone)
C  (up a semitone)
D  (up a tone)
E  (up a tone)
F# (up a tone)
G  (up a semitone)

पैमाने में ए, बी, सी, डी, ई, एफ #, और जी नोट हैं क्योंकि मैंने ए से शुरू किया था, हम इसे ए में डोरियन स्केल कहेंगे । इसलिए 12 अलग-अलग डोरियन तराजू हैं, जिनमें से प्रत्येक का नाम उस नोट के नाम पर है जिसे उन्होंने शुरू किया था। उनमें से प्रत्येक टोन और सेमीटोन के समान पैटर्न का उपयोग करते हैं, बस एक अलग स्थिति से शुरू होता है। यदि मेरी व्याख्या सुसंगत नहीं है तो आप विकिपीडिया से भी परामर्श कर सकते हैं ।

कार्यक्रम का इनपुट आपके कार्यक्रम के लिए जो भी उपयुक्त हो (जैसे STDIN, कमांड लाइन तर्क raw_input()) से दिया जा सकता है । यह एक चर में पूर्व-प्रारंभ नहीं हो सकता है। इनपुट अल्पविराम नोटों की एक सूची होगी, जो टुकड़े के माधुर्य का प्रतिनिधित्व करता है। बार-बार नोट आ सकते हैं। इनपुट में हमेशा अलग-अलग नोट होंगे जो निर्णायक रूप से टुकड़े के पैमाने को कम करने में सक्षम होंगे। एक उदाहरण इनपुट:

B,B,D,E,D,B,A,G#,A,G#,E,D,F#,E,F#,E,F#,G#,A

कार्यक्रम का आउटपुट स्ट्रिंग होना चाहिए Dorian scale in X, जहां एक्स पैमाने का शुरुआती नोट है। उदाहरण इनपुट का आउटपुट:

Dorian scale in B

बी ( B C# D E F# G# A) में डोरियन पैमाने के साथ इसकी तुलना करते हुए हम देखते हैं कि राग के सभी नोट इस पैमाने के भीतर हैं। नोट # इस मामले में अप्रयुक्त है। हालाँकि, B डोरियन को सही कुंजी के रूप में पहचानने के लिए पर्याप्त नोट हैं। कोई अन्य डोरियन स्केल फिट नहीं होता है, क्योंकि जो भी अन्य पैमाना हम आजमाते हैं, उसमें राग का कम से कम एक नोट हमेशा होता है, जो स्केल से संबंधित नहीं होता है।

यह कोड गोल्फ है, इसलिए कम से कम वर्णों के साथ प्रविष्टि जीतती है। यदि आपके कोई प्रश्न हैं, तो टिप्पणियों में पूछें।


तो, हमें जो करना चाहिए वह केवल पहले स्वर / अर्धविराम की व्याख्या करना है?
6

@ मुझे क्षमा करें, मुझे आपका प्रश्न समझ में नहीं आया। इनपुट हमेशा टॉनिक से शुरू नहीं होगा , यदि आप यही पूछ रहे हैं।
अबिन्थे

कृपया हमें और उदाहरण प्रदान करें। विशेष रूप से उन, जो टॉनिक के साथ शुरू नहीं करते हैं।
avall


1
@ दाविद इस मेटा प्रश्न के अनुसार , मैंने चुनौती शुरू करने के बाद से 12 दिनों की प्रतीक्षा अवधि के बाद सबसे कम उत्तर को स्वीकार किया। यह सिर्फ तब हुआ जब सीजेएम का उत्तर सही पोस्ट किया गया जब मैं अगले सबसे छोटे को स्वीकार करने जा रहा था।
अबिन्थे सेप

जवाबों:


2

CJam - 61

C,q',/f{"FCGDAEB"_5<'#f++:s@m<7<:A-!{"Dorian scale in "A3=}*}

इसे http://cjam.aditsu.net/ पर आज़माएं


वाह, यह मेरी सबसे तेज जीत होनी चाहिए .. 1 मिनट से भी कम समय :)
aditsu

8

सी, 171 146

i,b;main(int c,char**v){for(;c=v[1][i];)b|=c/65<<c*2%7+v[1][++i]%2*7;for(i=12;i--;)b&(1016056>>i)||printf("Dorian scale in %c%c",65+i*3%7,(i<5)*35);}

सी में तार लगाना उतना आसान नहीं है, इसलिए मैं अधिक गणितीय दृष्टिकोण के लिए गया।

मैं सर्कल ऑफ फिफ्थ्स का फायदा उठाता हूं। यदि हम एक बार में 7 सेमिटोन गिनने के आधार पर निम्नलिखित क्रम में नोटों की व्यवस्था करते हैं (एक "पांचवें" के रूप में जाना जाता है), तो हम पाते हैं कि किसी भी पैमाने पर अनुमत सभी नोटों में 7 नोटों का एक ब्लॉक और सभी निषिद्ध नोट हैं 5 नोटों का लगातार ब्लॉक बनाएं।

F C G D A E B F# C# G# D# A#

(यह एक चक्र है, यह Fअंत में चारों ओर घूमता है ।)

उपरोक्त अनुक्रम में एक प्राकृतिक नोट की स्थिति के रूप में गणना की जा सकती है (ASCII code) * 2 % 7। फिर यदि अगला वर्ण विषम है (लागू #नहीं होता है, लेकिन अल्पविराम, स्थान या शून्य बाइट पर) हम इसे तेज बनाने के लिए 7 जोड़ते हैं। हम उपयोग किए गए नोटों का एक बिटमैप संग्रहीत करते हैं।

संख्या 243(बाइनरी 11111000) ए # डोरियन के पैमाने में निषिद्ध नोटों से मेल खाती है। मैंने इसे (1<<12)+1=4097जादू की संख्या देने के लिए गुणा किया 1016056। यह जाँच करने का अधिकार है (एंडिंग द्वारा) यदि मेलोडी में 12 तराजू में से प्रत्येक के लिए निषिद्ध नोट हैं। यदि मेलोडी में निषिद्ध नोट नहीं हैं, तो स्केल मुद्रित होता है।

आउटपुट के लिए हमें रिवर्स ऑर्डर में स्केल किए गए स्केल नाम को ऊपर के चक्र के चक्र में प्रिंट करना होगा, याद रखें कि हम पीछे की ओर जा रहे हैं क्योंकि हम राइटशफ्टिंग कर रहे हैं।) ASCII अनुक्रम ADGCFBEADGCF द्वारा उत्पन्न होता है 65+i*3%7। इनमें से पहले पांच के लिए एक तेज भी मुद्रित किया जाना चाहिए।

अघोषित कोड

i,b;
main(int c,char**v){
  for(;c=v[1][i];)                          //for each character in first commanline argument v[1]
                                               //if it is a letter (assume uppercase, ASCII 65 or over)
   b|=c/65<<c*2%7+v[1][++i]%2*7;               //convert to position in the circle of fifths. 
                                               //Add 7 if the next character is odd (ASCII'#')
                                               //leftshift 1 by this number and OR this with the contents of b.

  for(i=12;i--;)b&(1016056>>i)||printf         //if melody includes no prohibited notes for the scale i, print
   ("Dorian scale in %c%c",65+i*3%7,(i<5)*35); //the scale letter, and a # (ASCII 35) if required, otherwise an ASCII 0.
}

अमान्य इनपुट व्यवहार: यदि अपर्याप्त नोट पैमाने को निर्धारित करने के लिए आपूर्ति की जाती है, तो यह सभी संभावित पैमानों को आउटपुट करेगा। यदि नोटों के एक असंभव संयोजन की आपूर्ति की जाती है, तो यह कुछ भी उत्पादन नहीं करेगा। नोट्स को अल्पविराम (या अन्य गैर-व्हाट्सएप चरित्र द्वारा एक समान ASCII कोड <= 64 के साथ सीमांकित किया जाना चाहिए) रिक्त स्थान का उपयोग नहीं किया जा सकता है क्योंकि पहले स्थान के बाद सब कुछ एक अलग तर्क माना जाएगा। ASCII कोड> 64 को वर्णित तरीके से नोट्स के रूप में व्याख्या किया जाएगा।


इसने मुझे झकझोर दिया कि पाँचवें के घेरे में यह संपत्ति है! शायद मैं इसे थोड़ा और गोल्फ के लिए उपयोग कर सकता हूं।
रे

1
@ यह वास्तव में है क्यों हम हमारे पास है कि नोटों का सेट है। सप्तक का आवृत्ति अनुपात 2: 1 है। पाइथागोरस द्वारा परिभाषित पांचवें का अनुपात 3: 2 है और यह ऑक्टेव के बाद सबसे महत्वपूर्ण संगीत अंतराल है। क्योंकि 1.5 ^ 12 के करीब है, लेकिन 2 ^ 7 के बराबर नहीं है, आधुनिक समान टेम्पर्ड पांचवें को 1.4983 तक निचोड़ा जाता है, ताकि 7 ऑक्टेव्स में ठीक 12 वें फिट हो। पुराने जमाने का हल सर्कल से उपलब्ध 12 में से केवल 7 नोटों का उपयोग करना था। इसीलिए हमारे पास 7 असमान रूप से फ़ैल हुए नोटों के आधार पर एक पैमाना है। यह कुछ यादृच्छिक सम्मेलन नहीं है, इसके पीछे कुछ ठोस गणित हैं।
लेवल रिवर सेंट

ऐसे कई उपकरण हैं जो सुविधा कारणों से पांचवीं में नोटों की व्यवस्था करते हैं (वायलिन को इस तरह से ट्यून किया गया है, और बास गिटार को चौथे में ट्यून किया गया है, जो 4: 3 का अनुपात है)। सबसे महत्वपूर्ण उदाहरण (और मुझे पता है कि एकमात्र उपकरण अच्छे ध्वनिक डिजाइन के लिए पंद्रहवें चक्र में रखे गए नोट हैं) स्टीलपैन है: पंद्रहवें बिछाए गए हैं स्टीलपैन है google.es/patents/US7696421 । इस लेआउट के साथ यह कोई फर्क नहीं पड़ता कि क्या आप जिस नोट को रिंग कर रहे हैं उसके बगल में नोट थोड़ा सा हिल रहा है।
लेवल रिवर सेंट

4

हास्केल - 152

w=words
n=w"C C# D D# E F F# G G# A A# B"
f s="Dorian scale in "++[n!!i|i<-[0..11],all(`elem`[(n++n)!!(i+j)|j<-[0,2,3,5,7,9,10]])s]!!0
main=interact$f.w

Ungolfed

type Note = String
type Scale = [Note]

notes :: [Note]
notes = words "C C# D D# E F F# G G# A A# B"

isScale :: Scale -> [Note] -> Bool
isScale scale notes = all (`elem` scale) notes

takeScale :: Int -> Scale
takeScale i = [(notes ++ notes) !! (i + j) | j <- [0, 2, 3, 5, 7, 9, 10]]

findScale :: [Note] -> Note
findScale xs = head [notes !! i | i <- [0..11], isScale (takeScale i) xs]

main = interact (("Dorian scale in "++) . findScale . words)

3

पायथन 2 - 177 अक्षर

यह कम नहीं है, लेकिन मुझे लगता है कि पायथन के आनंद को एक पंक्ति में छोरों के लिए कई नेस्टेड लिखना है, भले ही गोल्फ न हो। दुर्भाग्य से, मुझे इनपुट स्टेटमेंट को एक अलग लाइन पर रखना था ताकि यह एक से अधिक बार निष्पादित न हो।

j=set(raw_input().split(','))
print"Dorian Scale in",[x for x in[["A A# B C C# D D# E F F# G G#".split()[(b+n)%12]for n in[0,2,3,5,7,9,10]]for b in range(12)]if j<set(x)][0][0]

मैं पायथन 3 का उपयोग नहीं करता, लेकिन मेरा मानना ​​है कि यह एक दुर्लभ उदाहरण है जब प्रिंट स्टेटमेंट को अधिक पात्रों की आवश्यकता नहीं होगी। चूंकि printवहां एक समारोह है, मैं *अंतिम को बदलने के लिए सूची अनपैकिंग ऑपरेटर के उपयोग के साथ कोष्ठक की आवश्यकता को ऑफसेट करने में सक्षम होगा [0]


2
तुम भी स्थानापन्न कर पाएंगे, inputके लिए raw_inputअजगर 3. में और 4 अक्षर बचाने
comperendinous

"मुझे एक पंक्ति में छोरों के लिए कई नेस्टेड लिखने के लिए पायथन की खुशी मिलती है": लेकिन क्या आपको उन्हें पढ़ने में खुशी मिलती है?
कालेब पॉल

@Wideshanks बेशक ... यह केवल लिखने के कोड के बारे में है!
feersum

3

रूबी - 132

12.times{|i|$*[0].split(?,)-(g=(0..6).map{|j|%w{C C# D D# E F F# G G# A A# B}[-i+=~(58>>j&1)]})==[]?(puts"Dorain scale in "+g[0]):g}

कमांड लाइन आर्ग से इनपुट।
जैसेruby dorianscale.rb B,B,D,E,D,B,A,G#,A,G#,E,D,F#,E,F#,E,F#,G#,A

इस पर प्रयास करें: ideone


3

हास्केल - 140

@Steveverrill द्वारा शुरू की गई पांचवीं संपत्ति के सर्कल का उपयोग करें। अगर हम करते हैं circle0 = words "C G D A E B F# C# G# D# A# F"और circle = circle0 ++ circle0है, तो हम में लगातार 7 नोट लेने से सभी तराजू निर्माण कर सकते हैं circle

scales = [take 7 . drop i $ circle | i <- [0..11]]

इस तरह से निर्मित प्रत्येक पैमाने में, scale !! 3 , 4 तत्व तत्व नाम है।

कोड

w=words
n=w"C G D A E B F# C# G# D# A# F"
f s="Dorian scale in "++[x!!3|x<-[take 7.drop i$n++n|i<-[0..]],all(`elem`x)s]!!0
main=interact$f.w

Ungolfed

type Note = String
type Scale = [Note]

notes :: [Note]
notes = words "C G D A E B F# C# G# D# A# F"

scales :: [Scale]
scales = [take 7 . drop i $ notes ++ notes | i <- [0..11]]

findScale :: [Note] -> Note
findScale xs = head [scale !! 3 | scale <- scales, all (`elem` scale) xs]

main = interact (("Dorian scale in "++) . findScale . words)

2

स्काला, 130 128 127

print("Dorian scale in "+(".#?".r findAllIn "FCGDAEBF#C#G#D#A#"*2 sliding(7)find{l=>args(0)split','forall(l contains _)}get 3))

पांचवीं विधि के चक्र का उपयोग करना। कमांड लाइन आर्ग से इनपुट

scala dorianscale.scala B,B,D,E,D,B,A,G#,A,G#,E,D,F#,E,F#,E,F#,G#,A
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.