Code Golf: Klavier


88

Die Herausforderung

Der kürzeste Code nach Zeichenanzahl, um einen Teil einer Klaviertastatur ausgehend von der eingegebenen Note in einer bestimmten Länge auszugeben.

Die Eingabe besteht aus einer Notiz ( [ACDFG]#|[A-G]), von der aus die Tastatur gedruckt werden soll, und einer positiven Zahl, die die Länge der zu druckenden Tasten einschließlich der ersten Note angibt.

Die erste Taste sollte vollständig gedruckt werden. Wenn sie eine linke scharfe Taste hat, wird sie geschnitten. Wenn die Starttaste scharf ist, wird auch die linke Taste geschnitten.

Ein scharfer Schlüssel wird nicht gezählt, nur weiße Schlüssel.

Testfälle

Input
    C 14
Output
    |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |
    |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |
    |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |
    |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |
    |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |
    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |
    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |
    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |
    |____|____|____|____|____|____|____|____|____|____|____|____|____|____|

Input
    D# 1
Output
    ###   |
    ###   |
    ###   |
    ###   |
    ###   |
     |    |
     |    |
     |    |
    _|____|

Input
    A 7
Output
    ##  ###   |   ###  ###   |   ###  ##
    ##  ###   |   ###  ###   |   ###  ##
    ##  ###   |   ###  ###   |   ###  ##
    ##  ###   |   ###  ###   |   ###  ##
    ##  ###   |   ###  ###   |   ###  ##
    |    |    |    |    |    |    |    |
    |    |    |    |    |    |    |    |
    |    |    |    |    |    |    |    |
    |____|____|____|____|____|____|____|

Die Codeanzahl umfasst die Eingabe / Ausgabe (dh das vollständige Programm).


5
[A-G]#*? Bedeutet das, dass wir beispielsweise mit B#####as umgehen müssen E?
Anon.

5
Definieren Sie für die Anzahl der Schlüssel "Schlüssel". Warum druckt das Beispiel "C 14" 24 Tasten?
Guffa

53
OK, jetzt, wo wir C- und C # -Lösungen haben, brauchen wir B, D und F #.
LiraNuna

7
Nächster Code Golf: Implementieren Sie eine MIDI-Schnittstelle für diese Klaviere.
Mehrdad Afshari

10
Sehr geehrte Schließer, ich begrüße Sie, dass Sie diese Herausforderung nach 3 Tagen abgeschlossen haben. Wir haben es in 5 Minuten wieder geöffnet. Das allein sollte Ihnen etwas sagen - die Community mag und akzeptiert diese Art von Fragen, ob Sie es mögen oder nicht. Wenn Sie dies jedoch nicht tun, fügen Sie bitte Code-Golf zu Ihrer Liste der ignorierten Tags hinzu.
LiraNuna

Antworten:


27

GolfScript - 80 Zeichen

Passt in eine Zeile von #SO ohne Bildlaufleiste :)

' ':s/~~5*\(7&5*\,.4*@+):k;+):c;9,{5<'#'9**' | '4*+3/4<.1>+c*s.+*k>c<n+}%)s/'_'*

GolfScript - 81 Zeichen

' ': /((7&\,.4*@5*+:k;\~~5*+):c;9,{5<'#'9**' | '4*+3/4<.1>+c*  +*k)>c<n+}%) /'_'*

Schön formatierte Version (27 x 3)

' ': /((7&\,.4*@5*+:k;\~~5*
+):c;9,{5<'#'9**' | '4*+3/4
<.1>+9*  +*k)>c<n+}%) /'_'*

GolfScript - 82 Zeichen

' '/((7&\,.4*@5*+:k;\~~5*+):c;9,{5<3*'###  '*' |   '4*+20<.5>+c*k)>c<n+}%)' '/'_'*

GolfScript - 85 Zeichen

' '/((7&\,.4*@5*+:k;\~~5*+):c;9,{.5<3*'###  '*' _'1/@8=='|'1$3*++4*+20<.5>+c*k)>c<n}%

Schön formatierte Version (17 x 5)

' '/((7&\,.4*@5*+
:k;\~~5*+):c;9,{.
5<3*'###  '*' _'1
/@8=='|'1$3*++4*+
20<.5>+c*k)>c<n}%

GolfScript - 94 Zeichen

' ': /~~5*:c;(7&5*:^;,:&;['###  '3*' |   '+.5>+c*1>{^4&*+>&c+)<n}:f~]5*'   _'1/{'|'\4*+7*c*f}%

GolfScript - 98 Zeichen

' ': /~~5*:c;(7&5*:^;,:&;['###  '3*' |   '+.5>+c*^4&*+:^)>&c+):&<n]5*[   '_']{['|'\4*+7*c*^>&<n]}%

GolfScript - 101 Zeichen

' ': /~~5*:c;(7&5*:^;,:&;['###  '3*' |   '+.5>+c*^4&*+)>&c+)<n]5*[   '_']{['|'\4*+7*c*^4&*+>&c+)<n]}%

GolfScript - 109 Zeichen

