কত সেমিটোন


21

নির্দেশিকা

কার্য

দুটি নোট দেওয়া, স্ট্রিং বা তালিকাগুলি / অ্যারে হিসাবে ইনপুট করা, গণনা করুন যে তারা কতগুলি সেমিটোন পৃথক রয়েছে (নোটগুলি নিজেরাই অন্তর্ভুক্ত), সংখ্যা হিসাবে আউটপুট করে।

একটি সেমিটোন ব্যাখ্যা:

একটি সেমিটোন কীবোর্ডের এক ধাপ উপরে বা নীচে। সি থেকে সি # এর একটি উদাহরণ। আপনি দেখতে পাচ্ছেন নীচের নোটটি সি একটি সাদা নোটে রয়েছে এবং সি # এটির উপরে একটি কালো নোট। সিমিটোনগুলি হ'ল একটি কালো নোট থেকে পরবর্তী সাদা নোটে উপরে বা নীচে, বাদে:

  • বি থেকে সি
  • সি থেকে বি
  • E থেকে F
  • এফ থেকে ই

কীবোর্ড

উদাহরণ

'A, C' -> 4

'G, G#' -> 2

'F#, B' -> 6

'Bb, Bb' -> 13


বিধি

  • দুটি নোটের মধ্যে বৃহত্তম দূরত্ব 13 টি সেমিটোন।
  • দ্বিতীয় ইনপুটযুক্ত নোটটি সর্বদা প্রথম ইনপুট করা নোটের উপরে থাকবে।
  • আপনি ইনপুটটিকে স্ট্রিং বা অ্যারে / তালিকা হিসাবে নিতে পারেন। আপনি যদি এটি স্ট্রিং হিসাবে গ্রহণ করেন তবে নোটগুলি কমা দ্বারা পৃথক করা হবে (যেমন String -> 'A, F', Array -> ['A', 'F'])।
  • আপনি ধরে নিতে পারেন যে আপনাকে সর্বদা দুটি বৈধ নোট দেওয়া হবে।
  • তীক্ষ্ণ হিসাবে চিহ্নিত করা #হবে এবং ফ্ল্যাট হিসাবে চিহ্নিত করা হবেb
  • আপনার কোড অবশ্যই enharmonic সমতুল্য সমর্থন করে (যেমন এটি অবশ্যই F # এবং Gb উভয়ই সমর্থন করে)
  • আপনার কোডটির সাথে নামযুক্ত নোটগুলি সমর্থন করার দরকার নেই, তবে একটি ধারালো বা ফ্ল্যাট ছাড়াই নামকরণ করা যেতে পারে (যেমন আপনার E #, বা Cb সমর্থন করার প্রয়োজন নেই)। বোনাস পয়েন্টগুলি যদি আপনার কোডটি সমর্থন করে তবে।
  • আপনার কোডটিতে ডাবল শার্প বা ডাবল ফ্ল্যাট সমর্থন করার দরকার নেই।
  • আপনি ধরে নিতে পারেন যে আপনি যদি একই নোট বা একই পিচ (উদাহরণস্বরূপ 'জিবি, জিবি' বা 'এ #, বিবি') পান তবে দ্বিতীয়টি প্রথমটির ওপরে একটাকা হবে না।
  • এটি কোড গল্ফ তাই ন্যূনতম পরিমাণে বাইট জিততে উত্তর।

আমি 2 পেয়েছি G -> G#কারণ তারা উভয়ই অন্তর্ভুক্ত।
— হাইপারনিউট্রিনো

@ হাইপারনিউট্রিনো ইয়েপ দুঃখিত আমার পক্ষ থেকে ভুল।
— আমোরিস

1
আমাদের কি নোটের মতো Cbবা যত্ন নিতে হবে E#? ডাবল শার্প / ফ্ল্যাটগুলি সম্পর্কে কী?
— সুক

1
@ সোক না, আপনার কোডে E # বা Cb এর মতো নোটগুলি সমর্থন করার দরকার নেই এবং এর জন্য ডাবল শার্প বা ফ্ল্যাটগুলি সমর্থন করার দরকার নেই। প্রশ্নটি আরও পরিষ্কার করার জন্য আমি আপডেট করেছি। কোন বিভ্রান্তির জন্য দুঃখিত।
— আমোরিস

2
কেবল স্পষ্ট করে বলার জন্য, যখন কোনও সঙ্গীত তত্ত্ব থেকে সেমোনোনগুলির মধ্যে জ্ঞানের দূরত্ব থেকে কথা বলার সময় আপনি যে নোটটি শুরু করেছিলেন তা অন্তর্ভুক্ত হয় না । গাণিতিক ক্ষেত্রে এটি প্রতিনিধিত্ব করা হয় (X, Y]যেহেতু সি থেকে সি # 1 সেমিটোন এবং সি থেকে সি 12 সেমিটোন হয়।
— ডোম

উত্তর:


7

পাইথন 2 , 66 বাইট

r=1
for s in input():r=cmp(s[1:]+s,s)-ord(s[0])*5/3-r
print-r%12+2

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


পাইথন 2 , 68 বাইট

lambda s,t:13-(q(s)-q(t))%12
q=lambda s:ord(s[0])*5/3+cmp(s,s[1:]+s)

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


বি # এবং এফবি এর মতো নোটগুলি পরিচালনা করতে সক্ষম হওয়ার জন্য অতিরিক্ত পয়েন্টগুলি এখনও এখনও সংক্ষিপ্ততম অবশেষে রয়ে গেছে।
— আমোরিস

7

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

@ নীলকে ধন্যবাদ 1 বাইট সংরক্ষিত

সিনট্যাক্সের কারিঙে নোটগুলি নেয় (a)(b)।

a=>b=>((g=n=>'0x'+'_46280ab_91735'[parseInt(n+3,36)*2%37%14])(b)-g(a)+23)%12+2

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

হ্যাশ ফাংশন

হ্যাশ ফাংশনটির উদ্দেশ্য হেক্সাডেসিমালে সঞ্চিত সেমিটোন অফসেট (সি = 0, সি # = 1, ..., বি = 11) সমেত একটি অনুসন্ধানের টেবিলের পয়েন্টারে একটি নোটকে রূপান্তর করা।

আমরা প্রথমে সংযোজন একটি '3' যুক্ত করব এবং ফলাফলটি স্ট্রিংটি বেস -36 এ পার্স করব, যার ফলে পূর্ণসংখ্যার এন হবে । যেহেতু '#' একটি অবৈধ অক্ষর, এটি অনুসরণ করা কোনও অক্ষর পাশাপাশি এটি উপেক্ষা করা হবে।

তারপরে আমরা গণনা:

H(N) = ((N * 2) MOD 37) MOD 14

নীচে ফলাফলের সংক্ষিপ্তসার রইল।

 note | +'3' | parsed as | base 36->10 |   *2  | %37 | %14 | offset
------+------+-----------+-------------+-------+-----+-----+--------
  C   |  C3  |    c3     |         435 |   870 |  19 |   5 |  0x0
  C#  |  C#3 |    c      |          12 |    24 |  24 |  10 |  0x1
  Db  |  Db3 |    db3    |       17247 | 34494 |  10 |  10 |  0x1
  D   |  D3  |    d3     |         471 |   942 |  17 |   3 |  0x2
  D#  |  D#3 |    d      |          13 |    26 |  26 |  12 |  0x3
  Eb  |  Eb3 |    eb3    |       18543 | 37086 |  12 |  12 |  0x3
  E   |  E3  |    e3     |         507 |  1014 |  15 |   1 |  0x4
  F   |  F3  |    f3     |         543 |  1086 |  13 |  13 |  0x5
  F#  |  F#3 |    f      |          15 |    30 |  30 |   2 |  0x6
  Gb  |  Gb3 |    gb3    |       21135 | 42270 |  16 |   2 |  0x6
  G   |  G3  |    g3     |         579 |  1158 |  11 |  11 |  0x7
  G#  |  G#3 |    g      |          16 |    32 |  32 |   4 |  0x8
  Ab  |  Ab3 |    ab3    |       13359 | 26718 |   4 |   4 |  0x8
  A   |  A3  |    a3     |         363 |   726 |  23 |   9 |  0x9
  A#  |  A#3 |    a      |          10 |    20 |  20 |   6 |  0xa
  Bb  |  Bb3 |    bb3    |       14655 | 29310 |   6 |   6 |  0xa
  B   |  B3  |    b3     |         399 |   798 |  21 |   7 |  0xb

ফ্ল্যাট এবং তীক্ষ্ণ সম্পর্কে

নীচে প্রমাণ রয়েছে যে এই হ্যাশ ফাংশনটি নিশ্চিত করে যে '#' এর পরে একটি নোট 'বি' অনুসরণকারী পরবর্তী নোটের চেয়ে একই ফলাফল দেয় । এই অনুচ্ছেদে, আমরা বেস -36 পরিমাণের জন্য @ উপসর্গটি ব্যবহার করি ।

উদাহরণস্বরূপ, ডেটাবেস রূপান্তরিত হবে @ db3 এবং C # এর রূপান্তরিত হবে @c (পূর্ববর্তী অনুচ্ছেদ দেখুন)। আমরা তা প্রমাণ করতে চাই:

H(@db3) = H(@c)

বা সাধারণ ক্ষেত্রে, ওয়াই = এক্স + 1 সহ :

H(@Yb3) = H(@X)

@ B3 হয় 399 দশমিক হবে। অতএব:

H(@Yb3) =
@Yb3 * 2 % 37 % 14 =
(@Y * 36 * 36 + 399) * 2 % 37 % 14 =
((@X + 1) * 36 * 36 + 399) * 2 % 37 % 14 =
(@X * 1296 + 1695) * 2 % 37 % 14

1296 থেকে সর্বসম হয় 1 মডিউল 37 , তাই এই হিসাবে সরলীকৃত করা যেতে পারে:

(@X + 1695) * 2 % 37 % 14 =
((@X * 2 % 37 % 14) + (1695 * 2 % 37 % 14)) % 37 % 14 =
((@X * 2 % 37) + 23) % 37 % 14 =
((@X * 2 % 37) + 37 - 14) % 37 % 14 =
@X * 2 % 37 % 14 =
H(@X)

একটি বিশেষ কেস হ'ল জি # থেকে আবে স্থানান্তর , যেমন উপরের সূত্রগুলি মেনে চলার জন্য আমরা এইচবি আশা করে থাকি । তবে, এটিও কাজ করে কারণ:

@ab3 * 2 % 37 % 14 = @hb3 * 2 % 37 % 14 = 4

@ নীল ধন্যবাদ! আপনার অপ্টিমাইজেশন আমার চেয়ে বেশি বাইট সংরক্ষণ করে।
— আর্নল্ড

হু, আমি আসলে আমার ব্যাচের সমাধানের সাথে বিপরীতটি পেয়েছি ...
— নিল

@ নীল যেহেতু ব্যাচে মডুলোর চিহ্নটি বিভাজনের চিহ্ন, আমার ধারণা?
— আর্নল্ড

না, এটি ডিভিডেন্ডের লক্ষণ, জেএস-এর মতোই, তবে ফলাফলের লক্ষণটি সংশোধন করার জন্য এটি কিছুটা গল্ফিয়ার হিসাবে প্রমাণিত হয়েছিল যা পূর্বের গল্ফের কারণে উল্টানো হয়েছিল।
— নিল

4

পার্ল, 39 32 বাইট

+1জন্য অন্তর্ভুক্তp

STDIN- এ দুটি লাইন হিসাবে শুরু এবং শেষের নোটগুলি দিন

(echo "A"; echo "C") | perl -pe '$\=(/#/-/b/-$\+5/3*ord)%12+$.}{'; echo

শুধু কোড:

$\=(/#/-/b/-$\+5/3*ord)%12+$.}{


@ ওয়াস্টল তাই আমাকে বলা হয়েছে। আমি কোন মেটা পোস্টটি জানতে চাই যদিও আমি সেখানে গিয়ে একমত হতে পারি না :-)
— টন হসপেল

আমার মন্তব্য একটি লিঙ্ক। এটি ক্লিক করুন নির্দ্বিধায়।
— wastl

দেখে মনে হচ্ছে এটি আমার মতো একইভাবে কাজ করে - তবে পার্লের জন্য দুর্দান্তভাবে সংক্ষিপ্ত, +1
— লেভেল রিভার সেন্ট

@ লেভেলরিভারস্ট ভাল, এটি টন হসপেল।
— msh210

4

জাপট , 27 বাইট

®¬x!b"C#D EF G A"ÃrnJ uC +2

এটি অনলাইন পরীক্ষা! দুটি স্ট্রিংয়ের অ্যারে হিসাবে ইনপুট নেয়।

যে কোনও বেস নোটে কোনও পরিমাণ পরিমাণ শার্প বা ফ্ল্যাটগুলির জন্যও কাজ করে!

ব্যাখ্যা

®¬x!b"C#D EF G A"ÃrnJ uC +2   Let's call the two semitones X and Y.
®                Ã            Map X and Y by
 ¬                              splitting each into characters,
  x                             then taking the sum of
   !b"C#D EF G A"               the 0-based index in this string of each char.
                                C -> 0, D -> 2, E -> 4, F -> 5, G -> 7, A -> 9.
                                # -> 1, adding 1 for each sharp in the note.
                                b -> -1, subtracting 1 for each flat in the note.
                                B also -> -1, which happens to be equivalent to 11 mod 12.
                                The sum will be -2 for Bb, 2 for D, 6 for F#, etc.
                              Now we have a list of the positions of the X and Y.
                  rnJ         Reduce this list with reversed subtraction, starting at -1.
                              This gets the difference Y - (X - (-1)), or (Y - X) - 1.
                      uC      Find the result modulo 12. This is 0 if the notes are 1
                              semitone apart, 11 if they're a full octave apart.
                         +2   Add 2 to the result.

2

পার্ল 5 + -p, 66 বাইট

s/,/)+0x/;y/B-G/013568/;s/#/+1/g;s/b/-1/g;$_=eval"(-(0x$_-1)%12+2"

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

কমা-বিচ্ছিন্ন মান নেয়। সিবি, বি #, ই #, এফবি এবং একাধিক # / বি এর জন্যও কাজ করে।

ব্যাখ্যা:

# input example: 'G,G#'
s/,/)+0x/; # replace separator with )+0x (0x for hex) => 'G)+0xG#'
y/B-G/013568/; # replace keys with numbers (A stays hex 10) => '8)+0x8#'
s/#/+1/g; s/b/-1/g; # replace accidentals with +1/-1 => '8)+0x8+1'
$_ = eval # evaluate => 2
    "(-(0x$_-1)%12+2" # add some math => '(-(0x8)+0x8+1-1)%12+2'

খোলার জন্য ব্যাখ্যা:

(
    - (0x8) # subtract the first key => -8
    + 0x8 + 1 # add the second key => 1
    - 1 # subtract 1 => 0
) % 12 # mod 12 => 0
+ 2 # add 2 => 2
# I can't use % 12 + 1 because 12 (octave) % 12 + 1 = 1, which is not allowed

2

রুবি , 56 বাইট

->a{a.map!{|s|s.ord*5/3-s[-1].ord/32}
13-(a[0]-a[1])%12}

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

চিঠিগুলি নিম্নলিখিত অনুযায়ী তাদের ASCII কোড সময় অনুসারে পার্স করা 5/3হয় (এটি প্রয়োজনীয় সংখ্যক সেমিটোন সংখ্যা এবং 108 এর অফসেট দেয়)

A    B    C    D    E    F    G
108  110  111  113  115  116  118

গত অক্ষর ( #, bনিম্নরূপ বা আবার চিঠি) 32 দ্বারা বিভক্ত তার হওয়া ASCII কোড হিসেবে পার্স করা হয়

# letter (natural) b 
1  { --- 2 --- }   3

এটি চিঠি কোড থেকে বিয়োগ করা হয়।

তারপরে চূড়ান্ত ফলাফল হিসাবে ফেরত দেওয়া হয় 13-(difference in semitones)%12


2

স্ট্যাক্স , 25 24 বাইট

╝─°U┤ƒXz☺=≡eA╕δ┴╬\¿☺zt┼§

এটি চালান এবং অনলাইনে ডিবাগ করুন

একই প্রোগ্রামটির সংশ্লিষ্ট আসকি উপস্থাপনাটি এটি।

{h9%H_H32/-c4>-c9>-mrE-v12%^^

কার্যকরভাবে, এটি সূত্র ব্যবহার করে প্রতিটি নোটের কীবোর্ড সূচক গণনা করে, তারপরে ফলাফল অন্তরালে গণনা করে।

  1. বেস নোট, এ = 2, বি = 4, ... জি = 14 থেকে শুরু করুন
  2. দুর্ঘটনাজনিত অফসেট 2 - code / 32কোথায় গণনা করুনcode শেষ চরিত্রের আসকি কোড।
  3. এগুলি একসাথে যুক্ত করুন।
  4. ফলাফলটি যদি> 4 হয় তবে বি # সরানোর জন্য 1 টি বিয়োগ করুন।
  5. ফলাফলটি যদি 7 হয় তবে E # সরানোর জন্য 1 টি বিয়োগ করুন।
  6. দুটি ফলাফলের নোট সূচকে হালকাভাবে বিয়োগ করুন এবং 1 যুক্ত করুন।

1
["F#","B"]6 হওয়া উচিত
— ওয়েইজুন চিউ

1
ধন্যবাদ। আমি অন্যটিকে সামঞ্জস্য না করে গণনার এক অর্ধেক পরিবর্তন করেছি। এটা ঠিক আছে।
— পুনরাবৃত্তি

1

ব্যাচ, 136 135 বাইট

@set/ac=0,d=2,e=4,f=5,g=7,a=9,r=24
@call:c %2
:c
@set s=%1
@set s=%s:b=-1%
@set/ar=%s:#=+1%-r
@if not "%2"=="" cmd/cset/a13-r%%12

ব্যাখ্যা: cসাবরুটিনের বিকল্পগুলি #নোটের নামের সাথে +1এবং bসাথে প্রতিস্থাপন করে -1। এই ক্ষেত্রে সংবেদনশীল হয়, Bbহয়ে ওঠে -1-1। C... এর জন্য ভেরিয়েবলগুলি A(এছাড়াও সংবেদনশীল ক্ষেত্রেও নয়) তাই যথাযথ সংখ্যক সেমিটোন থেকে দূরে বেছে নেওয়া হয়েছে B=-1। ফলস্বরূপ স্ট্রিং এর পরে মূল্যায়ন করা হয় এবং @ xnor এর মানটি থেকে ফলাফল বিয়োগ করার কৌশলটি একে অপরের থেকে নোটের মানগুলি বিয়োগ করার পছন্দসই প্রভাব দেয়। সম্পাদনা: পরিশেষে আমি @ আর্নৌল্ডের 1 টি বাইট সংরক্ষণ করে কাঙ্ক্ষিত উত্তরটি অর্জন করতে 13 থেকে মডিউলগুলি বিয়োগ করার কৌশল ব্যবহার করি।


1

পাইথন 3 , 95 বাইট

lambda a,b:(g(b)+~g(a))%12+2
g=lambda q:[0,2,3,5,7,8,10][ord(q[0])-65]+" #".find(q.ljust(2)[1])

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

-14 বাইট ব্যবহারকারী 71546 ধন্যবাদ


-8 বাইট ord(q[0])-65প্রতিস্থাপনের সাথে "ABCDEFG".find(q[0]);)
— শিয়ারু আসাকোটো

ওহ, (g(b)+~g(a))%12+2প্রতিস্থাপনের সাথে আরও 6 বাইট1+((g(b)-g(a))%12or 12)
— শিয়েরু আসাকোটো 20'18

@ ইউজার 71546 ওহ দুর্দান্ত, ধন্যবাদ!
— হাইপারনিউট্রিনো

1

জেলি , 28 বাইট

O64_ṠH$2¦ḅ-AḤ’d5ḅ4µ€IḞṃ12FṪ‘

একটি মোনাডিক লিঙ্ক অক্ষরের দুটি তালিকার একটি তালিকা গ্রহণ করে এবং পূর্ণসংখ্যা ফেরত দেয়।

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

কিভাবে?

শূন্য থেকে বারোটি পূর্ণসংখ্যার উপর নোটগুলি ম্যাপ করার জন্য ইনপুট অক্ষরের অর্ডিনালে কিছু উদ্ভট গাণিতিক সম্পাদন করে এবং তারপরে বারো দ্বারা মডুলোর জন্য প্রক্সি হিসাবে একটি বেস-ডিকম্প্রেশন সম্পাদন করে যেখানে শূন্যটি 12 দ্বারা প্রতিস্থাপিত হয় তারপরে একটি যুক্ত করে।

O64_ṠH$2¦ḅ-AḤ’d5ḅ4µ€IḞṃ12FṪ‘ - Main link, list of lists    e.g. [['F','#'],['B']]  ...or [['A','b'],['G','#']]
                  µ€         - for €ach note list          e.g.  ['F','#'] ['B']          ['A','b'] ['G','#']
O                            - { cast to ordinal (vectorises)    [70,35]   [66]           [65,98]   [71,35]
 64                          -   literal 64
   _                         -   subtract (vectorises)           [-6,29]   [-2]           [-1,-34]  [-7,29]
        ¦                    -   sparse application...
       2                     -   ...to indices: [2] (just index 2)
      $                      -   ...do: last two links as a monad:
    Ṡ                        -          sign                     [-6,1]    [-2]           [-1,-1]   [-7,1]
     H                       -          halve                    [-6,-0.5] [-2]           [-1,-0.5] [-7,0.5]
         ḅ-                  -   convert from base -1            5.5       -2             0.5       7.5
           A                 -   absolute value                  5.5       2              0.5       7.5
            Ḥ                -   double                          11.0      4              1.0       15.0
             ’               -   decrement                       10.0      3              0.0       14.0
              d5             -   divmod by 5                     [2.0,2.0] [0,3]          [0.0,0.0] [2.0,4.0]
                ḅ4           -   convert from base 4             10.0      3              0.0       12.0
                             - } -->                             [10.0,3]                 [0.0,12.0]
                    I        - incremental differences           [-7.0]                   [12.0]
                     Ḟ       - floor (vectorises)                [-7]                     [12]
                      ṃ12    - base decompress using [1-12]      [[5]]                    [[1,12]]
                         F   - flatten                           [5]                      [1,12]
                          Ṫ  - tail                              5                        12
                           ‘ - increment                         6                        13

২৮ বাইটেও ...

এক্সনোর পাইথন 2 উত্তরের একটি (এত সরাসরি নয়) বন্দর ...

O×5:3z60_Ṡ¥2¦60U1¦Fḅ-‘N%12+2

সমস্ত সম্ভাব্য কেস চেষ্টা করুন


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