2.}<@>%?<{>$"/\M!8;
Có thể đọc được
2 . }
< @ > %
? < { > $
" / \ M
! 8 ;
Hãy thử trực tuyến!
Điều này có thể được chơi bằng một hoặc hai byte, nhưng điều đó có thể đòi hỏi một bố cục thực sự khéo léo, có thể dễ dàng tìm thấy hơn thông qua lực lượng vũ phu (ngay cả khi có thể mất nhiều thời gian để tìm thấy nó).
Giải thích cấp cao
Chương trình chủ yếu tuân theo mã giả này:
while (read number is not zero)
{
if (number is even)
print number;
}
Việc lạm dụng làm thế nào Hexagony cố đọc một số khi STDIN trống (nó trả về số 0). Cảm ơn rất nhiều vì Martin đã giúp đỡ với cách tiếp cận này.
Giải thích đầy đủ
Tôi vẫn chưa từng loay hoay với Mono để có được IDE bí truyền tuyệt vời của Timwi chạy , vì vậy tôi đã nhờ Martin cung cấp cho tôi một số hình ảnh đẹp hữu ích!
Đầu tiên, một chút mồi về dòng điều khiển cơ bản trong Hexagony. Con trỏ lệnh đầu tiên (IP), là con trỏ duy nhất được sử dụng trong chương trình này, bắt đầu ở phía trên bên trái của mã nguồn hình lục giác và bắt đầu di chuyển về phía bên phải. Bất cứ khi nào IP rời khỏi cạnh của hình lục giác, nó sẽ di chuyển side_length - 1
các hàng về phía giữa của hình lục giác. Vì chương trình này sử dụng một hình lục giác có ba cạnh dài, IP sẽ luôn luôn di chuyển hai hàng khi điều này xảy ra. Ngoại lệ duy nhất là nếu nó di chuyển ra khỏi hàng giữa, nơi nó di chuyển có điều kiện về phía trên hoặc dưới của hình lục giác, tùy thuộc vào giá trị của cạnh bộ nhớ hiện tại.
Bây giờ một chút về điều kiện. Các điều kiện duy nhất trong Hexagony cho luồng điều khiển là >
,<
và cạnh giữa của hình lục giác. Tất cả đều tuân theo một quy tắc không đổi: nếu giá trị trên cạnh bộ nhớ hiện tại bằng 0 hoặc luồng điều khiển âm di chuyển sang trái và nếu dương thì điều khiển chảy sang phải. Giá trị lớn hơn và nhỏ hơn dấu ngoặc chuyển hướng IP ở góc sáu mươi độ, trong khi cạnh của hình lục giác điều khiển hàng IP nhảy tới.
Hexagony cũng có một mô hình bộ nhớ đặc biệt, trong đó tất cả dữ liệu được lưu trữ trên các cạnh của lưới lục giác vô hạn. Chương trình này chỉ sử dụng ba cạnh: một để lưu trữ hai, một cho số hiện đang đọc và một cho số modulo hai. Nó trông giống như:
Mod \ / Input
|
2
Tôi sẽ không giải thích cẩn thận về vị trí của chúng ta trong bộ nhớ tại mỗi thời điểm trong quá trình giải thích chương trình, vì vậy hãy quay lại đây nếu bạn bị nhầm lẫn bởi nơi chúng ta đang ở trong bộ nhớ.
Với tất cả những điều đó, cách giải thích thực tế có thể bắt đầu. Đầu tiên, chúng ta điền vào cạnh "2" trong bộ nhớ bằng 2, sau đó chúng ta thực hiện lệnh cấm và di chuyển con trỏ bộ nhớ sang phải ( 2.}
).
Tiếp theo, chúng tôi bắt đầu vòng lặp chương trình chính. Chúng tôi đọc số đầu tiên từ STDIN và sau đó chúng tôi nhấn một điều kiện ( ?<
). Nếu không còn số nào trong STDIN, số này sẽ đọc số 0 vào cạnh bộ nhớ hiện tại, vì vậy chúng tôi rẽ trái vào @
, kết thúc chương trình. Mặt khác, chúng ta bật ra một tấm gương, di chuyển con trỏ bộ nhớ về phía sau và sang trái, quấn quanh hình lục giác để tính phần còn lại của việc chia đầu vào cho 2 và sau đó nhấn một điều kiện khác ( /"%>
).
Nếu phần còn lại là một (tức là số là số lẻ), chúng ta rẽ phải theo đường dẫn màu xanh bên trên bắt đầu bằng cách thực hiện lại lệnh no-op, sau đó chúng ta quấn quanh dưới cùng của hình lục giác, nhân cạnh hiện tại với 10 rồi thêm tám, bật ra một vài gương, thực hiện cùng một phép nhân và thêm lần nữa, nhận được 188 trên cạnh hiện tại, quay trở lại đỉnh của hình lục giác, thực hiện lại lệnh không hoạt động và cuối cùng kết thúc chương trình ( .8/\8.@
). Kết quả phức tạp này là một tai nạn hạnh phúc, ban đầu tôi đã viết một chút logic đơn giản hơn nhiều, nhưng nhận thấy rằng tôi có thể loại bỏ nó theo hướng có lợi cho no-op, mà tôi nghĩ là theo tinh thần Hexagony hơn.
Nếu phần còn lại bằng không, thay vào đó chúng ta rẽ trái theo con đường màu đỏ, ở trên. Điều này khiến chúng ta di chuyển con trỏ bộ nhớ sang trái, sau đó in giá trị ở đó (giá trị đầu vào) dưới dạng số. Chiếc gương mà chúng ta bắt gặp hoạt động như một no-op vì hướng chúng ta đang di chuyển ( ). Vì 77 là dương, chúng tôi di chuyển sang phía dưới của hình lục giác và vì tấm bạt lò xo bỏ qua hướng dẫn đầu tiên ( ). Sau đó, chúng tôi nhân cạnh bộ nhớ hiện tại với 10 và thêm 8, nhận 778. Sau đó, chúng tôi xuất giá trị này mod 256 (10) dưới dạng ký tự ASCII, đây là dòng mới. Cuối cùng, chúng ta thoát khỏi hình lục giác và quay trở lại cái đầu tiên ghi đè lên 778 bằng giá trị đầu vào tiếp theo.{/!
). Sau đó, chúng tôi chạm vào cạnh của hình lục giác hoạt động có điều kiện chỉ có một kết quả, vì giá trị đầu vào từ trước đã được kiểm tra là dương, vì vậy chúng tôi luôn di chuyển về phía bên phải (nếu bạn tưởng tượng mình phải đối mặt với hướng IP) . Sau đó, chúng tôi nhân nhiều đầu vào với 10 và thêm hai, chỉ để thay đổi hướng, quấn quanh và ghi đè giá trị mới bằng giá trị ascii của chữ in hoa M, 77. Sau đó, chúng tôi nhấn một số gương và thoát ra khỏi rìa giữa hình lục giác với tấm bạt lò xo (2<M\>$
!
?