মিউজিক ক্লাফগুলির মধ্যে রূপান্তর করুন


12

আপনি চলে যাওয়ার আগে, এই চ্যালেঞ্জটি করতে আপনাকে বেশি বাদ্যযন্ত্রের স্বরলিপি বুঝতে হবে না।

ব্যাখ্যা

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

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

পত্রক সংগীত

উপরের চিত্রটিতে, রেখার উপরের অর্ধেকটি হ'ল ট্রেবল ক্লাফ, এটি দিয়ে চিহ্নিত করা হয়েছে ট্রেবল ক্লিফ

নীচের অর্ধেকটি বেস ক্লেফ, এ দ্বারা চিহ্নিত oted বাস ক্লেফ

আপনি নীচে-পূর্বের লাইনে একটি নোট ক্লেফ ট্রেবল দেখতে পারেন একটি হল । (আমি এই চ্যালেঞ্জের জন্য ক্লিফ লাইনের বাইরে নোটগুলি গণনা করছি না) বেস ক্লাফের উপর, সর্বনিম্ন লাইনটি একটি জি । এই চ্যালেঞ্জটি সম্পূর্ণ করতে, আপনাকে নিম্নলিখিতগুলি করতে হবে:

প্রতিদ্বন্দ্বিতা

নিম্নলিখিত ফর্মগুলির একটিতে আপনার ইনপুট দেওয়া হয়েছে (আপনার পছন্দ), একে বিপরীত ক্লাফে রূপান্তর করুন। এটি ট্রেবল বা বেস ক্লাফ আপনার ভাষাতে ট্রুথী / ফ্যালসি মান হতে পারে (কেবলমাত্র কোনও দুটি মান নয়), উদাহরণস্বরূপ

এফ # টি বা এফ # সত্য বা এফ # ট্রিবল

কিন্তু না

এফ # -1 বা এফ # 4

স্পেস এবং মূলধন optionচ্ছিক, ফ্ল্যাটগুলি প্রদর্শিত হবে না এবং হোয়াইটস্পেসের পিছনে প্রবেশের অনুমতি নেই।

Input          Expected Output
E   Treble     G
F   Treble     A
F#  Treble     A#
G   Treble     B
G#  Treble     C
A   Treble     C
A#  Treble     C#
B   Treble     D
C   Treble     E
C#  Treble     F
D   Treble     F
D#  Treble     F#
E   Treble     G
F   Treble     A
F#  Treble     A#
G   Bass       E
G#  Bass       F
A   Bass       F
A#  Bass       F#
B   Bass       G
C   Bass       A
C#  Bass       A#
D   Bass       B
D#  Bass       C
E   Bass       C
F   Bass       D
F#  Bass       D#
G   Bass       E
G#  Bass       F
A   Bass       F
A#  Bass       F#

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

পিয়ানো

কালো কীগুলি তীক্ষ্ণ হয়, # দ্বারা চিহ্নিত হয়। মনে রাখবেন যে কোনও # # বা একটি বি # নেই। এর অর্থ হ'ল যদি আপনাকে E # ফেরার পরিবর্তে বাসের ক্লাফের উপর জি # দেওয়া হয় তবে আপনাকে এফ ফিরিয়ে দিতে হবে

এটি , তাই ক্ষুদ্রতম বাইট-কাউন্ট জিতে যায়।


1
আমাদের কি ফ্ল্যাট নিয়ে চিন্তা করতে হবে? ডাবল ফ্ল্যাট / শার্প সম্পর্কে কীভাবে?
mypetlion

1
দয়া করে বিষয়গুলির জন্য ট্যাগ তৈরি করবেন না যা সেগুলি ওয়ারেন্ট করে না।
জোনাথন অ্যালান

3
পিছনের সাদা অংশ ( C পরিবর্তে ফিরে C) ঠিক আছে?
লিন

2
ব্যবহার করছে 1এবং -1(অথবা এমনকি বলছি, 4এবং -4) ক্লেফ সূচকটি ইনপুট দেয়া জন্য অথবা এই শুধুমাত্র গ্রহণযোগ্য হবে যদি তারা আমাদের ভাষায় truthy / falsey মান?
জোনাথন অ্যালান

1
এটি একটি দুর্দান্ত এবং ভালভাবে উপস্থাপিত চ্যালেঞ্জ, তবে সামান্য শিথিল ইনপুট / আউটপুট ফর্ম্যাটগুলির সাথে এটি আরও ভাল আইএমও হতে পারে।
আর্নল্ড

উত্তর:


