pb、240バイト
<[8]^w[Y!14]{w[X!24]{>[8]b[124]^b[124]v}vw[X!-8]{b[45]<}vv}>[12]^[12]b[49]>[12]w[T!8]{<[4]b[T+50]^<w[X%8!6]{b[65+T*3+X%8%3]>}>[10]vw[B!124]{<[24]vvv}t[T+1]}<[4]b[42]>[8]b[48]>[8]b[35]^[4]>w[B!0]{b[B+2]<}b[87]w[X!2]{<[5]w[B!0]{b[B+1]<}}b[80]
(このプログラムは、現在のバージョンのpbiで入力を要求します。これは、Y = -1になり、B
変数がそれ自体を更新しようとするためです。入力を入力しても、何も壊れません。迷惑ですが、古いバージョンよりも優れています。何があっても入力を求められます。)
pbは、端末を2Dキャンバスとして扱うことに関するすべての言語です。出力するには、「ブラシ」(X変数とY変数の現在の値で表される点)をその文字を移動させたい場所に移動して、そこに配置する必要があります。単語をプリントアウトするようなものには面倒ですが、アートにはしばしば便利です。
このプログラムは、実際に質問が指定するものを正確には描画しません。(まだ、私に反対投票しないでください。説明させてください!)
ループでボックスを描くのはとても簡単ですが、落とし穴があります。次の形状を繰り返すと:
--------
|
|
あなたは箱を手に入れますが、右と下のものが開きます。余分な辺を手動で描画できますが、これにはバイトがかかります。これを回避するために、私のプログラムは実際に左と上に開いたエッジを使ってこれを描画します。
| | | |
| | | |
--------------------------------
| | ABC | DEF |
| 1 | 2 | 3 |
--------------------------------
| GHI | JKL | MNO |
| 4 | 5 | 6 |
--------------------------------
| PQRS | TUV | WXYZ |
| 7 | 8 | 9 |
--------------------------------
| | | |
| * | 0 | # |
--------------------------------
しかしモノレール!それは仕様が言っていることではありません!他のものを描くのは簡単で、気分が良いので、それを描くことはできません。また、私はあなたの注目を集めていますが、あなたはとてもスマートでかわいいです。
Shh、shh、それは大丈夫です。pbを使用すると、座標に1つ以上の負の値を含むキャンバス上の点に「書き込む」ことができます。値はプログラムの実行中に保存されますが、XとYが両方とも> = 0であるポイントのみが実際に画面に書き込まれます。このプログラムは、この画像で色付けされた領域が負のXまたはYになるようにブラシを配置します。
追加の線は「描画」されますが、印刷されることはありません。
ループを実行してグリッドを作成した後、このプログラムは上位9つのボックスに入力します。最初のコードはハードコードされ、1が書き込まれ、プログラムが続行されます。他の8つはプログラムで生成されます。次のボックスに移動するためのコードを無視し、行が空になったときに通知するなど(ブラシは常にボックスの一番下の行と中央の列から始まると想定)、これは8回実行されます。
b[T+50]
^<w[X%8!6]{b[65+T*3+X%8%3]>}
t[T+1]
それb
が文字を書き^v<>
、ブラシを動かし、w[a!b]{}
中括弧でコードを実行するコマンドであることを知っていてもa != b
、これを理解するのは困難です。注意すべき最初の重要なことは、pbでは変数を定義できないことです。すべてのプログラムに6つあり、それらと一緒に暮らすことを学ぶ必要があります。2つ目T
は、変数の使用に慣れている方法で実際に使用できる唯一の変数です。値を割り当て、後でそれを読み取る。他のすべての変数が設定されていないとあなたがにしているかのみと副作用(と間接的に設定することができますキャンバス内のポイントについてあなたに何かを伝えるだけでするか^v<>
変更X
してY
も、ブラシの位置を変更し、。c
セットP
に(P+1)%8
、出力色も変更されます)。何の数字を書く必要があるのか、どの文字を書くのが不可能なのかを把握する。代わりに、このコードは番号のみを追跡し、それに基づいて文字を計算します。方法は次のとおりです。
b[T+50] # We start printing at box 2 with T==0, 0+50=='2'
^< # Go up and to the left of the number
w[X%8!6]{ # Take the X coordinate mod 8 so it's like we're in
# the leftmost box. Until hitting the sixth cell:
b[ # Write this character:
65 # 'A'
+ T * 3 # Number of current box - 2 (letters start at
# 2) * 3 (3 letters per box)
+ X % 8 % 3 # X % 8 makes every box behave like it's on the
# left, % 3 puts 0 at the point where the first
# letter goes, then 1, then 2. This is how each
# letter is made different in a box.
]
> # Move to the right
}
t[T+1] # Box is done, increase counter
ボックス7と9には3文字しか入力されないため、これは不完全です。したがって、下の行を埋めた後(単純なハードコーディング)、ボックス9の各文字を2増やし、Wを手動で配置します。同様に、ボックス7と8のすべての文字が1ずつ増加し、Pは手動で配置されます。
未ゴルフ:
<[8]^ # Go to (-8, -1)
w[Y!14]{ # While the brush is not on Y=14:
w[X!24]{ # While the brush is not on X=24:
>[8] # Go right 8
b[124]^b[124]v # Draw a pipe at the current location and above it
}
vw[X!-8]{b[45]<} # Go down and draw hyphens all the way until X=-8
vv # Go down by 2 to start drawing next row
}
>[12]^[12]b[49] # Write a 1 in the first box
>[12] # Go to the bottom pipe on the right of box 2
w[T!8]{ # While T is not 8:
<[4] # Go to center cell of the box
b[T+50] # Write the number that belongs there
^<w[X%8!6]{b[65+T*3+X%8%3]>} # Write the letters
>[10]v # Go to the next box
w[B!124]{ # If the next box isn't there:
<[24]vvv # Go down a row
}
t[T+1] # Increase counter
}
<[4]b[42]>[8]b[48]>[8]b[35] # Put the asterisk, 0 and hash in their boxes
^[4]>w[B!0]{b[B+2]<} # Increase all letters in the 9th box by 2
b[87] # Put a W in the 9th box
w[X!2]{<[5]w[B!0]{b[B+1]<}} # Increase all letters in the 7th/8th box by 1
b[80] # Put a P in the 7th box