LilyPond, 285 288 291 310 315 330 333 340 350 Zeichen

34

Ruby - 125 Zeichen

146 144 140 137 134 126 125 Zeichen

a,n=$*;h=a[1]?0:1;s=a[0]-h+1
9.times{|t|puts (s..s+n.to_i).map{|i|i%7%4<1||t>4?" |   ":"###  "
}.join[h..-4].tr t>7?" ":n,"_"}

(Die zweite neue Zeile ist nicht erforderlich und wird nur hinzugefügt, um eine Bildlaufleiste in SO zu vermeiden. Semikolons können auf Wunsch durch neue Zeilen ersetzt werden.)

Die Ruby 1.9- Version ist unterschiedlich, aber gleich lang ( a[0]nach a.ordund "_"nach ersetzt ?_):

a,n=$*;h=a[1]?0:1;s=a.ord-h+1
9.times{|t|puts (s..s+n.to_i).map{|i|i%7%4<1||t>4?" |   ":"###  "
}.join[h..-4].tr t>7?" ":n,?_}

Rufen Sie an mit

$ ruby piano.rb C 14
molf
quelle
Hey VIM zählt 138 Zeichen auf dem ersten?!?
Hurikhan77
a, n = gets.split; ... macht den gleichen Job, -3 Zeichen
hurikhan77
1
Sie könnten sogar "gets.split" durch "$ *" ersetzen und die Eingabe in der Befehlszeile, -8 Zeichen
hurikhan77
Wechseln Sie i%7%4<1||t>4?"_|___":"###__"zu i%7%4&&t<5?"###__":"_|___"und speichern Sie 2 Zeichen. Ich liebe diese %7%4Redewendung
Mob
1
Wir haben also die kürzeste Lösung gefunden, oder? Ruby Rulez! :-D
hurikhan77

Antworten:

29

LilyPond, 285 288 291 310 315 330 333 340 350 Zeichen

In Übereinstimmung mit dem Musikthema finden Sie hier eine Lösung in einer Sprache, die zum Setzen von Musiknoten entwickelt wurde: LilyPond:

x=#ly:string-substitute
u=#(x"*""###  ""|   *** |   ** ")t=#(x"###"" | "u)q=#read-char
z=#(q)v=#(if(eq?(q)#\#)1 0)y=#(iota(+(*(read)5)1 v))#(format #t"~{~{~a~}
~}"(map(lambda(s)(map(lambda(i)(string-ref s(modulo(+(*(char->integer z)5)i(* v
4))35)))y))(list u u u u u t t t(x" ""_"t))))

Verwendung: $ lilypond thisfile.ly <input.in >output.out 2>/dev/null

KirarinSnow
quelle
4
Dies ist möglicherweise das erste und einzige Mal, dass ich LilyPond im Code-Golf gesehen habe.
Cobbal
26

RetroGolf - Applesoft GRUNDLAGEN: 236 239 245 249 257 245 267 285

Zur besseren Lesbarkeit in mehreren Zeilen dargestellt, sollte jedoch eine einzelne Zeile sein:

1K$="##   |   ###  #":K$="##  #"+K$+K$:
 FORI=1TO21:F$=F$+"|____":L$=L$+"|    ":NEXT:
 INPUTN$:S=MID$(N$,2,1)="#":O=(ASC(N$)-65)*5+1+S*4:L=VAL(RIGHT$(N$,2))*5+1+S:
 FORI=1TO5:?MID$(K$+K$+K$,O,L):NEXT:FORI=1TO3:?MID$(L$,O,L):NEXT:?MID$(F$,O,L)

Kann mit diesem Applesoft BASIC Interpreter in Javascript oder getestet werden einem Emulator .

Klavier http://img685.imageshack.us/img685/3407/piano2.png

Carlos Gutiérrez
quelle
Ist es möglich, beide Argumente gemäß den Spezifikationen in derselben Zeile zu lesen?
KirarinSnow
18

C # - 315

Ich spiele weiterhin Golf in C #, obwohl es keine sehr knappe Sprache ist ...

