Code Golf: Piyano


88

Meydan okuma

Belirli bir uzunluktaki giriş notasından başlayarak bir piyano klavyesinin bir bölümünü çıkarmak için karakter sayısına göre en kısa kod.

Giriş [ACDFG]#|[A-G], klavyeyi yazdırmaya başlamak için bir nottan ( ) ve ilk not dahil olmak üzere yazdırılacak tuşların uzunluğunu temsil eden pozitif bir sayıdan oluşacaktır .

İlk anahtar tam olarak yazdırılmalıdır - sol keskin anahtarı varsa, kesilir, aynı şekilde başlatma tuşu keskin olduğunda sol tuş da kesilir.

Keskin bir anahtar sayılmaz, yalnızca beyaz tuşlar sayılır.

Test durumları

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

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

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

Kod sayısı giriş / çıkışı içerir (yani tam program).


5
[A-G]#*? Sap, söz hakkından bu ortalama biz ihtiyaç mı B#####olduğu E?
Anon.

5
Anahtarların sayısı için "anahtar" ı tanımlayın. Örnek "C 14" neden 24 tuş yazdırıyor?
Guffa

53
Tamam, artık C ve C # çözümlerimiz olduğuna göre, B, D ve F #'a ihtiyacımız var.
LiraNuna

7
Sonraki kod golf: Bu piyanolar için bir MIDI arabirimi uygulayın.
mmx

10
Sevgili yakınlar, 3 gün sonra bu meydan okumayı kapatmayı başardığınız için sizi selamlıyorum. 5 dakika içinde yeniden açılmasını sağladık. Bu tek başına size bir şey söylemelidir - topluluk bu tür soruları sever ve kabul eder, beğenseniz de beğenmeseniz de. Ancak bunu yapmazsanız, lütfen göz ardı edilen etiketler listenize kod golfü ekleyin.
LiraNuna

Yanıtlar:


27

GolfScript - 80 Karakter

Kaydırma çubuğu olmadan bir #SO satırına sığar :)

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

GolfScript - 81 Karakter

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

Güzel biçimlendirilmiş sürüm (27 x 3)

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

GolfScript - 82 Karakter

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

GolfScript - 85 Karakter

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

Güzel biçimlendirilmiş sürüm (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 Karakter

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

GolfScript - 98 Karakter

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

GolfScript - 101 Karakter

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

GolfScript - 109 Karakter

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

GolfScript - 120 Karakter

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

GolfScript - 127 Karakter

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

İlk golfscript girişimi başka bir meydan okuma için göndermek üzereydim ( stackoverflow.com/questions/2104556/… ), ancak kapandı :-(
mob

2
Keşke okulda golf senaryosu öğrettiler. Paramı geri istiyorum.
Steve Tjoa

6
Güzel. Çözümümü daha sonra PianoScript'te yayınlayacağım. Sadece 6 karakter. :-)
molf

112

Perl, 133 (129) karakter

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

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

İşte molf'un Ruby çözümünden birkaç fikir ödünç alan 129 karakterlik bir çözüm:

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

ve Acme :: AsciiArtinator'ın yardımıyla :

                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, harika. Bu bir Steinway mi, Yamaha, Young Chang mı?
Steve Tjoa

2
"Maymun" şakasını anlamayanlara göstermek için bunu işaretleyeceğim.
mmx

3
@Steve - Let's make it a Yamaha
mob

6
@mobrule, grep'ten nefret ediyor musun? neden ölmesini istiyorsun? :(
LiraNuna

Golfscript * 1.3 105 olacaktır :)
John La Rooy

34

Yakut - 125 karakter

146 144 140 137 134 126 125 karakter

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

(İkinci satırsonu gerekli değildir ve yalnızca SO'da bir kaydırma çubuğundan kaçınmak için eklenir. İstenirse noktalı virgüller yeni satırlarla değiştirilebilir.)

Yakut 1.9 versiyonu farklıdır ancak eşit uzunlukta (değiştirilmesi a[0]ile a.ordve "_"ile ?_):

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

İle ara

$ ruby piano.rb C 14

Hey VIM ilkinde 138 karakter sayar?!?
hurikhan77

a, n = gets.split; ... aynı işi yapıyor, -3 karakter
hurikhan77

1
Hatta "gets.split" yerine "$ *" yazabilir ve komut satırındaki girdiyi -8 karakter
hurikhan77

Değişim i%7%4<1||t>4?"_|___":"###__"için i%7%4&&t<5?"###__":"_|___"ve 2 karakter kurtarmak. I love that %7%4idiom
mob

1
Yani en kısa çözüme döndük, ha? Ruby kuralı! :-D
hurikhan77

29

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

Müzik temasına uygun olarak, müzik notalarını dizmek için tasarlanmış bir dilde bir çözüm, 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))))

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


