म्यूजिकल स्कोर इंटरप्रेटर


11

एससीआई म्यूजिकल स्कोर को देखते हुए, आपको नोट और उसकी संबंधित लंबाई को आउटपुट करने में सक्षम होना चाहिए। स्कोर में समावेशी 5 और 15 नोटों के बीच होगा, और एक सीढ़ियों पर स्थानांतरित किया जाएगा। एक सीढ़ी पांच क्षैतिज रेखाओं से बनी होती है, जिसमें - (माइनस) वर्ण रिक्त स्थान की रेखाओं से अलग होते हैं। सीढ़ी में नीचे की रेखा नोट 'ई' के बराबर है। नीचे की रेखा के ठीक ऊपर स्थित रिक्त स्थान की रेखा एक 'एफ' को इंगित करती है, और एक उच्च पिच की है जो इसके नीचे 'ई' है। यह नीचे के रूप में जारी है। ध्यान दें कि नोट्स केवल 'ए' पर फिर से शुरू करने से पहले 'जी' तक जाते हैं। निचे देखो:

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

ध्यान दें कि पत्र इनपुट में शामिल नहीं हैं। नोटों को 'नोट हेड' इंगित करने के लिए एओ (लोअरकेस ओह) वर्ण का उपयोग करते हुए सीढ़ी के ऊपर लगाया जाता है। यह नोट हेड नोट की आवृत्ति को इंगित करता है, और इसलिए ऊपर के रूप में इसका वर्णनात्मक प्रतिनिधित्व करता है। उदाहरण के लिए, नीचे दिए गए स्कोर पर रखा गया एक नोट एक 'ए' इंगित करता है:

----

----

----
o   
----

----

ऊपर दिए गए 'A' की तरह एक नोट को 'पूरा नोट' कहा जाता है और इसे पूरे बीट के लिए खेला जाता है। अन्य अवधियों को नोट से उठने वाले 'स्टेम' और शून्य और तीन 'फ्लैग' के बीच संकेत दिया जा सकता है। एक तना तीन से बना होता है | (पाइप, या वर्टिकल बार) अक्षर सिर के ठीक ऊपर ढेर हो गए। बिना झंडे वाले तने को 'क्वार्टर-नोट' माना जाता है, और बीट के क्वार्टर के लिए खेलता है। झंडे \ (बैकस्लैश) अक्षर हैं, और स्टेम के दाहिने हाथ की ओर हैं। प्रत्येक स्टेम उस समय को रोक देता है जब नोट खेला जाता है। प्रत्येक नोट की लंबाई निम्नलिखित में से एक होगी: एक पूरा नोट, एक चौथाई नोट, एक आठवां नोट, एक सोलहवाँ नोट या तीस-सेकंड का नोट। यह प्रत्येक प्रकार का नोट A के लिए कैसा दिखेगा:

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

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

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

एक से अधिक नोट एक साथ रखने से आपको स्कोर मिलता है। प्रत्येक नोट को चार वर्णों वाला माना जा सकता है, एक नोट प्रत्येक चार-वर्ण ब्लॉक के पहले कॉलम में होता है। उदाहरण के लिए :

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

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

ऊपर दिए गए उदाहरण में निम्नलिखित नोट हैं, क्रम में: एक चौथाई नोट 'जी', एक बत्तीस नोट 'डी', आठवां नोट 'सी', एक पूरा नोट 'डी' और सोलहवां नोट 'बी'। आपके आउटपुट में प्रत्येक नोट प्रारूप पत्र / लंबाई में होना चाहिए, जहां पत्र एजी हो और लंबाई पूरे नोट की तुलना में नोट की लंबाई का अंश हो। अपवाद के रूप में, लंबाई और / वर्ण मुद्रित नहीं किया जाना चाहिए यदि नोट एक संपूर्ण नोट है। आपके आउटपुट में प्रत्येक नोट को एक ही स्थान से अलग किया जाना चाहिए। इसलिए, ऊपर दिए गए स्कोर के लिए, आपके कोड को निम्न आउटपुट देना चाहिए:

