The Note of Destiny - поместите записку на посох

19

Зомби-апокалипсис наступил, и мир подходит к концу. Внезапно кто-то обнаруживает формулу, которая берет текущий час, минуту и ​​день, и выплевывает идеальную ноту для игры на пианино, которая мгновенно убивает каждого зомби, который ее слышит. К сожалению, в мире остался только один пианист, и он забыл, как читать ноты, но он все еще знает, как читать ноты. Конечно, это очень чувствительная ко времени вещь, поэтому вполне естественно, что компьютер это делает. 1

Ваша задача - сделать заметку, например G, и вывести заметку, помещенную на посох (в скрипичном ключе), например:

-----

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

-----

Спецификация:

  • Вы должны вывести ряд чередующихся строк -----(5 штрихов) и пустую строку. Всего будет 5 -----с. Записка должна быть наложена поверх этого персонала.
  • На входе будет указано, где находится заметка. Вход будет:
    • необязательный Hили L, указывая "высокий" или "низкий"
    • письмо от Aдо с Gуказанием поля
    • необязательный #или b, указав острый или плоский.
  • «Примечание» определяется как:
    • Один O(заглавная O) выровнен по центру посоха, который находится на месте записки. (Верхняя строка HF(высокая F), а нижняя строка E(нормальная E).)
    • Три |с (вертикальные полосы), стебель, который будет:
      • один пробел слева от примечания и спуск вниз (начиная с одного пробела ниже примечания), если примечание находится в средней строке ( B) или выше, или
      • один пробел справа от примечания и переход вверх (начиная с одного пробела выше примечания), если примечание находится ниже средней линии.
    • A #или bодин пробел слева от примечания, если он указан во входных данных.
  • Строки книги должны быть добавлены, если примечание слишком высоко или низко. Эти линии будут ---(только 3 штриха по ширине, а не 5) и появятся только в том случае, если примечание находится на или выше / ниже (для линий верхней / нижней бухгалтерской книги соответственно) линий бухгалтерской книги.
  • Посторонние места могут быть размещены где угодно. например, вы можете сделать так, чтобы пустые строки имели пробелы или пробелы после строк главной книги, если это поможет вам сохранить любые символы.

Вот визуализация для более легкого понимания спецификации со всеми именами примечаний рядом со строками:

      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)

Вот еще несколько примеров, которые вы можете использовать для тестирования вашей программы:

Входные данные: HG#

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

-----

-----

-----

Входные данные: LAb

-----

-----

-----

-----

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

Входные данные: HB

  O
 |--
 |
-|---

-----

-----

-----

-----

Входные данные: C

-----

-----

-----

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

Это , поэтому выиграет самый короткий код в байтах!

1: самая реалистичная экспозиция evar! :-П

Дверная ручка
источник
2
Это выглядит очень странно иметь #или bсправа от примечания, а не слева; это действительно то, что требуется?
Томас Барухель
2
А как насчет B # и тому подобное? 1. сюжет как есть; 2. отклонить; 3. молча конвертировать в C?
Цифровая травма
2
Может быть, лучше явно указать, что оно должно быть в скрипичном ключе.
user12205
3
Кто-нибудь пытался сделать это в Фуге ?
AJMansfield
3
@ AJM Да, это должно быть искусство ASCII.
Ручка

Ответы:

1

Golfscript, 211 210 209 197 195 192 символов

Приближается к (на момент публикации) победа, версия GolfScript моей последней версии 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}/

Проверьте это здесь (первые 2 строки - пользовательский ввод, обычно это происходит из stdin).

«Читаемая» версия:

;"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 и снова побежден GolfScript. :) ...
Мартин Эндер
@ m.buettner: Ха-ха, это никогда не кончается .. удивительно близко, хотя!
Клаудиу
1
Лучше! Теперь мне нужно только найти 6/9 байтов, чтобы наверстать упущенное: D (хотя я не понимаю, как бы я это сделал)
Мартин Эндер
@ m.buettner: получил еще 2 байта! Хотя каждый из них так жесток ... Возможно, мне придется сейчас остановиться. Удачи!
Клавдиу
2
О, черт возьми ... как раз тогда, когда я думал, что победил твои 209. Я думаю, что я сдаюсь. GolfScript преобладает. ;)
Мартин Эндер
6

Рубин - 271 267 252 249 234 229 220 214 символов

Я буквально только что выучил Ruby для этого. Так что, безусловно, есть место для улучшения игры в гольф. Или делать что-нибудь на самом деле. Но мне нужен был язык с изменяемыми строками. :)

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

Немного негольфя

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

Я могу сократить его еще на 2 символа до 212 символов, если разрешены начальные пустые строки. Это решение не заполняет строки, которые все равно не печатаются:

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

Честная ли лямбда-игра? Тогда я могу получить 210 символов с первого подхода

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

Или 207 символов с дополнительными пустыми строками:

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}

Конечно, теперь вам нужно сделать f.call("HGb").

Мартин Эндер
источник
Ха, +1 за изучение совершенно нового языка! ;-) Вот совет: !x.nil?эквивалентно !x. И для одной строки ifs if x;y;end;эквивалентно y if x. Также вы можете использовать буквальный перевод строки в этой строке.
дверная ручка
@ Doorknob спасибо, я постараюсь поработать над этим!
Мартин Эндер
@ Doorknob Хм, я только получил на ifработу. Если я использую ?\n(если вы это имели в виду), мне нужно добавить пробел, поэтому я ничего не получу. И удаление .nil?s не работает вообще (всегда оценивается как true).
Мартин Эндер
Я имел в виду буквально добавление новой строки между двумя кавычками. И я думаю, что вам нужны дополнительные парены при удалении .nil?, но это стоит того, чтобы у персонажей.
Дверная ручка
@ Doorknob ах, нет !x.nil?это !!x. :)
Мартин Эндер
2

