pb , 240 byte
<[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]
(Program ini akan meminta input dalam versi pbi saat ini, karena ia menuju ke Y = -1 dan B
variabel mencoba untuk memperbarui sendiri. Bahkan jika Anda memasukkan input, tidak ada yang akan pecah. Ini menjengkelkan tetapi lebih baik daripada versi yang lama yang meminta input tidak peduli apa.)
pb adalah bahasa yang digunakan untuk memperlakukan terminal sebagai kanvas 2D. Untuk menghasilkan, Anda harus memindahkan "kuas" (titik yang diwakili oleh nilai saat ini dari variabel X dan Y) ke tempat Anda ingin karakter itu pergi dan meletakkannya di sana. Ini rumit untuk hal-hal seperti mencetak kata tetapi untuk seni sering kali nyaman.
Program ini sebenarnya tidak menggambarkan dengan tepat apa yang ditentukan pertanyaan. (Tunggu, jangan downvote saya dulu! Biarkan saya jelaskan!)
Menggambar kotak dengan loop cukup mudah, tetapi ada tangkapan. Jika Anda mengulangi bentuk berikut:
--------
|
|
Anda memang mendapatkan kotak, tetapi yang kanan dan bawah akan terbuka. Anda dapat menggambar sisi tambahan secara manual, tetapi itu membutuhkan byte. Untuk menyiasati ini, program saya benar-benar menggambar ini, dengan tepi terbuka di sebelah kiri dan atas:
| | | |
| | | |
--------------------------------
| | ABC | DEF |
| 1 | 2 | 3 |
--------------------------------
| GHI | JKL | MNO |
| 4 | 5 | 6 |
--------------------------------
| PQRS | TUV | WXYZ |
| 7 | 8 | 9 |
--------------------------------
| | | |
| * | 0 | # |
--------------------------------
Tapi monorel! Bukan itu yang dikatakan spek! Anda tidak bisa hanya menggambar sesuatu yang lain karena lebih mudah dan Anda merasa menyukainya! Juga, sementara saya mendapatkan perhatian Anda, Anda sangat cerdas dan imut.
Sst, sst, tidak apa-apa. pb memungkinkan Anda untuk "menulis" ke titik di kanvas dengan satu atau lebih nilai negatif dalam koordinatnya. Nilai disimpan saat program berjalan, tetapi hanya titik di mana X dan Y keduanya> = 0 yang benar-benar ditulis ke layar. Program ini memposisikan sikat sehingga area yang berwarna pada gambar ini memiliki X atau Y negatif:
Meskipun garis ekstra "ditarik", mereka tidak pernah dicetak.
Setelah mengulang dan membuat kisi, program ini mengisi sembilan kotak teratas. Yang pertama adalah hardcoded, 1 ditulis dan program melanjutkan. Delapan lainnya dihasilkan secara terprogram. Mengabaikan kode untuk pindah ke kotak berikutnya, memperhatikan ketika baris kosong, dll (anggap sikat selalu dimulai di baris bawah kotak dan di kolom tengah), inilah yang dijalankan delapan kali:
b[T+50]
^<w[X%8!6]{b[65+T*3+X%8%3]>}
t[T+1]
Bahkan mengetahui itu b
adalah perintah untuk menulis karakter, ^v<>
pindahkan kuas dan w[a!b]{}
jalankan kode dalam kurung kurawal sampai a != b
, ini sulit untuk diikuti. Hal penting pertama yang perlu diperhatikan adalah Anda tidak dapat mendefinisikan variabel di pb. Ada enam di setiap program dan Anda harus belajar untuk hidup bersama mereka. Kedua, T
adalah satu-satunya variabel yang Anda benar-benar dapat menggunakan cara Anda terbiasa menggunakan variabel; menetapkan nilai dan kemudian membacanya nanti. Setiap variabel lain tidak dapat disetel dan hanya memberi tahu Anda tentang titik di kanvas tempat Anda berada atau hanya dapat ditetapkan secara tidak langsung dan dengan efek samping ( ^v<>
ubah X
dan Y
, yang juga mengubah lokasi kuas. c
Atur P
ke(P+1)%8
, yang juga mengubah warna output). Menyimpan konter untuk nomor apa yang perlu ditulis dan surat mana yang tidak mungkin. Sebagai gantinya, kode ini hanya melacak nomor dan mencari tahu huruf-huruf berdasarkan itu. Begini caranya:
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
Ini tidak sempurna, karena hanya 3 huruf yang dimasukkan ke dalam kotak 7 dan 9. Jadi, setelah mengisi baris bawah (hardcoding sederhana), setiap huruf dalam kotak 9 bertambah 2 dan W ditempatkan secara manual. Demikian pula, setiap huruf dalam kotak 7 dan 8 bertambah 1 dan P ditempatkan secara manual.
Tidak Disatukan:
<[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