La nota del destino: posiziona una nota su uno staff


19

L'apocalisse di zombi è arrivata e il mondo sta finendo. Improvvisamente, qualcuno scopre una formula che prende l'ora, i minuti e il giorno correnti e sputa la nota perfetta per suonare su un piano che uccide all'istante ogni zombi che lo ascolta. Sfortunatamente, al mondo è rimasto solo un pianista e ha dimenticato come leggere le note, ma sa ancora leggere gli spartiti. Naturalmente, questa è una cosa molto sensibile al tempo, quindi sembra naturale che un computer lo faccia. 1

La tua sfida è prendere una nota, come G, ed emettere la nota posizionata su uno staff (in chiave di violino), in questo modo:

-----

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

-----

Specifica:

  • È necessario produrre uno staff di righe alternate di -----(5 trattini) e una riga vuota. Ci saranno 5 -----s in totale. La nota deve essere sovrapposta a questo staff.
  • L'input specificherà dove si trova la nota. L'input sarà:
    • un facoltativo Ho L, specificando "alto" o "basso"
    • una lettera da Aa G, specificando il tono
    • un optional #o b, specificando sharp o flat.
  • La "nota" è definita come:
    • Uno O(O maiuscola) allineato al centro del rigo, che si trova al posto della nota. (La linea superiore è HF(F alta) e la linea inferiore è E(una E normale).
    • Tre |s (barre verticali), lo stelo, che sarà:
      • uno spazio a sinistra della nota e andando verso il basso (iniziando uno spazio sotto la nota) se la nota si trova sulla riga centrale ( B) o sopra, oppure
      • uno spazio a destra della nota e andando verso l'alto (iniziando uno spazio sopra la nota) se la nota è sotto la linea di mezzo.
    • Uno #o buno spazio direttamente a sinistra della nota se specificato nell'input.
  • Le righe di registro devono essere aggiunte se la nota è troppo alta o bassa. Queste linee avranno ---(solo 3 trattini in larghezza, anziché 5) e appariranno solo se la nota è sopra o sopra / sotto (rispettivamente per le linee di registro superiore / inferiore) le linee di registro.
  • Spazi estranei possono essere posizionati ovunque tu voglia; ad esempio, potresti fare in modo che le righe vuote abbiano spazi o uno spazio dopo le righe del libro mastro se ti aiuta a salvare i caratteri.

Ecco una visualizzazione, per comprendere più facilmente le specifiche, con tutti i nomi delle note accanto alle righe:

      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)

Ecco alcuni altri esempi che è possibile utilizzare per testare il programma:

Ingresso: HG#

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

-----

-----

-----

Ingresso: LAb

-----

-----

-----

-----

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

Ingresso: HB

  O
 |--
 |
-|---

-----

-----

-----

-----

Ingresso: C

-----

-----

-----

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

Questo è , quindi vincerà il codice più breve in byte!

1: evar esposizione più realistica! :-P


2
Sembra molto strano avere #o balla destra della nota piuttosto che alla sinistra; è davvero ciò che è richiesto?
Thomas Baruchel,

2
Che dire di B # e simili? 1. trama così com'è; 2. respingere; 3. converti silenziosamente in C?
Trauma digitale

2
Potrebbe essere meglio dichiarare esplicitamente che dovrebbe essere nella chiave di violino.
user12205

3
Qualcuno ha intenzione di tentare questo in Fuga ?
AJMansfield,

3
@AJM Sì, deve essere arte ASCII.
Maniglia della porta

Risposte:


1

Golfscript, 211 210 209 197 195 192 caratteri

In arrivo per la (a partire da questo post) una versione GolfScript della mia ultima versione di 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}/

Provalo qui (le prime 2 righe sono inserite dall'utente, normalmente provengono da stdin).

Versione "leggibile":

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

Aaaaaa e battuto di nuovo da GolfScript. :) ...
Martin Ender il

@ m.buettner: Haha, non finisce mai .. sorprendentemente vicino però!
Claudiu,

