বাদ্যযন্ত্র স্কোর দোভাষী


11

একটি আসকি মিউজিকাল স্কোর দেওয়া, আপনি অবশ্যই নোট এবং তার সাথে সম্পর্কিত দৈর্ঘ্য আউটপুট করতে সক্ষম হবেন। স্কোরটিতে 5 থেকে 15 টি নোট সহ অন্তর্ভুক্ত থাকবে এবং একটি স্টেভে প্রতিলিপি দেওয়া হবে। একটি স্টাভ পাঁচটি অনুভূমিক রেখা দ্বারা গঠিত - (বিয়োগ) অক্ষরকে ফাঁকা রেখার দ্বারা পৃথক করে। স্ট্যাভের নীচের লাইনটি 'ই' নোটের সমান। নীচের লাইনের অবিলম্বে স্পেসগুলির রেখাটি একটি 'এফ' নির্দেশ করে এবং এর নীচে 'ই' উচ্চতর পিচকে চিহ্নিত করে। এটি নীচের মতো চলতে থাকবে। দ্রষ্টব্য যে নোটগুলি 'এ' থেকে আবার শুরু করার আগে কেবল 'জি' তে যায়। নিচে দেখ:

F ----------
E           
D ----------
C           
B ----------
A           
G ----------
F           
E ----------

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

----

----

----
o   
----

----

উপরের 'এ' এর মতো একটি নোটকে 'পুরো নোট' বলা হয় এবং এটি পুরো একটি বীটের জন্য খেলানো হবে। নোট থেকে উত্থিত 'স্টেম' এবং শূন্য থেকে তিনটি 'পতাকা' অন্তর্ভুক্ত করে অন্যান্য সময়সীমা নির্দেশ করা যেতে পারে। একটি স্টেম তিনটি দিয়ে গঠিত (পাইপ বা উল্লম্ব বার) অক্ষরগুলি নোটের মাথার উপরে অবিলম্বে সজ্জিত। কোনও পতাকাবিহীন স্টেমকে 'কোয়ার্টার নোট' হিসাবে বিবেচনা করা হয়, এবং এটি একটি চতুর্থাংশের জন্য বীট খেলে। পতাকাগুলি হ'ল bac (ব্যাকস্ল্যাশ) অক্ষর এবং কান্ডের ডানদিকে হাত hand প্রতিটি কান্ডটি নোটটি চালানোর সময়কে অর্ধেক করে দেয়। প্রতিটি নোটের দৈর্ঘ্য নিম্নলিখিতগুলির মধ্যে একটি হবে: একটি সম্পূর্ণ নোট, একটি চতুর্থাংশ নোট, একটি অষ্টম নোট, ষোলতম নোট বা ত্রিশ সেকেন্ডের নোট। প্রতিটি ধরণের নোট এটির জন্য কীভাবে সন্ধান করবে:

--------------------

----|---|\--|\--|\--
    |   |   |\  |\
----|---|---|---|\--
o   o   o   o   o
--------------------

--------------------

একসাথে একাধিক নোট স্থাপন করা আপনাকে স্কোর দেয়। প্রতিটি নোট চারটি অক্ষর প্রশস্ত হিসাবে বিবেচনা করা যেতে পারে, প্রতিটি নোট প্রতিটি চার-অক্ষরের ব্লকের প্রথম কলামে রয়েছে। উদাহরণ স্বরূপ :

    |\             
----|\--|\----------
    |\  |       |\  
----o---|---o---|\--
|       o       |   
|---------------o---
|                   
o-------------------

--------------------

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

G/4 D/32 C/8 D B/16
  • নোটগুলি নিম্নলিখিত ব্যাপ্তিতে থাকবে: EFGABCDE F. নোট করুন যে কেবলমাত্র চিঠিটি মুদ্রণ করা দরকার, অষ্টভাকে উপেক্ষা করা হবে।
  • নোট করুন যে ইনপুটটির রেখার সংখ্যা 9 থেকে 12 -র মধ্যে পরিবর্তিত হয়, যেহেতু ত্রৈমাসিক সময় বা কম লাইনের ডি বা তার চেয়ে কম সংখ্যক নোটগুলিতে সম্পূর্ণরূপে দেখাতে আরও লাইন প্রয়োজন require
  • এই ক্ষেত্রে কোনও অর্ধ নোট নেই।

সংক্ষিপ্ততম কোড জয় (সাদা স্থান গণনা করে না)।

সম্পাদনা করুন: একটি ইনপুট ব্যবধানে স্থির ত্রুটি।

কিছু নমুনা ইনপুট:

        |\                    
----|\--|-------------------
|\  |   |                   
|---|---o---------------o---
|   o               |\      
o---------------|\--|\------
            |\  |\  |\      