using C=System.Console;class P{static void L(int o,int c,string s){while(c-->0)C.Write(s[(420>>o++%5*2&3)+(91>>(o+2)/5%7&1)*3]);C.WriteLine();}static void Main(string[]a){int i=0,s=a[0].Length-1,c=int.Parse(a[1])*5+1+s,o=(a[0][0]-65+s)*5-s;while(i++<5)L(o,c,"|  ## ");while(i++<8)L(o,c,"|  |  ");L(o,c,"|__|__");}}
Guffa
quelle
23
Nun zur F # -Lösung, um die Melodie zu vervollständigen.
LiraNuna
13
+1 für Humor, -1 für kitschigen Humor und +1, da C # und F # übereinstimmen.
Steve Tjoa
Ich habe eine System.IndexOutOfRangeException erhalten, als ich versucht habe, sie auszuführen.
Fitzchak Yitzchaki
@Mendy: Sie müssen Befehlszeilenargumente angeben, wenn Sie es ausführen. Wenn Sie es in Visual Studio ausführen, öffnen Sie die Eigenschaften für das Projekt, wechseln Sie zur Registerkarte Debug und geben Sie unter Startoptionen Befehlszeilenargumente ein. Wenn Sie den Code in eine Exe kompiliert haben, führen Sie ihn einfach in einem Konsolenfenster mit den Argumenten nach dem Programmnamen aus.
Guffa
1
Sehr nette Verwendung des Operators ->.
Kevin
16

Python - 164

k,n=raw_input().split()
m=k[1:]>""
n=int(n)*5+1
o=(ord(k[0])-65)*5+4*m
for x in["##  ###   |   ### "]*5+[n*"|    "]*3+[n*"|____"]:print((x+x[::-1][:-1])*n)[o:o+n+m]
Gnibbler
quelle
Könnten Sie nicht einige Zeichen speichern, indem Sie den wiederholten Teil von tund entfernen uund mit 7 multiplizieren?
Matthew Crumley
@ Matthew Crumley, zögern Sie nicht, von meiner Lösung zu leihen :)
John La Rooy
@gnibbler, ich bin nicht wirklich ein Python-Programmierer (ich habe einiges damit herumgespielt, aber nicht ausgiebig), also bezweifle ich, dass ich viel damit anfangen kann. Ich wusste nicht einmal, dass Python solche Zeichenfolgen multiplizieren kann, bis ich Ihre ursprüngliche Lösung sah.
Matthew Crumley
@gnibbler - nette Lösung, würde es gerne ausführen, aber einen SyntaxError bekommen .... C 14 Traceback (letzter Aufruf zuletzt): Datei "piano.py", Zeile 1, in? k, n = input (). split () Datei "<string>", Zeile 1 C 14 ^
AJ.
@AJ, sieht so aus, als ob dieser Fehler von der Python3-Lösung stammt. Ich bin mir nicht sicher, warum du das bekommst
John La Rooy
15

Octave, 153 154 155 158 159 162 172 180 186 185 188 197 199 200 206 207 209 212 214 215 219 240 244 268 Zeichen

Warum nur C oder C # oder F # (oder B oder D) verwenden, wenn Sie mit einer vollen Oktave programmieren können?

(aus Gründen der Klarheit alle 60 Zeichen eingewickelt)