G/4 D/32 C/8 D B/16
  • नोट निम्न श्रेणी में होंगे: EFGABCDE F. ध्यान दें कि केवल पत्र को मुद्रित करने की आवश्यकता है, ऑक्टेव को अनदेखा किया गया है।
  • ध्यान दें कि इनपुट की लाइनों की संख्या 9 से 12 तक भिन्न होती है, क्योंकि तिमाही समय या उससे कम अवधि वाले नोटों पर डी या उच्चतर को पूरी तरह से दिखाने के लिए अधिक लाइनों की आवश्यकता होगी।
  • इस मामले में कोई आधा नोट नहीं है।

सबसे छोटा कोड जीत (व्हॉट्सएप गिनती नहीं करता है)।

संपादित करें: एक इनपुट में रिक्ति में निश्चित त्रुटि।

कुछ नमूने इनपुट:

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

आउटपुट: बी /: सी / / डी / B ई / ३२ एफ / ३२ जी / ३२ डी


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

आउटपुट: EGBDFFACE


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

आउटपुट: बी / ४ ए / / एफ / ३२ एफ / ३२ ईसी / ४ बी / ३२ एफ / १६


व्हॉट्सएप की गिनती क्यों नहीं?
JB

@ जे: ताकि लोगों को यह महसूस न हो कि कार्यक्रम एक पंक्ति में लंबे समय तक रिक्त स्थान नहीं हैं।
नील

1
व्हॉट्सएप की गिनती करना पारंपरिक है लेकिन नई-नई लाइनों की गिनती नहीं करना जो केवल उचित चौड़ाई के तहत प्रवेश रखने के लिए हैं। जॉर्ज के यूजरस्क्रिप्ट कुछ भाषाओं (सी सहित) के साथ ऐसा करते हैं।
dmckee --- पूर्व-संचालक

2
@ अच्छी तरह से अभी सब मुझे लगता है प्रस्तुत करने के लिए इच्छुक है एक व्हाट्सएप कार्यक्रम है।
जेबी

@ नील, हाँ, लेकिन फिर आपको स्मार्टनेस मिलती है जो वास्तव में क्रिया समाधान लिखते हैं, उन्हें व्हाट्सएप की
बूथ 28

जवाबों:


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और रिक्त स्थान के काम का बहुत कुछ करने देते हैं, लेकिन बॉयलरप्लेट और विराम चिह्न को अपना बदला ले लिया, और मैं केवल (आवश्यक सफेद स्थान के साथ 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

अपूर्ण लाइनों से निपटने के लिए पैच इस बार थोड़ा सा निराला है (क्या, आपको लगता है कि यह अजीब नहीं हो सकता है)। 139 वर्ण, आवश्यक व्हाट्सएप के साथ 155।

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)}

स्कोर के अंत तक रिक्त स्थान इनबेटवीन बार होते हैं , हालांकि मैंने इसका उल्लेख नहीं किया इसलिए कार्यक्रम को बिना परवाह किए काम करना चाहिए। यदि रिक्त स्थानों के साथ लाइन अचानक समाप्त हो जाती है, तो इसका मतलब है कि वैसे भी उस लाइन के लिए विचार करने के लिए अधिक इनपुट नहीं है। यह बस दुर्घटना नहीं है .. :)
नील

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 दिनों के लिए अजगर के साथ कोड गोल्फ शुरू कर दिया है और मैंने पाया चीजों की तरह है कि import sys, sys.stdin.read, sys.stdout.writeप्रशस्त कर रहे हैं।


यदि आप पाइथन में गोल्फ के लिए नए हैं, तो आपको यह अजगर गोफ्लिंग टिप्स प्रश्न उपयोगी लग सकता है।
गारेथ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.