5

জেলি ,  35  34 বাইট

আমার মনে হচ্ছে কিছু গাণিতিক এই পদ্ধতিতে জিততে পারে।

ØAḣ7µW€ż;€”#$Ẏ
Ç”C4¦”F⁵¦
Ñi+_⁸?4ị¢

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

একটি সম্পূর্ণ প্রোগ্রাম গ্রহণ 1) ক্লিফ সূচক 0বা 1যথাক্রমে বাস বা ট্রেবলের জন্য এবং 2) নোট; এবং ফলাফল নোট মুদ্রণ।

31 বাইট হতে চান যদি -4এবং 4ক্লেফ সূচকটি ইনপুট মান (তারপর যেমন গ্রহণযোগ্য ছিল Ñi+_⁸?4ị¢হতে পারে Ñi+⁸ị¢) কিন্তু যেমন মঞ্জুরিপ্রাপ্ত নয় যদি না -4 falsey হয় এবং 4 যা জেলি জন্য কেস নয় truthy, এই ব্যাখ্যা করা হয়েছে।

কিভাবে?

ফ্যানটম B#এবং E#কীগুলির সাহায্যে একটি কীবোর্ড তৈরি করে, ইনপুটটির সূচকটি সন্ধান করে, 4প্রয়োজনীয় দিক নির্দেশনা অনুসারে, প্রয়োজনীয় ফলগুলি (তাদের উপরের কী) দ্বারা প্রতিস্থাপিত সেই ফ্যান্টম কীগুলির সাহায্যে একটি কীবোর্ডে সূচি ফিরিয়ে দেয়:

ØAḣ7µW€ż;€”#$Ẏ - Link 1, keyboard with phantoms: no inputs
ØA             - alphabet yield        -> ['A', 'B', ..., 'Z']
   7           - literal seven
  ḣ            - head                  -> ['A','B','C','D','E','F','G']
    µ          - new monadic chain, call that K
     W€        - wrap €ach             -> ["A","B","C","D","E","F","G"] ("" being lists of characters)
            $  - last two links as a monad:
          ”#   -   character '#'
        ;€     -   concatenate to €ach -> ["A#","B#","C#","D#","E#","F#","G#"]
       ż       - zip together          -> [["A","A#"],["B","B#"],["C","C#"],["D","D#"],["E","E#"],["F","F#"],["G","G#"]]
             Ẏ - tighten               -> ["A","A#","B","B#","C","C#","D","D#","E","E#","F","F#","G","G#"]

Ç”C4¦”F⁵¦ - Link 2, keyboard with phantoms replaced: no inputs
Ç         - call the last link (1) as a monad  ["A","A#","B","B#","C","C#","D","D#","E","E#","F","F#","G","G#"]
    ¦     - sparse application:
   4      - ...to index: literal four
 ”C       - ...action: character 'C'    -> ["A","A#","B","C","C","C#","D","D#","E","E#","F","F#","G","G#"]
        ¦ - sparse application:
       ⁵  - ...to index: literal ten
     ”F   - ...action: character 'F'    -> ["A","A#","B","C","C","C#","D","D#","E","F","F","F#","G","G#"]

Ñi+_⁸?4ị¢ - Main link: integer, clef (1 Treble / 0 Bass); list of characters, key
                                      e.g. 0; "D#"
Ñ         - next link (1) as a monad (no atom for next link as a nilad, but this works here anyway)
          -                               ["A","A#","B","B#","C","C#","D","D#","E","E#","F","F#","G","G#"]
 i        - first index of key in that    8
      4   - literal four
     ?    - if:
    ⁸     - ...condition: chain's left argument, clef
  +       - ...then: addition
   _      - ...else: subtraction          4
        ¢ - next link as a nilad          ["A","A#","B","C","C","C#","D","D#","E","F","F","F#","G","G#"]
       ị  - index into                    "C"

সবুজ চেক: হুম, সুতরাং এখনও কেউ এই স্কোরটি পরাজিত করতে পারে না - আমি মোটামুটি হতবাক।
জোনাথন অ্যালান

9

বেফুঞ্জ, 70 64 বাইট

~0~:70p##~+2%00p+"A"-~7%2++7%:3%2%00g*:10p+"A"+,00g!10g+#@_"#",@

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

ইনপুটটি ফর্মটিতে হওয়া উচিত C# Trebleবা F Bass, যদিও ক্লিফ কেবল প্রথম অক্ষর (যেমন Tবা B) হতে পারে, যেহেতু বাকি ইনপুট যেভাবেই উপেক্ষা করা হয়।

