Code Golf: Fortepian


88

Wyzwanie

Najkrótszy kod ze względu na liczbę znaków, który wyświetla część klawiatury fortepianu, zaczynając od nuty wejściowej o określonej długości.

Dane wejściowe będą składać się z nuty ( [ACDFG]#|[A-G]), od której rozpocznie się drukowanie klawiatury, oraz dodatniej liczby reprezentującej długość klawiszy do wydrukowania, w tym pierwszą nutę.

Pierwszy klawisz powinien być wydrukowany w całości - jeśli ma lewy ostry klawisz, zostanie obcięty, tak samo, gdy klawisz start jest ostry, lewy klawisz również zostanie obcięty.

Ostry klawisz nie jest liczony, tylko białe klawisze.

Przypadki testowe

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

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

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

Liczba kodów obejmuje wejście / wyjście (tj. Pełny program).


5
[A-G]#*? Czy to oznacza, że ​​musimy sobie radzić, powiedzmy, B#####jak E?
Anon.

5
Jako liczbę kluczy zdefiniuj „klucz”. Dlaczego przykład „C 14” wyświetla 24 klawisze?
Guffa

53
OK, teraz, gdy mamy rozwiązania C i C #, potrzebujemy B, D i F #.
LiraNuna

7
Następny kod golf: Zaimplementuj interfejs MIDI dla tych pianin.
Mehrdad Afshari,

10
Drodzy zamykacze, pozdrawiam Was za to, że udało się wam zamknąć to wyzwanie po 3 dniach. Mamy go ponownie otworzyć za 5 minut. Już samo to powinno ci coś powiedzieć - społeczność lubi i akceptuje tego rodzaju pytania, czy ci się to podoba, czy nie. Jeśli jednak tego nie zrobisz, dodaj code-golf do listy ignorowanych tagów.
LiraNuna

Odpowiedzi:


27

GolfScript - 80 znaków

Mieści się w jednej linii #SO bez paska przewijania :)

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

GolfScript - 81 znaków

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

Ładnie sformatowana wersja (27 x 3)

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

GolfScript - 82 znaki

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

GolfScript - 85 znaków

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

Ładnie sformatowana wersja (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 znaki

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

GolfScript - 98 znaków

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

GolfScript - 101 znaków

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

GolfScript - 109 znaków

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

GolfScript - 120 znaków

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

GolfScript - 127 znaków

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

Miałem właśnie wysłać swój pierwszy wpis w skrypcie golfa do kolejnego wyzwania ( stackoverflow.com/questions/2104556/… ), ale został on zamknięty :-(
mob

2
Chciałabym, żeby uczyli w szkole gry w golfa. Chce z powrotem moje pieniądze.
Steve Tjoa

6
Ładny. Później opublikuję moje rozwiązanie w PianoScript. To tylko 6 znaków. :-)
molf

112

Perl, 133 (129) znaków

Perl, 167 160 156 147 142 133 D'oh! 147 144 137 134, 133 znaków

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

Oto rozwiązanie 129 znaków, pożyczające kilka pomysłów z rozwiązania Molf's Ruby:

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

iz pomocą 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, super. Czy to Steinway, Yamaha, Young Chang?
Steve Tjoa

2
Zamierzam dodać to do zakładek, aby pokazać je ludziom, którzy nie rozumieją „małpiego” żartu.
Mehrdad Afshari,

3
@Steve - Zróbmy to Yamaha
mob

6
@mobrule, czy nienawidzisz grepa? dlaczego chcesz, żeby umarło? :(
LiraNuna

Golfscript * 1.3 to 105 :)
John La Rooy

34

Ruby - 125 znaków

146 144 140 137 134 126 125 znaków

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

(Drugi znak nowej linii nie jest konieczny i jest dodawany tylko w celu uniknięcia paska przewijania w SO. W razie potrzeby średniki można zastąpić nowymi wierszami).

Ruby 1,9 wersja jest inna, ale tę samą długość (zamiast a[0]przez a.ordi "_"za ?_)

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

Zadzwoń z

$ ruby piano.rb C 14

Hej VIM liczy 138 znaków na pierwszym?!?
hurikhan77

a, n = gets.split; ... wykonuje tę samą pracę, -3 znaki
hurikhan77

1
Możesz nawet zamienić „gets.split” na „$ *” i podać dane wejściowe w wierszu poleceń, -8 znaków
hurikhan77

Zmiana i%7%4<1||t>4?"_|___":"###__"do i%7%4&&t<5?"###__":"_|___"zaoszczędzisz 2 znaki. Uwielbiam ten %7%4idiom
mob

1
Więc jesteśmy przy najkrótszym rozwiązaniu, co? Ruby rulez! :-D
hurikhan77

29

LilyPond 285 288 291 310 315 330 333 340 350 znaków

Zgodnie z motywem muzycznym, oto rozwiązanie w języku przeznaczonym do składu nut, 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))))

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


