Notatka o przeznaczeniu - umieść notatkę na pięciolinii

19

Apokalipsa zombie nadeszła i świat się kończy. Nagle ktoś odkrywa formułę, która zajmuje aktualną godzinę, minutę i dzień, i wyrzuca idealną nutę do gry na pianinie, która natychmiast zabija każdego zombie, który ją słyszy. Niestety na świecie pozostał tylko jeden pianista, który zapomniał czytać nuty, ale nadal umie czytać nuty. Oczywiście jest to kwestia bardzo czasochłonna, więc wydaje się naturalne, że komputer to robi. 1

Twoim wyzwaniem jest zanotowanie Gi wysłanie notatki umieszczonej na pięciolinii (w kluczu wiolinowym) w następujący sposób:

-----

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

-----

Specyfikacja:

  • Musisz wypisać pięciolinię naprzemiennych linii -----(5 myślników) i pustej linii. Łącznie będzie 5 -----s. Notatkę należy nałożyć na ten pięciolinię.
  • Dane wejściowe określą lokalizację notatki. Dane wejściowe będą:
    • opcjonalny Hlub Lokreślający „wysoki” lub „niski”
    • list od Ado G, określający wysokość
    • opcjonalny #lub b, określający ostry lub płaski.
  • „Uwaga” jest zdefiniowana jako:
    • Jedna O(duża litera O) wyrównana do środka pięciolinii, która znajduje się w miejscu nuty. (Górna linia to HF(wysokie F), a dolna linia to E(normalne E).)
    • Trzy |s (pionowe paski), trzon, który będzie:
      • jedno pole na lewo od nuty i schodzenie w dół (zaczynając o jedno pole poniżej nuty), jeśli nuta znajduje się w środkowej linii ( B) lub powyżej, lub
      • jedno pole po prawej stronie nuty i idące w górę (zaczynając o jedno pole powyżej nuty), jeśli nuta znajduje się poniżej środkowej linii.
    • A #lub bjedna spacja bezpośrednio na lewo od nuty, jeśli podano ją na wejściu.
  • Wiersze księgi muszą zostać dodane, jeśli nuta jest zbyt wysoka lub niska. Te linie będą ---(tylko 3 kreski szerokości, w przeciwieństwie do 5) i pojawią się tylko wtedy, gdy nuta jest na lub powyżej / poniżej (odpowiednio dla górnych / dolnych linii księgi) linii księgi.
  • Przestrzenie zewnętrzne można umieszczać w dowolnym miejscu; na przykład możesz sprawić, że puste linie będą miały spacje lub spację po liniach księgi, jeśli pomoże to w zapisaniu dowolnych znaków.

Oto wizualizacja umożliwiająca łatwiejsze zrozumienie specyfikacji wraz ze wszystkimi nazwami nut obok wierszy:

      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)

Oto kilka przykładów, które możesz wykorzystać do przetestowania swojego programu:

Wejście: HG#

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

-----

-----

-----

Wejście: LAb

-----

-----

-----

-----

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

Wejście: HB

  O
 |--
 |
-|---

-----

-----

-----

-----

Wejście: C

-----

-----

-----

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

To jest , więc wygra najkrótszy kod w bajtach!

1: najbardziej realistyczny evar ekspozycji! :-P

Klamka
źródło
2
Dziwnie jest mieć #lub bpo prawej stronie nuty niż po lewej; czy to naprawdę jest wymagane?
Thomas Baruchel
2
Co z B # i podobnymi? 1. działka w stanie, w jakim się znajduje; 2. odrzucić; 3. po cichu przekonwertować na C?
Cyfrowa trauma
2
Lepiej może jednoznacznie stwierdzić, że powinien to być klucz wiolinowy.
user12205
3
Ktoś może spróbować tego w Fuga ?
AJMansfield,
3
@AJM Tak, to musi być sztuka ASCII.
Klamka

Odpowiedzi:

1

Golfscript, 211 210 209 197 195 192 znaków

Przybywając po zwycięstwo (od tego postu), w mojej najnowszej wersji Python w wersji GolfScript :

"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}/

Przetestuj tutaj (pierwsze 2 wiersze są wprowadzane przez użytkownika, zwykle pochodzi ze standardowego wejścia).

Wersja „czytelna”:

