ব্যঞ্জনা বা বিচ্ছিন্নতা?


36

দুটি নোটের নাম দেওয়া হয়েছে, আপনাকে এমন একটি প্রোগ্রাম লিখতে হবে যা নির্ধারণ করে যে এই দুটি নোটের দ্বারা গঠিত বিরতি ব্যঞ্জনাত্মক বা বিচ্ছিন্ন কিনা if

ভূমিকা

পশ্চিমা সংগীতে, কেবল 12 "বিভিন্ন" টোন রয়েছে। তাদের নাম সর্বনিম্ন থেকে সর্বোচ্চ সাজানো, সেগুলি হল: C, C#, D, D#, E, F, F#, G, G#, A, A#, B। ক্রমটি চক্রাকার, অর্থাত্‍ এটি অনন্তর Cপরে অন্যটির সাথে চলতে থাকে B

দুটি স্বরের মধ্যবর্তী দূরত্বকে অন্তর বলা হয় । উপরের সিরিজের (যেমন C — C#বা E — F) দুটি সংলগ্ন দুটি নোটের মধ্যবর্তী ব্যবধানকে সেমিটোন বলে । আরও দূরবর্তী নোটের মধ্যবর্তী ব্যবধানটি প্রথম থেকে দ্বিতীয় পর্যন্ত পৌঁছানোর জন্য প্রয়োজনীয় সেমিটোন পদক্ষেপগুলির সংখ্যার হিসাবে সংজ্ঞায়িত করা হয় (সম্ভবত অনুক্রমের চারপাশে মোড়ক দেওয়ার সময়)। কয়েকটি উদাহরণ: D to E= 2 টি সেমিটোনস, C to G= 7 টি সেমিটোনস, B to D#= 4 টি সেমিটোনস (এটি ক্রমের চারপাশে মোড়ানো)। 1

এখন, এই অন্তরগুলিকে দুটি বিভাগে বিভক্ত করা হয়েছে: ব্যঞ্জনবর্ণ (আপনি দুটি নোট একবারে খেললে আনন্দিতভাবে শোনা যাচ্ছে) এবং বিচ্ছিন্ন (এত বেশি নয়)।

আসুন ব্যঞ্জন অন্তরগুলি সংজ্ঞায়িত করুন: 0, 3, 4, 5, 7, 8 এবং 9 সেমিটোনগুলি।

তাদের বাকিগুলি অসম্পূর্ণ, যথা: 1, 2, 6, 10 এবং 11 সেমিটোন।

চ্যালেঞ্জ

নিম্নলিখিতটি করার জন্য একটি "প্রোগ্রাম" (শব্দের স্বাভাবিক বিস্তৃত অর্থে: একটি ফাংশন পুরোপুরি ঠিক আছে) লিখুন:

  • একটি ইনপুট হিসাবে দুটি নোটের নাম (উপরের ক্রম থেকে স্ট্রিং) নিন। আপনি নিজের পছন্দ মতো এগুলি নিতে পারেন (স্টিডিন থেকে, আর্গুমেন্ট হিসাবে, যা খুশি তাই আলাদা করে নিতে পারেন এমনকি অক্ষরের তালিকা হিসাবে নির্দ্বিধায় উদার হন (উদাহরণস্বরূপ ["C","#"])) তবে আপনি নোটগুলিতে অন্য কোনও নাম নির্ধারণ করতে পারবেন না (বিশেষত আপনি তাদের 0 থেকে 11 পর্যন্ত সংখ্যা না দিয়ে সংখ্যাগুলি ব্যবহার করতে পারে)।

  • আপনার সংগীত গিকসের জন্য, নোটগুলি অষ্টক ব্যতীত নির্দিষ্ট করা হবে। এই ক্ষেত্রে, নোটগুলি কোন আদেশে আসে এবং কোনটি কম এবং কোনটি বেশি সেগুলিও গুরুত্বপূর্ণ নয়। শেষ অবধি, উপরের তালিকায় আপনার কোনও নাম হ্যান্ডেল করার দরকার নেই। অন্য কোনও enharmonics যেমন E#, কোনও ফ্ল্যাট নেই, ডাবল-পরিবর্তন এবং এই জাতীয় and

  • দুটি পৃথক মান চয়ন করুন। আপনার প্রোগ্রামটি অবশ্যই তাদের মধ্যে একটির আউটপুট আবশ্যক যখনই ইনপুটটিতে দুটি নোট দ্বারা গঠিত বিরতি ব্যঞ্জনাত্মক হয় এবং অন্যটি সেগুলি না হয়। (হতে পারে Trueএবং False, তবে π এবং ই আপনি চাইলে :))

  • এটি একটি কোড-গল্ফ। প্রতিটি ভাষায় বাইটের মধ্যে সংক্ষিপ্ততম প্রোগ্রামটি জয়লাভ করে। আনন্দ কর!

উদাহরণ এবং পরীক্ষার কেস

Note 1    Note 2    Output    Interval [semitones]
  C          D     Dissonant   2
  A#         A#    Consonant   0
  G          D     Consonant   7 (wraparound)
  D#         A     Dissonant   6
  F          E     Dissonant   11
  A          C     Consonant   3

এর মধ্যে আর কোনও বিশেষভাবে বিশ্বাসঘাতকতার মামলা না থাকায় আমি তাদের আরও যুক্ত করি না।