4
jest to prawdopodobnie pierwszy i jedyny raz, kiedy widziałem LilyPond używany w golfie kodowym.
cobbal


26

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

Dla czytelności wyświetlany w wielu wierszach, ale powinien być jednym wierszem:

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)

Może być testowany za pomocą tego interpretera Applesoft BASIC w Javascript lub emulatorze .

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


Czy można odczytać oba argumenty w tej samej linii, zgodnie ze specyfikacją?
KirarinSnow,

18

C # - 315

Nadal gram w golfa w C #, chociaż nie jest to zbyt lakoniczny język ...

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
Teraz rozwiązanie F #, aby zakończyć melodię.
LiraNuna

13
+1 dla humoru, -1 dla banalnego humoru i +1, ponieważ C # i F # są zgodne.
Steve Tjoa

Otrzymałem System.IndexOutOfRangeException podczas próby uruchomienia.
Fitzchak Yitzchaki,

@ Mendy: Po uruchomieniu musisz podać argumenty wiersza poleceń. Jeśli uruchomisz go z programu Visual Studio, otwórz właściwości projektu, przejdź do karty debugowania iw obszarze Opcje uruchamiania możesz wprowadzić argumenty wiersza polecenia. Jeśli skompilowałeś kod do pliku exe, po prostu uruchom go z okna konsoli z argumentami po nazwie programu.
Guffa,

1
Bardzo przyjemne użycie operatora ->.
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]

Czy nie mógłbyś uratować niektórych znaków, usuwając powtarzającą się część ti ui mnożąc przez 7?
Matthew Crumley

@Matthew Crumley, nie krępuj się pożyczyć od mojego rozwiązania :)
John La Rooy,

@gnibbler, tak naprawdę nie jestem programistą Pythona (trochę się nim bawiłem, ale nie za bardzo), więc wątpię, czy byłbym w stanie wiele z tym zrobić. Nie wiedziałem nawet, że Python może mnożyć takie łańcuchy, dopóki nie zobaczyłem Twojego oryginalnego rozwiązania.
Matthew Crumley

@gnibbler - fajne rozwiązanie, chciałbym go uruchomić, ale otrzymuję błąd SyntaxError .... C 14 Traceback (ostatnie wywołanie ostatnie): Plik "piano.py", wiersz 1, w? k, n = input (). split () Plik "<string>", wiersz 1 C 14 ^
AJ.

@AJ, wygląda na to, że ten błąd pochodzi z rozwiązania Python3. Nie jestem pewien, dlaczego to rozumiesz
John La Rooy

15

Oktawę, 153 154 155 158 159 162 172 180 186 185 188 197 199 200 206 207 209 212 214 215 219 240 244 268 znaków

Po co używać tylko C lub C # lub F # (lub B lub D), skoro można programować z pełną oktawą?

(zawijane co 60 znaków dla przejrzystości)

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

Tak ... to rozwiązanie naprawdę oblicza złożoną sprzężoną transpozycję ciągu.

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


13

C - 197 203 207 216 224 232 240 postacie

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

Ta odpowiednik 194- znakowej wersji zakłada, że ​​przepełnienie bufora jest w porządku.

#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++)<- bezużyteczne spacje i wydaje się, że uwzględniłeś je również w liczbie znaków
Nicolás,

12

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

