मेजर-माइनर डिचोटॉमी


15

जीवा की सूची को देखते हुए उन्हें 'मेजर' या 'माइनर' के रूप में लेबल करें।

इनपुट

इनपुट जीवा की एक सूची होगी, जो प्रति पंक्ति एक स्थान से 3 नोटों से बनी होती है। प्रत्येक नोट में अपरकेस ( A- G) और वैकल्पिक आकस्मिक ( #या b) नोट नाम शामिल होगा । तार किसी भी उलटा (यानी किसी भी क्रम में नोट हो सकते हैं) में हो सकते हैं।

उत्पादन

यदि कॉर्ड प्रमुख है, तो आउटपुट 'मेजर' है। यदि कॉर्ड छोटा है, तो आउटपुट 'माइनर' है। यदि कॉर्ड न तो प्रमुख है और न ही मामूली है, तो एक रिक्त लाइन आउटपुट करें।

उदाहरण

इनपुट

C E G
F Ab C
C Eb Gb
E G B
Db F Ab
Bb G D
D A Gb

उत्पादन

Major
Minor

Minor
Major
Minor
Major

टेस्ट स्क्रिप्ट

मेरे पिछले कुछ सवालों की तरह, मैंने एक बार फिर से कुछ परीक्षण स्क्रिप्ट तैयार की हैं, जो मूल रूप से जॉय और वेंटरो द्वारा बनाई गई हैं, इस प्रश्न के लिए कुछ परीक्षण मामले प्रदान करने के लिए:

उपयोग: ./test [your program and its arguments]

पुरस्कार

प्रत्येक प्रविष्टि जिसे मैं सत्यापित कर सकता हूं कि यह कल्पना से मिलता है, परीक्षणों को पास करता है और जाहिर है कि गोल्फ में कुछ प्रयास मुझे प्राप्त होगा (इसलिए कृपया अपने उत्तर के साथ उपयोग निर्देश प्रदान करें)। 13/10/2012 के अंत तक सबसे छोटा समाधान विजेता के रूप में स्वीकार किया जाएगा।

थोड़ा सिद्धांत

आप में से कोई भी संगीत सिद्धांत के ज्ञान के साथ यहां आपके लिए प्रतिस्पर्धा करने में सक्षम होने के लिए पर्याप्त जानकारी है।

एक प्रमुख या मामूली कॉर्ड तीन नोटों से बना होता है, जो सेमिटोन्स के एक विशिष्ट पैटर्न द्वारा अलग किए जाते हैं। यदि हम कॉर्ड के मूल (नीचे नोट) को 0 मानते हैं, तो एक प्रमुख कॉर्ड पैटर्न 0-4-7 और एक मामूली कॉर्ड पैटर्न 0-3-7 है। चीजों को इस तथ्य से और अधिक अजीब बना दिया जाता है कि कुछ नोट अलग हैं और कुछ अलग हैं। से semitones के प्रसार Ab- G#इस प्रकार है:

G#/Ab A A#/Bb B/Cb B#/C C#/Db D D#/Eb E/Fb E#/F F#/Gb G G#/Ab
  0   1   2    3     4    5   6   7    8     9    10  11  12

G#/Abइसका मतलब है कि G#जैसा है वैसा ही नोट Ab। इससे हम देख सकते हैं कि राग Ab C Ebएक प्रमुख राग है, और Ab Cb Ebयह मामूली है।

जटिल आगे मायने रखती करने के लिए, तार Eb Cb Abके रूप में ही माना जाता है Ab Cb Eb, Cb Eb Abऔर Cb Ab Ebऔर इतने पर। इन विविधताओं में से हर एक अभी भी एक मामूली राग है।


2
मुझे लगता है कि आपके बैश टेस्टर को इनपुट्स और अपेक्षित उत्तरों की अदला-बदली चाहिए।
फ्लोडेल

@flodel हां, आप सही कह रहे हैं। इस बारे में क्षमा करें, मैंने इसे अब ठीक कर दिया है। मुझे यह जांचने की आवश्यकता होगी कि पॉवर्सशेल परीक्षण स्क्रिप्ट में भी यही समस्या नहीं है।
गैरेथ

जवाबों:


3

गोल्फस्क्रिप्ट, 83 वर्ण

n%{' '%{1\{'A#BC D EF G'?+}/.}%$(+2/{~- 12%}%.(+.(+]$0=.$]10,7>?'MMaijnoorr

'>2%}%

यह एक त्वरित पहला उपाय है; मुझे यकीन है कि इसे और आगे बढ़ाया जा सकता है। कमेंट्स में फ्लोडेल द्वारा बताए गए बग को ठीक करने के बाद बैश टेस्ट सूट पास करता है।

संपादित 1: कैनोनिकलकृत प्रमुख और मामूली कॉर्ड पैटर्न को पहचानने के लिए 5 चार्ट को एक छोटे तरीके से सहेजा गया।

संपादित करें 2: grc के समाधान से प्रेरित अधिक कॉम्पैक्ट आउटपुट एन्कोडिंग के साथ 2 और चार्ट सहेजे गए। (धन्यवाद!) एक साइड इफेक्ट के रूप में, कोड अब आउटपुट के बाद एक अतिरिक्त रिक्त लाइन प्रिंट करता है, लेकिन परीक्षण हार्नेस को स्वीकार करने लगता है, इसलिए मुझे लगता है कि यह ठीक है। :)

यहां देखिए यह कैसे काम करता है:

  • बाहरी लूप n%{ }%n*केवल इनपुट को लाइनों में विभाजित करता है, प्रत्येक पंक्ति के लिए ब्रेसिज़ के अंदर कोड चलाता है और नए सिरे से परिणामों में शामिल होता है।

  • ' '%प्रत्येक पंक्ति को नोट्स की एक सरणी में विभाजित करता है। उन नोटों में से प्रत्येक के लिए, 1\{'A#BC D EF G'?+}/फिर स्ट्रिंग में उसके प्रत्येक वर्ण को खोजकर 'A#BC D EF G'और पदों को जोड़कर (जो किसी भी वर्ण के लिए स्ट्रिंग में नहीं पाया जाएगा, जो विशेष रूप से शामिल है b) द्वारा उस नोट को एक अर्ध-संख्या में रूपांतरित करता है । (मुझे यकीन है कि मैंने इस ट्रिक को पहले इस्तेमाल किया है।) अंत में, .प्रत्येक नंबर को डुप्लिकेट करता है, ताकि, लूप के अंत में, जैसे इनपुट F Ab Cको चालू किया गया है [9 9 0 0 4 4]

  • हम तब के साथ नोटों को सॉर्ट करते हैं $, पहले नोट को अंत तक ले जाते हैं (+, और सरणी को जोड़े में विभाजित करते हैं 2/, ताकि यह अब जैसे दिखता है [[9 0] [0 4] [4 9]]। फिर {~- 12%}%हमारे अंतर मोड में हमारे अंतर सरणी 12 में नोटों की प्रत्येक जोड़ी को मैप करता है [9 8 7]

  • अगला, .(+सरणी की एक प्रति बनाता है और उसके तत्वों को एक स्थिति से छोड़ देता है। हम इसे दो बार करते हैं और प्रतियों को एक सरणी में इकट्ठा करते हैं ], ताकि हमारा उदाहरण अब जैसा दिखता है [[9 8 7] [8 7 9] [7 9 8]]

  • हम तब एरे के इस सरणी को सॉर्ट करते $हैं और पहले तत्व को - इस मामले में [7 9 8]- के साथ लेते हैं 0=। हम फिर इस सरणी ( .) की एक प्रति बनाते हैं , इसे सॉर्ट करते हैं ( $), दोनों को अनसोल्ड और अनसोल्ड एरे को एरे के दूसरे ऐरे में इकट्ठा करते हैं ( ]), और एरे की पहली घटना को खोजते हैं [7 8 9](जिसे 10,7>दो वर्णों को बचाने के लिए लिखा जाता है। ) इस में।

  • यह हमें या तो देता है 0(यदि अनसुलझा सरणी था [7 8 9], और इस तरह तार प्रमुख है), 1(यदि अनसुलझा सरणी एक क्रमपरिवर्तन था [7 8 9], जिसे देखते हुए, इसका पहला तत्व सबसे छोटा होना चाहिए, केवल हो सकता है [7 9 8], जीवा को मामूली बना सकता है ) या -1(यदि सॉर्ट किया गया सरणी समान नहीं है [7 8 9])।

  • यह संख्या तब स्ट्रिंग में एक शुरुआती सूचकांक के रूप में उपयोग की जाती है "MMaijnoorr\n\n"(जहां \nकोड में वास्तविक लाइनफीड्स के रूप में एस दिए गए हैं), जिसमें से हम उस चरित्र को लेते हैं और हर दूसरे बाद में आउटपुट के रूप में। यदि इंडेक्स -1 है, तो हम स्ट्रिंग के अंतिम वर्ण से शुरू करते हैं, जो कि केवल एक पंक्ति फ़ीड है।


अच्छी व्याख्या। मुझे वही कठिनाई हो रही है जो मुझे हमेशा गोल्फस्क्रिप्ट के साथ लगती है - मैं इसे परीक्षण करने के लिए एक समय में एक पंक्ति लगा echo "G# B# Eb" | ruby golfscript.rb ilmari.gsसकता हूं लेकिन मैं इस पर परीक्षण स्क्रिप्ट कैसे चला सकता हूं? मैंने कोशिश की, ./test ruby golfscript.rb ilmari.gsलेकिन इसमें से कुछ भी नहीं हो रहा था। (मैं आपको पहले ही एक +1 दे चुका हूं क्योंकि यह स्पष्ट रूप से काम करता है, लेकिन मैं बस उत्सुक हूं)
गैरेथ

1
@ गैरेथ: ऐसा लगता है कि बैश टेस्ट स्क्रिप्ट में एक बग है - यह कई तर्कों को सही से हैंडल नहीं करता है। इसे ठीक करने के लिए, args="$@"साथ args=("$@")और got=$("$cmd" "$args")साथ बदलें got=$("$cmd" "${args[@]}")। (या सिर्फ golfscript.rbनिष्पादन योग्य ./test ./golfscript.rb chords.gs
बनाइए

4

अजगर, 160

f='A#BC D EF G3453543'.find
try:
 while 1:x,y,z=sorted(map(lambda x:f(x[0])+f(x[1:])+1,raw_input().split()));print'MMianjoorrr'[f(`y-x`+`z-y`)/14:-1:2]
except:0
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.