এটি আমার প্রথম চ্যালেঞ্জ, সুতরাং যে কোনও গঠনমূলক সমালোচনা আন্তরিকভাবে স্বাগত :—)। আপনি যদি তত্ত্বের ব্যাখ্যাটি ম্লান দেখতে পান তবে নির্দ্বিধায় প্রশ্ন জিজ্ঞাসা করুন। অবশেষে, আমাকে বলুন করবেন না দয়া করে যে এই একটি প্রতারিত হয় এই বা এই । আমি নিশ্চিত করেছিলাম যে তা নেই। (উত্তরোত্তরটি বেশ অনুরূপ তবে আরও জটিল I আমি ভেবেছিলাম যে কিছুটা সহজ চ্যালেঞ্জ গ্রহণ করা মানুষের পক্ষে যোগ দেওয়া সহজ করে দেবে))


1 : আমি যথাসম্ভব এই ব্যাখ্যাটি সহজ করার চেষ্টা করেছি। অন্তরগুলিকে ঘিরে আরও অনেক তত্ত্ব রয়েছে। এটি ছেড়ে দেওয়ার জন্য দয়া করে আমাকে মারধর করবেন না

উত্তর:


12

জেলি , 21 বাইট

দুটি স্ট্রিংয়ের তালিকা হিসাবে ইনপুট নেয়। রিটার্নস 0বেসুরো জন্য অথবা 1ব্যঞ্জনবর্ণ জন্য।

OḢ6×%21_Lµ€IA“¬ɠṘ’æ»Ḃ

এটি অনলাইন চেষ্টা করুন!

OḢ6×%21_Lµ€IA“¬ɠṘ’æ»Ḃ   - main link
         µ€             - for each note             e.g. ["A#", "C"]
O                       -   convert to ASCII codes  -->  [[65, 35], 67]
 Ḣ                      -   keep the first element  -->  [65, 67]
  6×                    -   multiply by 6           -->  [390, 402]
    %21                 -   modulo 21               -->  [12, 3]
       _L               -   subtract the length     -->  [12, 3] - [2, 1] = [10, 2]
           IA           - absolute difference       -->  8
             “¬ɠṘ’      - the integer 540205
                  æ»    - right-shift               -->  540205 >> 8 = 2110
                    Ḃ   - isolate the LSB           -->  2110 & 1 = 0

তৈরী করা

আমরা প্রথম সচেতন থাকা আবশ্যক ফাংশন যা ফাঃ যে আমরা খুঁজছেন সেটি বিনিময় হল: নোট কোনো জুড়ি জন্য (এ, বি) , আমরা এফ (এ, বি) = এফ (বি, একটি)

যেহেতু অনতি সম্ভব ইনপুট এবং শুধুমাত্র 2 সম্ভব আউটপুট সঙ্গে মোকাবিলা করার জন্য, এটি একটি বরং সহজ হ্যাশ ফাংশন খুঁজে পাওয়া সম্ভব হওয়া আবশ্যক এইচ , যেমন যে | এইচ (একটি) - এইচ (বি) | সীমিত মানের মূল্য নির্ধারণ করে এবং প্রত্যাশিত আউটপুটটির সাথে সম্মত সমস্ত নোটের (এ, বি) সংযোগ -মুক্ত ।

আমরা ফাংশনগুলি এইচ (মুল, মোড) এর সেটটি পরীক্ষা করতে যাচ্ছি যা সংজ্ঞায়িত:

H(mul, mod)(s) = ((ORD(s[0]) * mul) MOD mod) - LEN(s)

ORD(s[0])নোটের প্রথম চরিত্রের ASCII কোডটি কোথায় এবং নোটটির LEN(s)দৈর্ঘ্য ( 2 যদি সেখানে একটি '#'এবং 1 না থাকে তবে) হয়।

নীচে জেএস কোডের একটি মন্তব্য করা সংস্করণ রয়েছে যা বেশ কয়েকটি বৈধ জোড় (মুল, মোড) এবং ফলস্বরূপ বিটমাস্কগুলি খুঁজতে ব্যবহৃত হয়েছিল । অনেকগুলি সম্ভাব্য সমাধান রয়েছে তবে * 6 % 21এই পদ্ধতির সাথে সংক্ষিপ্ততমতম সমাধান ।


3
কীভাবে আপনি এই জিনিসগুলি নিয়ে এসেছেন? আর দ্বিতীয় প্রশ্নের উত্তর নির্বিশেষে: কিভাবে ..?! এস " আক্ষরিক পূর্ণসংখ্যা 540205; ডানে সঙ্গে স্থানান্তরিত (ASCII কোড; 6 গুন; মডিউল 21; প্রথম রাখা; বিয়োগ দৈর্ঘ্য ...);, bitwise-এবং 1 "। আপনার উত্তরগুলি আমাকে প্রতিবারই মুগ্ধ করে রাখে ..
কেভিন ক্রুইজসেন

@ কেভিন ক্রুজসেন আমি মূল জেএস কোডটি যুক্ত করেছি যা এই মানগুলি খুঁজে পেতে ব্যবহৃত হয়েছিল।
আর্নাউল্ড

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

9

এপিএল (ডায়ালগ) , 62 39 বাইট

ব্যবহার ⎕IO←0; 0 ব্যঞ্জনবর্ণ, 1 বিচ্ছিন্ন। বাম আর্গুমেন্ট হিসাবে বেস নোট অক্ষরের তালিকা এবং ডান আর্গুমেন্ট হিসাবে শার্পগুলির তালিকা নেয়।

