Catatan Takdir - letakkan catatan pada staf

19

Kiamat zombie telah datang, dan dunia akan segera berakhir. Tiba-tiba, seseorang menemukan formula yang mengambil jam, menit, dan hari saat ini, dan mengeluarkan nada yang sempurna untuk bermain piano yang langsung membunuh setiap zombie yang mendengarnya. Sayangnya, hanya ada satu pemain piano yang tersisa di dunia, dan dia lupa cara membaca catatan, tetapi dia masih tahu cara membaca lembaran musik. Tentu saja, ini adalah hal yang sangat sensitif terhadap waktu, jadi sepertinya wajar jika komputer melakukannya. 1

Tantangan Anda adalah membuat catatan, seperti G, dan menampilkan catatan yang diletakkan pada staf (dalam treble clef), seperti ini:

-----

-----
   |
---|-
   |
--O--

-----

Spesifikasi:

  • Anda harus menampilkan staf garis bergantian -----(5 garis) dan garis kosong. Akan ada -----total 5 s. Catatan itu harus ditumpangkan di atas staf ini.
  • Input akan menentukan di mana catatan itu berada. Inputnya adalah:
    • opsional Hatau L, menentukan "tinggi" atau "rendah"
    • surat dari Ake G, yang menentukan nada
    • opsional #atau b, menentukan tajam atau rata.
  • "Catatan" didefinisikan sebagai:
    • Satu O(modal O) sejajar dengan tengah staf, yang ada di tempat catatan. (Garis atas adalah HF(F tinggi), dan garis bawah adalah E(E normal).)
    • Three |s (batang vertikal), batangnya, yaitu:
      • satu spasi di sebelah kiri note dan turun ke bawah (mulai satu spasi di bawah note) jika note ada di garis tengah ( B) atau di atas, atau
      • satu spasi di sebelah kanan note dan naik ke atas (mulai satu spasi di atas note) jika note berada di bawah garis tengah.
    • A #atau bsatu spasi langsung ke kiri catatan jika ditentukan dalam input.
  • Garis besar harus ditambahkan jika nada terlalu tinggi atau rendah. Garis-garis ini akan menjadi ---(hanya 3 strip lebarnya, berlawanan dengan 5) dan hanya akan muncul jika catatan berada di atas atau di atas / di bawah (untuk masing-masing garis besar buku besar) garis besar buku besar.
  • Ruang asing dapat ditempatkan di mana pun Anda inginkan; misalnya, Anda dapat membuat garis kosong memiliki spasi atau memiliki spasi setelah garis besar buku jika membantu Anda menyimpan karakter apa pun.

Berikut adalah visualisasi, untuk memahami spesifikasi lebih mudah, dengan semua nama catatan di sebelah baris:

      HB
 ---  HA
      HG
----- HF
      HE
----- HD
      HC
----- B
      A
----- G
      F
----- E
      D
 ---  C
      LB
 ---  LA
      LG
 ---  LF
... (bottom cut off for brevity, you get the idea anyway)

Berikut ini beberapa contoh lain yang dapat Anda gunakan untuk menguji program Anda:

Memasukkan: HG#

 #O
-|---
 |
-|---

-----

-----

-----

Memasukkan: LAb

-----

-----

-----

-----

-----
   |
 --|
   |
 bO-

Memasukkan: HB

  O
 |--
 |
-|---

-----

-----

-----

-----

Memasukkan: C

-----

-----

-----

-----
   |
---|-
   |
 -O-

Ini adalah , jadi kode terpendek dalam byte akan menang!

1: eksposisi evar paling realistis! :-P

Gagang pintu
sumber
2
Terlihat sangat aneh untuk memiliki #atau bdi sebelah kanan catatan daripada di sebelah kiri; apakah ini benar-benar yang dibutuhkan?
Thomas Baruchel
2
Bagaimana dengan B # dan sejenisnya? 1. plot apa adanya; 2. menolak; 3. secara diam-diam dikonversi ke C?
Digital Trauma
2
Mungkin lebih baik untuk secara eksplisit menyatakan bahwa itu harus dalam treble clef.
user12205
3
Adakah yang mau mencoba ini di Fugue ?
AJMansfield
3
@AJM Ya, itu harus seni ASCII.
Gagang pintu