1
Meglio! Ora ho solo bisogno di trovare 6/9 byte per recuperare: D (anche se non vedo come lo farei)
Martin Ender

@ m.buettner: hai 2 byte in più in meno! Ognuno è così brutale, però ... potrei fermarmi per ora. In bocca al lupo!
Claudiu,

2
Oh maledetto inferno ... proprio quando pensavo di aver battuto il tuo 209. Penso che mi arrenderò. Prevale GolfScript. ;)
Martin Ender il

6

Rubino - 271 267 252 249 234 229 220 214 caratteri

Ho letteralmente imparato Ruby per questo. Quindi c'è sicuramente spazio per migliorare il golf. O fare qualcosa davvero. Ma avevo bisogno di una lingua con stringhe mutabili. :)

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

Abbastanza ungolfed:

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 tagliarlo di altri 2 caratteri fino a 212 caratteri se sono consentite righe vuote iniziali. Questa soluzione non riempie comunque le linee che non sono stampate:

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

Il gioco leale di lambda? Quindi posso ottenere 210 caratteri con il primo approccio

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

O 207 caratteri con righe vuote aggiuntive:

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}

Certo, ora dovresti farlo f.call("HGb").


Ah, +1 per l'apprendimento di una lingua completamente nuova! ;-) Ecco un suggerimento: !x.nil?è equivalente a !x. E per una riga ifs, if x;y;end;equivale a y if x. Inoltre puoi usare una nuova riga letterale in quella stringa.
Maniglia della porta

@Doorknob grazie, proverò a lavorarci dentro!
Martin Ender,

@Doorknob hm, ho solo avuto il iflavoro. Se uso ?\n(se è quello che volevi dire) ho bisogno di aggiungere uno spazio, quindi non guadagno nulla. E la rimozione della .nil?s non ha funzionato affatto (sempre valutata a true).
Martin Ender,

Intendevo letteralmente aggiungere una nuova riga tra le due virgolette. E penso che hai bisogno di parentesi extra durante la rimozione .nil?, ma ne vale la pena nei personaggi.
Maniglia della porta

@Doorknob ah, no lo !x.nil?è !!x. :)
Martin Ender il

2

Python, 329 309 295 286 280 277 caratteri

Ho giocato a golf un po 'di più ora. Può ancora essere migliorato, ma non sono sicuro di riuscire a battere le soluzioni ruby ​​o golfscript con questo approccio.

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

Inizialmente stavo stampando riga per riga, ma si è rivelato troppo lungo, quindi ho generato una griglia di stringhe e quindi ho compilato ciò che è necessario compilare. L'input proviene dalla riga di comando, ad esempio:

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

-----

-----

-----

Nella riga 5 è possibile rimuovere lo spazio prima della seconda virgola
user12205

@ace: grazie, ho perso quello
Claudiu

2

GolfScript - 243 232 228 227 caratteri

Ho tradotto la mia risposta CoffeeScript in GolfScript, che è molto più adatto alle manipolazioni delle stringhe.

MODIFICARE: sei caratteri salvati usando correttamente l'operatore di incremento, tre facendo buon uso dello stack, altri sei ridefinendo irresponsabilmente gli operatori che non sto usando, e uno in più non stampando lo spazio finale dopo le linee di tolleranza.

Interamente golfato:

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

Con commenti:

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

Sarei stato sorpreso se potessi battere una soluzione GolfScript in una lingua in cui non ho esperienza;)
Martin Ender

1
Non sono un esperto di GolfScript ma penso di aver eliminato quasi tutti i personaggi che uscirò da questo, quindi se riesci a trovarne altri due, sei d'oro!
sabato

Prova a digitarlo Go. uscirà oo|||:)
Jamie,

1

Pitone, 250 245 242 235 caratteri

Un approccio molto diverso che ha finito per battere il mio altro! Il codice di elaborazione dell'input è simile ma questo è tutto.

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

