A Nota do Destino - coloque uma nota em uma equipe

19

O apocalipse zumbi chegou e o mundo está chegando ao fim. De repente, alguém descobre uma fórmula que leva a hora, minuto e dia atuais e cospe a nota perfeita para tocar em um piano que mata instantaneamente todos os zumbis que a ouvem. Infelizmente, resta apenas um pianista no mundo, e ele esqueceu de ler notas, mas ainda sabe ler partituras. Obviamente, isso é muito sensível ao tempo, por isso parece natural ter um computador. 1 1

Seu desafio é tomar uma nota, como G, e enviar a nota colocada em uma pauta (na clave de sol), assim:

-----

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

-----

Especificação:

  • Você deve gerar uma equipe de linhas alternadas de -----(5 traços) e uma linha em branco. Haverá 5 -----s no total. A nota deve ser sobreposta a essa equipe.
  • A entrada especificará onde a nota está localizada. A entrada será:
    • um opcional Hou L, especificando "alto" ou "baixo"
    • uma letra de Apara G, especificando o tom
    • um opcional #ou b, especificando afiado ou achatado.
  • A "nota" é definida como:
    • Um O(capital O) alinhado ao meio da pauta, que está no lugar da nota. (A linha superior é HF(F alto) e a linha inferior é E(E normal).)
    • Três |s (barras verticais), a haste, que será:
      • um espaço à esquerda da nota e indo para baixo (iniciando um espaço abaixo da nota) se a nota estiver na linha do meio ( B) ou acima, ou
      • um espaço à direita da nota e subindo (iniciando um espaço acima da nota) se a nota estiver abaixo da linha do meio.
    • Um #ou bum espaço diretamente à esquerda da nota, se especificado na entrada.
  • Linhas de razão devem ser adicionadas se a nota for muito alta ou baixa. Essas linhas terão ---(apenas 3 traços de largura, em oposição a 5) e aparecerão apenas se a nota estiver acima ou abaixo / abaixo (para as linhas de contabilidade superior / inferior, respectivamente) as linhas de contabilidade.
  • Espaços estranhos podem ser colocados em qualquer lugar que você desejar; por exemplo, você pode fazer com que as linhas em branco tenham espaços ou após as linhas do razão, se isso ajudar a salvar caracteres.

Aqui está uma visualização, para entender a especificação mais facilmente, com todos os nomes das notas ao lado das linhas:

      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)

Aqui estão mais alguns exemplos que você pode usar para testar seu programa:

Entrada: HG#

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

-----

-----

-----

Entrada: LAb

-----

-----

-----

-----

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

Entrada: HB

  O
 |--
 |
-|---

-----

-----

-----

-----

Entrada: C

-----

-----

-----

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

Isso é , então o código mais curto em bytes vencerá!

1: evar exposição mais realista! :-P

Maçaneta da porta
fonte
2
Parece muito estranho ter #ou bà direita da nota e não à esquerda; é realmente o que é necessário?
Thomas Baruchel 23/03
2
E o B # e afins? 1. plotagem como está; 2. rejeitar; 3. silenciosamente converter para C?
Digital Trauma
2
Pode ser melhor afirmar explicitamente que deve estar na clave de sol.
user12205
3
Alguém está tentando fazer isso na fuga ?
AJMansfield
3
@AJM Sim, tem que ser arte ASCII.
Maçaneta

Respostas:

1

Golfscript, 211 210 209 197 195 192 caracteres

Chegando para a vitória (a partir deste post), uma versão GolfScript da minha versão mais recente do Python :

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

Teste aqui (as 2 primeiras linhas são inseridas pelo usuário, normalmente vêm do stdin).

Versão 'legível':