x=5*scanf("%2c%d");for k=-8:0disp((s={[t="|   ###  ###  ","#
##   ",t" "]"|    ","|____"}{(k>-4)+!k+1})(1+mod(5*(y=x(2)>1
60)+(-y:x(3))+x(1),rows(s'))))end

Ja ... diese Lösung berechnet wirklich die komplexe konjugierte Transponierte eines Strings.

Verwendung: $ octave -q thisfile.m <input.in >output.out

KirarinSnow
quelle
13

C - 197 203 207 216 224 232 240 Zeichen

#define S"#   |   ###  ###  ##"
main(i,j,l,h,t){char*X[]={"____|","    |",S S,S S},s[i=11];for(scanf("%s%n%d",s,&h,&l);--i>1;puts(""))for(j=t=*s%7*5+h*4;j<t+l*5+h;putchar(X[i/3][j++%(i>5?35:5)]));}

Diese äquivalente Version mit 194 Zeichen geht davon aus, dass der Pufferüberlauf in Ordnung ist.

#define S"#   |   ###  ###  ##"
i=11;main(j,l,h,t){char*X[]={"____|","    |",S S,S S},s;for(scanf("%s%n%d",&s,&h,&l);--i>1;puts(""))for(j=t=s%7*5+h*4;j<t+l*5+h;putchar(X[i/3][j++%(i>5?35:5)]));}
KennyTM
quelle
1
for(j=0; j<=l*5+h; j++)<- nutzlose Leerzeichen, und Sie scheinen sie auch in die Anzahl der Charaktere aufgenommen zu haben
Nicolás
12

PostScript: 239 245 293 312 (regulär); 219 224 225 231 (ASCII85)

/r{(%stdin)(r)file token pop}def[(]){mul add}/z r(:-)cvs dup length 1
sub/v exch/p r/s(|   ###  ###  ###   |   ###  ###   )([){0 1 v p 5]{s
exch z 0 get 5]v 4]s length mod 1 getinterval print}for/
=}>>begin[[[[[/s(|    )def[[[/s(|____)def[

Binärversion erweitert durch ASCII85-Codierung zu einem 219-Zeichen-Programm mit nur ASCII-druckbaren Zeichen:

/(|____)/(|    )[/r/(|   ###  ###  ###   |   ###  ###   )<~Ou%G5-$+0=Bl5@JE[d/;P,jagI?HCK@<*JGP,4<rOuSV60p8LhG*5%O8oc=a.=3b)!HsVu23Md=!IHJ_A<K->@5*j;23Md=!HoSBP&-9^09Tk/@ZkI\P"_$^I?I,S+?b-:5*?@Z>?b<9Ou$<H>EUc~>cvx
exec[

Verwendung: $ gs -q -dNOPROMPT -dNODISPLAY -dBATCH thisfile.ps <input.in >output.out

KirarinSnow
quelle
10
Ich liebe es, die weniger traditionellen Sprachen in diesen Wettbewerben zu sehen.
Mob
12

F #: 224 225, 226, 248, 252, 270, 276, 299, 306 Zeichen

let x,(/)=System.Console.ReadLine(),String.replicate
let t,p=(int x.[0]-60)%7*5,int x.[1]%2
let g s i=printf"%s"(i/((99/s).[t+4*p..t+int x.[2..]*5+5*p]+"\n"))
g"|   ###  ###   |   ###  ###  ###   "5 
g"|    "3
g"|____"1

Ich habe Module von 2 verwendet, um nach einem Leerzeichen oder Pfund zu suchen. '' ist 32% 2 = 0 '#' ist 35% 2 = 1 und da meine bedingte Null für false zurückgegeben wurde, habe ich gerade das Modulergebnis multipliziert.

Verwendet die <| Bediener, um ein Leerzeichen zu rasieren. Überladen des Operators verwendet, um ein weiteres Zeichen zu speichern.

Original

let piano_long (input:string) = 
    let sharp, flat = if input.[1] = '#' then 4, 1 else 0, 0

    let note = (int input.[0] - 60) % 7
    let num = int (input.Substring 2)

    let start = note * 5 + sharp
    let stop = num * 5 + 1 + flat

    let top    = "|   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |"
    let middle = "|    |    |    |    |    |    |    |    |    |    |    |    |    |    |"
    let bottom = "|____|____|____|____|____|____|____|____|____|____|____|____|____|____|"


    let mutable piano = ""

    for i in 1..5 do 
        piano <- piano + top.Substring(start, stop) + "\n"

    for i in 1..3 do 
        piano <- piano + middle.Substring(start, stop) + "\n"

    piano <- piano + bottom.Substring(start, stop)

    printf "%s\n\n" piano
Gradbot
quelle
Ich könnte 46 Zeichen abschneiden, wenn F # einen String-Multiplikationsoperator hätte
Gradbot
Ein bisschen kürzer:let g s i=for i=1 to i do printfn"%s"(String.replicate 99 s).[t+4*p..t+int(x.[2..])*5+5*p]
cfern
Super, danke! Ich weiß nicht, warum ich das nicht finden konnte. Ich habe es einer Variablen zugewiesen und zweimal verwendet.
Gradbot
Jetzt zahle ich nur die 48-Zeichen-Steuer für .net-Funktionsnamen.
Gradbot
Herzlichen Glückwunsch zu Version 8! Ich bin überrascht, wie viel Sie herausgeschnitten haben.
ChaosPandion
11

sed, 231 235 234 235 237 238 244 268 269 270 276 279 280 282 287 300 307 314 329 338 Zeichen

Funktioniert für bis zu 99 Tasten. Das Standardklavier hat 52 weiße Tasten, dies sollte also ausreichen.

s/.*/CDEFGABC&=0123456789-/
s/(.).=(.*)\1.*/&\2\2\2\2\2\2\2\2\2\2/
s/ .?(.)=(.*)\1.*-/\2/
s/.*#/%&/
:
s/((.)(.).*\2)[#-9]/\1  \3/
t
s/[^ %CF]/###/g
s/C|F/ | /g
s/(%....)?.{25}(.*)./\2/p
p
p
p
p
s/## /|  /g
s/#[|#]/ |/g
p
p
p
y/ /_/

Beispiele:

$ echo C 14 | sed -rf piano.sed
|   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |
|   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |
|   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |
|   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |
|   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |
|    |    |    |    |    |    |    |    |    |    |    |    |    |    |
|    |    |    |    |    |    |    |    |    |    |    |    |    |    |
|    |    |    |    |    |    |    |    |    |    |    |    |    |    |
|____|____|____|____|____|____|____|____|____|____|____|____|____|____|
$ echo D# 1 | sed -rf piano.sed
###   |
###   |
###   |
###   |
###   |
 |    |
 |    |
 |    |
_|____|
$ echo A 7 | sed -rf piano.sed
##  ###   |   ###  ###   |   ###  ##
##  ###   |   ###  ###   |   ###  ##
##  ###   |   ###  ###   |   ###  ##
##  ###   |   ###  ###   |   ###  ##
##  ###   |   ###  ###   |   ###  ##
|    |    |    |    |    |    |    |
|    |    |    |    |    |    |    |
|    |    |    |    |    |    |    |
|____|____|____|____|____|____|____|
$ echo A 52 | sed -rf piano.sed
##  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ##
##  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ##
##  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ##
##  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ##
##  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ##
|    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |
|    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |
|    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |
|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|

Im letzten Beispiel wird die Standardtastatur zusammen mit imaginären schwarzen Tasten an beiden Enden gedruckt.

KirarinSnow
quelle
10

PianoScript - 2 Zeichen

Es ist ein Einzeiler:

go

Verwendung:

PianoScript piano.ps G# 11

Ausgabe:

###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ##
###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ##
###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ##
###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ##
###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ##
 |    |    |    |    |    |    |    |    |    |    |    |
 |    |    |    |    |    |    |    |    |    |    |    |
_|____|____|____|____|____|____|____|____|____|____|____|

Weitere Informationen zur PianoScript-Sprache finden Sie hier .

Ahnungslos
quelle
1
Es können 0 Zeichen sein, nicht wahr?
SIE
Ich gehe davon aus, dass Sie in PianoScript ++ das Programm in einem Zeichen weniger schreiben können.
Gradbot
4
Schade, dass Sie nicht der erste sind, der auf diese Idee gekommen ist.
LiraNuna
4
-1 für Betrug und nicht einmal einen coolen Namen für die Sprache zu finden;)
Gnarf
1
Klaviere haben Partituren, keine Skripte
Jimmy
10

JavaScript - 195 Zeichen

Hey, Golf ist ein Spiel, bei dem du nur gegen dich selbst antrittst, oder? :) :)

k=readFile(0).split(' ')
q=!k[0][1]
r=k[1]
o=''
for(x=10;x--;){p=k[0].charCodeAt(0)-65+!q
s=''
for(j=+r+1;j--;){p=++p%7
s+=x>4&&!p|p%3?'###  ':x?' |   ':'_|___'}o+=s.substring(q,r*5+2)+'\n'}print(o)

Lösung durch Zwerg; von KirarinSnow auf Rhino portiert (mit geringfügigen Korrekturen und Formatierungsänderungen); weiter vom Zwerg weggeschlagen; Fehler von KirarinSnow korrigiert. Zwischenspeicherk[1] von cwallenpoole

Verwendung: $ cp input.in 0; rhino thisfile.js

Schnelle HTML-Demoversion: Golf Test - Fügt hinzureadFile=prompt;print=function(a) {document.write("<pre>"+a);}

Gnarf
quelle
Nun, Sie konkurrieren auch gegen die Spezifikation ... und ich denke, dass Sie verloren haben. ;) Es besteht nicht einmal die Testfälle. Es scheint, dass es eins beginnt.
Guffa
Sie haben nur 1 Verweis auf b. Ändern Sie readFile (b) in readFile ('substring')
Ponkadoodle
@ Wallacoloo - später benötigt, der Teil unten:s=s[b](1-q,p=s.length-3)
Gnarf
6

Python3 - 158

Für mehr inputvs raw_input. Verlieren Sie ()fürprint

k,n=input().split()
o=(ord(k[0])-65)*5
n=int(n)*5+1
for x in["##  ###   |   ### "]*5+[n*"|    "]*3+[n*"|____"]:print(((x+x[::-1][:-1])*n)[o+3*len(k[1:]):o+n])
John La Rooy
quelle
5

F #: 355 signifikante Zeichen

Alles in einer Zeile:

let[|x;y|]=System.Console.ReadLine().Split([|' '|])in[for i in 1..9->let r (a:string) b j (s:string)=s.Replace(a,if i>j then b else a)in((String.replicate(int y+1)"23012123012121").Substring(int(x.[0])-65,int y*2+x.Length).Replace("0","|   ")|>r"1""#"0|>r"2""##  "0|>r"3"" "0).TrimEnd()|>r"###"" | "5|>r"##""| "5|>r" ""_"8]|>String.concat"\n"|>printfn "%s"

Erweitert:

let piano() =
    let[|x;y|]=System.Console.ReadLine().Split([|' '|])in
    [for i in 1..9->
        let r (a:string) b j (s:string) = s.Replace(a,if i>j then b else a) in
        ((String.replicate (int y+1) "23012123012121")
            .Substring(int(x.[0])-65,int y*2+x.Length).Replace("0","|   ")
            |> r "1" "#" 0
            |> r "2" "##  " 0
            |> r "3" " " 0)
            .TrimEnd()|> r "###" " | " 5|> r "##" "| " 5|> r " " "_" 8]
    |> String.concat "\n"
    |> printfn "%s"
Julia
quelle
@Brian, bitte lassen Sie das Team implementieren getsoder gleichwertig, wir würden 22 Zeichen speichern!
Benjol
Ich finde, dass beim Golfen eine Rekursion ein guter Weg ist, um Typanmerkungen zu entfernen.
Gradbot
3

SETL

165 Zeichen; Übersetzung von Gribblers Python-Lösung.

get(l);[k,n]:=split(l);o:=(abs k(1)-65)*5;n:=1+5*val n;(for x in['##  ###   |   ### ']*5+[n*'|    ']*3+[n*'|____'])print(((x+reverse x(2..))*n)(o+4*#k-3..o+n));end;
finnw
quelle
3

D2 (Vorlagen): 331 370 400 + 17 Zeichen

(basierend auf der Ruby-Lösung.)

Komprimiert:

template J(alias T,int b,int e,r...){static if(e)enum J=T!(b,r)~J!(T,b+1,e-1,r);else enum J="";}template K(int i,int t){enum K=t>7?"_|___":t<5&&3&i%7?"###  ":" |   ";}template R(int t,int s,int l,int h){enum R=J!(K,s-h,l,t)[h..$-3]~"\n";}template M(alias k){enum M=J!(R,0,9,k[0]+1,k[$-2]>32?k[$-1]+10*k[$-2]-527:k[$-1]-47,k[0]&1);}

Erklärt:

/**
    Macros:
        D = <tt>$0</tt>
 */
 ;

/**
    $(D_PSYMBOL J) (short for "join") will evaluate $(D T!(i,r)) for
    $(D_PARAM i) in $(D [b..b+e]). Then, these compile-time strings will be
    concatenated.
 */
template J(alias T,int b,int e,r...){
    static if(e)
        enum J=T!(b,r)~J!(T,b+1,e-1,r);
    else
        enum J="";
}

/**
    $(D_PSYMBOL K) (short for "key") will generate 5 characters as a row of
    key $(D_PARAM i) at row $(D_PARAM t).
 */
template K(int i,int t){
    enum K=t>7?"_|___":t<5&&3&i%7?"###  ":" |   ";
}

/**
    $(D_PSYMBOL R) (short for "row") will generate the keyboard at row
    $(D_PARAM t), from key $(D_PARAM s) and sharpness $(D_PARAM h) with a
    length of $(D_PARAM l) keys.
 */
template R(int t,int s,int l,int h){
    enum R=J!(K,s-h,l,t)[h..$-3]~"\n";
}

/**
    $(D_PSYMBOL M) (short for "main") results in the whole keyboard as a string.

    Example:
    -----
    pragma(msg,M!("C 14"));
    pragma(msg,M!("D# 1"));
    pragma(msg,M!("A 7"));
    -----
 */
template M(alias k){
    enum M=J!(R,0,9,k[0]+1,k[$-2]>32?k[$-1]+10*k[$-2]-527:k[$-1]-47,k[0]&1);
}

Da wir keine Parameter von dmdder Eingabe übergeben können, muss dies im Code erfolgen. Unterstützt nur bis zu 99 Schlüssel.

KennyTM
quelle
2
Können Sie die Eingabe zu einer einzelnen Zeichenfolge machen? Ein Teil der Herausforderung besteht darin, die Linie in eine Note, eine optionale Schärfe und eine Dauer zu zerlegen. Das Parsen selbst kann in einigen Sprachen einige Zeichen
annehmen
2

Haskell: 212 211 208 Zeichen

a="  |  "
b=" ### "
d=concat.cycle
e=d[b,b,a,b,b,a,b]
f=d[a]
t x s m n=map(take(5*read s+m).drop(5*length['@'..x]-n))[e,e,e,e,e,f,f,f,d["__|__"]]
u(x:'#':s)=t x s 2 4 
u(x:s)=t x s 1 8
main=interact$unlines.u

Es werden weiterhin ASCII-kompatible Buchstaben angenommen (insbesondere die Sequenz "@ABCDEFG"), es wird jedoch kein Char.ord mehr benötigt

Kommensturm
quelle
2

Ruby - 113 Zeichen

Wird mit Befehlszeilenargumenten ausgeführt

$ ruby piano.rb A 7

k,c=$*
9.times{|x|puts (((b=x<8?'  |  ':'__|__')+(a=x<5?' ### ':b)*3+b+a*2)*j=k[0]*5-2+4*s=k.size)[j,c.to_i*5+s]}

Ruby - 118 Zeichen

k,c=$*
9.times{|x|puts (((b=x<8?'  |  ':'__|__')+(a=x<5?' ### ':b)*3+b+a*2)*j=2+k[0]*5+4*s=k.size-1)[j..c.to_i*5+s+j]}
Gnibbler
quelle
2

PHP - 208 Zeichen

<?$e=45*substr($a=PIANO,2+$d=!($a[1]^~ì))+9+$d*45;$j=9*$c=4*$d;for($b=ord($a[0])-65,--$c;$j<$e;$f[$i=$j++%9].=($c=($c+!$i)%5)%4<2&$i>3&$b%3!=2?Ü:($c?$i?ß: :))$j%45-36?:$b=++$b%7;for(;$a=$f[$i--];)echo~$a,~õ;

Muss verbessert werden.

Die Eingabe muss in der Konstante PIANO erfolgen.

user581149
quelle
1

F # 414 386 372 signifikante Zeichen:

//wins me 2 characters
open System

//String.replicate, didn't know this existed before reading Juliet
let r=String.replicate  

//print s n times, each time on a newline
let P n s=printf"%s"(r n (s+"\n"))  

//define top rows
let t="##  ###   |   ###  ###   |   ###  #" 

//middle and bottom rows can be defined using 'r'
let m,b=r 7"|    ",r 7"|____" 

//pick of chars from O to n+O from string, wrap round if we go beyond s.Length
let L(s:string)O n=String([|5*O..5*(n+O)|]|>Array.map(fun i->s.[i%35]))

//match input string into two halves
let[|k;n|]=Console.ReadLine().Split([|' '|])

//work out start pos and length (in chars, not keys)
let O,N=
 let K=int k.[0]-65                    //'A'=65, this is why t starts at A
 if k.[0]='#'then(K+3,int n+2)else(K,int n) 

//Print 5 top rows, 3 middle rows and the bottom row
P 5(L t O N)
P 3(L m O N)
P 1(L b O N)

Oh, und ein Bonus, dieses Skript wird "F # 372" tatsächlich korrekt behandeln - ich werde Sie nicht ärgern, wenn ich es hier einfüge ...

System.Console.ReadLine () ist so ein Mist ...

Benjol
quelle