টিউনিং স্ট্রিংস


9

কার্য

নোটটি কতটা সেন্টের বাইরে সুরক্ষিত আছে তার সাথে একটি নির্দিষ্ট ফ্রিকোয়েন্সিটিতে সুরযুক্ত একটি নির্দিষ্ট পয়েন্টে চেপে একটি প্রোগ্রাম লিখুন।

সরলতার স্বার্থে, ধরে নিই যে উত্পাদিত শব্দটির ফ্রিকোয়েন্সি এবং স্ট্রিংয়ের দৈর্ঘ্য যেখানে চাপছে তার ডানদিকে বিপরীতভাবে আনুপাতিক।

দ্রষ্টব্য: এই টাস্কটি সম্পূর্ণরূপে মৌলিক স্বরে কাজ করে, ওভারটোনস / অন্যান্য সুরেলা বা সুরকারীর সাথে নয়।

ইনপুট

আপনার প্রোগ্রামে ডেটা দুটি টুকরা দেওয়া হয়:

  • প্রশ্নবিদ্ধ স্ট্রিংকে উপস্থাপন করে নির্বিচারে দৈর্ঘ্যের একটি স্ট্রিং। এই স্ট্রিংটি একটি এক্স দিয়ে চিহ্নিত করা হবে যেখানে স্ট্রিংটি চেপে রাখা হবে।

    [-----] is a string divided in six sections (five divisions).
    [--X--] is a string pressed at the exact center of the string.
    [X----] is a string pressed at 1/6 the length of the string. (Length used is 5/6)
    [-X--] is a string pressed at 2/5 of the length of the string. (Length used is 3/5)
    

    ধরুন নোটটি ডানদিকে স্ট্রিংয়ের অংশটি ব্যবহার করে শোনানো হয়েছে X

  • একটি সংখ্যা (অগত্যা কোনও পূর্ণসংখ্যার নয়), স্ট্রিংটি যে ফ্রিকোয়েন্সিটিতে সুর করা হয় তা নির্দেশ করে। এই সংখ্যার যথার্থতা দশমিকের চেয়ে বেশি চার অঙ্কের হবে।

ধারণা করা যেতে পারে যে পাস করা ফ্রিকোয়েন্সিগুলি 10 Hzএবং এর মধ্যে থাকবে 40000 Hz

ইনপুট আপনার পছন্দের বিন্যাসে পাস হতে পারে। আপনার উত্তরে আপনার প্রোগ্রামে কীভাবে ইনপুট গ্রহণ করা হবে তা দয়া করে নির্দিষ্ট করুন।

আউটপুট

আপনার প্রোগ্রামটি অবশ্যই বারো-টোন সমান মেজাজের টিউনিং সিস্টেমের নিকটতম নোট * এবং সেন্টারের সংখ্যার নিকটতম নোট থেকে দূরে অবশ্যই আউটপুট দিতে হবে যে স্ট্রিং দ্বারা বর্ণিত শব্দটি (নিকটতম সেন্টারে গোলাকার) হবে।

+nসেন্টগুলি nনোটের উপরে তীক্ষ্ণ / উপরে চিহ্নিত করতে এবং নোটটির -nনীচে ফ্ল্যাট / নীচে চিহ্নিত করতে ব্যবহার করা উচিত ।

নোটটি বৈজ্ঞানিক পিচ স্বরলিপিতে আউটপুট করা উচিত। ধরুন এ 4 টি টিউন হয়েছে 440Hz। ফ্ল্যাট / তীক্ষ্ণ নোটের জন্য খ এবং # ব্যবহার করুন। দ্রষ্টব্য: হয় ধারালো বা ফ্ল্যাট ব্যবহার করা যেতে পারে। নোটের জন্য, নোটের জন্য 466.16Hzহয় A#বা Bbআউটপুট করা যেতে পারে।

আউটপুট ফর্ম্যাট আপনার উপর নির্ভর করবে, যতক্ষণ না আউটপুটে কেবলমাত্র দু'টি পূর্বনির্ধারিত তথ্য রয়েছে (যেমন প্রতিটি সম্ভাব্য আউটপুট মুদ্রণের অনুমতি নেই)।

