কত সেমিটোন


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-1C... এর জন্য ভেরিয়েবলগুলি 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.