ব্যাখ্যা

~0        Read the note and push a zero (the purpose of this will become apparent later).
~:70p     Read the following sharp or space and write that out as the next instruction.

এই কোড পরিবর্তন করার ফলে, নির্দেশের পরবর্তী ক্রম দুটি ফর্মের মধ্যে একটি গ্রহণ করবে:

##~       The first # jumps over the second, and thus we perform the read instruction.
 #~       But if there's only one #, we'll ending up skipping the read instruction.

এই সময়ে স্ট্যাক হয় হয় note,0,sharp,spaceবা note,0,space

+2%       Add the top two stack items mod 2, returning 1 if we read a sharp, else 0 if not.
00p       Save this 'sharp' boolean for later use.

এই মুহুর্তে স্ট্যাকটি হয় note,0বা কেবল note(নীচে একটি অন্তর্নিহিত শূন্য সহ) থাকে।

+         By adding the top two items, we combine the 0 (if present) onto the note below.
"A"-      We can then subtract 'A' to convert the note into a number in the range 0 to 6.
~7%2+     Read the T/B clef, then mod 7 and add 2, returning 2 or 5 (the conversion offset).
+7%       Add that offset to our note number, then mod 7, to get the converted note number.
:3%2%     Make a dup, and calculate mod 3 mod 2 to determine the special cases (B# or E#).
00g*      Multiply that by the 'sharp' boolean, since we only care if the input was sharp.
:10p      Duplicate and save this special case boolean for later.
+         Now add it to the note number, since the special cases need to be offset by 1.
"A"+,     Then we can finally convert the number back into a character and output it.
00g!10g+  Now we check if the original note was not sharp, or if this was a special case.
#@_       If so, we exit immediately.
"#",@     Otherwise, we output a '#'.

3

পার্ল 5, 56 বাইট

$_=<>;s/./chr 65+(-4*<>+ord$&)%7/e;s/B#/C/;s/E#/F/;print

STDIN থেকে দুটি লাইন হিসাবে নোট এবং ক্লাফটি পড়ে এবং নতুন নোটটি STDOUT এ মুদ্রণ করে। ক্লাফ ত্রিবাল 0এবং 1খাদ জন্য।


1
ব্যবহার 11 বাইট সংরক্ষণ করতে পারবেন -pপতাকা tio.run/##K0gtyjH9/79YX08/OaNIwcxUW0PXRMvGTju/KEVFTVPVXD/...
Nahuel Fouilleul

3

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

সংবাহন সিনট্যাক্স ইনপুট লাগে (note)(clef)যেখানে clefহয় 0জন্য খাদ এবং 1জন্য ট্রেবল

n=>c=>'FC.DAFCGDAEBF'[k=(parseInt(n,36)*15+!n[1]*90+c)%98%13]+(k<5?'#':'')

ডেমো

কিভাবে?

এটি আমার আগের সংস্করণটির তুলনায় আসলে খানিকটা কম মজার, তবে অন্তর্নিহিত অনুসন্ধান সারণীটি এখন NUL চরিত্রের ট্রিকটি এড়ানোর সময় # শর্তটি F#,C#,(unused),D#,A#,F,C,G,D,A,E,B,Fসংক্ষিপ্ত করতে দেয় - যা আমি কিছুটা সীমান্ত-রেখা ছিল বলে মনে করি।


পূর্ববর্তী সংস্করণ 76 75 বাইট

n=>c=>'ACCDFF.CDEFGABCDE'[k=parseInt(4*!!n[1]+c+n,21)%24%17]+'\0#'[45>>k&1]

ডেমো

কিভাবে?

ইনপুট (এন, সি) নিম্নলিখিত পদক্ষেপের মাধ্যমে প্রক্রিয়া করা হয়:

  1. নোটটিতে একটি # এবং অন্যথায় মিথ্যা ( 0 তে জোর করে ) থাকলে আমরা 4 * !!n[1] + c + nকোথায় সত্য ( 1 তে জোর করা ) !!n[1]এটি প্রথম নির্ধারণ করি । এক্সপ্রেশনটির ফলে একটি সংখ্যার মান হয় যা স্ট্রিং n এর সামনে যুক্ত হয় ।4 * !!n[1] + c

  2. অন্তর্নিহিত পদক্ষেপ: নেতৃস্থানীয় শূন্যগুলি এবং অনুসরণ করা # এড়ানো হবে parseInt()। উদাহরণস্বরূপ, "5G#"আসলে হিসাবে পার্স করা হয় "5G"

  3. আমরা নতুন স্ট্রিংটিকে একটি বেস -21 পরিমাণ হিসাবে পার্স করে দশমিক মানকে রূপান্তর করি।

  4. আমরা মডিউল 24 প্রয়োগ করি।

  5. আমরা মডিউল 17 প্রয়োগ করি।

নীচে প্রত্যাশিত আউটপুট সহ সমস্ত সম্ভাব্য ইনপুট জোড়ার সংক্ষিপ্তসার সারণিটি রয়েছে। নোট করুন যে চূড়ান্ত ফলাফল 0 , 2 , 3 বা 5 হলে আউটপুটটিতে একটি # যুক্ত করতে হবে । সুতরাং বাইনারি মাস্ক 101101 ( দশমিক 45 45 ) ব্যবহার।

 n   | c | (1)   | (2)   | (3) | (4) | (5) | Output
-----+---+-------+-------+-----+-----+-----+-------
"E"  | 1 | "1E"  | "1E"  |  35 |  11 |  11 | "G"
"F"  | 1 | "1F"  | "1F"  |  36 |  12 |  12 | "A"
"F#" | 1 | "5F#" | "5F"  | 120 |   0 |   0 | "A#"
"G"  | 1 | "1G"  | "1G"  |  37 |  13 |  13 | "B"
"G#" | 1 | "5G#" | "5G"  | 121 |   1 |   1 | "C"
"A"  | 1 | "1A"  | "1A"  |  31 |   7 |   7 | "C"
"A#" | 1 | "5A#" | "5A"  | 115 |  19 |   2 | "C#"
"B"  | 1 | "1B"  | "1B"  |  32 |   8 |   8 | "D"
"C"  | 1 | "1C"  | "1C"  |  33 |   9 |   9 | "E"
"C#" | 1 | "5C#" | "5C"  | 117 |  21 |   4 | "F"
"D"  | 1 | "1D"  | "1D"  |  34 |  10 |  10 | "F"
"D#" | 1 | "5D#" | "5D"  | 118 |  22 |   5 | "F#"
-----+---+-------+-------+-----+-----+-----+-------
"E"  | 0 | "0E"  | "E"   |  14 |  14 |  14 | "C"
"F"  | 0 | "0F"  | "F"   |  15 |  15 |  15 | "D"
"F#" | 0 | "4F#" | "4F"  |  99 |   3 |   3 | "D#"
"G"  | 0 | "0G"  | "G"   |  16 |  16 |  16 | "E"
"G#" | 0 | "4G#" | "4G"  | 100 |   4 |   4 | "F"
"A"  | 0 | "0A"  | "A"   |  10 |  10 |  10 | "F"
"A#" | 0 | "4A#" | "4A"  |  94 |  22 |   5 | "F#"
"B"  | 0 | "0B"  | "B"   |  11 |  11 |  11 | "G"
"C"  | 0 | "0C"  | "C"   |  12 |  12 |  12 | "A"
"C#" | 0 | "4C#" | "4C"  |  96 |   0 |   0 | "A#"
"D"  | 0 | "0D"  | "D"   |  13 |  13 |  13 | "B"
"D#" | 0 | "4D#" | "4D"  |  97 |   1 |   1 | "C"

3

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

ফাংশন যা মুদ্রণ STDOUTTrueখাদকে ট্রাবলে Falseরূপান্তরিত করে , এবং ত্রিগুণকে খাদে রূপান্তরিত করে।

def f(n,c):N=ord(n[0])-63-4*c;M=-~N%3<1<len(n);print chr((N+M)%7+65)+n[1:2-M]

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

ব্যাখ্যা:

  • প্রথম বিবৃতি, N=ord(n[0])-63-4*c;নতুন নোটের চিঠির সূচক (0 থেকে 7) গণনা করে, শার্পগুলি উপেক্ষা করে।
    • ord(N[0])-63-4*cবর্তমান চিঠির সূচক পায় এবং 2 টির cপরিবর্তনের মানের উপর নির্ভর করে (পরিবর্তনশীল দিক পরিবর্তন করতে পরিবর্তনশীল) যোগ করে বা বিয়োগ করে 2
  • পরবর্তী বিবৃতিটি M=-~N%3<1<len(n);গণনা করে যে এই পরিবর্তনশীলটি সামঞ্জস্য করতে হবে কিনা। উদাহরণস্বরূপ, যদি নতুন নোটটি হয় Eএবং মূল নোটটি তীক্ষ্ণ থাকে তবে এটি একটিতে সামঞ্জস্য করা দরকার F। শৃঙ্খলিত অসমতা নিম্নলিখিত হিসাবে কাজ করে:
    • -~N%3<1নতুন নোটের সূচকটি ক্রমানুসারে রয়েছে কিনা তা পরীক্ষা করে 3n-1। এটি কেবলমাত্র Eএবং Bদুটি নোটের তাত্পর্যপূর্ণ নয় এমনটি পাওয়া যাবে ।
    • 1<len(n)মূল নোটটিতে একটি ধারালো ছিল কিনা তা পরীক্ষা করে (এটি স্ট্রিংয়ের দৈর্ঘ্য 1-এর চেয়ে বড় করবে)। এটি যেমন প্রয়োজন ততক্ষণে যদি তীক্ষ্ণ না থাকে তবে নতুন নোটের অক্ষরগুলি সামঞ্জস্য করার প্রয়োজন নেই।
    • এটি Mহয় Trueবা এর মান নির্ধারণ করে False, যা যথাক্রমে 1এবং 0যথাক্রমে গণনায় ব্যবহৃত হতে পারে , সুতরাং সমন্বয় সম্পাদন করতে আমাদের কেবলমাত্র এম তে এন এবং মডিউল 7 যুক্ত করতে হবে।
  • চূড়ান্ত বিবৃতি চূড়ান্ত ফলাফল তৈরি করে এবং আউটপুট করে।
    • chr((N+M)%7+65) প্রয়োজনে সামঞ্জস্য যোগ করুন, তারপরে একটি সূচক থেকে মানটিকে একটি অক্ষরে রূপান্তরিত করে।
    • +n[1:2-M]উভয়ই M=0(কোনও সমন্বয় করা হয়নি) এবং মূল মানটিতেও তীক্ষ্ণ চিহ্ন থাকলে একটি তীক্ষ্ণ প্রতীক যুক্ত করা হবে ।

1
দুঃখিত, কেবল 0 এবং 1, ট্রুথি এবং ফালসি বা
টিএন্ডবি

@tfbninja স্পষ্টতার জন্য ধন্যবাদ
ফ্লিপট্যাক

2

জাভা 8, 119 বাইট

n->b->(b?"C D E F G A B C# F F# A# C":"F G A B C D E F# A# C D# F").split(" ")["A B C D E F G A#C#D#F#G#".indexOf(n)/2]

ব্যাখ্যা:

এখানে চেষ্টা করুন।

n->b->         // Method with String and boolean parameters and String return-type
  (b?          //  If it's Treble:
    "C D E F G A B C# F F# A# C"
               //   Use this String
   :           //  Else (it's Bass):
    "F G A B C D E F# A# C D# F")
               //   Use this String
  .split(" ")  //  Split this String by spaces,
   [           //  and then get the item at index:
    "A B C D E F G A#C#D#F#G#".indexOf(n)
               //   Get the index of the String on the left,
    /2]        //   and divide this by 2
               // End of method (implicit / single-line return-statement)

1
99 বাইট সহ আরও একটি সমাধান:n->b->((char)((n.charAt(0)-(b?0:4))%7+65)+n.substring(1)).replaceAll("B#","C").replaceAll("E#","F")
নাহুয়েল ফুইলুল

পছন্দ করুন আমি প্রকৃতপক্ষে একটি চর-কাস্ট দিয়ে কিছু ভাবছিলাম এবং কিছু মডিউলগুলি আরও সংক্ষিপ্ত হতে পারে। তবে যেহেতু এটি আমার বর্তমান উত্তর থেকে কিছুটা পৃথক, তাই আলাদা উত্তর হিসাবে পোস্ট করতে নির্দ্বিধায়। আপনি যদি আমার upvote পেয়ে থাকেন। :)
কেভিন ক্রুইজসেন

0

আর , 111 বাইট

function(k,C,N=paste0(LETTERS[2:15%/%2],c("","#")))sub("E#","F",sub("B#","C",N[which(k==N[(4:17+6*C)%%14+1])]))

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

Ungolfed:

function(k,C){
  N=paste0(LETTERS[2:15%/%2],c("","#")) # Generate a vector of the notes, including E# and B#
  M=N[(4:17+6*C)%%14+1])                # Create a copy that's cycled either up 4 or down 4
  P=N[which(k==M)]                      # Look up the input note in the complementary vector
  P=sub("B#","C",P)                     # Replace B# with C
  P=sub("E#","F",P)                     # Replace E# with F
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.