4
Bu muhtemelen LilyPond'un kod golfünde kullanıldığını gördüğüm ilk ve tek zamandır.
cobbal


26

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

Okunabilirlik için birden çok satırda gösterilir, ancak tek bir satır olmalıdır:

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)

Bu Applesoft BASIC Yorumlayıcı ile Javascript veya bir emülatörde test edilebilir .

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


Spesifikasyonlara göre her iki argümanı aynı satırda okumak mümkün müdür?
KirarinSnow

18

C # - 315

Çok kısa bir dil olmasa da C # ile golf oynamaya devam ediyorum ...

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
Şimdi melodiyi tamamlayacak F # çözümüne.
LiraNuna

13
Mizah için +1, bayat mizah için -1 ve C # ve F # uyumlu olduğundan +1.
Steve Tjoa

Çalıştırmayı denediğimde bir System.IndexOutOfRangeException aldım.
Fitzchak Yitzchaki

@Mendy: Çalıştırdığınızda komut satırı argümanları sağlamalısınız. Visual Studio'dan çalıştırırsanız, projenin özelliklerini açın, hata ayıklama sekmesine gidin ve Başlatma Seçenekleri altında komut satırı argümanlarını girebilirsiniz. Kodu bir exe olarak derlediyseniz, bunu bir konsol penceresinden program adından sonra argümanlarla çalıştırın.
Guffa

1
-> operatörünün çok güzel kullanımı.
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]

Eğer tekrarlanan kısmını kaldırarak bazı karakterler kaydedilemedi tve uve 7 ile çarpılır?
Matthew Crumley

@Matthew Crumley, çözümümden ödünç almaktan çekinmeyin :)
John La Rooy

@gnibbler, ben gerçekten bir python programcısı değilim (onunla biraz oynadım ama kapsamlı olarak değil) bu yüzden onunla çok şey yapabileceğimi sanmıyorum. Orijinal çözümünüzü görene kadar python'un dizeleri bu şekilde çarpabileceğini bile bilmiyordum.
Matthew Crumley

@gnibbler - güzel çözüm, çalıştırmayı çok isterdim ama bir SyntaxError alıyorum .... C 14 Traceback (en son çağrı): Dosya "piano.py", satır 1, içinde? k, n = input (). split () Dosya "<string>", satır 1 C 14 ^
AJ.

@AJ, bu hata Python3 çözümünden gelmiş gibi görünüyor. Neden bunu
anladığından

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 karakter

Tam bir Oktav ile programlayabiliyorsanız neden sadece C veya C # veya F # (veya B veya D) kullanasınız?

(netlik için her 60 karakterde bir sarılır)

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

Evet ... bu çözüm gerçekten bir dizgenin karmaşık eşlenik devrik değerini hesaplar.

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


13

C - 197 203 207 216 224 232 240 karakterler

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

Bu eşdeğer 194 karakterlik sürüm, arabellek taşmasının iyi olduğunu varsayar.

#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++)<- gereksiz boşluklar ve onları karakter sayısına da dahil
Nicolás

12

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

İkili sürüm, ASCII85 kodlaması yoluyla yalnızca ASCII yazdırılabilir karakterlerle 219 karakterlik bir programa genişletildi:

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

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


10
Bu yarışmalarda daha az geleneksel olan dilleri görmeyi seviyorum.
mob

12

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

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

Bir boşluk veya pound tespit etmek için 2'li modüller kullandım. '' 32% 2 = 0 '#'% 35 2 = 1 ve koşullu yanlış için sıfır döndürdüğü için modül sonucunu çarptım.

Kullanılmış <| operatör bir boşluk karakterini tıraş eder. Başka bir char kaydetmek için operatör aşırı yüklemesini kullandı.

orijinal

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

F # 'da bir dizi çarpma operatörü olsaydı 46 karakteri tıraş edebilirdim
gradbot