;"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
źródło
Aaaaaa i ponownie pobity przez GolfScript. :) ...
Martin Ender
@ m.buettner: Haha, to nigdy się nie kończy ... choć zaskakująco blisko!
Claudiu
1
Lepszy! Teraz muszę tylko znaleźć 6/9 bajtów, aby nadrobić zaległości: D (chociaż nie wiem, jak bym to zrobił)
Martin Ender
@ m.buettner: Mam jeszcze 2 bajty! Każdy z nich jest jednak tak brutalny ... Może na razie będę musiał się zatrzymać. Powodzenia!
Claudiu
2
O cholera ... kiedy pomyślałem, że pokonałem twoje 209. Chyba się poddaję. GolfScript zwycięża. ;)
Martin Ender
6

Rubinowy - 271 267 252 249 234 229 220 214 znaków

Dosłownie nauczyłem się do tego Ruby. Jest więc z pewnością miejsce na ulepszenie gry w golfa. Lub robienie czegokolwiek naprawdę. Ale potrzebowałem języka ze zmiennymi ciągami. :)

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

Nieco golfisty:

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

Mogę go przyciąć o kolejne 2 znaki do 212 znaków, jeśli dozwolone są wiodące puste wiersze. To rozwiązanie i tak nie wypełnia wierszy, które nie są drukowane:

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

Czy lambda jest uczciwą grą? Wtedy mogę uzyskać 210 znaków przy pierwszym podejściu

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

Lub 207 znaków z dodatkowymi pustymi wierszami:

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}

Oczywiście, teraz musisz zrobić f.call("HGb").

Martin Ender
źródło
Ha, +1 za naukę zupełnie nowego języka! ;-) Oto wskazówka: !x.nil?odpowiada !x. I dla jednej linii ifs if x;y;end;jest równoważne z y if x. Możesz także użyć literału nowego wiersza w tym ciągu.
Klamka
@Doorknob dzięki, postaram się je wykorzystać!
Martin Ender
@Doorknob hm, mam tylko ifdo pracy. Jeśli użyję ?\n(jeśli o to ci chodziło), muszę dodać spację, więc nic nie zyskuję. A usunięcie .nil?s wcale nie działało (zawsze sprawdzane true).
Martin Ender
Miałem na myśli dosłownie dodanie nowego wiersza między tymi dwoma cytatami. I myślę, że potrzebujesz dodatkowych skórek podczas usuwania .nil?, ale warto w postaciach.
Klamka
@Doorknob ah, no !x.nil?is !!x. :)
Martin Ender
2

Python, 329 309 295 286 280 277 znaków

Grałem teraz trochę więcej. Nadal można to poprawić, ale nie jestem pewien, czy uda mi się pokonać rozwiązania ruby ​​lub gry w golfa dzięki takiemu podejściu.

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

Początkowo drukowałem wiersz po wierszu, ale okazało się, że zajmuje to zbyt wiele, więc generuję siatkę ciągów, a następnie wypełniam to, co należy wypełnić. Dane wejściowe pochodzą z wiersza poleceń, np .:

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

-----

-----

-----
Claudiu
źródło
W linii 5 możesz usunąć spację przed drugim przecinkiem
12205
@ace: Dzięki, przegapiłem tę
Claudiu
2

GolfScript - 243 232 228 227 znaków

Przetłumaczyłem moją odpowiedź CoffeeScript na GolfScript, który jest znacznie bardziej odpowiedni do manipulacji ciągami.

EDYCJA: Oszczędność sześciu znaków dzięki prawidłowemu użyciu operatora inkrementacji, trzech dzięki dobremu wykorzystaniu stosu, sześciu kolejnych przez nieodpowiedzialne przedefiniowanie operatorów, których nie używam, i jeszcze jednego poprzez nie drukowanie spacji po wierszach łaski.

Całkowicie grał w golfa:

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

Z komentarzami:

# 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*
couchand
źródło
Byłbym zdumiony, gdybym mógł pokonać rozwiązanie GolfScript w języku, w którym nie mam doświadczenia;)
Martin Ender
1
Nie jestem ekspertem od GolfScript, ale myślę, że poznałem wszystkie postacie, które z tego wyciągnę, więc jeśli możesz znaleźć kolejne dwa, jesteś złoty!
couchand
Spróbuj wpisać Go. wyjdzie oo|||:)
Jamie
1

Python, 250 245 242 235 znaków

Zupełnie inne podejście, które zakończyło się pokonaniem mojego drugiego! Kod przetwarzania danych wejściowych jest podobny, ale o to chodzi.

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