Wersja binarna rozszerzona przez kodowanie ASCII85 do 219-znakowego programu z tylko drukowalnymi znakami 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[

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


10
Uwielbiam oglądać mniej tradycyjne języki w tych konkursach.
tłum

12

F #: 224 225, 226, 248, 252, 270, 276, 299, 306 znaków

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

Użyłem modułów 2, aby wykryć przestrzeń lub funt. '' to 32% 2 = 0 '#' to 35% 2 = 1, a ponieważ moje zera warunkowe zwrócone dla fałszu po prostu pomnożyłem wynik modułów.

Użyto <| operator, aby zgolić jeden znak spacji. Użyto przeciążenia operatora, aby zapisać kolejny znak.

oryginał

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

Mógłbym zgolić 46 znaków, gdyby F # miał operator mnożenia ciągów
gradbot

Nieco krócej: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

Wielkie dzieki! Nie wiem, dlaczego nie mogłem tego znaleźć. Przypisałem go do zmiennej i użyłem dwukrotnie.
gradbot

Teraz płacę tylko 48-znakowy podatek od nazw funkcji .net.
gradbot

Gratulacje dla wersji 8! Dziwię się, jak bardzo przyciąłeś.
ChaosPandion

11

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

Działa dla maksymalnie 99 kluczy. Standardowe pianino ma 52 białe klawisze, więc to powinno wystarczyć.

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

Przykłady:

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

Ostatni przykład wyświetla standardową klawiaturę wraz z wyimaginowanymi czarnymi klawiszami na obu końcach.


10

PianoScript - 2 znaki

To jest jedna linijka:

go

Stosowanie:

PianoScript piano.ps G# 11

Wynik:

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

Więcej informacji na temat języka PianoScript można znaleźć tutaj .


1
Może mieć 0 znaków, prawda?
TY

Zakładam, że w PianoScript ++ będziesz w stanie napisać program o jeden znak mniej.
gradbot

4
Szkoda, że ​​nie jesteś pierwszym, który wpadł na ten pomysł.
LiraNuna,

4
-1 za oszukiwanie, a nawet nie
wymyślenie fajnej

1
fortepiany mają partytury, a nie scenariusze
Jimmy

10

JavaScript - 195 znaków

Hej, golf to gra, w której rywalizujesz tylko ze sobą, prawda? :)

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)

Rozwiązanie autorstwa gnarf; przeniesiony do Rhino (z drobną poprawką i zmianami formatowania) przez KirarinSnow; dodatkowo odłupane przez gnarf; błąd poprawiony przez KirarinSnow. cache użytkownika k[1]cwallenpoole

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

Szybka wersja demonstracyjna HTML: Test golfa - dodajereadFile=prompt;print=function(a) {document.write("<pre>"+a);}


Cóż, rywalizujesz też ze specyfikacją ... i myślę, że przegrałeś. ;) To nawet nie przechodzi testów. Wydaje się, że zaczyna się od początku.
Guffa

Masz tylko 1 odniesienie do b. zmień readFile (b) na po prostu readFile ('podciąg')
Ponkadoodle,

@wallacoloo - potrzebne później, część na dole:s=s[b](1-q,p=s.length-3)
gnarf

6

Python3 - 158

Zapisać na inputżywo raw_input. Przegrać ()zaprint

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 znaczących znaków

Wszystko w jednej linii:

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"

Rozszerzony:

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, poproś zespół o wdrożenie getslub odpowiednik, zaoszczędzilibyśmy 22 znaki!
Benjol,

Uważam, że podczas gry w golfa rekurencja jest dobrym sposobem na usunięcie adnotacji typu.
gradbot

3

SETL

165 znaków; Tłumaczenie rozwiązania Gribblers Python.

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 (szablony): 331 370 400 + 17 znaków

(na podstawie rozwiązania Ruby).

Sprężony:

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

Wyjaśnił:

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

Ponieważ nie możemy przekazać parametrów z dmdwejścia, należy to zrobić w kodzie. Obsługuje tylko do 99 kluczy.


2
Czy możesz wprowadzić dane wejściowe jako pojedynczy ciąg? Częścią wyzwania jest przetworzenie linii na nutę, opcjonalny krzyżyk i czas trwania. Samo parsowanie może zająć sporo znaków w niektórych językach ...
KirarinSnow,

2

Haskell: 212 211 208 znaków

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

Nadal zakłada litery zgodne z ASCII (w szczególności sekwencja „@ABCDEFG”), ale nie wymaga już znaku Char.ord


2

Ruby - 113 znaków

Działa z argumentami wiersza poleceń

$ 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 znaków

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 znaków

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

Trzeba to poprawić.

Wejście musi być dostarczone w stałej o nazwie PIANO.


1

F # 414 386 372 znaczące znaki:

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

Aha, i jeden bonus, ten skrypt właściwie obsłuży "F # 372" poprawnie - nie będę cię denerwować, wklejając go tutaj ...

System.Console.ReadLine () to taki kłopot ...

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.