Записка долі - помістіть записку до персоналу


19

Апокаліпсис зомбі настав, і світ наближається до кінця. Раптом хтось виявляє формулу, яка займає поточну годину, хвилину та день, і виписує ідеальну ноту для гри на піаніно, що миттєво вбиває кожного зомбі, який її почує. На жаль, у світі залишився лише один піаніст, і він забув читати ноти, але все ще вміє читати ноти. Звичайно, це дуже залежна від часу річ, тому, здається, природно, щоб комп'ютер це робив. 1

Ваша задача полягає в тому, щоб зробити замітку, таку як G, і видати нотатку, розміщену на персоналі (у високих ключах), як це:

-----

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

-----

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

  • Ви повинні вивести штат змінних ліній -----(5 тире) та порожнього рядка. Усього буде 5 -----с. Нотатка повинна бути накладена поверх цього персоналу.
  • Вхід вказує, де знаходиться примітка. Вхід буде:
    • необов'язково Hабо із Lзазначенням "високого" або "низького"
    • лист від Aдо G, із зазначенням висоти
    • необов'язковий #або b, із зазначенням гострих або плоских.
  • "Примітка" визначається як:
    • Один O(з великої літери О) вирівняний до середини штату, який знаходиться на місці записки. (Верхня лінія HF(висока F), а нижня E(звичайна E).)
    • Три |с (вертикальні бруски), стебло, яке буде:
      • один пробіл ліворуч від ноти і йде вниз (починаючи один пробіл під нотою), якщо нота знаходиться на середній лінії ( B) або вище, або
      • один пробіл праворуч від ноти і йде вгору (починаючи один пробіл над нотою), якщо нота знаходиться нижче середньої лінії.
    • А #або 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! :-P


2
Дуже дивно виглядати, #а bне праворуч від замітки, а не зліва; це справді те, що потрібно?
Томас Баручель

2
А що з B # тощо? 1. сюжет як-є; 2. відхилити; 3. мовчки перетворити на С?
Цифрова травма

2
Можливо, краще чітко заявити, що воно повинно бути з високим ключем.
користувач12205

3
Хтось намагався це зробити на фузі ?
AJMansfield

3
@AJM Так, це має бути мистецтво ASCII.
Дверна ручка

Відповіді:


1

Гольфскрипт, 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
}/

Аааааа і знову побили GolfScript. :) ...
Мартін Ендер

@ m.buettner: Ха-ха, це ніколи не закінчується ... напрочуд близько!
Клавдіу

1
Краще! Тепер мені потрібно лише знайти 6/9 байтів, щоб наздогнати: D (хоча я не бачу, як би це зробити)
Мартін Ендер,

@ m.buettner: Знищено ще 2 байти! Кожна з них така жорстока ... Мені, можливо, доведеться зараз зупинитися. Удачі!
Клавдіу

2
О, кривавий чорт ... якраз тоді, коли я думав, що побив твої 209. Я думаю, що я здаюся. Переважає GolfScript. ;)
Мартін Ендер

6

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

Я буквально для цього навчився Рубі. Тож, безумовно, є можливість вдосконалитись в гольфі. Або робити щось насправді. Але мені потрібна була мова зі змінними рядками. :)

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

Я можу скоротити його ще на два символи до 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

Пітон, 329 309 295 286 280 277 символів

Зараз гольфували трохи більше. Все ще можна вдосконалити, але не впевнений, чи зможу я вибити рішення з рубіну або гольфскрипту при такому підході.

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: Дякую, пропустив це
Клавдіу,

2

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

Я переклав свою відповідь CoffeeScript в GolfScript, що набагато більше підходить до строкових маніпуляцій.

EDIT: Збережено шість символів за допомогою правильного використання оператора приросту, три, використовуючи стек, ще шість - безвідповідально перевизначаючи операторів, якими я не користуюся, і ще один - не друкуючи пробіл після граціозних ліній.

Цілком гольф:

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

Я був би здивований, якби я міг перемогти рішення GolfScript мовою, на яку я не маю досвіду;)
Мартін Ендер,

1
Я не експерт GolfScript, але я думаю, що я вигадав майже всіх персонажів, у яких я вийду з цього, тож якщо ти зможеш знайти ще двох, ти золотий!
couchand

Спробуйте ввести Goйого. це вийде oo|||:)
Джеймі

1

Пітон, 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, останній рядок здається більше чорною магією Перла, ніж пітонічними
Антоніо Рагагнін

1

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

О, будь ласка, не ненавиджу мене, це вперше. Я не можу знайти жодного файлу / вступу, тому я сподіваюся, що мій формат публікацій у порядку. Не впевнені, наскільки серйозно люди сприйняли кількість символів .... нормальна версія коду - додатково це рядки / пробіли (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]);
  }
}

Я бачу тонни непотрібних прогалин (особливо після коми і навколо операторів і дужок і дужок) і довгі імена змінних (як args).
Дверна ручка

У поданні підрахунку символів: 921 символ, усе пробіл пішов: P
Will_61

Друге подання з пробілами скрізь - це дозволити людям читати код, як я сказав, що це вперше, тому не впевнений, чи маємо на увазі залишити 1 подання та 1, де ви намагаєтесь зменшити обмеження символів ... чи що?
Will_61

Ні; Я бачу величезну кількість марної пробілу в цій версії. Наприклад, пробіли після крапки з комою, пробіли навколо операторів, пробіли після [], пробіли навколо дужок тощо
Doorknob

Видалили їх усіх зараз (я думаю) Спасибі :)
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 символів: - /
купе

0

C, 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циклі.
користувач12205

Також у першому ifтвердженні ((i%12)&11)==0можна замінити на !((i%12)&11).
користувач12205

Нарешті, ?:має дуже низький пріоритет ніж ^та <, тож ви можете зняти дужки умов перед ?. І ви можете замінити printf("%s",на puts(.
користувач12205

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.