Python, 329 309 295 286 280 277 символов

Гольф немного больше сейчас. Все еще может быть улучшено, но не уверен, смогу ли я победить решения ruby ​​или golfscript с помощью этого подхода.

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

Первоначально я печатал построчно, но оказалось, что это заняло слишком много времени, поэтому я генерирую сетку строк, а затем заполняю то, что необходимо заполнить. Ввод осуществляется из командной строки, например:

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

-----

-----

-----
Клаудиу
источник
В строке 5 вы можете удалить пробел перед второй запятой
user12205
@ace: Спасибо, пропустил это
Claudiu
2

GolfScript - 243 232 228 227 символов

Я перевел свой ответ CoffeeScript на GolfScript, который гораздо больше подходит для работы со строками.

РЕДАКТИРОВАТЬ: Сохранить шесть символов, правильно используя оператор приращения, три - используя стек, еще шесть - безответственно переопределяя операторы, которые я не использую, и еще один, не печатая завершающий пробел после грациозных строк.

Полностью гольф:

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

С комментариями:

# 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
источник
Я был бы удивлен, если бы я мог победить решение GolfScript на языке, с которым у меня нет опыта;)
Martin Ender
1
Я не эксперт по GolfScript, но я думаю, что выучил почти все персонажи, которые я собираюсь выбрать, поэтому, если вы сможете найти еще двух, вы великолепны!
диван
Попробуйте набрать Goэто. это будет выводить oo|||:)
Джейми
1

Python, 250 245 242 235 символов

Совсем другой подход, который в итоге обыграл другого! Код обработки ввода похож, но это все.

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

Я наметил значение каждого символа на основе строки и столбца, а затем сыграл в гольф печать:

#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, последняя строка кажется более черной магией Perl, чем Pythonic
Антонио Раганьин,
1

Ява - 921 907 863 символа

Я строю каждую строку отдельно, сохраняя каждую строку в массиве. Затем переберите массив и распечатайте каждую строку.

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

О, пожалуйста, не ненавидь меня, это мой первый раз. Я не могу найти faq / введение, поэтому я надеюсь, что мой формат публикации в порядке. Не уверен, насколько серьезно люди относились к количеству символов .... нормальная версия кода - дополнительный перевод строки / пробелы (1313 символов):

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
источник
Я вижу тонны ненужных пробелов (особенно после точек с запятой и вокруг операторов, скобок и скобок) и длинных имен переменных (например args).
Ручка двери
В представлении подсчета символов: 921 символов, все пробелы исчезли: P
Will_61
Второе представление с пропусками повсюду - позволить людям читать код, как я сказал, это мой первый раз, так что не уверен, что нам нужно оставить 1 представление и 1, где вы пытаетесь уменьшить ограничение на количество символов ... или что?
Will_61
Нет; Я вижу огромное количество бесполезных пробелов в этой версии. Например, пробелы после точек с запятой, пробелы вокруг операторов, пробелы после [], пробелы в скобках и т. Д.
Ручка двери
Убрал их всех сейчас (думаю) Спасибо :)
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

Безголовая версия:

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

Грамотный CoffeeScript - 497 527 символов

Я уверен, что есть лучший способ построить сетку, но я не могу понять это.

Один помощник по гольфу.

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

Масштаб АС и персонал.

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

Наша функция записи примет строковое представление заметки.

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

Сначала мы определим октаву.

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

Тогда записка и случайно. Должен любить деконструирующее назначение.

  [n,a]=i

Давайте преобразуем заметку и октаву в индекс и нанесем на карту заметку.

  x=7*o+s.indexOf n

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

Теперь мы будем сокращать столько персонала, сколько нам нужно.

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

И нота стволовая.

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

Теперь давайте выведем результаты.

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

Наконец, мы экспортируем функцию для тестирования консоли. Эти персонажи не учитываются в общем количестве.

module.exports = f
couchand
источник
Если присмотреться поближе, мне кажется, что я облажался при рефакторинге ноты, так что в настоящий момент он производит неправильный вывод.
Каучанд
Я исправил это, но он добавил 30 символов: - /
couchand
0

С 325 304

Теперь на 21 байт короче благодаря @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));}

Выход:

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

-----

-----

-----

-----


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

-----

-----

-----

-----

 --| 
   | 
 --| 
 #O  
брезгливый оссифраж
источник
Глобальные переменные по умолчанию инициализируются на ноль, поэтому вам не нужно инициализировать, nи вы можете удалить i=0первый forцикл.
user12205
Также в первом ifутверждении ((i%12)&11)==0можно заменить на !((i%12)&11).
user12205
Наконец, ?:имеет более низкий приоритет, чем ^и <, поэтому вы можете снять скобки с условий перед ?. И вы можете заменить printf("%s",на puts(.
user12205
0

JavaScript 390 388

Немного проблем, я должен признать ... Я уверен, что есть способы уменьшить это далее ... Я открыт для предложений ...

Первая итерация

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

Вторая итерация (используется n.slice(-1)вместо n[n.length-1]), бреет 2 байта

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

Безголовая версия:

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"));
Уолли Уэст
источник
Не могли бы вы добавить версию без разборчивости (читаемую), пожалуйста?
Мартин Эндер
@ m.buettner Готово ... Надеюсь, это поможет вам лучше понять, что я сделал :)
WallyWest