Ho mappato il valore di ogni personaggio in base alla riga e alla colonna e poi ho golfato la stampa:

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

+1, L'ultima riga sembra più la magia nera di Perl che roba da Pythonic
Antonio Ragagnin,

1

Java - 921 907 863 caratteri

Costruisco ciascuna stringa separatamente, memorizzando ogni stringa in un array. Quindi passare in rassegna l'array e stampare ogni riga.

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, per favore, non odiarmi, è la mia prima volta. Non trovo alcuna domanda / introduzione, quindi spero che il mio formato di pubblicazione sia ok. Non sono sicuro di quanto siano serie le persone sul conteggio dei caratteri .... versione normale del codice - extra è la linea / spazi (1313 caratteri):

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

Vedo tonnellate di spazi bianchi non necessari (specialmente dopo il punto e virgola e attorno a operatori, parentesi e parentesi) e nomi di variabili lunghe (come args).
Maniglia della porta

Nella presentazione conteggio caratteri: 921 caratteri, tutto lo spazio bianco è sparito: P
Will_61

Il secondo invio con spazi bianchi ovunque è quello di consentire alle persone di leggere il codice, come ho detto è la mia prima volta, quindi non sono sicuro se dovremmo lasciare 1 invio e 1 in cui si tenta di ridurre il limite di caratteri ... o cosa?
Will_61,

No; Vedo un'enorme quantità di spazi bianchi inutili in quella versione. Ad esempio, spazi dopo punto e virgola, spazi attorno agli operatori, spazi dopo [], spazi tra parentesi, ecc.
Maniglia della porta

Li ho rimossi tutti ora (penso) Grazie :)
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

Versione non golfata:

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)

0

Literate CoffeeScript: 497 527 caratteri

Sono sicuro che c'è un modo migliore per costruire la griglia, ma non riesco a capirlo.

Un aiutante di golf.

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

Scala principale e personale AC.

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

La nostra funzione di notazione prenderà la rappresentazione in forma di stringa di una nota.

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

Per prima cosa determineremo l'ottava.

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

Quindi la nota e accidentale. Devi amare decostruire l'incarico.

  [n,a]=i

Convertiamo la nota e l'ottava in un indice e tracciamo la nota.

  x=7*o+s.indexOf n

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

Ora elimineremo solo tutto lo staff di cui abbiamo bisogno.

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

E il gambo della nota.

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

Ora produciamo i risultati.

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

Infine, esporteremo la funzione per i test della console. Questi personaggi non contano per il totale.

module.exports = f

Guardando più da vicino, mi sembra di aver sbagliato nel refactoring dello stelo delle note, quindi al momento produce un output illegale.
sabato

L'ho corretto, ma ha aggiunto 30 caratteri: - /
couchand il

0

C, 325 304

Ora 21 byte in meno grazie a @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));}

Produzione:

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

-----

-----

-----

-----


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

-----

-----

-----

-----

 --| 
   | 
 --| 
 #O  

Le variabili globali sono inizializzate su zero per impostazione predefinita, quindi non è necessario inizializzare ne è possibile rimuovere il i=0nel primo forciclo.
user12205

Inoltre, nella prima ifaffermazione, ((i%12)&11)==0può essere sostituito con !((i%12)&11).
user12205

Infine, ?:ha una precedenza molto più bassa di ^e <, quindi è possibile rimuovere le parentesi delle condizioni prima di ?. E puoi sostituirlo printf("%s",con puts(.
user12205

0

JavaScript 390 388

Un po 'una sfida, dovrò ammettere ... Sono sicuro che ci sono modi per ridurlo ulteriormente ... Sono aperto a suggerimenti ...

Prima Iterazione

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

Seconda Iterazione (usando n.slice(-1)invece di n[n.length-1]), rade 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"))

Versione non golfata:

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

Potresti aggiungere una versione non leggibile (leggibile), per favore?
Martin Ender,

@ m.buettner Fatto ... Spero che ti aiuti a capire meglio quello che ho fatto :)
WallyWest
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.