------------|\--|\--o-------
            |\  o           
------------o---------------

আউটপুট: বি / 8 সি / 8 ডি / 8 ই / 32 এফ / 32 জি / 32 ডি


----------------o-------------------
                                o   
------------o-----------------------
                            o       
--------o---------------------------
                        o           
----o-------------------------------
                    o               
o-----------------------------------

আউটপুট: EGBDFFACE


            |\                  
            |\                  
            |\                  
------------o-------|-----------
|               o   |   |\      
|---|\--------------|---|\------
|   |               o   |\      
o---|---|\--------------o---|\--
    o   |\                  |\  
--------|\------------------|---
        o                   o   
--------------------------------

আউটপুট: বি / 4 এ / 8 এফ / 32 এফ / 32 ইসি / 4 বি / 32 এফ / 16


হোয়াইটস্পেস গণনা হয় না কেন?
জেবি

@ জে: যাতে লোকেরা কোনও স্থান ছাড়াই দীর্ঘ এক লাইনে প্রোগ্রাম জমা দেওয়ার প্রবণতা অনুভব না করে।
নিল

1
শ্বেত স্পেস গণনা করা প্রচলিত তবে কেবল যুক্তিযুক্ত প্রস্থের নীচে প্রবেশের জন্য রয়েছে এমন নতুন লাইনগুলি গণনা করা নয়জর্জের ইউজার স্ক্রিপ্ট কিছু ভাষা (সি সহ) সহ এটি করে।
ডিএমকেকে --- প্রাক্তন মডারেটর বিড়ালছানা

2
@ নীল এখনই আমি জমা দিতে আগ্রহী বলে মনে করি হ'ল হোয়াইটস্পেস প্রোগ্রাম।
জেবি

@ নীল, হ্যাঁ, তবে তারপরে আপনি এমন স্মার্টসেস পেয়েছেন যারা সত্যিকারের ভারবোজ সমাধানগুলি লেখেন, তাদেরকে হোয়াইটস্পেসের একটি স্ট্রিংয়ের মধ্যে প্যাক করেন এবং গল্ফ একটি ডিকোড-অ্যান্ড- এক্সিকিউট
বুথবি

উত্তর:


6

জাভাস্ক্রিপ্ট, 284,279,278,225,221 , 220 টি অক্ষর (প্রয়োজনীয় সাদা অংশ সহ)

ওয়ান-লাইনার ( টেস্টের ফিডাল ):

function a(c){b='',d=c.split('\n');for(e=0;d[0][e++];){f=0;for(i=0;g=d[i++];){h=g[e-1];if(h=='o')b+=(b?' ':'')+String.fromCharCode((d.length+4-i)%7+65);if(h=='|')f=f||4;if(g[e]&&g[e]=='\\')f*=2;}if(f)b+='/'+f;}return b;}

পঠনযোগ্য ( পরীক্ষার বেড়া ):

function getNotes(input){
    out='',lines=input.split('\n');

    for(col=0;lines[0][col++];){
        time=0;
        for(i=0;line=lines[i++];){
            char=line[col-1];
            if(char=='o')out+=(out?' ':'')+String.fromCharCode((lines.length+4-i)%7+65);
            if(char=='|')time=time||4;
            if(line[col]&&line[col]=='\\')time*=2;
        }
        if(time)out+='/'+time;
    }
    return out;
}

1
অপ্রয়োজনীয় ;গুলি সরিয়ে এবং কিছু কৌশল করে, আপনি এটিকে আরও খাটো করতে পারেন। function a(c){b='',d=c.split('\n');for(e=0;d[0][e++];){for(i=f=0;g=d[i++];){h=g[e-1];if(h=='o')b+=(b?' ':'')+String.fromCharCode((d.length+4-i)%7+65);if(h=='|')f=f||4;f*=1+(g[e]=='\\');}if(f)b+='/'+f}return b}(209 অক্ষর)
জিমিনপি

4

পার্ল, 103 টি অক্ষর

(108 যদি আপনি প্রয়োজনীয় সাদা স্থানের অক্ষর গণনা করেন)