;"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
fonte
Aaaaaaand espancado pelo GolfScript novamente. :) ...
Martin Ender
@ m.buettner: Haha, isso nunca acaba .. surpreendentemente perto!
Claudiu 25/03
11
Melhor! Agora eu só preciso encontrar 6/9 bytes para recuperar o atraso: D (embora eu não vejo como eu faria isso)
Martin Ender
@ m.buettner: Obtive mais 2 bytes! Cada um é tão brutal, embora ... eu possa ter que parar por enquanto. Boa sorte!
Claudiu 25/03
2
Oh, diabos ... exatamente quando pensei que tinha vencido o seu 209. Acho que estou desistindo. O GolfScript prevalece. ;)
Martin Ender
6

Ruby - 271 267 252 249 234 229 220 214 caracteres

Eu literalmente aprendi Ruby por isso. Portanto, certamente há espaço para melhorias no golfe. Ou fazendo qualquer coisa realmente. Mas eu precisava de uma linguagem com strings mutáveis. :)

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

Um pouco não-destruído:

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

Posso cortá-lo em mais 2 caracteres para 212 caracteres se linhas em branco iniciais forem permitidas. Esta solução não preenche as linhas que não são impressas de qualquer maneira:

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

O jogo justo da lambda? Então eu consigo 210 caracteres com a primeira abordagem

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

Ou 207 caracteres com linhas em branco adicionais:

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}

Claro, agora você precisaria fazer f.call("HGb").

Martin Ender
fonte
Ha, +1 por aprender um idioma totalmente novo! ;-) Aqui está uma dica: !x.nil?é equivalente a !x. E para uma linha ifs, if x;y;end;é equivalente a y if x. Além disso, você pode usar uma nova linha literal nessa sequência.
Maçaneta
@ Doorknob obrigado, vou tentar trabalhar aqueles!
Martin Ender
@ Doorknob hm, eu só tenho ifque trabalhar. Se eu usar ?\n(se é isso que você quis dizer), preciso adicionar um espaço, para não ganhar nada. E remover os .nil?s não funcionou (sempre avaliado como true).
Martin Ender
Eu quis dizer literalmente adicionar uma nova linha entre as duas aspas. E eu acho que você precisa de parênteses extras ao remover .nil?, mas vale a pena em caracteres.
Maçaneta
@ Maçaneta ah, não !x.nil?é !!x. :)
Martin Ender
2

Pitão, 329 309 295 286 280 277 caracteres

Jogou golfe um pouco mais agora. Ainda pode ser melhorado, mas não tenho certeza se posso vencer as soluções ruby ​​ou golfscript com essa abordagem.

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

Inicialmente, eu estava imprimindo linha por linha, mas acabou demorando muito, então eu gere uma grade de strings e preenche o que precisa ser preenchido. A entrada é da linha de comando, por exemplo:

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

-----

-----

-----
Claudiu
fonte
Na linha 5, você pode remover o espaço antes da vírgula segunda
user12205
@ace: Obrigado, perdi aquela #
Claudiu
2

GolfScript - 243 232 228 227 caracteres

Traduzi minha resposta do CoffeeScript para o GolfScript, que é muito mais adequado para as manipulações de strings.

EDIT: Salva seis caracteres usando o operador de incremento corretamente, três fazendo bom uso da pilha, mais seis redefinindo irresponsavelmente os operadores que não estou usando e mais um não imprimindo o espaço à direita após as linhas de graça.

Totalmente jogado:

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

Com comentários:

# 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
fonte
Eu teria ficado surpreso se eu poderia bater uma solução GolfScript em uma língua que eu não tenho nenhuma experiência em;)
Martin Ender
11
Eu não sou um especialista em GolfScript, mas acho que me apaixonei por todos os personagens que vou sair disso, então, se você puder encontrar outros dois, estará de ouro!
couchand
Tente digitar Gonele. a saída será oo|||:)
Jamie
1

Pitão, 250 245 242 235 caracteres

Uma abordagem muito diferente que acabou superando a minha outra! O código de processamento de entrada é semelhante, mas é isso.

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