* নিকটতম নোটটি সেই নোটটিকে বোঝায় যা ইনপুট দ্বারা চিহ্নিত শব্দের নিকটতম, সেন্টের সংখ্যায় পরিমাপ করা (অতএব, শিরোনামের মধ্যে থাকা নোট 50 cents)। শব্দটি যদি 50 centsদুটি পৃথক নোট (বৃত্তাকার পরে) থেকে দূরে থাকে তবে দুটি নোটের কোনও একটি আউটপুট হয়ে যেতে পারে।

উদাহরণ

আপনার প্রোগ্রামটি কেবলমাত্র নিম্নলিখিত উদাহরণগুলি নয়, সমস্ত ক্ষেত্রে কাজ করা উচিত।

Output             Input Frequency   Input String
A4,  +0  cents     220               [-----X-----]
A5,  +0  cents     220               [--------X--]
D5,  -2  cents     440               [--X--------]
B4,  -49 cents     440               [X----------]
A#4, +19 cents*    314.1592          [X-]
Eb9, +8  cents*    400               [-----------------------X]
Eb11,+8  cents*    100               [--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------X]
D#1, +49 cents*    10                [--X]
A0,  -11 cents     11.7103           [---X--]

* হয় ধারালো বা ফ্ল্যাট আউটপুট করা যেতে পারে।

সম্ভাব্য সহায়ক লিঙ্কগুলি

এই এত সংক্ষিপ্ত উত্তর জেতা


আমি মনে করি আপনার উদাহরণগুলি কিছুটা বেমানান: প্রথমটির মতে [--X--]স্ট্রিংটি বিভাগের মাঝখানে যেখানে চাপানো হয়েছে সেখানে চাপানো হয়েছে x, যখন [-X--]এই যুক্তিটি অনুসরণ করার পরে শেষটি 3/8 (2/5 নয়) এ হবে। নাকি আমি কিছু ভুল বুঝতে পারি?
flawr

শেষ একের জন্য @ ফ্লোলার [-X--], স্ট্রিংটি 4 টি জায়গায় বিভক্ত (এবং তাই 5 ভাগে বিভক্ত) এবং এই বিভাগগুলির দ্বিতীয়টিতে টিপুন । সুতরাং, এটি টিপানো হয় 2/5, এবং ব্যবহৃত দৈর্ঘ্য হয় 3/5
es1024

আহ ঠিক আছে এখন আমি দেখতে পাচ্ছি, সুতরাং প্রতিটি -মূলত বিভাগগুলির অবস্থানের প্রতিনিধিত্ব করে, ব্যাখ্যা করার জন্য আপনাকে ধন্যবাদ!
flawr

উত্তর:


1

বিবিসি বেসিক, ১1১ #

  REM get frequency and string. Store length of string in n for later.
  INPUT f,s$
  n=LEN(s$)

  REM store floating-point value of note in semitones above (C0-0.5). Store integer value in n% (offset effectively means it will be rounded not truncated.)
  n=LN(f*(n-1)/(n-INSTR(s$,"X"))/15.8861)/LN(2)*12
  n%=n

  REM format printing to whole numbers only
  @%=2^17

  REM Output note name and octave. Output cents (discrepancy between n and n%, minus the offset of 0.5)
  PRINT MID$("C C#D D#E F F#G G#A A#B ",n%MOD12*2+1,2);INT(n/12)'(n-0.5-n%)*100'

স্কোর মন্তব্যগুলি বাদ দেয়। এখনও গল্ফ হয়নি।

আউটপুট

দীর্ঘ দুটি ব্যতীত সমস্ত পরীক্ষার ক্ষেত্রে সঠিকভাবে সম্পাদন করে। কারণ দেখে Eb9মনে হচ্ছে পরীক্ষার কেস থেকে একটি ড্যাশ নিখোঁজ রয়েছে: 22 -এবং একটি রয়েছে X, যা স্ট্রিংটিকে 24 টি সমান টুকরোতে বিভক্ত করে। আমার ম্যানুয়াল গণনা অনুসারে এটি 9600Hz, যা একটি ডি 9 এর উপরে 37 সেন্ট। এটিই আমার প্রোগ্রামটি ফলাফল দেয়। আমি যদি অন্য ড্যাশ যুক্ত করি তবে আমি Eb9 + 8 সেন্ট পাই। দুর্ভাগ্যক্রমে বিবিসি বেসিক 255 টিরও বেশি অক্ষরের স্ট্রিং পরিচালনা করতে পারে না, তাই Eb11কেসটি একটি ত্রুটি দেয়।

