Điều này là vô cùng thú vị. Cảm ơn bạn đã đăng thử thách này.
Tiết lộ đầy đủ: Ngôn ngữ (Hexagony) không tồn tại tại thời điểm thử thách này được đăng. Tuy nhiên, tôi đã không phát minh ra nó và ngôn ngữ không được thiết kế cho thử thách này (hoặc bất kỳ thử thách cụ thể nào khác).
){_2"_{\"{{""}"{'2//_.\><*\"\/_><[\]/3\'\_;|#__/(\2\'3_'}(#:|{$#{>_\//(#={/;01*&"\\_|[##={|}$_#></)]$_##|){*_.>.(/?#//~-="{}<_"=#/\}.>"%<.{#{x\"<#_/=&{./1#_#>__<_'\/"#|@_|/{=/'|\"".{/>}]#]>(_<\'{\&#|>=&{{(\=/\{*'"]<$_
Đặt ra hình lục giác:
) { _ 2 " _ { \ "
{ { " " } " { ' 2 /
/ _ . \ > < * \ " \ /
_ > < [ \ ] / 3 \ ' \ _
; | # _ _ / ( \ 2 \ ' 3 _
' } ( # : | { $ # { > _ \ /
/ ( # = { / ; 0 1 * & " \ \ _
| [ # # = { | } $ _ # > < / ) ]
$ _ # # | ) { * _ . > . ( / ? # /
/ ~ - = " { } < _ " = # / \ } .
> " % < . { # { x \ " < # _ /
= & { . / 1 # _ # > _ _ < _
' \ / " # | @ _ | / { = /
' | \ " " . { / > } ] #
] > ( _ < \ ' { \ & #
| > = & { { ( \ = /
\ { * ' " ] < $ _
Chương trình không thực sự sử dụng #
hướng dẫn, vì vậy tôi đã sử dụng ký tự đó để hiển thị các ô nào thực sự không được sử dụng.
Chương trình này hoạt động như thế nào? Mà phụ thuộc. Bạn muốn phiên bản ngắn, hay dài?
Giải thích ngắn
Để minh họa những gì tôi muốn nói về dòng sản phẩm và dòng phân khúc của Google trong phần giải thích sau đây, hãy xem xét cách phân tích đầu ra dự định này:
segments →
│ │ │ │ │ │x lines
─┼───┼─┼─────────┼─┼───┼─ ↓
│ │ │ │ │xxx│
─┼───┼─┼─────────┼─┼───┘
│ │ │ │x│
─┼───┼─┼─────────┼─┘
│ │ │xxxxxxxxx│
─┼───┼─┼─────────┘
│ │x│
─┼───┼─┘
│xxx│
─┼───┘
x│
Với giải thích đó, chương trình tương ứng với mã giả sau:
n = get integer from stdin
# Calculate the number of lines we need to output.
line = pow(2, n+1)
while line > 0:
line = line - 1
# For all segments except the last, the character to use is spaces.
ch = ' ' (space, ASCII 32)
# The number of segments in each line is
# equal to the line number, counting down.
seg = line
while seg > 0:
seg = seg - 1
# For the last segment, use x’s.
if seg = 0:
ch = 'x' (ASCII 120)
# Calculate the actual segment number, where the leftmost is 1
n = line - seg
# Output the segment
i = pow(3, number of times n can be divided by 2)
i times: output ch
output '\n' (newline, ASCII 10)
end program
Giải thích dài
Vui lòng tham khảo sơ đồ đường dẫn mã màu này.
Thực hiện bắt đầu ở góc trên cùng bên trái. Chuỗi các hướng dẫn ){2'"''3''"2}?)
được thực hiện (cộng với một vài lần hủy dự phòng, như "{
v.v.) bằng cách theo đuổi một đường dẫn khá phức tạp. Chúng tôi bắt đầu với Con trỏ lệnh # 0, được tô sáng màu đỏ thẫm. Nửa chừng, chúng tôi chuyển sang số 1, bắt đầu ở góc trên bên phải và sơn màu xanh lá cây. Khi IP # 2 bắt đầu có màu xanh hoa ngô (giữa bên phải), bố cục bộ nhớ là:
Trong toàn bộ chương trình, các cạnh có nhãn 2a và 2b sẽ luôn có giá trị 2
(chúng tôi sử dụng chúng để tính 2ⁿ⁺¹ và chia cho 2, tương ứng) và cạnh có nhãn 3 sẽ luôn luôn 3
(chúng tôi sử dụng giá trị đó để tính 3ⁱ).
Chúng tôi có được doanh nghiệp khi chúng tôi bước vào vòng lặp đầu tiên của chúng tôi, nổi bật với màu xanh hoa ngô. Vòng lặp này thực hiện các hướng dẫn (}*{=&}{=
để tính giá trị 2ⁿ⁺¹. Khi vòng lặp thoát ra, đường dẫn màu nâu yên được thực hiện, đưa chúng ta đến Con trỏ lệnh # 3. IP này chỉ đơn thuần là chạy dọc theo cạnh dưới về phía tây về màu vàng Goldenrod và sớm chuyển quyền kiểm soát sang IP # 4.
Đường dẫn fuchsia cho biết có bao IP # 4, bắt đầu từ phía dưới bên trái, tiến hành nhanh chóng để sụt dòng , bộ ch để 32
(nhân vật không gian) và seg đến (giá trị mới của) dòng . Đó là do sự sụt giảm sớm mà chúng ta thực sự bắt đầu với 2ⁿ⁺¹ 1 và cuối cùng trải qua lần lặp cuối cùng với giá trị 0. Sau đó chúng ta vào vòng lặp lồng đầu tiên .
Chúng tôi chuyển sự chú ý của chúng tôi sang màu chàm phân nhánh, trong đó, sau một thời gian giảm dần của seg , chúng tôi thấy ch được cập nhật x
chỉ khi seg bây giờ bằng không. Sau đó, n được đặt thành dòng - seg để xác định số lượng thực tế của phân khúc chúng tôi đang ở. Ngay lập tức chúng tôi nhập một vòng lặp khác, lần này là màu cà chua công bằng.
Ở đây, chúng tôi tính xem có thể chia bao nhiêu lần n (số phân khúc hiện tại) cho 2. Miễn là modulo cho chúng tôi bằng 0, chúng tôi tăng i và chia n cho 2. Khi chúng tôi hài lòng thì n không còn chia hết , chúng tôi phân nhánh thành màu xám đá phiến, chứa hai vòng: đầu tiên, nó tăng 3 đến sức mạnh của i mà chúng tôi đã tính toán, và sau đó nó tạo ra ch nhiều lần. Quan sát rằng các vòng lặp đầu tiên chứa một[
hướng dẫn chuyển đổi điều khiển sang IP # 3 - hướng dẫn chỉ thực hiện các bước bé dọc theo cạnh dưới trước đó. Phần thân của vòng lặp (nhân với 3 và giảm dần) được thực thi bởi một IP # 3 cô đơn, bị giam cầm trong một chu kỳ màu xanh ô liu vô tận dọc theo cạnh dưới của mã. Tương tự, phần thứ hai của các vòng màu xám đá phiến này chứa một ]
lệnh, kích hoạt IP # 5 để xuất ch và giảm, được hiển thị ở đây bằng màu đỏ Ấn Độ. Trong cả hai trường hợp, những Con trỏ Hướng dẫn bị mắc kẹt trong sự phục vụ đều ngoan ngoãn thực hiện một lần lặp lại tại một thời điểm và điều khiển năng suất trở lại IP # 4, chỉ để chờ đợi thời điểm dịch vụ của chúng được gọi lại một lần nữa. Màu xám, trong khi đó, tham gia lại anh em fuchsia và chàm của nó.
Như seg chắc chắn đạt đến số không, các lối ra vòng lặp chàm vào con đường màu xanh lá cây cỏ, mà chỉ đơn thuần là kết quả đầu ra kí tự xuống dòng và kịp thời kết hợp trở lại vào cây khoa vản anh để tiếp tục dòng vòng lặp. Ngoài vòng lặp cuối cùng của vòng lặp dòng là con đường ebon ngắn có thể kết thúc chương trình cuối cùng.
(,],~3^#@~.)@]
thay vì(1,[:,1,"0~3*])
tiết kiệm 1 byte. Và nếu bạn ổn với!
vai trò đầu rau:32+
thay vì' #'{~
lưu một cái khác.