Code Golf: Piano


88

La sfida

Il codice più breve per numero di caratteri per produrre una parte della tastiera di un pianoforte a partire dalla nota di input in una data lunghezza.

L'input sarà composto da una nota ( [ACDFG]#|[A-G]) da cui iniziare a stampare la tastiera e un numero positivo che rappresenta la lunghezza dei tasti da stampare, inclusa la prima nota.

Il primo tasto deve essere stampato per intero - se ha un tasto diesis sinistro, verrà tagliato, lo stesso per quando il tasto di avvio è diesis, verrà tagliato anche il tasto sinistro.

Non viene conteggiato un tasto diesis, solo i tasti bianchi.

Casi test

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

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

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

Il conteggio del codice include input / output (cioè programma completo).


5
[A-G]#*? Questo significa che dobbiamo gestire, diciamo, B#####come E?
Anon.

5
Per il conteggio delle chiavi, definire "chiave". Perché l'esempio "C 14" stampa 24 tasti?
Guffa

53
OK, ora che abbiamo le soluzioni C e C #, abbiamo bisogno di B, D e F #.
LiraNuna

7
Next code golf: implementa un'interfaccia MIDI per questi pianoforti.
Mehrdad Afshari

10
Cari Closer, vi saluto per essere riusciti a chiudere questa sfida dopo 3 giorni. Dobbiamo riaprirlo tra 5 minuti. Questo da solo dovrebbe dirti qualcosa: alla comunità piace e accetta questo tipo di domande, che ti piaccia o no. Se non lo fai, tuttavia, aggiungi code-golf al tuo elenco di tag ignorati.
LiraNuna

Risposte:


27

GolfScript - 80 caratteri

Si inserisce in una riga di #SO senza la barra di scorrimento :)

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

GolfScript - 81 caratteri

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

Versione ben formattata (27 x 3)

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

GolfScript - 82 caratteri

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

GolfScript - 85 caratteri

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

Versione ben formattata (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 caratteri

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

GolfScript - 98 caratteri

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

GolfScript - 101 caratteri

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

GolfScript - 109 caratteri

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

GolfScript - 120 caratteri

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

GolfScript - 127 caratteri

' '/~~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 
##  ###   |   ###  ###   |   ###  ##
##  ###   |   ###  ###   |   ###  ##
##  ###   |   ###  ###   |   ###  ##
##  ###   |   ###  ###   |   ###  ##
##  ###   |   ###  ###   |   ###  ##
|    |    |    |    |    |    |    |
|    |    |    |    |    |    |    |
|    |    |    |    |    |    |    |
|____|____|____|____|____|____|____|

Stavo per inviare la mia prima voce di golfscript per un'altra sfida ( stackoverflow.com/questions/2104556/… ), ma è stata chiusa :-(
mob

2
Vorrei che insegnassero golfscript a scuola. Voglio i miei soldi indietro.
Steve Tjoa

6
Bello. Pubblicherò la mia soluzione in PianoScript più tardi. Sono solo 6 caratteri. :-)
molf

112

Perl, 133 (129) caratteri

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

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

Ecco una soluzione di 129 caratteri, prendendo in prestito diverse idee dalla soluzione Ruby di molf:

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

e con l'aiuto di 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, fantastico. Quello è uno Steinway, Yamaha, Young Chang?
Steve Tjoa

2
Lo aggiungerò ai segnalibri per mostrarlo alle persone che non capiscono lo scherzo della "scimmia".
Mehrdad Afshari,

3
@Steve - Facciamolo diventare una Yamaha
mob

6
@mobrule, odi grep? perché vuoi che muoia? :(
LiraNuna

Golfscript * 1.3 sarebbe 105 :)
John La Rooy

34

Rubino - 125 caratteri

146 144 140 137 134 126 125 caratteri

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,"_"}

(La seconda nuova riga non è necessaria e viene aggiunta solo per evitare una barra di scorrimento su SO. I punti e virgola possono essere sostituiti da una nuova riga, se lo si desidera.)

La versione Ruby 1.9 è diversa ma di uguale lunghezza (sostituita a[0]da a.orde "_"da ?_):

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,?_}

Chiama con

$ ruby piano.rb C 14