এখানে চিত্র বর্ণনা লিখুন


3

সি, 179

main(n,d){float f;scanf("%*[^X]%nX%*[-]%n]%f",&n,&d,&f);f=log(f*d/(d-n))*17.3123-57.376;n=d=f+.5;n=n%12*7+784;printf("%c%d%c,%+2.0f cents\n",n/12,(d+9)/12,n%12/7*3+32,(f-d)*100);}

নিজেই একটি লাইনে আসকি চিত্র এবং পৃথক লাইনের ফ্রিকোয়েন্সি অর্জন করে।

কয়েকটি অক্ষর যাদু সংখ্যার সঠিকতা হ্রাস দ্বারা বাদ যাবে 17.3123এবং 57.376

গল্ফিং ব্যতীত প্রোগ্রামটি এমন দেখাচ্ছে:

main(n,d)
{
    float f; // 'float' and '%f' better than 'double' and '%lf'

    scanf("%*[^X]%nX%*[-]%n]%f", &n, &d, &f);
    // n is the number of chars before 'X'
    // d is the number of chars before ']'
    // f is the frequency

    // Calculate the tuned frequency
    f = f * d / (d - n);

    // Convert the frequency to logarithmic scale, relative to pitch A0
    f=log(f)*17.3123-57.376;
    // alternatively: f = log2(f / (440 / 16)) * 12;

    // Round to nearest integer
    n=d=f+.5;

    // Calculate the note name ('A', 'B', etc), multipled by 12 for convenience
    n=n%12*7+784;

    printf("%c%d%c,%+2.0f cents\n", // output example: B4 ,-49 cents
        n/12,        // note name
        (d+9)/12,    // octave number
        n%12/7*3+32, // if n%12 is large enough, it's '#' else ' ' (natural)
        (f-d)*100);  // number of cents; stdio rounds it to integer
}

2
দারুণ scanfফর্ম্যাট স্ট্রিংয়ের জন্য +1 । আপনি এটা করতে পারেন আমার ধারণা ছিল না। আমি পরে আপনার আউটপুট কোডটি যাচাই করব (আমি সিতে এটি করার বিষয়ে ভেবেছিলাম এবং আউটপুটের ক্ষেত্রে যদিও আমার সাথে এ জাতীয় কিছু ঘটেছিল, আমি পুরো জিনিসটি প্রতিযোগিতামূলকভাবে করার কোনও উপায় দেখতে পেলাম না)) আমি ধরে নিয়েছি d+9কারণ আপনি ইনডেক্স করেছেন নোট এ, সুতরাং আপনাকে নোট সিতে সূচকগুলিতে অষ্টভ সংখ্যাটি সামঞ্জস্য করতে হবে: আমি ভাবছি যে এর আশেপাশে কোনও উপায় আছে কিনা।
স্তর নদী সেন্ট

হ্যাঁ, অষ্টাভ্যন্তরগুলি সি থেকে শুরু হওয়া সত্যতাটির জন্য +9 ক্ষতিপূরণ দেয় এটি নোটের নাম গণনার সাথে একই রকম হয় or নোটের নামগুলির জন্য, বিজ্ঞপ্তিটি শিফটটি এলইউটি দ্বারা প্রয়োগ করা যেতে পারে তবে আমি সেগুলি গণনার আরও "গাণিতিক" পদ্ধতি পছন্দ করি।
অ্যানাটলিগ

1

জাভাস্ক্রিপ্ট (199)

যেমন হিসাবে কল t('[X-]',314.1592)

t=(s,f)=>{l=s.length-1;p='C C# D D# E F F# G G# A B H'.split(' ');n=12*Math.log2(f*l/(l-s.indexOf('X'))/16.3515978);m=n+.5|0;return p[m%12]+(n/12|0)+' '+((n-m)*100+.5|0)}