{⎕A[|-/('C D EF G A '⍳⍺)+⍵=⍕#]∊'BCGKL'}

এটি অনলাইন চেষ্টা করুন!

{} বেনাম ফাংশন যেখানে বাম আর্গুমেন্ট এবং সঠিক যুক্তি

⎕A[... ]∊'BCGKL' হয় একটি lphabet নিম্নলিখিত, স্ট্রিং এর একজন সদস্য দ্বারা সূচীবদ্ধ?

  ⍕# রুট নেমস্পেস ফর্ম্যাট করুন (তীক্ষ্ণ অক্ষর দেয়)

  ⍵= সঠিক আর্গুমেন্টের অক্ষর (তীক্ষ্ণ) এর সমান?

  ()+ নিম্নলিখিত যুক্ত করুন:

   'C D EF G A '⍳⍺ বাম আর্গুমেন্ট সূচক স্ট্রিং মধ্যে অক্ষর

  -/ তাদের মধ্যে পার্থক্য

  | পরম মান


আমরা যারা এপিএলের সাথে অপরিচিত তাদের জন্য একটি ব্যাখ্যা যুক্ত করতে আপত্তি করবেন?
ড্রাকনিস

@ ড্রাকনিস ব্যাখ্যা যোগ করা হয়েছে।
এডম

9

এমএটিএল , 30 27 26 বাইট

,j'DJEFPGIALBC'&mQs]ZP7Mdm

দুটি নোটকে বিভিন্ন লাইনে ইনপুট করে। আউটপুট 0ব্যঞ্জনবর্ণ জন্য, 1বেসুরো জন্য।

এটি অনলাইন চেষ্টা করুন! বা সমস্ত পরীক্ষার কেস যাচাই করুন

ব্যাখ্যা

11-অক্ষরের স্ট্রিং

DJEFPGIALBC

নোট এবং বিচ্ছিন্ন বিরতি উভয়কে এনকোড করে নিন।

প্রোগ্রামটি প্রথমে উপরের স্ট্রিংয়ের ইনপুট অক্ষরের 1-ভিত্তিক সূচকগুলি সন্ধান করে । একটি তীক্ষ্ণ ইনপুট যেমন Dদেবে 1, Eদেবে 3, ..., Cদেবে 11। এই সংখ্যাগুলি 1 × 1 সংখ্যার অ্যারেও বিবেচনা করা যেতে পারে। মত একটি তীক্ষ্ণ ইনপুট C#1 × 2 অ্যারে দেবে [11 0], অর্থাত্ Cঅবস্থানটিতে পাওয়া গেছে 11এবং #পাওয়া যায় নি।

লক্ষ্য করুন যে অক্ষরগুলি JPILকখনই ইনপুটটিতে উপস্থিত হবে না। এখন তারা শুধুমাত্র যাতে উদাহরণস্বরূপ নোট, প্লেসহোল্ডার হিসাবে ব্যবহৃত হয় Eহয় দুই উপরে semitones D। তবে তারা বিচ্ছিন্ন অন্তরগুলি সংজ্ঞায়িত করতেও কার্যকর হবে।

1 × 1 বা 1 1 2 অ্যারের প্রথম এন্ট্রির নম্বরগুলি সেমোটোনগুলিতে নোট পিচের সাথে মিল রয়েছে, তীক্ষ্ণ চিহ্নগুলি গণনা করা হয়নি (এখনও)। লক্ষ্য করুন যে এই সংখ্যা দ্বারা সংজ্ঞায়িত স্কেল শুরু হয় না C; তবে এটি কোনও বিষয় নয় কারণ আমরা কেবল অন্তর চাই, অর্থাত নোটের মধ্যে পার্থক্য । প্রাপ্ত সংখ্যাগুলি বিয়োগ করে বিরতি বা 12 বিয়োগ বিরতি দেবে। তবে প্রথমে আমাদের তীক্ষ্ণ প্রতীকটি বিবেচনা করা উচিত।

তীক্ষ্ণ নোটগুলি বিবেচনা করার জন্য, একটি গোলফি উপায় (এমএটিএল এ) এর 1আগে প্রাপ্ত 1 × 1 বা 1 × 2 অ্যারের প্রতিটি এন্ট্রি যুক্ত করতে হবে এবং তারপরে অ্যারে (2 বাইট) যোগ করতে হবে। সুতরাং অ-তীক্ষ্ণ নোটগুলি দ্বারা 1এবং তীক্ষ্ণ নোটগুলি দ্বারা বৃদ্ধি করা হয় 2। এটি তীক্ষ্ণ নোটগুলিকে 1-সেমিটোন অ-তীক্ষ্ণ নোটগুলির চেয়ে বেশি প্রয়োজন হিসাবে প্রয়োজনীয় as আমরা সমস্ত নোটগুলিতে একটি অতিরিক্ত সেমিটোন যুক্ত করছি, তবে এটি তাদের মধ্যে অন্তরগুলিকে পরিবর্তন করে না। তাই এখন মনে রাখবেন Dপিচ নম্বর দিতে হবে 2, D#দিতে হবে 3, ..., Cদেব 12, C#দেব 13

বেসুরো অন্তর হয় 1, 2, 6, 10, অথবা 11। এগুলির একটি মডুলো -12 প্রতিসাম্য রয়েছে : দুটি নোটের মধ্যে একটি বিরতি যদি বিপরীত ক্রমে নোটগুলির সাথে বিরতি, মডুলো 12, বিচ্ছিন্ন হয় তবেই তা বিরতিযুক্ত।

আমরা যদি স্ট্রিংয়ের পরপর পার্থক্যগুলি গণনা করি তবে আমরা 'DJEFPGIALBC'সংখ্যার ভেক্টরটি পাই

6 -5 1 10 -9 2 -8 11 -10 1

এতে কিছুটা নেতিবাচক মান ছাড়াও বিস্মৃতভাবে বিরক্তিকর অন্তর অন্তর্ভুক্ত রয়েছে যা কার্যকর বা ক্ষতিকারকও হবে না। লক্ষ্য করুন যে এটি JPILস্ট্রিংয়ের অতিরিক্ত অক্ষরের পছন্দ 'DJEFPGIALBC'যা সংবিধানের অন্তরগুলি (ক্রমাগত পার্থক্যের মাধ্যমে) সংজ্ঞায়িত করে।

দুটি ইনপুট নোট অসম্পূর্ণ কিনা তা দেখতে আমরা তাদের পিচ সংখ্যার পরম পার্থক্য নিই । উদাহরণস্বরূপ, Cএবং যথাক্রমে D#সংখ্যা দেবে 12এবং 3সম্পূর্ণ পার্থক্য 9। আসল পার্থক্যটি হবে -9এবং আসল বিরতি হবে 3( -9মডুলো 12 হিসাবে প্রাপ্ত )। তবে উপরে বর্ণিত প্রতিসাম্যকে ধন্যবাদ, আমরা এর 9পরিবর্তে বিবেচনা করতে পারি 3। যেহেতু 9ধারাবাহিক পার্থক্যের ভেক্টরে উপস্থিত নেই, তাই নোটগুলি ব্যঞ্জনবর্ণ।


2
আপনি কীভাবে একই স্ট্রিংয়ে নোটগুলি এবং অসন্তুষ্ট বিরতি উভয়কে এনকোড করেছেন I
celtschk

8

জাভাস্ক্রিপ্ট (ES6), 68 64 বাইট

নোটগুলি কারিরিং সিনট্যাক্সে দুটি স্ট্রিং হিসাবে নেয় (a)(b)। রিটার্নস 0বেসুরো জন্য অথবা 1ব্যঞ্জনবর্ণ জন্য।

a=>b=>488055>>(g=s=>'C D EF G A'.search(s[0])-!s[1])(a)-g(b)+9&1

পরীক্ষার মামলা

ফর্ম্যাট এবং মন্তব্য

a => b =>                       // given the two notes 'a' and 'b'
  488055 >>                     // 19-bit lookup bitmask: 1110111001001110111
    (g = s =>                   // we use g() to convert a note 's' into a semitone index
      'C D EF G A'.search(s[0]) // position of the note: -1 for 'B' (not found) to 9 for 'A'
      - !s[1]                   // subtract 1 semitone if the '#' is not there
    )(a)                        // compute the result for 'a'  --> [ -2 ...  9]
    - g(b)                      // subtract the result for 'b' --> [-11 ... 11]
    + 9                         // add 9                       --> [ -2 ... 20]
  & 1                           // test the bitmask at this position (0 if negative or > 18)

7

জেলি , 26 বাইট

i@€ØAo.SḤ’d5ḅ4µ€ạ/“¢£©½¿‘ċ

একটি মোনাডিক লিঙ্ক দুটি নোটের একটি তালিকা (অক্ষরের তালিকাগুলি হিসাবে) নিয়ে এবং 0ব্যঞ্জনবর্ণের 1জন্য এবং বিচ্ছিন্ন হয়ে ফিরতে returning

এটি অনলাইন চেষ্টা করুন! বা পরীক্ষার স্যুটটিতে সমস্ত ইনপুট দেখুন।

কিভাবে?

i@€ØAo.SḤ’d5ḅ4µ€ạ/“¢£©½¿‘ċ - Link: list of lists of characters, notes
              µ€           - for €ach note in notes: (call the resulting list x)
   ØA                      -   yield the uppercase alphabet
i@€                        -   first index of c in ^ for €ach character, c
                           -     ...note '#' is not there so yields 0 (A->1, B->2,...)
      .                    -   literal one half
     o                     -   or (vectorised)  - e.g. "C#" -> [3, 0] -> [3, 0.5]
       S                   -   sum
        Ḥ                  -   double - that is ...  C C#  D D#  E  F F#  G G#  A A#  B
                                                 ->  6  7  8  9 10 12 13 14 15  2  3  4
         ’                 -   decrement         ->  5  6  7  8  9 11 12 13 14  1  2  3
           5               -   literal five
          d                -   divmod                (e.g. 9 -> [1,4] or 11 -> [2,1])
             4             -   literal four
            ḅ              -   convert from base     (e.g. [1,4] -> 8 or [2,1] -> 9)
                                                 ->  4  5  6  7  8  9 10 11 12  1  2  3
                 /         - reduce x with:
                ạ          -   absolute difference   (e.g. ["G#", "A"] -> [12, 1] -> 11)
                  “¢£©½¿‘  - code-page indices = [1, 2, 6, 10, 11]
                         ċ - count occurrences (1 if in the list, 0 if not)

5

জেলি , 31 বাইট

O_65ị“¢[ḋṃ’b⁴¤+L$€Ḣ€ạ/e“cṾ’b12¤

এটি অনলাইন চেষ্টা করুন!

হুইলি 32 বাইট খুব দীর্ঘ

ব্যাখ্যা

O_65ị“¢[ḋṃ’b⁴¤+L$€Ḣ€ạ/e“cṾ’b12¤  Main link
O                                Cast each character to an int using Python `ord`
 _65                             Subtract 65 (A is 0, G is 7)
     “¢[ḋṃ’b⁴¤                   [2, 3, 5, 7, 9, 10, 0]
     “¢[ḋṃ’                      37058720
           b                     Digits in base
            ⁴                    16
    ị                            Index into this list; this creates the gaps for sharps
                 €               For each sublist
              +L$                Add the length to each element (Sharpens sharp notes)
              +                  Add
               L                 Length
                   €             For each sublist
                  Ḣ              Take the first element
                    ạ/           Absolute difference between the two (unoctaved) pitches # It's convenient that every interval's inverse (?) has the same consonance/dissonance
                      e          Is the semitone difference in
                       “cṾ’b12¤  [1, 2, 6, 10, 11]?
                       “cṾ’      25178
                           b     base
                            12   12

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

সেমিটোন পার্থক্যটি প্রতিসম হতে পারে তবে আপনি এখনও ডুফের ফলাফল পান - উদাহরণস্বরূপ "G#", "A"(বিচ্ছিন্ন) এর মধ্যে একটি পার্থক্য পাওয়া যায় 11যা এতে নেই[1,2,6]
জোনাথন অ্যালান

@ জোনাথান অ্যালান ওহ আহহ্ যে লজ্জাজনক; আমি ভেবেছিলাম যে পরম পার্থক্য স্থির করেছে ... ._। লোল ঠিক করবে
HyperNeutrino


4

গণিত, 55 বাইট

function                                                  arguments        bytes

FreeQ[1|2|6|10|11]@Abs[#-#2&@@Sound`PitchToNumber/@#]&    [{"C","F#"}]     55

ইনপুটটিতে অভ্যন্তরীণ অন্তর্নির্মিত মানচিত্র Sound`PitchToNumberকরুন (দুটি স্ট্রিংয়ের তালিকা), সম্পূর্ণ পার্থক্য নিন, তারপরে বিচ্ছিন্ন বিরতি সংখ্যার জন্য প্যাটার্ন ম্যাচ।


কেবল মজাদার জন্য (অ-প্রতিযোগিতামূলক)

এখানে কিছু সংক্ষিপ্ত ফাংশন রয়েছে যা এই সীমাবদ্ধতা লঙ্ঘন করেছে "আপনি নোটগুলিতে অন্য কোনও নাম নির্ধারণ করতে পারবেন না” " প্রাথমিক Music`প্যাকেজে নোটের ধাপ ( A4 = 440.পূর্ববর্তী) এবং ফাংশন HertzToCents(যা গল্ফ করা যেতে পারে) রয়েছে pred স্ট্রিংয়ের পরিবর্তে, আমরা নোট ধ্রুবকগুলি আর্গুমেন্ট হিসাবে ব্যবহার করব, তবে প্রতিটি ফাংশনের জন্য আলাদা ফর্ম্যাটে দেওয়া হবে।

FreeQ[1|2|6|10|11]@Abs@@Round[.01HertzToCents@#]&         [{C3,Fsharp3}]   50+9=59
FreeQ[1|2|6|10|11]@Abs@Round[17Log[#2/#]]&                [C3,Fsharp3]     43+9=52
FreeQ[1|2|6|10|11]@Abs@Round[17Log@#]&                    [C3/Fsharp3]     39+9=48

প্যাকেজ আমদানিতে <<Music`;9 বাইট লাগে।

এই ফাংশনটি একটি স্ট্রিংকে (যেমন "F#") একটি নোট ধ্রুবক (যেমন Fsharp3) তে রূপান্তর করে :

Symbol[StringReplace[#,"#"->"sharp"]<>"3"]&                                44

একটি অষ্টক চেয়ে বড় অন্তর স্বীকার করতে, প্রতিস্থাপন Abs[…]সঙ্গে Mod[…,12]


কিছু বিরতি কেন অসন্তুষ্ট বলে বিবেচিত হয়? একটি অন্তর দুটি ফ্রিকোয়েনির অনুপাত। অনুপাতের যদি একটি "সাধারণ" অংক এবং ডিনোমিনেটর থাকে তবে এটি আরও ব্যঞ্জনবর্ণ হতে থাকে। ইন 5-সীমা টিউনিং , অনুপাত শুধুমাত্র মৌলিক সংখ্যার পূর্ণসংখ্যা ক্ষমতা মধ্যে কম উপাদান যাবে বা সমান মেজাজ করা 5. কোন ব্যবধান সমান অষ্টক ছাড়াও, একটি হল শুধু ব্যবধান ; এগুলি 2 এর 12 তম মূলের শক্তি ব্যবহার করে কেবলমাত্র কাছাকাছি।

হার্ড-কোডিংয়ের পরিবর্তে যা অন্তরসংখ্যার বিভেদযুক্ত, আমরা ব্যবধানটির একটি যৌক্তিক অনুমান খুঁজে পেতে পারি এবং তারপরে এটির সংখ্যক এবং ডিনোমিনেটরটি "সরল" হয় (যার অর্থ হ'ল 5 এর চেয়ে কম হয় এবং অনুপাত 7 ভাগ করে না)।

এই টেবিলটি সেই প্রক্রিয়াটির প্রতিটি ধাপ দেখায়।

Table[
  Module[{compoundInterval,simpleInterval,rationalApprox,denomLeq5,div7,consonant},
    compoundInterval = Power[2, i/12];
    simpleInterval   = 2^Mod[Log2[compoundInterval], 1];
    rationalApprox   = Rationalize[N@simpleInterval, 1/17];
    denomLeq5        = Denominator[rationalApprox]<=5;
    div7             = Denominator[rationalApprox]>1 && rationalApprox\[Divides]7;
    consonant        = FreeQ[1|2|6|10|11][Mod[i,12]];

    InputForm/@{
      i, simpleInterval, rationalApprox, 
      denomLeq5, div7, denomLeq5 && !div7,
      consonant
    }
  ], {i, 0, 12}
]

i   sInterval  ratio   denomLeq5  div7       den&&!div  | consonant?

0   1          1       True       False      True       | True
1   2^(1/12)   17/16   False      False      False      | False
2   2^(1/6)    9/8     False      False      False      | False
3   2^(1/4)    6/5     True       False      True       | True
4   2^(1/3)    5/4     True       False      True       | True
5   2^(5/12)   4/3     True       False      True       | True
6   Sqrt[2]    7/5     True       True       False      | False
7   2^(7/12)   3/2     True       False      True       | True
8   2^(2/3)    8/5     True       False      True       | True
9   2^(3/4)    5/3     True       False      True       | True
10  2^(5/6)    7/4     True       True       False      | False
11  2^(11/12)  11/6    False      False      False      | False
12  1          1       True       False      True       | True

যুক্তিযুক্ত আনুষঙ্গিকতা 1/17অন্তরালের মধ্যেই থাকে কারণ এটিই সর্ববৃহৎ প্রান্তিক যা সমস্ত 12 টি সমান মেজাজের অন্তরগুলির মধ্যে পার্থক্য করে। আমরা প্রথমে প্যাটার্নের সাথে যুক্তিযুক্ত সংখ্যাগুলি Rational[a_,b_](বা ঠিক a_~_~b_) এর সাথে মেলে এবং তারপরে কেবলমাত্র পূর্ণসংখ্যার সাথে মেলে _

এটি নীচের পরিবর্তে সংক্ষিপ্ত ফাংশনে সমাপ্ত হয় যা নির্ধারণ করে যে একটি স্বেচ্ছাসেবী ফ্রিকোয়েন্সি অনুপাত (1 এর বেশি) ব্যঞ্জনা বা বিচ্ছিন্ন কিনা।

Rationalize[#,1/17]/.{a_~_~b_:>b<=5&&!a∣7,_->True}&       [Fsharp3/C3]     51+9=60

1
ভগবন্, আমাকে বলবেন না ম্যাথামেটিকাল এমনকি একটি builtin হয়েছে এই ডি: ...
Ramillies

3

গণিত, 118 বাইট

FreeQ[{1,2,6,10,11},Min@Mod[Differences[Min@Position["C|C#|D|D#|E|F|F#|G|G#|A|A#|B"~StringSplit~"|",#]&/@{#,#2}],12]]&


ইনপুট ফর্ম

["বিজ্ঞাপন"]

আউটপুট

True->Consonant  
False->Dissonant   

ধন্যবাদ @ জোনাথনফ্রেচ -16 বাইটস


কেবল একটি মন্তব্য: আপনার স্ট্রিং আউটপুট লাগবে না Consonantএবং Dissonant। আপনি তাদের পরিবর্তে যে কোনও দুটি মান আউটপুট করতে পারেন (0/1, ... যাই হোক না কেন)। এটি কিছু বাইট সংরক্ষণ করতে পারে।
Ramillies

1
আপনি বাদ দিতে If[...,0,1]এবং সংজ্ঞা দিতে পারবেন না True->Consonant; False->Dissonant?
জোনাথন ফ্রেচ

1
StringCases["CC#DD#EFF#GG#AA#B",_~~"#"...]- 42 বাইট
celtschk

1
এছাড়াও, 2 বাইটগুলি প্রতিস্থাপনের {1,2,6,10,11}মাধ্যমে সংরক্ষণ করা যেতে পারে1|2|6|10|11
সেলটস্ক

1
@ স্কাইলার নীচের উত্তর দেখুন।
এইচটিএফএফ

3

কাঠকয়লা , 30 বাইট

≔B#A#G#FE#D#C槔o∧⌈ς”⁻⌕ζ⮌θ⌕ζ⮌η

এটি অনলাইন চেষ্টা করুন! লিঙ্কটি কোডটির ভার্জোজ সংস্করণ। ব্যঞ্জনবর্ণের জন্য আউটপুট 1, বিচ্ছিন্নতার জন্য 0। ব্যাখ্যা:

≔B#A#G#FE#D#Cζ                  Store reversed note names in z
                        θ       First input
                       ⮌        Reversed
                     ⌕ζ         Find index in z
                            η   Second input
                           ⮌    Reversed
                         ⌕ζ     Find index in z
                     ⁻          Subtract
               ”o∧⌈ς”           Compressed string 100111011100
              §                 Circularly index
                                Implicitly print

কৌতূহলের বাইরে, গ্লিফটি ⌕ζ" সূচকগুলি অনুসন্ধান করুন" এর জন্য ব্যবহৃত হয় এমন কোনও স্মৃতিবিজ্ঞানের কারণ কি?
জোনা

@ জোনাহ ζহ'ল আগে পরিবর্তনশীল।
নিল

2

জে, 68 বাইট

[:e.&1 2 6 10 11[:(12| -~/)(<;._1',C,C#,D,D#,E,F,F#,G,G#,A,A#,B')i.]

ব্যাখ্যা

জেতে একটি সোজাসাপ্টা, সুপার গল্ফ প্রয়োগ নয়:

  • ক্রমানুসারে ইনপুটটি বক্সযুক্ত আইটেমযুক্ত নোট (কাট ব্যবহার করে উত্পাদিত) হিসাবে দেওয়া হয়।

  • নোটের সীমার মধ্যে তাদের সূচকগুলি সন্ধান করুন: (<;._1',C,C#,D,D#,E,F,F#,G,G#,A,A#,B')i.]

  • দ্বিতীয়টি থেকে প্রথমটি বিয়োগ করুন: -~/

  • 12 দ্বারা ভাগ হয়ে গেলে অবশিষ্ট অংশটি নিন: 12|

  • এটি কোনও বিতর্কিত নোট কিনা তা পরীক্ষা করুন: e.&1 2 6 10 11

এটি অনলাইন চেষ্টা করুন!


2

/// , 90 88 বাইট

/^/"\///^\/\///C^D/##"E/DD"F/E#"G/FD"A/GD"B/AD"#,#/,"B#^B/#"A#/#"A^G#^G^F#/#"F^E^D#^D/#/

এটি অনলাইন চেষ্টা করুন! (একবারে সব পরীক্ষার কেস)

  • কোড পরে ইনপুট রাখুন।
  • ,B#প্রতিটি পরীক্ষার ক্ষেত্রে নোটের নামগুলি পৃথক করুন ।
  • আউটপুট ,ব্যঞ্জনবর্ণের ,#জন্য, বিচ্ছিন্নতার জন্য।
  • ডাবল-পরিবর্তনের জন্য সমর্থন ( ##) বা E#কিছু বিশেষ ক্ষেত্রে। অন্যথায় আউটপুট ,ব্যঞ্জনবর্ণের #,জন্য, বিচ্ছিন্নতার জন্য (মডুলো 12 প্রতিসাম্যকে ধন্যবাদ)
  • একসাথে একাধিক পরীক্ষার কেস পরিচালনা করতে পারে (যদি যুক্তিসঙ্গতভাবে পৃথক করা হয়)
  • ছোট হাতের অক্ষরগুলি ঠিক ছাপা হয় printed

2

সি (জিসিসি) , 91 বাইট

g(char*s){return (s[1]&1|2**s&15)*4/5;}f(char*x,char*y){return (1952220<<g(x)>>g(y))&2048;}

কল: f("A#", "D")

ফেরত মূল্য:

  • ব্যঞ্জনবর্ণ: 2048
  • বিযুক্তি: 0

বোনাস: ফাংশনটি সংবেদনশীল।

এটি অনলাইন চেষ্টা করুন!


উভয় ক্ষেত্রে দুটি অপ্রয়োজনীয় স্থান নেই return (?
জোনাথন ফ্রেচ

আপনি চেষ্টা করতে পারেন g(char*s){s=(s[1]&1|2**s&15)*4/5;}f(char*x,char*y){x=1952220<<g(x)>>g(y)&2048;}এবং দুর্দান্ত সমাধান!
কিউ গাং

1

পাইথন 2, 125 117 83 78 77 বাইট

a,b=map("C C#D D#E F F#G G#A A#B".index,input())
print chr(abs(a-b))in""

যেখানে ""শেষে আসলে অক্ষরগুলি থাকে"\x02\x04\x0c\x14\x16"

অনলাইনে চেষ্টা করে দেখুন!

(+3 কারণ আমি তালিকাটিতে 11 বা 22 টি শুরু করে ভুলে গেছি)

জোনাথন ফ্রেচ থেকে -8 বাইট এবং পাইথন 2 এ স্যুইচ করা ।

-৩ জোনাথন ফ্রেচের পরামর্শ এবং str'এর পরিবর্তে এর সূচক ব্যবহার করে বাইটস list

ইনলাইনিং iএবং নীল এর স্ট্রিং পরামর্শটি বিপরীত করা থেকে 4 বাইট (কেবল -2 সত্যই, আমি যেমন ()জেনারেটরের আশেপাশে ভুলে গেছি )

ইন-ইনলাইনিং iএবং ইনপুট ফর্ম্যাট পরিবর্তন করে -5 বাইট

জোনাথন ফ্রেচের সাথে -1 বাইটস map()এবং অ-প্রিন্টেবলগুলি

বিন্যাসে স্টিডিনের এক লাইনে ইনপুট নেয়:

'C','C#'

Trueঅসম্পূর্ণ, Falseব্যঞ্জনবর্ণ হয়।

পুরানো ব্যাখ্যা:

i='C C#D D#E F F#G G#A A#B'.index
a,b=input()
print abs(i(a)-i(b))in[2,4,12,20]

পাইথন str.indexএকটি মিলের সাবস্ট্রিংয়ের সর্বনিম্ন (ধনাত্মক) সূচকটি দেয়, তাই "ABACABA".index("A") == 0এবং "ABACABA".index("BA") == 1। এর কারণে, আমরা নোটের নামগুলি একটি স্ট্রিংয়ে সমানভাবে ফাঁক করে রাখতে পারি এবং যতক্ষণ না (উদাহরণস্বরূপ) Aআগে আসে ততক্ষণ A#ভাগ করে নেওয়া Aকোনও সমস্যা হবে না।

i='C C#D D#E F F#G G#A A#B'.index

iএখন এমন একটি ফাংশন যা সূচককে 'C C#D D#E F F#G G#A A#B'তার আর্গুমেন্টে ফিরিয়ে দেয় (একটি নোটের নাম) যা 2 * (নোটটি যে সিমিটোনগুলির থেকে শুরু করে C)

a,b=input()

পাইথন 2 এর input()(মূলত) পাইথন 3 এর সমতুল্য eval(input()), সুতরাং বিন্যাসটির বৈধ ইনপুট সহ 'C#','F'(উদাহরণস্বরূপ), a='C#'এবংb='F'

print abs(i(a)-i(b))in[2,4,12,20]

যদি স্ট্রিংয়ে প্রথম নোট এবং দ্বিতীয় নোটের মধ্যে পার্থক্যটি 2, 4, 12, বা 20 না হয় (যেহেতু নোটের নামগুলি 2 টি অক্ষরে প্রতিনিধিত্ব করা হয়), তবে অন্তরটি বিচ্ছিন্ন, সত্য মুদ্রণ করুন, অন্যথায় এটি ব্যঞ্জনাযুক্ত, মিথ্যা মুদ্রণ।


ইনপুট ফর্ম্যাটটি কঠোর না eval(input())হওয়ায় আপনি input().split()(15 বাইট) পরিবর্তে (13 বাইট) ব্যবহার করতে পারেন ।
জোনাথন ফ্রেচ




1
আপনি একটি এমটিপি স্ট্রিংয়ের পরিবর্তে ইউনিকোড অক্ষর ( ) ব্যবহার করতে পারেন ।
জোনাথন ফ্রেচ

1

সি (জিসিসি) , 115117 120 বাইট

g(char*a){a=*a-65+!!a[1]*(7-*a/70-*a/67);}f(x,y)char*x,*y;{x="(pP$HL<lt<X"[g(x)]*32+"=ZukW-^h1F6"[g(x)]>>g(y)&1;}

এটি অনলাইন চেষ্টা করুন!

ব্যঞ্জনা এবং বিচ্ছিন্নতার জন্য 1/0 ফেরত দিন। খাঁটি সি দিয়ে স্ট্রিং ম্যানিপুলেশন করা সবসময় আকর্ষণীয় inputf("A#", "C")


0

পাওয়ারশেল , 107 বাইট

param($a,$b)[math]::abs(($x=-split'C C# D D# E F F# G G# A A# B').indexof($b)-$x.indexof($a))-in1,2,6,10,11

এটি অনলাইন চেষ্টা করুন!

Trueঅসন্তুষ্ট এবং Falseব্যঞ্জনবর্ণের জন্য আউটপুট ।

ইনপুট নেয় $aএবং $b, দুটি নোট, স্ট্রিং হিসাবে। -splitনোটগুলির একটি অ্যারে তৈরি করতে, সেইগুলিতে সঞ্চয় করে, স্কেলে একটি অপারেশন সঞ্চালিত করে, যা সাদা স্থানগুলিতে বিভক্ত হয় $x। অনুসন্ধান করে .indexof $bযে অ্যারের মধ্যে, সূচক subtracts $a, এবং তারপর লাগে absolute মান উহার। এই সংখ্যাটি -inঅসম্পূর্ণ পরিসীমা কিনা তা পরীক্ষা করে ।



0

এসকিউএল, 582 বাইট

এসকিউএল ফিডল

এটি করার জন্য আমার এখনও কিছু গল্ফ রয়েছে, তবে এটি সম্পূর্ণরূপে ভেঙে যাওয়ার আগে আমি এখানে এটি নামিয়ে আনতে চেয়েছিলাম।

যদি ইনপুটটি কোনও অক্ষরের বিন্যাসে থাকে, তবে সেই অক্ষরগুলি মান সহ একটি টেবিলে রাখা ঠিক আছে, তাই না?

CREATE TABLE N(N char(2),v int)
Insert Into N values('A',1),('A#',2),('B',3),('C',4),('C#',5),('D',6),('D#',7),('E',8),('F',9),('F#',10),('G',11),('G#',12);
CREATE TABLE D(D char(9),v int) 
Insert Into D values('C',0),('D',1),('D',2),('C',3),('C',4),('C',5),('D',6);
CREATE FUNCTION I(@A char(2),@B char(2))
RETURNS char(9) as
BEGIN
DECLARE @E int=(SELECT v from N where n=@A),@F int=(SELECT v from N where n=@B)
DECLARE @C char(9) = (SELECT case D when 'D' then 'Dissonant' when 'C' then 'Consonant' END from D where v in(abs(@e-@f),12-abs(@e-@f)))
RETURN isnull(@C,'NotANote')
END

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