Hey VIM conta 138 caratteri sul primo?!?
hurikhan77

a, n = gets.split; ... fa lo stesso lavoro, -3 caratteri
hurikhan77

1
Potresti anche sostituire "gets.split" con "$ *" e fornire l'input sulla riga di comando, -8 caratteri
hurikhan77

Passa i%7%4<1||t>4?"_|___":"###__"a i%7%4&&t<5?"###__":"_|___"e salva 2 caratteri. Adoro %7%4quell'idioma
mob

1
Quindi siamo arrivati ​​alla soluzione più breve, eh? Ruby rulez! :-D
hurikhan77

29

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

In linea con il tema musicale, ecco una soluzione in un linguaggio progettato per la composizione di spartiti musicali, 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))))

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


4
questa è forse la prima e unica volta che ho visto LilyPond usato nel golf in codice.
acciottolato


26

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

Mostrato in più righe per la leggibilità, ma dovrebbe essere una singola riga:

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)

Può essere testato con questo interprete BASIC di Applesoft in Javascript o un emulatore .

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


È possibile leggere entrambi gli argomenti sulla stessa riga, secondo le specifiche?
KirarinSnow

18

C # - 315

Mi ostino a giocare a golf in C # anche se non è un linguaggio molto conciso ...

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
Ora la soluzione F # completa la melodia.
LiraNuna

13
+1 per l'umorismo, -1 per l'umorismo sdolcinato e +1 poiché C # e F # sono concordanti.
Steve Tjoa

Ho ricevuto un'eccezione System.IndexOutOfRangeException quando ho provato a eseguirlo.
Fitzchak Yitzchaki

@ Mendy: devi fornire argomenti della riga di comando quando lo esegui. Se lo esegui da Visual Studio, apri le proprietà del progetto, vai alla scheda di debug e in Opzioni di avvio puoi inserire gli argomenti della riga di comando. Se hai compilato il codice in un exe, eseguilo da una finestra della console con gli argomenti dopo il nome del programma.
Guffa

1
Uso molto piacevole dell'operatore ->.
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]

Non potresti salvare alcuni caratteri rimuovendo la parte ripetuta di te ue moltiplicando per 7?
Matthew Crumley

@ Matthew Crumley, sentiti libero di prendere in prestito dalla mia soluzione :)
John La Rooy,

