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]
(Chương trình này sẽ nhắc nhập liệu trong phiên bản hiện tại của pbi, vì nó đi đến Y = -1 và B
cố gắng biến để cập nhật chính nó. Thậm chí nếu bạn làm nhập đầu vào, không có gì sẽ phá vỡ. Đó là khó chịu nhưng nó tốt hơn so với phiên bản cũ nhắc nhở đầu vào không có vấn đề gì.)
pb là một ngôn ngữ về việc coi thiết bị đầu cuối như một khung vẽ 2D. Để xuất ra, bạn phải di chuyển "cọ vẽ" (một điểm được biểu thị bằng các giá trị hiện tại của biến X và Y) đến nơi bạn muốn ký tự đó đi và đặt nó ở đó. Nó cồng kềnh cho những thứ như in ra một từ nhưng đối với nghệ thuật thì nó thường tiện lợi.
Chương trình này không thực sự rút ra chính xác những gì câu hỏi chỉ định. (Đợi đã, đừng coi thường tôi! Hãy để tôi giải thích!)
Vẽ các hộp với các vòng lặp khá dễ dàng, nhưng có một nhược điểm. Nếu bạn lặp lại hình dạng sau:
--------
|
|
Bạn nhận được hộp, nhưng cái bên phải và bên dưới sẽ được mở. Bạn có thể tự vẽ các mặt phụ, nhưng chi phí byte. Để giải quyết vấn đề này, chương trình của tôi thực sự rút ra điều này, với các cạnh mở ở bên trái và trên cùng:
| | | |
| | | |
--------------------------------
| | ABC | DEF |
| 1 | 2 | 3 |
--------------------------------
| GHI | JKL | MNO |
| 4 | 5 | 6 |
--------------------------------
| PQRS | TUV | WXYZ |
| 7 | 8 | 9 |
--------------------------------
| | | |
| * | 0 | # |
--------------------------------
Nhưng monorail! Đó không phải là những gì spec nói! Bạn không thể vẽ thứ gì khác vì nó dễ hơn và bạn cảm thấy thích nó! Ngoài ra, trong khi tôi có sự chú ý của bạn, bạn rất thông minh và dễ thương.
Suỵt, không sao đâu. pb cho phép bạn "ghi" vào một điểm trên khung vẽ với một hoặc nhiều giá trị âm trong tọa độ của nó. Giá trị được lưu trữ trong khi chương trình chạy, nhưng chỉ các điểm trong đó X và Y đều> = 0 thực sự được ghi vào màn hình. Chương trình này định vị bàn chải sao cho các khu vực được tô màu trong hình ảnh này có X hoặc Y âm:
Mặc dù các dòng thêm được "vẽ", chúng không bao giờ được in.
Sau khi lặp qua và tạo lưới, chương trình này sẽ điền vào chín ô trên cùng. Đầu tiên là mã hóa cứng, 1 được viết và chương trình tiếp tục. Tám cái còn lại được tạo lập trình. Bỏ qua mã để di chuyển đến hộp tiếp theo, nhận thấy khi hàng trống, v.v (giả sử bàn chải luôn bắt đầu ở hàng dưới cùng của hộp và ở cột giữa), đây là thứ được chạy tám lần:
b[T+50]
^<w[X%8!6]{b[65+T*3+X%8%3]>}
t[T+1]
Ngay cả khi biết rằng đó b
là lệnh để viết một ký tự, ^v<>
di chuyển bàn chải và w[a!b]{}
chạy mã trong các dấu ngoặc nhọn cho đến khi a != b
, điều này rất khó để làm theo. Điều quan trọng đầu tiên cần lưu ý là bạn không thể xác định các biến trong pb. Có sáu trong mỗi chương trình và bạn phải học cách sống với họ. Thứ hai, T
là biến duy nhất mà bạn thực sự có thể sử dụng theo cách bạn đã sử dụng để sử dụng các biến; gán một giá trị và sau đó đọc nó sau. Mọi biến số khác không thể được đặt và chỉ cho bạn biết điều gì đó về điểm trong khung vẽ bạn đang bật hoặc chỉ có thể được đặt gián tiếp và với các hiệu ứng phụ ( ^v<>
thay đổi X
và Y
, cũng thay đổi vị trí cọ vẽ.c
Bộ P
để(P+1)%8
, cũng thay đổi màu đầu ra). Giữ một bộ đếm cho số nào cần được viết và những chữ cái đơn giản là không thể. Thay vào đó, mã này chỉ theo dõi số lượng và tìm ra các chữ cái dựa trên nó. Đây là cách thực hiện:
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
Điều này là không hoàn hảo, vì chỉ có 3 chữ cái được đặt vào hộp 7 và 9. Vì vậy, sau khi điền vào hàng dưới cùng (mã hóa đơn giản), mỗi chữ cái trong hộp 9 được tăng thêm 2 và W được đặt thủ công. Tương tự, mỗi chữ cái trong hộp 7 và 8 được tăng thêm 1 và P được đặt thủ công.
Ung dung:
<[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