Odwzorowałem wartość każdego znaku na podstawie wiersza i kolumny, a następnie grałem w golfa nad drukiem:

#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
źródło
+1, ostatnia linia wydaje się bardziej czarną magią Perla niż
kwestią pytoniczną
1

Java - 921 907 863 znaków

Każdy ciąg buduję osobno, przechowując każdy ciąg w tablicy. Następnie przejdź przez tablicę i wydrukuj każdą linię.

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

Och, proszę, nie nienawidź mnie, to mój pierwszy raz. Nie mogę znaleźć żadnego pytania / wprowadzenia, więc mam nadzieję, że mój format publikacji jest w porządku. Nie jestem pewien, jak poważni ludzie podeszli do liczby znaków ... normalna wersja kodu - dodatkowa jest łamana linia / spacje (1313 znaków):

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
źródło
Widzę mnóstwo niepotrzebnych białych znaków (szczególnie po średnikach i wokół operatorów oraz nawiasów i parenów) i długich nazw zmiennych (jak args).
Klamka
W zgłoszeniu liczenia znaków: 921 znaków, wszystkie białe znaki zniknęły: P
Will_61
Drugie zgłoszenie z białymi znakami wszędzie pozwala ludziom czytać kod, ponieważ powiedziałem, że to mój pierwszy raz, więc nie jestem pewien, czy mamy zostawić 1 zgłoszenie i 1, w którym próbujesz zmniejszyć limit znaków ... czy co?
Will_61
Nie; W tej wersji widzę ogromną ilość bezużytecznych białych znaków. Na przykład spacje po średnikach, spacje wokół operatorów, spacje po [], spacje wokół nawiasów itp.
Klamka
Usunąłem je wszystkie teraz (tak myślę) Dzięki :)
Usunąłem
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

Wersja bez golfa:

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)
Promień
źródło
0

Literate CoffeeScript - 497 527 znaków

Jestem pewien, że istnieje lepszy sposób na zbudowanie siatki, ale nie mogę tego rozgryźć.

Jeden pomocnik golfa.

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

AC na dużą skalę i personel.

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

Nasza funkcja notacji weźmie ciąg reprezentujący notatkę.

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

Najpierw określmy oktawę.

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

Potem notatka i przypadkowa. Uwielbiam dekonstruować zadanie.

  [n,a]=i

Przekształćmy nutę i oktawę w indeks i narysujmy notatkę.

  x=7*o+s.indexOf n

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

Teraz wyeliminujemy tylko tyle personelu, ile potrzebujemy.

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

I trzon notatki.

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

Teraz wypiszmy wyniki.

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

Na koniec wyeksportujemy funkcję do testowania na konsoli. Te postacie nie liczą się do sumy.

module.exports = f
couchand
źródło
Przyglądając się bliżej, wygląda na to, że spieprzyłem podczas refaktoryzacji trzonu nuty, więc w tej chwili produkuje nielegalne wyjście.
couchand
Naprawiłem to, ale dodałem 30 znaków: - /
couchand
0

C 325 304

Teraz o 21 bajtów krótszy dzięki @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));}

Wynik:

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

-----

-----

-----

-----


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

-----

-----

-----

-----

 --| 
   | 
 --| 
 #O  
piskliwy kostuch
źródło
Zmienne globalne są domyślnie inicjowane na zero, więc nie trzeba inicjować ni można usunąć i=0pierwszą forpętlę.
user12205
Również w pierwszym ifzdaniu ((i%12)&11)==0można go zastąpić !((i%12)&11).
user12205
Wreszcie, ?:ma bardzo niższy priorytet niż ^i <tak można usunąć wsporniki o warunkach przed złożeniem ?. I można wymienić printf("%s",z puts(.
user12205
0

JavaScript 390 388

Trochę wyzwania, muszę przyznać ... Jestem pewien, że istnieją sposoby na zmniejszenie tego ... Jestem otwarty na sugestie ...

Pierwsza iteracja

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

Druga iteracja (użycie n.slice(-1)zamiast n[n.length-1]), goli 2 bajty

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

Wersja bez golfa:

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
źródło
Czy mógłbyś dodać wersję bez golfa (czytelną)?
Martin Ender
@ m.buettner Gotowe ... Mam nadzieję, że pomoże ci to lepiej zrozumieć, co zrobiłem :)
WallyWest