Biraz daha kısa: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

Harika, teşekkürler! Bunu neden bulamadığımı bilmiyorum. Onu bir değişkene atadım ve iki kez kullandım.
gradbot

Şimdi sadece .net işlev adlarının 48 karakter vergisini ödüyorum.
gradbot

8. sürüm için tebrikler! Ne kadar kırptığına şaşırdım.
ChaosPandion

11

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

99 anahtara kadar çalışır. Standart piyanonun 52 beyaz tuşu vardır, bu yüzden bu yeterli olmalıdır.

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

Örnekler:

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

Son örnek, her iki uçta da hayali siyah tuşlarla birlikte standart klavyeyi yazdırır.


10

PianoScript - 2 karakter

Tek satırlık:

go

Kullanım:

PianoScript piano.ps G# 11

Çıktı:

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

PianoScript dili hakkında daha fazla bilgi burada bulunabilir .


1
0 karakter olabilir, değil mi?
SİZ

PianoScript ++ 'da programı bir daha az karakterle yazabileceğinizi varsayıyorum.
gradbot

4
Ne yazık ki bu fikri ilk bulan sen değilsin.
LiraNuna

4
-1 hile yapmak ve hatta dil için havalı bir isim
bulmamak

1
piyanolar skorları, değil komut dosyaları var
Jimmy

10

JavaScript - 195 karakter

Hey, golf sadece kendinize karşı rekabet ettiğiniz bir oyun değil mi? :)

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)

Gnarf ile çözüm; KirarinSnow tarafından Rhino'ya taşındı (küçük bir düzeltme ve biçimlendirme değişiklikleri ile); gnarf tarafından daha da parçalanmış; KirarinSnow tarafından düzeltilen hata. k[1]cwallenpoole tarafından önbellek

Kullanım: $ cp input.in 0; rhino thisfile.js

Hızlı HTML Demo Sürümü: Golf Testi - EklemelerreadFile=prompt;print=function(a) {document.write("<pre>"+a);}


Sen de şartnameye karşı yarışıyorsun ... ve bence kaybettin. ;) Test durumlarını bile geçmiyor. Görünüşe göre tek seferlik başlıyor.
Guffa

B'ye yalnızca 1 referansınız var. readFile (b) 'yi sadece readFile (' substring ') olarak değiştirin
Ponkadoodle

@wallacoloo - daha sonra gerekli, alt kısımdaki kısım:s=s[b](1-q,p=s.length-3)
gnarf

6

Python3 - 158

inputVs üzerinde tasarruf edin raw_input. Üzerinde Lose ()içinprint

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 anlamlı karakter

Hepsi tek satırda:

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"

Genişletilmiş:

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, lütfen ekibin uygulamasını getsveya eşdeğerini sağlayın, 22 karakter tasarruf edeceğiz!
Benjol

Golf özyinelemenin tür ek açıklamalarını kaldırmanın iyi bir yolu olduğunu düşünüyorum.
gradbot

3

SETL

165 karakter; Gribblers Python çözümünün çevirisi.

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 (şablonlar): 331 370 400 + 17 karakter

(Ruby çözümüne göre.)

Sıkıştırılmış:

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

Açıklandı:

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

Girişten parametreler geçiremediğimiz dmdiçin kodda yapılmalıdır. Yalnızca 99 anahtara kadar destekler.


2
Girişi tek bir dizge yapabilir misiniz? Zorluğun bir kısmı, satırı bir nota, isteğe bağlı bir keskinliğe ve bir süreye ayrıştırmaktır. Ayrıştırmanın kendisi bazı dillerde epeyce karakter alabilir ...
KirarinSnow

2

Haskell: 212 211 208 karakter

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

Hala ascii uyumlu harfleri varsayar (özellikle "@ABCDEFG" dizisi), ancak artık Char.ord gerektirmez


2

Ruby - 113 karakter

Komut satırı argümanları ile çalışır

$ 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 karakter

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 karakter

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

İyileştirilmesi gerekecek.

Giriş, PIANO adlı sabitte teslim edilmelidir.


1

F # 414 386 372 önemli karakterler:

//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, ve bir bonus, bu komut dosyası aslında "F # 372" yi doğru bir şekilde işleyecek - yine de buraya yapıştırarak sizi rahatsız etmeyeceğim ...

System.Console.ReadLine () tam bir serseri ...

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.