Mapeei o valor de cada caractere com base na linha e na coluna e depois joguei a impressão:

#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
fonte
+1, Última linha parece magia negra mais do Perl do que coisas Pythonic
Antonio Ragagnin
1

Java - 921 907 863 caracteres

Eu construo cada string separadamente, armazenando cada string em uma matriz. Em seguida, passe pela matriz e imprima cada linha.

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, por favor, não me odeie, é a minha primeira vez. Não posso encontrar nenhuma pergunta / introdução, por isso espero que meu formato de postagem esteja correto. Não tenho certeza do quanto as pessoas são sérias sobre a contagem de caracteres .... versão normal do código - extra é quebra de linha / espaços (1313 caracteres):

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
fonte
Vejo toneladas de espaço em branco desnecessário (especialmente após ponto-e-vírgula e em torno de operadores, colchetes e parênteses) e nomes longos de variáveis ​​(como args).
Maçaneta
No envio da contagem de caracteres: 921 caracteres, todo o espaço em branco desapareceu: P
Will_61
O segundo envio com espaço em branco em todos os lugares é permitir que as pessoas leiam o código, como eu disse que é a minha primeira vez, não tenho certeza se devemos deixar 1 envio e 1 onde você tenta reduzir o limite de caracteres ... ou o quê?
Will_61
Não; Eu vejo uma enorme quantidade de espaço em branco inútil nessa versão. Por exemplo, espaços após vírgulas, espaços em torno de operadores, espaços depois [], espaços ao redor parênteses, etc.
Doorknob
Removidos todos eles agora (eu acho) Thanks :)
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

Versão não destruída:

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)
Raio
fonte
0

CoffeeScript alfabetizado - 497 527 caracteres

Tenho certeza de que há uma maneira melhor de construir a grade, mas não consigo descobrir.

Um ajudante de golfe.

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

AC maior escala e pessoal.

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

Nossa função de notação terá a representação de string de uma nota.

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

Primeiro vamos determinar a oitava.

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

Então a nota e acidental. Adoro desconstruir a tarefa.

  [n,a]=i

Vamos converter a nota e oitava em um índice e plotar a nota.

  x=7*o+s.indexOf n

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

Agora, cortaremos apenas o número de funcionários que precisarmos.

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

E o caule da nota.

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

Agora vamos mostrar os resultados.

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

Por fim, exportaremos a função para teste do console. Esses caracteres não contam para o total.

module.exports = f
couchand
fonte
Olhando mais de perto, parece que eu estraguei tudo ao refatorar a haste da nota, então ela produz uma saída ilegal no momento.
couchand
Eu o
corrigi
0

C, 325 304

Agora 21 bytes mais curtos graças ao @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));}

Resultado:

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

-----

-----

-----

-----


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

-----

-----

-----

-----

 --| 
   | 
 --| 
 #O  
ossifrage melindroso
fonte
A variável global é inicializada como zero por padrão, portanto você não precisa inicializar ne pode remover o i=0no primeiro forloop.
user12205
Além disso, na primeira ifinstrução, ((i%12)&11)==0pode ser substituído por !((i%12)&11).
user12205
Por fim, ?:tem uma precedência muito menor que ^e <, portanto, você pode remover os colchetes das condições anteriores ao ?. E você pode substituir printf("%s",por puts(.
user12205
0

JavaScript 390 388

Um pouco de desafio, vou ter que admitir ... Tenho certeza de que há maneiras de reduzir isso ainda mais ... Estou aberto a sugestões ...

Primeira Iteração

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

Segunda iteração (usando em n.slice(-1)vez de n[n.length-1]), raspa 2 bytes

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

Versão não destruída:

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
fonte
Você poderia adicionar uma versão não legível (legível), por favor?
Martin Ender
@ m.buettner Feito ... espero que ajuda a dar-lhe uma melhor compreensão do que eu fiz :)
Wally West