@gnibbler, non sono davvero un programmatore Python (ci ho giocato un po ', ma non ampiamente) quindi dubito che sarei in grado di farci molto. Non sapevo nemmeno che Python potesse moltiplicare stringhe in quel modo finché non ho visto la tua soluzione originale.
Matthew Crumley

@gnibbler - bella soluzione, mi piacerebbe eseguirlo ma ottenendo un SyntaxError .... C 14 Traceback (ultima chiamata più recente): File "piano.py", riga 1, in? k, n = input (). split () File "<stringa>", riga 1 C 14 ^
AJ.

@AJ, sembra che l'errore provenga dalla soluzione Python3. Non sono sicuro del motivo per cui lo stai ricevendo
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 caratteri

Perché usare solo C o C # o F # (o B o D) quando puoi programmare con un'ottava completa?

(avvolto ogni 60 caratteri per chiarezza)

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

Sì ... questa soluzione calcola davvero la complessa trasposizione coniugata di una stringa.

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


13

C - 197 203 207 216 224 232 240 personaggi

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

Questa versione equivalente a 194 caratteri presuppone che l'overflow del buffer sia corretto.

#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++)<- spazi inutili, e sembra che tu li abbia inclusi anche nel conteggio dei caratteri
Nicolás

12

PostScript: 239 245 293 312 (normale); 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[

Versione binaria espansa tramite la codifica ASCII85 in un programma di 219 caratteri con solo caratteri stampabili ASCII:

/(|____)/(|    )[/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[

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


10
Amo vedere le lingue meno tradizionali in questi concorsi.
mafia

12

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

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

Ho usato moduli da 2 per rilevare uno spazio o una libbra. '' è 32% 2 = 0 '#' è 35% 2 = 1 e poiché il mio condizionale ha restituito zeri per falso, ho semplicemente moltiplicato il risultato dei moduli.

Usato il <| operatore per radere un carattere spaziale. Utilizzato il sovraccarico dell'operatore per salvare un altro carattere.

originale

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

Potrei eliminare 46 caratteri se F # avesse un operatore di moltiplicazione delle stringhe
gradbot

Un po 'più breve: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

Fantastico, grazie! Non so perché non sono riuscito a trovarlo. L'ho assegnato a una variabile e l'ho usato due volte.
gradbot

Ora sto solo pagando la tassa di 48 caratteri per i nomi delle funzioni .net.
gradbot

Congratulazioni per la versione 8! Sono sorpreso di quanto tu abbia tagliato fuori.
ChaosPandion

11

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

Funziona fino a 99 chiavi. Il pianoforte standard ha 52 tasti bianchi, quindi dovrebbe essere sufficiente.

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/ /_/

Esempi:

$ 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
##  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ##
##  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ##
##  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ##
##  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ##
##  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ##
|    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |
|    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |
|    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |
|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|

L'ultimo esempio stampa la tastiera standard, insieme a tasti neri immaginari su entrambe le estremità.


10

PianoScript - 2 caratteri

È una battuta:

go

Utilizzo:

PianoScript piano.ps G# 11

Produzione:

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

Ulteriori informazioni sul linguaggio PianoScript sono disponibili qui .


1
Può contenere 0 caratteri, non è vero?
TU

Presumo che in PianoScript ++ sarai in grado di scrivere il programma in un carattere in meno.
gradbot

4
Peccato che tu non sia il primo ad aver avuto questa idea.
LiraNuna

4
-1 per aver imbrogliato e nemmeno
inventare

1
i pianoforti hanno spartiti, non copioni
Jimmy

10

JavaScript - 195 caratteri

Ehi, il golf è un gioco in cui gareggi solo contro te stesso, giusto? :)

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)

Soluzione di gnarf; portato su Rhino (con una piccola correzione e modifiche alla formattazione) da KirarinSnow; ulteriormente scheggiato da gnarf; errore corretto da KirarinSnow. cache k[1]di cwallenpoole

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

Versione demo rapida HTML: Golf Test - AggiungereadFile=prompt;print=function(a) {document.write("<pre>"+a);}


Bene, gareggi anche contro le specifiche ... e penso che tu abbia perso. ;) Non supera nemmeno i casi di test. Sembra che ne inizi uno.
Guffa

Hai solo 1 riferimento a b. cambia readFile (b) in readFile ('sottostringa')
Ponkadoodle

@wallacoloo - necessaria in seguito, la parte in basso:s=s[b](1-q,p=s.length-3)
gnarf

6

Python3 - 158

Risparmia sul inputvs raw_input. Perdere ()perprint

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 caratteri significativi

Tutto su una riga:

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"

Allargato:

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, per favore chiedi al team di implementare getso equivalente, salveremmo 22 caratteri!
Benjol

Trovo che quando si gioca a golf la ricorsione sia un buon modo per rimuovere le annotazioni di tipo.
gradbot

3

SETL

165 caratteri; Traduzione di gribblers Python solution.

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 (modelli): 331 370 400 + 17 caratteri

(basato sulla soluzione Ruby.)

Compresso:

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

Spiegato:

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

Poiché non è possibile passare parametri dmddall'input, è necessario farlo nel codice. Supporta solo fino a 99 chiavi.


2
Potete rendere l'input una singola stringa? Parte della sfida è analizzare la linea in una nota, un diesis opzionale e una durata. L'analisi stessa può richiedere un bel po 'di caratteri in alcune lingue ...
KirarinSnow

2

Haskell: 212 211 208 caratteri

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

Presuppone ancora lettere compatibili con ascii (in particolare, la sequenza "@ABCDEFG"), ma non richiede più Char.ord


2

Rubino - 113 caratteri

Funziona con argomenti della riga di comando

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

Rubino - 118 caratteri

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 caratteri

<?$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,~õ;

Dovrà essere migliorato.

L'input deve essere consegnato nella costante denominata PIANO.


1

F # 414 386 372 caratteri significativi:

//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, e un bonus, questo script gestirà correttamente "F # 372" - Non ti infastidirò incollandolo qui però ...

System.Console.ReadLine () è un vero peccato ...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.