গ্রেগরিয়ান চার্চের সংগীত পরিচালনা করুন


19

বছরটি 930, এবং গ্রেগরিয়ান চার্চটিতে একটি সমস্যা রয়েছে। তাদের কাছে কয়েক হাজার পৃষ্ঠার মন্ত্রসংগীত রয়েছে, তবে সমস্যাটি হ'ল যে সমস্ত শীট সংগীতটি কোনও আসল সংগঠন সিস্টেম না করে কেবল একটি গাদাতে ফেলে দেওয়া হয়েছিল:

শীট সংগীতের চিত্র Image
কার্টোগ্রাফার গিল্ডে ব্যবহারকারী গেমার প্রিন্টার দ্বারা ছবি ।

চার্চের সমস্ত শীট সংগীত সংগঠিত করা দরকার, তাই তারা তাদের জন্য একটি প্রোগ্রাম লেখার জন্য একটি মধ্যযুগীয় সফটওয়্যার ইঞ্জিনিয়ার নিয়োগ করেছে। আপনি যে সফ্টওয়্যার ইঞ্জিনিয়ার নিয়োগ করা হয়েছে। যাইহোক, মধ্যযুগীয় সময়ে সংকলন প্রক্রিয়াটি ধীর বাইবেলের লিখিত স্ক্রাইবদের একটি দল প্রোগ্রামের মাধ্যমে কাগজে লেখা থাকে। স্ক্রিবিদের দলকে আপনার কোডটি সংকলন করতে সময়টি কমিয়ে আনার জন্য, আপনাকে অবশ্যই প্রোগ্রামটি যতটা সম্ভব ছোট করা উচিত।

চার্চ চায় যে তারা যে সংগীত রচনায় রচিত রয়েছে তার ভিত্তিতে মন্ত্রের সংগীতকে সংগঠিত করা হোক। চার্চের সমস্ত মন্ত্রসংগীত ডোরিয়ান স্কেলে লেখা আছে । নির্দিষ্ট অংশের সংগীতের নোটগুলি দেওয়া, আপনার প্রোগ্রামটি যে ডোরিয়ান স্কেলটি রয়েছে তাতে আউটপুট দেবে Here এখানে, আমি ডোরিয়ান স্কেলটি ঠিক কী তা ব্যাখ্যা করব। আপনি যদি ইতিমধ্যে জানেন তবে আপনি এই বিভাগটি এড়িয়ে যেতে পারেন।

যে কোনও সুরতে 12 টি নোট রয়েছে। এখানে তারা যথাযথ:

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

একটি সেমিটোন (একটি ব্যবহার করে প্রতিনিধিত্ব করা S) ডানদিকে এক ধাপ বাড়িয়ে দিচ্ছে, চারপাশে মোড়ানো (যাতে বি থেকে একটি সেমিটোন সিটিতে ফিরে আসে)। একটি স্বর (একটি ব্যবহার করে প্রতিনিধিত্ব করা T) দুটি সেমিটোন। উদাহরণস্বরূপ, এফ # এর থেকে একটি সেমিটোন হবে জি।

ডোরিয়ান স্কেল তৈরি করতে, আমরা তালিকার যে কোনও নোট থেকে শুরু করি এবং তারপরে আমরা যে নোটগুলির মুখোমুখি হই সেগুলি তালিকাভুক্ত করে নীচের প্যাটার্নে উঠে যাই:

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 টি আলাদা ডোরিয়ান স্কেল রয়েছে, যার প্রত্যেকটির নাম থেকেই তারা যে নোটটি শুরু করেছিল তার নাম অনুসারে রয়েছে। প্রত্যেকে আলাদা আলাদা অবস্থান থেকে শুরু করে টোন এবং সেমিটোনগুলির একই প্যাটার্ন ব্যবহার করে। আমার ব্যাখ্যা যদি সুসংগত না হয় তবে আপনি উইকিপিডিয়াকেও পরামর্শ করতে পারেন ।

প্রোগ্রামটির ইনপুটটি আপনার প্রোগ্রামের জন্য যথাযথ যা কিছু থেকে দেওয়া যেতে পারে (যেমন এসটিডিআইএন, কমান্ড লাইন আর্গুমেন্ট, 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) তে ডোরিয়ান স্কেলের সাথে তুলনা করে আমরা দেখতে পাই যে সুরের সমস্ত নোটগুলি এই স্কেলের মধ্যে রয়েছে। নোট সি # এই ক্ষেত্রে অব্যবহৃত। তবে বি ডরিয়ানকে সঠিক কী হিসাবে চিহ্নিত করার জন্য যথেষ্ট নোট রয়েছে। অন্য কোনও ডরিয়ান স্কেল খাপ খায় না, কারণ অন্যান্য স্কেলগুলি আমরা যা চেষ্টা করি না কেন, সর্বদা কমপক্ষে সুরের অন্তত একটি নোট থাকে যা স্কেলের সাথে সম্পর্কিত নয়।

