運命のメモ-譜表にメモを入れる


19

ゾンビの黙示録が来て、世界は終わりに近づいています。突然、誰かが現在の時、分、日を取る式を発見し、それを聞いたすべてのゾンビを即座に殺すピアノで演奏するための完璧な音を吐き出します。残念ながら、世界にはピアノ奏者が1人しかいないため、ノートの読み方を忘れていましたが、楽譜の読み方はまだ知っています。もちろん、これは非常に時間に敏感なことなので、コンピューターにそれをさせるのは自然なことです。1

あなたの課題は、などのメモを取り、次のようにG譜表に配置されたメモを高音部記号で出力することです。

-----

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

-----

仕様:

  • -----(5ダッシュ)と空白行の交互の行の譜表を出力する必要があります。-----合計5 秒になります。この譜表の上に音符を重ねる必要があります。
  • 入力により、ノートの場所が指定されます。入力は次のようになります。
    • オプションのHor L、「high」または「low」を指定
    • からAまでの文字でG、ピッチを指定します
    • オプションの#またはb、シャープまたはフラットを指定します。
  • 「メモ」は次のように定義されます。
    • O音符の場所にある譜表の中央に配置された1つ(大文字のO)。(一番上の行はHF(高F)、一番下の行はE(通常のE)です。)
    • 3つ|のs(垂直バー)、ステム。
      • 音符が中央の行(B)または上にある場合、音符の左に1スペース、下に行く(音符の下に1スペース開始)、または
      • 音符が中央線より下にある場合、音符の右側に1スペース、上に行く(音符の上に1スペース開始)。
    • A #またはb入力で指定されている場合、ノートの左に直接1つのスペース。
  • メモが高すぎたり低すぎたりする場合は、元帳行を追加する必要があります。これらの行は---(5ではなく幅が3ダッシュのみ)、ノートが元帳行の上または下(上/下元帳行の場合)にある場合にのみ表示されます。
  • 余分なスペースを任意の場所に配置できます。たとえば、文字の保存に役立つ場合は、空白行にスペースを入れるか、元帳行の後にスペースを入れることができます。

以下は、仕様をより簡単に理解するための視覚化で、すべてのノート名が行の横にあります。

      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:最も現実的な展示エバー!:-P


2
それは持っていることは非常に奇妙に見える#か、bノートの右側ではなく左側にあります。本当に必要なものですか?
トーマスバルチェル14年

2
B#などはどうですか?1.そのままプロットします。2.拒否します。3.静かにCに変換しますか?
デジタル外傷14年

2
高音部記号を使用する必要があることを明示的に述べる方がよい場合があります。
user12205 14年

3
フーガでこれを試みるまで誰でも?
AJMansfield 14年

3
@AJMはい、それはASCIIアートでなければなりません。
ドアノブ

回答:


1

Golfscript、211 210 209 197 195 192文字

(この投稿の時点で)勝利のために来て、私の最新のPythonバージョンの 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}/

ここでテストします(最初の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
}/

Aaaaaaand GolfScriptに再びbeatられました。:) ...
マーティン・エンダー

@ m.buettner:ハハ、決して終わらない..驚くほど近い!
クラウディウ14年

1
より良い!D(私はそれを行うだろうか表示されていないが):今、私は唯一の6/9が追いつくためにバイトを見つける必要がある
マーティン・エンダー

@ m.buettner:さらに2バイトダウンしました!それぞれがとても残酷です...私は今のところ停止する必要があるかもしれません。がんばろう!
クラウディウ14年

2
ああ、血まみれの地獄...あなたの209を打ち負かしたと思ったとき、私はあきらめていると思います。GolfScriptが優先されます。;)
マーティン・エンダー14年

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です。そして、1行のifsの場合、if x;y;end;と同等y if xです。また、その文字列でリテラルの改行を使用できます。
ドアノブ

@Doorknobありがとう、私はそれらを働かせようとします!
マーティンエンダー14年

@Doorknob hm、私はif仕事をするようになった。私が使用する場合?\n(それがあなたの意図である場合)、スペースを追加する必要があるため、何も得られません。.nil?sを削除してもまったく機能しませんでした(常に評価されますtrue)。
マーティンエンダー14年

文字通り、2つの引用符の間に改行を追加することを意味しました。そして、私はあなたが削除するときに余分な括弧が必要だと思いますが.nil?、文字でそれは価値があります。
ドアノブ

ああ@Doorknob、何が!x.nil?あるん!!x。:)
マーティンエンダー14年

2

Python、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:ありがとう、あれを逃した
Claudiu 14年

2

GolfScript- 243 232 228 227文字

CoffeeScriptの回答をGolfScriptに翻訳しました。GolfScriptは文字列の操作により適しています。

編集:インクリメント演算子を適切に使用して6文字を保存し、3つはスタックをうまく利用して、6つは私が使用していない演算子を無責任に再定義することによって、もう1つは猶予行の後のスペースを印刷しないことによって保存しました。

完全にゴルフ:

..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 14年

入力Goしてみてください。出力されますoo|||:)
ジェイミー14

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、最後の行はPython的のものよりもPerlの黒魔術だ
アントニオRagagnin

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)。
ドアノブ

文字カウント
送信

空白を含む2番目のサブミッションは、コードを読むことができるようにすることです。これは初めてだと言ったので、1のサブミッションと1を残して文字制限を減らすつもりかどうかはわかりませんか?
Will_61

いいえ。そのバージョンには膨大な量の無駄な空白があります。たとえば、セミコロンの後のスペース、演算子の周りのスペース、後の[]スペース、括弧の周りのスペースなど
ドアノブ

それらをすべて削除しました(私は思う)ありがとう:)
Will_61 14年

1

ハスケル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

Literate CoffeeScript- 497 527文字

グリッドを構築するより良い方法があると確信していますが、それを理解することはできません。

1人のゴルフヘルパー。

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

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

表記関数は、メモの文字列表現を取ります。

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 14年

0

C、325 304

@aceのおかげで21バイト短くなりました!

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=0for
user12205

また、最初のifステートメントで((i%12)&11)==0は、に置き換えることができます!((i%12)&11)
user12205 14年

最後に、と?:よりも優先順位が非常に低いため、の前の条件の括弧を削除できます。そして、あなたは置き換えることができて。^<?printf("%s",puts(
user12205 14年

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

2番目の反復(の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"));

無償の(読み取り可能な)バージョンを追加してください。
マーティンエンダー14年

@ m.buettner完了...私が何をしたかをより良く理解できるように願っています:)
WallyWest 14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.