সংশোধন করা হয়েছে। (যেহেতু আমি ইউরোপে থাকি আমি বি বি এর পরিবর্তে বি এবং বি = এর পরিবর্তে एच ব্যবহার করি)


ফ্লাওয়ার, আপনি কি জার্মান? আমি সর্বদা বি এবং এইচকে একটি জার্মান স্বরলিপি হিসাবে ভাবতাম, কোনও ইউরোপীয় স্বরলিপি নয়। ইউ কে এবং আয়ারল্যান্ড বিবি এবং বি ব্যবহার করে স্পেন এবং ইতালি এসআইবি এবং এসআই ব্যবহার করে (যেমন ডিও রে এমআই এফএ এসএল ল এসআই হিসাবে।) যাইহোক এটি কেবল একটি চরিত্রের সঞ্চয়।
স্তরের নদী সেন্ট

হ্যাঁ আমি একটি জার্মান ভাষী দেশ, আমি জানি না যে অন্যান্য ইউরোপীয় দেশগুলি সেই ডোরেমি সিস্টেমটি ব্যবহার করে (আমি কেবলমাত্র শিশুদের শিক্ষায় লোকেরা এটি ব্যবহার করতে শুনেছি)। যাইহোক এটি মূলত একটি রসিকতা ছিল যেহেতু আপনি বলেছেন যে এটি কেবল 1 টির সাশ্রয় করে এবং প্রয়োজনীয়তাগুলি সত্যিই পূরণ করে না =)
flawr

এটি সেন্টের সংখ্যাটি negative t('[---X--]',11.7103)-10-11
ণাত্মক

ব্যবহার p="C0C#0D0D#0E0F0F#0G0G#0A0B0H".split(0)আপনাকে অতিরিক্ত 2 টি অক্ষর সংরক্ষণ করে ।
শান লাথাম

@ এস 1024 ওহ আমার জানা উচিত ছিল: এটি কারণ কারণ আমি বৃত্তাকার ফাংশনটি প্রয়োগ করেছি round(x) = x+.5|0যার দ্বারা কেবল ধনাত্মক সংখ্যার জন্য সঠিক, আমি পরে এটি ঠিক করব। @ আইপিআই ধন্যবাদ!
flawr

1

পাইথন 3: 175

import math
def t(b,s):l=len(s)-1;n=12*math.log2(b*l/(l-s.index("X"))/16.35);m=round(n);return"%s%s%+d"%(("C C# D D# E F F# G G# A A# B".split()*99)[m],m//12,round(100*(n-m)))

Ungolfed:

import math

c0 = 16.35

def tuning (base_frequency, string):
    return formatted (note_number (frequency (base_frequency, string)))

def formatted (note_number):
    return "{name}{octave:d}{cents:+d}".format (name=note_name (note_number),
                             octave=octave (note_number),
                             cents=cents_out (note_number))

def note_name (note_number):
    return ("C C# D D# E F F# G G# A A# B".split() * 99)[round (note_number)]

def note_number (frequency):
    return 12 * math.log2 (frequency / c0)

def octave (note_number):
    return round (note_number) // 12

def cents_out (note_number):
    return round (100 * (note_number - round (note_number)))

def frequency (base_frequency, string):
    string_length = len (string) - 1
    held_length = string_length - string.index ("X")
    return base_frequency * string_length / held_length

if "__main__" == __name__:

    print ("Testing functions against known values...")
    assert "A4+0"     == tuning (220,      "[-----X-----]")
    assert "A5+0"     == tuning (220,      "[--------X--]")
    assert "D5-2"     == tuning (440,      "[--X--------]")
    assert "B4-49"    == tuning (440,      "[X----------]")
    assert "A#4+19"   == tuning (314.1592, "[X-]")
    assert "D#9+8"    == tuning (400,      "[-----------------------X]")
    assert "D#11+8"   == tuning (100,      "[--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------X]")
    assert "D#1+49"   == tuning (10,       "[--X]")
    assert "A0-11"    == tuning (11.7103,  "[---X--]")
    print ("Tests passed.")
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.