এটি কোড গল্ফ, তাই সংক্ষিপ্ত সংখ্যক অক্ষরের সাথে এন্ট্রি জিততে পারে। আপনার যদি প্রশ্ন থাকে তবে মন্তব্যগুলিতে জিজ্ঞাসা করুন।


সুতরাং, আমাদের কি করা উচিত কেবল প্রথম টোন / সেমিটোনকে ব্যাখ্যা করা?
avall

@ ওয়াল আমি দুঃখিত, আমি আপনার প্রশ্নটি বুঝতে পারি না। ইনপুটটি সর্বদা টনিকের সাথে শুরু হবে না , যদি এটি আপনি জিজ্ঞাসা করেন।
অ্যাবসিন্থে

আমাদের আরও উদাহরণ প্রদান করুন। বিশেষত যারা, টনিক দিয়ে শুরু হয় না।
avall


1
@ ডেভিড এই মেটা প্রশ্ন অনুসারে , আমি চ্যালেঞ্জটি শুরু করার পর থেকে 12 দিনের অপেক্ষার পরে আমি স্বল্পতম উত্তরের জন্য গ্রহণটি প্রদান করেছি। আমি ঠিক যখন পরবর্তী সংক্ষিপ্ত উত্তরটি গ্রহণ করতে যাচ্ছিলাম ঠিক তখনই সিজেএম উত্তরটি পোস্ট করা হয়েছিল।
সোমরস

উত্তর:


2

সিজেম - 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);}

সিতে স্ট্রিংগুলি পার্স করা এত সহজ নয়, তাই আমি আরও গাণিতিক পদ্ধতির জন্য গিয়েছিলাম।

আমি পঞ্চম সার্কেলটির সুবিধা নিই। যদি আমরা একই সাথে নোটগুলি se টি সেমিটোন গণনার উপর ভিত্তি করে নোটগুলি সাজিয়ে রাখি ("পঞ্চম" হিসাবে পরিচিত), আমরা দেখতে পেলাম যে কোনও ন্যূনতম স্কেলগুলিতে অনুমোদিত সমস্ত নোটগুলি ধারাবাহিকভাবে notes টি নোট এবং সমস্ত নিষিদ্ধ নোট গঠন করে একটানা 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 হয়ে গেছে যাতে ঠিক 12 টি অর্ধেকটি অষ্টকগুলিতে ফিট করে। পুরানো ফ্যাশনযুক্ত সমাধানটি ছিল চেনাশোনা থেকে উপলব্ধ 12 টির মধ্যে 7 টি নোটই ব্যবহার করা। এজন্য আমাদের 7 অসম ব্যবধানযুক্ত নোটের ভিত্তিতে একটি স্কেল রয়েছে। এটি কিছু এলোমেলো কনভেনশন নয়, এর পিছনে কিছু শক্ত গণিত রয়েছে।
লেভেল নদী সেন্ট

সুবিধামত কারণে পঞ্চম মধ্যে নোটগুলি সাজানোর জন্য এমন অনেকগুলি যন্ত্র রয়েছে (বেহালা এইভাবে সুর করা হয়, এবং বাস গিটারটি চতুর্থ অংশে সুর করা হয়, যা 4: 3 এর অনুপাত)। সবচেয়ে আকর্ষণীয় উদাহরণ (এবং আমি যে একমাত্র উপকরণটি জানি তার মধ্যে ভাল অ্যাকোস্টিক ডিজাইনের জন্য পঞ্চাশতম বৃত্তে নোটগুলি লেখা আছে) হ'ল স্টিলপ্যান : google.es/patents/US7696421 । আপনি এই লেআউটটি দিয়ে কিছু বলবেন না যে আপনি যেটির সাথে নোটটি খানিকটা বেজে যাচ্ছেন ings
স্তর নদী সেন্ট

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 টি অক্ষর

এটি এতটা ছোট নয়, তবে গল্ফিং না করেও এক লাইনে লুপের জন্য একাধিক নেস্ট লিখেছিলাম পাইথনের আনন্দটি find দুর্ভাগ্যক্রমে, আমাকে ইনপুট স্টেটমেন্টটি আলাদা লাইনে লাগাতে হয়েছিল যাতে এটি একাধিকবার কার্যকর না হয়।

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

"পাইথনের আনন্দটি আমি এক লাইনে লুপের জন্য একাধিক নেস্ট লিখেছি": তবে সেগুলি পড়ে আপনি কী আনন্দ পান?
কালেব পল

@ ওয়ানড্যাঙ্কস অবশ্যই নয় ... এটি কেবল লেখার কোডের বিষয়ে!
22:25

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

এটি এখানে চেষ্টা করুন: আদর্শ


3

হাস্কেল - 140

@ স্টেভেভারিল দ্বারা প্রবর্তিত পঞ্চম সম্পত্তি সার্কেলটি ব্যবহার করুন। যদি আমরা যাক 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, চতুর্থ উপাদানটি হল স্কেল নাম।

কোড

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

scala, 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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.