$i=0,s/\|\\/h /g,map$b[$i++].=$_,/./g for<>;/o/&&print chr 65+(4+length$')%7,/[h|]/&&"/".4*2**y/h//," "for@b

উপস্থাপনের জন্য সাদা স্থান সহ:

$i=0,
    s/\|\\/h /g,
    map $b[$i++]. = $_, /./g
  for <>;
/o/ && print chr 65 + (4 + length $') % 7,
             /[h|]/ && "/" . 4*2**y/h//,
             " "
  for @b

নোট করুন যে আমি ধরে নিয়েছি যে সমস্ত লাইনের একই দৈর্ঘ্য রয়েছে (প্রশ্নের সংশোধিত সংস্করণ অনুসারে)।

ব্যাখ্যা সহ পুনরায় সাজানো সংস্করণ:

#!/usr/bin/env perl
# First transpose the list of lines into a list of columns.
my @b = ();               # @b[$i] will contain the characters in column $i
while (<>) {              # for each input line, do
    my $i = 0;            # start in column 0
    s/\|\\/h /g;          # replace '\|' by 'h ', to keep track of part notes in the first column
    foreach (/./g) {      # for each character, do
        $b[$i++] .= $_;   # append the character to the transposed matrix
    }
}
# Now process each column.
foreach (@b) {            # for each column, do
    if (/o/) {            # if it contains a note, then
        print chr(65 + (4 + length $') % 7);    # print the note pitch
        if (/[h|]/) {                           # if this is a part note (had |\ or just |)
            print "/", 4*2**y/h//;              # print /n where n = 2^(subdivision)
        }
        print " ";
    }
}

(পুরাতন, দীর্ঘ সমাধান, রাখা হয়েছে কারণ এটি কিছুটা দীর্ঘ হলেও আকর্ষণীয় হতে পারে)

পার্ল, 147 126 টি অক্ষর

( 149 131 যদি আপনি প্রয়োজনীয় সাদা স্থান গণনা করেন)

$c=0,map{/o/?$h[$c]=E:/\\/?$d[$c-1]*=2:/\|/?$d[$c]||=4:++$h[$c];++$c}/./g for<>;print grep{s~$~/$d[$i++] ~;s~/ ~ ~;y/E-M/EFGA-F/}@h

উপস্থাপনের জন্য সাদা স্থান সহ:

$c = 0,
map { /o/ ? $h[$c]=E :
      /\\/ ? $d[$c-1]*=2 :
      /\|/ ? $d[$c]||=4 :
      ++$h[$c];
      ++$c
    } /./g for <>;
print grep {s~$~/$d[$i++] ~; s~/ ~ ~; y/E-M/EFGA-F/} @h

ভাষাটি যাতে এত বেশি অপব্যবহার না করা হয় সে জন্য একটু পুনরায় সাজানো:

#!/usr/bin/perl
my @h;          # $h[$c] will contain the note in column $c, if any
my @d;          # $d[$c] will contain the note length (e.g. 4), if any
while (<>) {    # for each input line, do
    my $c = 0;  # column number
    foreach (split //) {   # for each character, do
        if (/o/) { $h[$c] = "E"; }      # o => it's a note; if this is the last line, it's E
        elsif (/\\/) { $d[$c-1] *= 2; } # \ => halve the duration of the note in the previous column
        elsif (/\|/) { $d[$c] ||= 4; }  # | => if this is the first | in the column, we have a quarter note
        else { ++$h[$c]; }              # anything else => bump the note by 1
        ++$c;
     }
}
for (my $i = 0; $i < @h; $i++) { # for each column, do
    $_ = $h[$i];                   # look up the potential note (or garbage if there is no note in this column)
    s~$~/$d[$i++] ~;               # append the duration and a space (or "/ " if there is no duration)
    s~/ ~ ~;                       # remove the spurious "/" if there is no duration
    if (y/E-M/EFGA-F/) {           # if it's a note (i.e. if it contains a letter E-M), then
                                   # fix the letter wraparound and then
        print $_;                    # print the note
    }
}

মনে রাখবেন যে আমি ধরে নিয়েছি যে সমস্ত লাইনের দৈর্ঘ্য একই। যদি আপনি সংক্ষিপ্ত রেখাগুলি মঞ্জুর করতে চান তবে একটি স্পষ্ট ফিক্সটি হ'ল $_.=1x$c,9 টি অক্ষরের ব্যয় করে প্রোগ্রামের শুরুতে যুক্ত করা।

আমি অন্য পদ্ধতির চিন্তা মত দীর্ঘ শব্দ এড়াতে splitএবং mapএবং স্পেস কাজ আরো কাজ করতে দিন, কিন্তু boilerplate, এবং যতিচিহ্ন তাদের প্রতিশোধ নেন, এবং আমি শুধুমাত্র (প্রয়োজনীয় সাদা ব্যবধান দিয়ে 144) একটি হুপিং 130 নিচে এটা পেতে পারেন।

sub p{$-[0]}
%a=qw(o $h[p]=E \ $d[&p-1]*=2 | $d[p]||=4 - ++$h[p]);
y/ /-/,s~.~$a{$&}~gee for<>;
print grep{s~$~/$d[$i++] ~;s~/ ~ ~;y/E-M/EFGA-F/}@h

অসম্পূর্ণ রেখাগুলি মোকাবেলার জন্য প্যাচটি এবার একটু অযৌক্তিক what ১৩৯ টি অক্ষর, প্রয়োজনীয় সাদা স্থান সহ ১৫৫ টি অক্ষর।

sub p{$-[0]}
%a=qw(o $h[p]=E \ $d[&p-1]*=2 | $d[p]||=4 - ++$h[p]);
$_.=" "x p,y/
 /-/,s~.~$a{$&}~gee for<>;
print grep{s~$~/$d[$i++] ~;s~/ ~ ~;y/E-M/EFGA-F/}@h

2

স্কালা (2.9), 352 313 291 294 290 277 274 273 টি অক্ষর

যদি কোনও ফাংশন প্রয়োজন হয় তবে:

def m(s:String){var(x,y,z,l)=(0,1,s.count(_=='\n'),Array.fill(99)(0))
var n=l.clone
for(c<-s){if(c=='\n'){x=0;y+=1}
if(c=='\\')l(x-1)+=1
if(c=='|')l(x)+=1
if(c=='o')n(x)="EFGABCDEF"(z-y)
x+=1}
(n,l).zipped.map((x,y)=>if(x>0)print(x.toChar+(if(y>0)"/"+(4<<y-3)else"")+" "))}

যদি একটি পূর্ণ প্রোগ্রাম প্রয়োজন হয়:

object M extends App{def m(s:String){var(x,y,z,l)=(0,1,s.count(_=='\n'),Array.fill(99)(0))
var n=l.clone
for(c<-s){if(c=='\n'){x=0;y+=1}
if(c=='\\')l(x-1)+=1
if(c=='|')l(x)+=1
if(c=='o')n(x)="EFGABCDEF"(z-y)
x+=1}
(n,l).zipped.map((x,y)=>if(x>0)print(x.toChar+(if(y>0)"/"+(4<<y-3)else"")+" "))}
m(io.Source.stdin.mkString)}

সেখানে হয় যদিও আমি এটা উল্লেখ না তাই প্রোগ্রাম নির্বিশেষে কাজ করা উচিত, স্কোর শেষ পর্যন্ত বার inbetween ফাঁকা স্পেস। যদি ফাঁকা ফাঁকা জায়গাগুলি সহ লাইনটি হঠাৎ শেষ হয় তবে এর অর্থ হ'ল যাইহোক এই লাইনের জন্য বিবেচনা করার মতো আর কোনও ইনপুট নেই। এটি কেবল ক্র্যাশ করতে হবে না .. :)
নিল

2

জে - 108 টি অক্ষর

exit echo}.,>,&.>/_4<@((a.{~32,65+7|4+i.&'o'),(>&0#('/',0":2^]))@((+/@(=&'\'))+2*'|'&e.))@;\|:|.[;._2]stdin''

Ungolfed:

str =: stdin''
lines =: [;._2] str                          NB. split on the last character, the newline
rotated =: |: |. lines                       NB. lines reversed, then transposed
pitch =: 65 + 7 | 4 + i.&'o'                 NB. ord('A') + ( line.index('o') + 4 ) % 7
has_stem =: '|' & e.                         NB. '|' in line?
backslash_count =: (+/ @ (=&'\') )           NB. sum(char = '\\' for char in line)
denom_exp =: backslash_count + 2 * has_stem
fraction =: (>&0 # ('/', 0": 2 ^ ]))         NB. slash + 2^denom_exp, if denom_exp > 0
suffix =: fraction @ denom_exp
note_string =: (a. {~ 32,pitch) , suffix     NB. map(chr, (ord(' '), pitch)) + suffix
boxed_note_string =: < @ note_string @ ;     NB. box the string so it doesn't get padded
each_note_of_the =: boxed_note_string        NB. compute the note for a block of 4 lines
join_to_one_box =: , &. >
exit echo }. , > join_to_one_box / _4 each_note_of_the \ rotated

2

পাইথন গল্ফ, 207 টি অক্ষর।

import sys
a=[x[:-1]+' '*99 for x in sys.stdin]
for x in range(0,99,4):
 b=''.join((y[x:x+4] for y in a))+'o'
 c=2**(b.count('\\')+('|'in b)*2)
 print'FEDCBAGFE '[b.index('o')/4-len(a)+9]+('','/'+`c`)[c>1],

আমি 2 দিনের জন্য পাইথন মাধ্যমে কোডের golfing শুরু করেছি এবং আমি দেখেছি কিছু চাই যে import sys, sys.stdin.read, sys.stdout.writeঅকপট হয়।


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