Jawaban:

1

Golfscript, 211 210 209 197 195 195 192 karakter

Datang untuk menang (pada posting ini), versi GolfScript versi Python terbaru saya :

"J"\+[0]+.1=71>>3<{}/@7*2/246-@3+7%-:z;:c;21,{..3z<3z
if<\11z>11z
if>|{;}{...2>\12<&\2%.{'-'' 'if}:Q~:9;&Q\.z={c!9{[c]''+}if}{..z>\4z+<&8z>&'|'9if}if\.z='o'9if\..z
4-\<\z<&7z<&'|'9if\;3$n}if}/

Uji di sini (2 baris pertama adalah input pengguna, biasanya berasal dari stdin).

Versi 'Dapat Dibaca':

;"HCb"

"J"\+[0]+       #process input
.1=71>>3<       #first char is HJL, second is letter, third is #b or space
{}/             #spill chars onto stack, now we working with ints
@7*2/246-@3+7%- #convert HC/JD/LE etc to a number from 0 to 20
:z;:c;
21,{            #for r in range(21):
  ..3z<3z if<           #either out-of-bounds or process the line
  \11z>11z if>|
  {;}{
    ...2>\12<&\2%.{'-'' 'if}:Q~:9;&Q\        #1st char
    .z={c!9{[c]''+}if}                       #2nd char accidental
       {..z>\4z+<&8z>&'|'9if}if\            #2nd char stem or row
    .z='o'9if\                              #3rd char
    ..z 4-\<\z<&7z<&'|'9if\                 #4th char stem or row
    ;3$                                      #5th char=1st char
    n
  }if
}/
Claudiu
sumber
Aaaaaa dan dikalahkan oleh GolfScript lagi. :) ...
Martin Ender
@ m.buettner: Haha, tidak pernah berakhir .. meskipun begitu dekat!
Claudiu
1
Lebih baik! Sekarang saya hanya perlu menemukan 6/9 byte untuk mengejar ketinggalan: D (walaupun saya tidak melihat bagaimana saya akan melakukannya)
Martin Ender
@ m.buettner: Turun 2 byte lagi! Tapi masing-masing sangat brutal ... Aku mungkin harus berhenti sekarang. Semoga berhasil!
Claudiu
2
Oh, sial ... tepat ketika saya pikir saya telah mengalahkan 209 Anda. Saya pikir saya menyerah. GolfScript menang. ;)
Martin Ender
6

Ruby - 271 267 252 249 234 229 220 214 karakter

Saya benar-benar baru belajar Ruby untuk ini. Jadi pasti ada ruang untuk perbaikan dalam bermain golf. Atau benar-benar melakukan sesuatu. Tapi aku butuh bahasa dengan string yang bisa berubah. :)

def f(n)s=[0]*20
s.fill{|i|i%2>0?i<3||i>11?" ---":?-*5:" "*5}
s[l=(3-n[(p="H_L".index n[0])?1:0].ord)%7+7*(p||1)][1,2]=("#b"[n[-1]]||s[l][1])+?O
s[l+3-2*o=l>7?3:1,3].map{|t|t[o]=?|}
puts s[[3,l].min..[11,l].max]end

Agak tidak terserang:

def f(note)
  staff=[]
  0.step(20) {|i| staff[i] = " "*5}
  1.step(19,2) {|i| staff[i] = " ---"}
  3.step(11,2) {|i| staff[i] = "-"*5}
  level = 7
  if !(pos="HL".index note[i=0]).nil?
    level = 14*pos
    i += 1
  end
  level += (73-note[i].ord)%7
  staff[level][2] = "O"
  mark = note[-1]
  if !"#b".index(mark).nil?
    staff[level][1] = mark
  end
  offset = (level > 7) ? 3 : 1
  staff[level-2*offset+3,3].map {|line| line[offset] = "|"}
  first = [3,level].min
  last = [11,level].max
  puts s[first..last]
end

Saya dapat memotongnya dengan 2 karakter lagi menjadi 212 karakter jika memimpin garis kosong diizinkan. Solusi ini tidak memenuhi garis yang tidak dicetak:

def f(n)s=[]
[3,l=(3-n[(p="H_L".index n[0])?1:0].ord)%7+7*(p||1)].min.step(l>11?l:11){|i|s[i]=i%2>0?i<3||i>11?" ---":?-*5:" "*5}
s[l][1,2]=("#b"[n[-1]]||s[l][1])+?O
s[l+3-2*o=l>7?3:1,3].map{|t|t[o]=?|}
puts s
end

Apakah permainan adil lambda? Maka saya bisa mendapatkan 210 karakter dengan pendekatan pertama

f=->n{s=[0]*20
s.fill{|i|i%2>0?i<3||i>11?" ---":?-*5:" "*5}
s[l=(3-n[(p="H_L".index n[0])?1:0].ord)%7+7*(p||1)][1,2]=("#b"[n[-1]]||s[l][1])+?O
s[l+3-2*o=l>7?3:1,3].map{|t|t[o]=?|}
puts s[[3,l].min..[11,l].max]}

Atau 207 karakter dengan garis kosong tambahan:

f=->n{s=[]
[3,l=(3-n[(p="H_L".index n[0])?1:0].ord)%7+7*(p||1)].min.step(l>11?l:11){|i|s[i]=i%2>0?i<3||i>11?" ---":?-*5:" "*5}
s[l][1,2]=("#b"[n[-1]]||s[l][1])+?O
s[l+3-2*o=l>7?3:1,3].map{|t|t[o]=?|}
puts s}

Tentu saja, sekarang Anda harus melakukannya f.call("HGb").

Martin Ender
sumber
Ha, +1 untuk mempelajari bahasa yang sama sekali baru! ;-) Inilah tipnya: !x.nil?setara dengan !x. Dan untuk satu baris seandainya, if x;y;end;setara dengan y if x. Anda juga dapat menggunakan baris baru literal dalam string itu.
Gagang Pintu
@Doorknob terima kasih, saya akan mencoba mengerjakannya!
Martin Ender
@ Doorknob hm, saya hanya bisa ifbekerja. Jika saya menggunakan ?\n(jika itu yang Anda maksud) saya perlu menambahkan spasi, jadi saya tidak mendapatkan apa-apa. Dan menghapus .nil?s tidak berhasil sama sekali (selalu dievaluasi true).
Martin Ender
Maksud saya benar-benar menambahkan baris baru antara dua kutipan. Dan saya pikir Anda perlu parens tambahan saat menghapus .nil?, tapi itu sepadan dengan karakter.
Gagang Pintu
@Doorknob ah, tidak ada !x.nil?yang !!x. :)
Martin Ender
2

Python, 329 309 295 286 280 277 karakter

Golf sedikit lagi sekarang. Masih dapat ditingkatkan, tetapi tidak yakin apakah saya dapat mengalahkan solusi ruby ​​atau golfscript dengan pendekatan ini.

R=range
N='J'+raw_input()+' '
X=N[1]>'G'
a,b,c=N[X:3+X]
z=266-ord(a)/2*7+(ord(b)-4)%7
Z=[list((' '*5,(' ---','-'*5)[8<r<18])[r%2])for r in R(21)]
Z[z][2]='o'
if' '<c:Z[z][1]=c
Q=(z<13)*2
for i in(1,2,3):Z[z+i*Q-i][Q+1]='|'
for r in R(max(17,z),min(z-1,8),-1):print''.join(Z[r])

Awalnya saya mencetak baris demi baris, tetapi ternyata terlalu banyak, jadi saya menghasilkan string grid dan kemudian mengisi apa yang perlu diisi. Masukan dari baris perintah, misalnya:

>echo HG# | python note2_golf.py
 #o
-|---
 |
-|---

-----

-----

-----
Claudiu
sumber
Pada baris 5 Anda dapat menghapus spasi sebelum koma kedua
user12205
@ace: Terima kasih, melewatkan yang itu
Claudiu
2

GolfScript - 243 232 228 227 karakter

Saya menerjemahkan jawaban CoffeeScript saya ke GolfScript, yang jauh lebih cocok untuk manipulasi string.

EDIT: Menyimpan enam karakter dengan menggunakan operator increment dengan benar, tiga dengan memanfaatkan stack, enam lainnya dengan mendefinisikan ulang operator yang tidak bertanggung jawab yang tidak saya gunakan, dan satu lagi dengan tidak mencetak spasi tambahan setelah garis rahmat.

Sepenuhnya golf:

..0="HL"?2+3%:o)2%.@="CDEFGAB"?7o*+:`2%45 32if:r;
).2$,<{=}{;;r}if:&;
[" "5*:|" ---":g]4*[|"-"5*]5*+[|g|]+.
[`<~]\[`>([0=:^&79r^]''+\~]
+17`<`)18if<9`>`9if:j>:t 13`>.2*):x;
4,1>{`j-\2${+}{-}if}%\;
{.@<\t>(:v[x<'|'+x)v>+]\++:t}
/-1%n*

Dengan komentar:

# extract octave
..0="HL"?2+3%:o

# extract note
2%1\-.@="CDEFGAB"?7o*+:k

# line spacer
2%45 32if:r;

# extract accidental
1+.2$,<{=}{;;r}if:a;

# staff
[" "5*:|" --- ":g]4*[|"-"5*]5*+[|g|]+.

# lines below
[k<~]\

# note line and above
[k>([0=:w a 79r w]''+\~]+

# cut off just what we need
17k<1k+18if<
9k>k 9if:j>:t;

# and the note stem
13k>.2*1+:x;4,1>{k j-\2${+}{-}if}%\;

{
  .t<\
  t>(:v[x<'|'+1x+v>+]\++:t;
}/

# now output the note
t-1%n*
sofa dan
sumber
Saya akan heran jika saya bisa mengalahkan solusi GolfScript dalam bahasa yang saya tidak punya pengalaman;)
Martin Ender
1
Saya bukan ahli GolfScript, tetapi saya pikir saya sudah keluar dari semua karakter saya akan keluar dari ini, jadi jika Anda dapat menemukan dua lagi, Anda emas!
sofa dan
Cobalah untuk mengetiknya Go. itu akan menampilkan oo|||:)
Jamie
1

Python, 250 245 242 235 karakter

Pendekatan yang sangat berbeda yang akhirnya mengalahkan yang lain! Kode pemrosesan input mirip tetapi hanya itu saja.

M=' -'
N=raw_input()+M
a,b,c=('J'+N)[N>'G':][:3]
z=ord(a)*7/2-246-(ord(b)+3)%7
for r in range(21):
 L=M[r%2];F=M[2<r<12and r%2]
 if min(3,z)<=r<=max(11,z):print F+((L,'|')[8>z<r<z+4],(L,c)[M<c])[r==z]+(L,'o')[r==z]+(L,'|')[z-4<r<z>7]+F

Saya memetakan nilai masing-masing karakter berdasarkan baris dan kolom dan kemudian mencetak pencetakan:

#given row r, with note on row n, how to print each char?
#rows are:
#       HB : 0
#  ---  HA : 1
#       HG : 2
# ----- HF : 3
#       HE : 4
# ----- HD : 5
#       HC : 6
# ----- B  : 7
#       A  : 8
# ----- G  : 9
#       F  : 10
# ----- E  : 11
#       D  : 12
#  ---  C  : 13
#       LB : 14
#  ---  LA : 15
#       LG : 16
#  ---  LF : 17
#       LE : 18
#  ---  LD : 19
#       LC : 20
#chars are:
# 0 | 1 | 2 | 3 | 4
#
# 0,4:
#    if r%2:
#      if 2<r<12: '-'
#      else ' '
#    else: ' '
# 1: ' -b#|'
#    if r==n:
#      if A: c
#      else: ' -'[r%2]
#    elif n<8 and n<r<n+4: '|'
#    else: ' -'[r%2]
# 2: ' -o'
#    if r==n: 'o'
#    else: ' -'[r%2]
# 3: ' -|'
#    if n>7 and n-4<r<n: '|'
#    else: ' -'[r%2]
Claudiu
sumber
+1, Baris terakhir sepertinya lebih banyak sihir hitam Perl daripada barang Pythonic
Antonio Ragagnin
1

Java - 921 907 863 karakter

Saya membangun setiap string secara terpisah, menyimpan setiap string dalam sebuah array. Kemudian loop melalui array dan cetak setiap baris.

public class D{public static void main(String[]a){char[]z=a[0].toCharArray();char[]y=new char[3];y[0]=('H'==z[0]||'L'==z[0])?z[0]:'N';int o=(y[0]=='N')?0:1;y[1]=z[o++];y[2]=z.length>o?z[o]:'!';int n=y[1]<'C'?((int)(y[1]-'A'))+6:((int)(y[1]-'C'))+1;n=(y[0]=='N')?n+7:(y[0]=='H'?n+14:n);String s="     ";String b=" --- ";String[]u=new String[22];for(int i=1;i<=21;i+=2){u[i]=s;}for(int i=10;i<=18;i+=2){u[i]="-----";}u[20]=n>19?b:s;u[2]=n<3?b:s;u[4]=n<5?b:s;u[6]=n<7?b:s;u[8]=n<9?b:s;char c=u[n].charAt(0);char e=u[n].charAt(1);char[]h=new char[]{c,y[2]=='!'?e:y[2],'O',e,c};u[n]=new String(h);for(int i=0;i<22;i++){if(n<14&&i-n<4&&i>n)u[i]=u[i]!=null?u[i].substring(0,3)+"|"+u[i].charAt(4):s;else if(n>13&&n-i<4&&n>i)u[i]=u[i]!=null?u[i].substring(0,3)+"|"+u[i].charAt(4):s;}for(int i=21;i>=0;i--)if(!(i>n&&i>18||i<n&&i<10))System.u.println((u[i]==null)?s:u[i]);}}

Oh tolong jangan membenciku, ini pertama kalinya aku. Saya tidak dapat menemukan faq / pengantar jadi saya harap format posting saya ok. Tidak yakin seberapa serius orang mendapat tentang jumlah karakter .... versi normal kode - ekstra adalah linebreak / spasi (1313 karakter):

public class DisplayNote
{
  public static void main(String[] args)
  {
    char[] z=args[0].toCharArray();
    char[] y=new char[3];
    y[0]=('H'==z[0]||'L'==z[0])?z[0]:'N';
    int o=(y[0]=='N')?0:1;
    y[1]=z[o++];
    y[2]=z.length>o?z[o]:'!';

    int noteValue=y[1]<'C'?((int) (y[1] - 'A')) + 6:((int) (y[1] - 'C')) + 1;
    noteValue=(y[0]=='N')?noteValue+7:(y[0]=='H'?noteValue+14:noteValue);
    String s="     ";
    String b=" --- ";
    String[] out=new String[22];
    for (int i=1;i<=21;i+=2){out[i]=s;}
    for (int i=10;i<=18;i+=2){out[i]="-----";}
    out[20]=noteValue>19?b:s;
    out[2]=noteValue<3?b:s;
    out[4]=noteValue<5?b:s;
    out[6]=noteValue<7?b:s;
    out[8]=noteValue<9?b:s;

    char c=out[noteValue].charAt(0);
    char e=out[noteValue].charAt(1);
    char[] h=new char[]{c,y[2]=='!'?e:y[2],'O',e,c};
    out[noteValue]=new String(h);
    for (int i=0;i<22;i++)
    {
      if (noteValue<14&&i-noteValue<4&&i>noteValue)
        out[i]=out[i]!=null?out[i].substring(0,3)+"|"+out[i].charAt(4):s;
      else if (noteValue>13&&noteValue-i<4&&noteValue>i)
        out[i]=out[i]!=null?out[i].substring(0,3)+"|"+out[i].charAt(4):s;        
    }

    for (int i=21;i>=0;i--)
      if (!(i>noteValue&&i>18||i<noteValue&&i<10))
        System.out.println((out[i]==null)?s:out[i]);
  }
}
Will_61
sumber
Saya melihat banyak spasi kosong yang tidak perlu (terutama setelah titik koma dan sekitar operator dan tanda kurung dan parens) dan nama variabel panjang (seperti args).
Gagang Pintu
Dalam pengiriman penghitungan karakter: 921 karakter, semua spasi putih hilang: P
Will_61
Kiriman kedua dengan spasi putih di mana-mana adalah membiarkan orang membaca kode, seperti yang saya katakan ini pertama kalinya saya jadi tidak yakin apakah kita harus meninggalkan 1 kiriman dan 1 di mana Anda mencoba mengurangi batas karakter ... atau apa?
Will_61
Tidak; Saya melihat sejumlah besar spasi putih tidak berguna di versi itu. Misalnya, spasi setelah titik koma, spasi di sekitar operator, spasi setelah [], spasi di sekitar tanda kurung, dll.
Gagang Pintu
Dihapus semuanya sekarang (saya pikir) Terima kasih :)
Will_61
1

Haskell 377C

import Data.Char
(<.)=elem
n(c:r)|elem c"HL"=let(s,a)=n r in(s+case c of 'H'->7;_-> -7,a)|1<2=(mod(ord c-67)7-2,case r of[]->' ';[x]->x)
r(s,a)y x=c where d|s>4= -1|1<2=1;c|x<.[0,4]&&(y<0||y>8)=' '|x==2&&y==s='o'|y==s&&x==1&&' '/=a=a|x==2+d&&y<.[s+k*d|k<-[1..3]]='|'|1<2="- "!!mod y 2
g p@(s,a)=unlines$[map(r p y)[0..4]|y<-reverse[min 0 s..max 8 s]]
main=getLine>>=putStr.g.n

Versi tidak disatukan:

import Data.Char

fromName ('H':s) = let (step, alter) = fromName s in ((step + 7), alter)
fromName ('L':s) = let (step, alter) = fromName s in ((step - 7), alter)
fromName (x:s) = (mod (ord x - 67) 7 - 2, if null s then ' ' else head s)

renderChar :: (Int, Char) -> Int -> Int -> Char
renderChar (step, alter) y x = let
    dir = if step >  4 then -1 else 1
    normal = "- "!!mod y 2
    stemYs = [step + k * dir | k <- [1..3]]
    c | elem x [0,4] && not(elem y [0,2,4,6,8]) = ' '
      | x == 2 && y == step = 'o'
      | y == step && x == 1 && alter /= ' ' = alter
      | elem y stemYs && x == 2 + dir = '|'
      | otherwise = normal
  in c

render :: (Int, Char)-> String
render (step, alter) = unlines [map (renderChar (step, alter) y) [0..4] | y <- ys] 
  where
    ys = reverse [min 0 step .. max 8 step]

main = getLine >>= (putStr.render.fromName)
sinar
sumber
0

Literate CoffeeScript - 497 527 karakter

Saya yakin ada cara yang lebih baik untuk membangun grid tetapi saya tidak bisa mengetahuinya.

Satu penolong golf.

_=(q)->->q.split ""

AC skala utama dan staf.

s=_("CDEFGAB")()
l=_ "-----"
e=_ "     "
g=_ " --- "
t=->
  o=[e(),l(),e(),l(),e(),l(),e(),l(),e(),l(),e(),g(),e()]
  o.unshift e(),g() for [0..3]
  o

Fungsi notasi kami akan mengambil representasi string dari catatan.

f=(i)->
  o=1
  m=t()

Pertama kita akan menentukan oktafnya.

  if /L|H/.test i[0]
    if i[0]=="L" then o=0 else o=2
    i=i[1..]

Kemudian catatan dan kebetulan. Harus suka mendekonstruksi tugas.

  [n,a]=i

Mari kita konversi catatan dan oktaf ke indeks dan plot catatan.

  x=7*o+s.indexOf n

  m[x][1]=a if a
  m[x][2]='O'

Sekarang kita akan memangkas staf sebanyak yang kita butuhkan.

  j=9
  k=17
  if x>17
    k=x
  else if x<9
    j=x
  u=x-j
  m=m[j..k]

Dan batang not.

  if x<13
    m[x][3]='|' for x in [u+3...u]
  else
    m[x][1]='|' for x in [u-3...u]

Sekarang mari kita hasilkan hasilnya.

  m.map((p)->p.join '').reverse().join '\n'

Akhirnya, kami akan mengekspor fungsi untuk pengujian konsol. Karakter-karakter ini tidak diperhitungkan total.

module.exports = f
sofa dan
sumber
Melihat lebih dekat sepertinya saya mengacau ketika refactoring batang catatan, sehingga menghasilkan output ilegal saat ini.
sofa dan
Saya memperbaikinya, tetapi menambahkan 30 karakter: - /
couchand
0

C, 325 304

Sekarang 21 byte lebih pendek berkat @ace !

i;j;c;n;main(t){char
x[133];for(i;i<132;i++){x[i]="-----\n     \n"[i%12];if((i<18||i>77)&&!((i%12)&11))x[i]=32;}for(;!n;){c=getchar();if(c>71)t=c^72?2:0;else
n=7*t+7-(c-4)%7;}x[i=n*6+2]=79;if((c=getchar())>32)x[i-1]=c;for(t=0,j=n<9?i+5:i-17;t<3;t++,j+=6)x[j]='|';x[n<13?77:n*6+5]=0;puts(x+(n>4?24:n*6));}

Keluaran:

./a.out
HBb
 bO  
 |-- 
 |   
-|---

-----

-----

-----

-----


./a.out
LG#
-----

-----

-----

-----

-----

 --| 
   | 
 --| 
 #O  
lubang keras melengking
sumber
Variabel global diinisialisasi ke nol secara default, jadi Anda tidak perlu menginisialisasi ndan Anda dapat menghapusnya i=0di forloop pertama .
user12205
Juga, dalam ifpernyataan pertama , ((i%12)&11)==0bisa diganti dengan !((i%12)&11).
user12205
Akhirnya, ?:memiliki prioritas lebih rendah dari ^dan <, sehingga Anda dapat menghapus tanda kurung kondisi sebelum ?. Dan Anda bisa menggantinya printf("%s",dengan puts(.
user12205
0

JavaScript 390 388

Sedikit tantangan, saya harus mengakui ... Saya yakin ada cara untuk mengurangi ini lebih lanjut ... Saya terbuka untuk saran ...

Iterasi pertama

C=(a,x,o,c)=>{a[x]=a[x].substr(0,o)+c+a[x].substr(o+1)};l=7;s=[];for(i=21;i--;)s[i]="    ";for(j=1;19>j;j+=2)s[j]=" ---";for(k=3;12>k;k+=2)s[k]="-----";~(p="HL".indexOf((n=prompt())[i=0]))&&(l=14*p,i++);l+=(73-n.charCodeAt(i))%7;C(s,l,2,"O");m=n[n.length-1];"#"!=m&   "b"!=m||C(s,l,1,m);o=7<l?3:1;for(z=0;3>z;C(s,t=l-2*o+3+z++,o,"|"));S=s.splice(3<=l?3:l,11>=l?11:l);console.log(S.join("\n"))

Iterasi kedua (menggunakan n.slice(-1)bukan n[n.length-1]), mencukur 2 byte

C=(a,x,o,c)=>{a[x]=a[x].substr(0,o)+c+a[x].substr(o+1)};l=7;s=[];for(i=21;i--;)s[i]="    ";for(j=1;19>j;j+=2)s[j]=" ---";for(k=3;12>k;k+=2)s[k]="-----";~(p="HL".indexOf((n=prompt())[i=0]))&&(l=14*p,i++);l+=(73-n.charCodeAt(i))%7;C(s,l,2,"O");m=n.slice(-1);"#"!=m& "b"!=m||C(s,l,1,m);o=7<l?3:1;for(z=0;3>z;C(s,t=l-2*o+3+z++,o,"|"));S=s.splice(3<=l?3:l,11>=l?11:l);console.log(S.join("\n"))

Versi tidak disatukan:

function C(a,x,o,c){
    a[x]=a[x].substr(0,o)+c+a[x].substr(o+1);
}
l=7;s=[];
for(i=21;i--;){
    s[i]="    ";
}
for(j=1;19>j;j+=2){
    s[j]=" ---";
}
for(k=3;12>k;k+=2){
    s[k]="-----";
}
i=0;n=prompt();
p="HL".indexOf(n[i]);
if(p>=0){
    l=14*p;i++;
}
l+=(73-n.charCodeAt(i))%7;
C(s,l,2,"O");
m=n.slice(-1);
if((m=="#")||m=="b"){
    C(s,l,1,m);
}
o=7<l?3:1;
for(z=0;3>z;z++){
    C(s,t=l-2*o+3+z,o,"|");
}
F=Math.min(3,l);
L=Math.max(11,l);
S=s.splice(F,L);
console.log(S.join("\n"));
WallyWest
sumber
Bisakah Anda menambahkan versi yang tidak dapat dibaca (dibaca)?
Martin Ender
@ m.buettner Selesai ... Saya harap ini membantu memberi Anda pemahaman yang lebih baik tentang apa yang telah saya lakukan :)
WallyWest