' ': /~~5*:c;(7&5*:^;,:&;['##''  ###'.'   | '++.'  #'+++c*^4&*+>&c+)<n]5*[   '_']{['|'\4*+7*c*^4&*+>&c+)<n]}%

GolfScript - 120 Zeichen

' '/~~5*:c;(7&5*:^;,:&;['##''  ###'.'   | '++.'  #'+++c*^4&*+>&c+)<n]5*['|    '7*c*^4&*+>&c+)<n]3*'|____'7*c*^4&*+>&c+)<

GolfScript - 127 Zeichen

' '/~~5*:c;(7&5*:^;,:&;['##  ###  ###   |   ###  ###   |   #'c*^4&*+>&c+)<n]5*['|    '7*c*^4&*+>&c+)<n]3*'|____'7*c*^4&*+>&c+)<

$ echo -n C 14 | ruby golfscript.rb piano.gs 
|   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |
|   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |
|   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |
|   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |
|   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |
|    |    |    |    |    |    |    |    |    |    |    |    |    |    |
|    |    |    |    |    |    |    |    |    |    |    |    |    |    |
|    |    |    |    |    |    |    |    |    |    |    |    |    |    |
|____|____|____|____|____|____|____|____|____|____|____|____|____|____|
$ echo -n D# 1| ruby golfscript.rb piano.gs 
###   |
###   |
###   |
###   |
###   |
 |    |
 |    |
 |    |
_|____|
$ echo -n A 7| ruby golfscript.rb piano.gs 
##  ###   |   ###  ###   |   ###  ##
##  ###   |   ###  ###   |   ###  ##
##  ###   |   ###  ###   |   ###  ##
##  ###   |   ###  ###   |   ###  ##
##  ###   |   ###  ###   |   ###  ##
|    |    |    |    |    |    |    |
|    |    |    |    |    |    |    |
|    |    |    |    |    |    |    |
|____|____|____|____|____|____|____|

Ich wollte gerade meinen ersten Golfscript-Eintrag für eine weitere Herausforderung einreichen ( stackoverflow.com/questions/2104556/… ), aber er wurde geschlossen :-(
Mob

2
Ich wünschte, sie hätten in der Schule Golfskript unterrichtet. Ich will mein Geld zurück.
Steve Tjoa

6
Nett. Ich werde meine Lösung später in PianoScript veröffentlichen. Es sind nur 6 Zeichen. :-)
molf

112

Perl, 133 (129) Zeichen

Perl, 167 160 156 147 142 133 D'oh! 147 144 137 134 133 Zeichen

    $ _ = shift; die grep {5> $ n? y / * / # /: y / # * / | /; $ n ++ - 8 || y / / _ /}
    @ Q = (substr (("* # #". ("* # # * # | #") X2) x9,
    4 * / # / + (7 & ord) * 5,1 + / # / + 5 * pop). $ /) X9

Hier ist eine 129-Zeichen-Lösung, die verschiedene Ideen aus der Ruby-Lösung von molf entlehnt:

    ($ _, $ c) = @ ARGV; $ j = ($ k = / # /) + ord;
    für $ n (0..8) {print $ /, substr + (join '', map {8- $ n? 5> $ n && $ _% 7% 4? "###"
    : "|": "_ | ___"} $ j .. $ j + $ c) ,! $ k, -3}

und mit Hilfe des Acme :: AsciiArtinator :

                sub init_piano{$S=$";$H='#';
                (                            $
               T                              ,$P,$U)=qw(
              T                                          |
             _                                            |
            /                                              )
           ;                                                $
          d             =$T.$H.$S.$S;$t                     =
         $             d               .                   $H
        .              $               d                  . $
       S               .$P.$S.$S.$S.$H;$                t=  $
      d.$H.$t.$t;};$_=shift;-/-/;&init_piano();$Z=/#/;-/|   |
      |                                                 |   |
      |                    YAMAHA                       |  /
      ;die grep{4>$n++?y/T/#/:y/#T/ |/;$n-8||y/ /_/;}@q=(m{
     // // /// // /// // /// // /// // /// // /// // /// /   
    // // /// // /// // /// // /// // /// // /// // /// /
   }                                                   .
   substr(${t}x(9),4*${Z}+(7&ord)*5,1+$Z+5*pop).$/)x(8)
          ;   '                            \   /
           | |                              | |
           /_\                              /';

7
Hahaha, großartig. Ist das ein Steinway, Yamaha, Young Chang?
Steve Tjoa

2
Ich werde dies mit einem Lesezeichen versehen, um es Leuten zu zeigen, die den "Affen" -Witz nicht verstehen.
Mehrdad Afshari

3
@Steve - Machen wir es zu einem Yamaha
Mob

6
@mobrule, hasst du grep? warum willst du, dass es stirbt? :(
LiraNuna

Golfscript * 1.3 wäre 105 :)
John La Rooy

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

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

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


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


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,"|__|__");}}

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]

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


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

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


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

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.


10

PianoScript - 2 Zeichen

Es ist ein Einzeiler:

go

Verwendung:

PianoScript piano.ps G# 11

Ausgabe:

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

Weitere Informationen zur PianoScript-Sprache finden Sie hier .


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


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

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"

@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;

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.


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


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

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.


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 ...

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.