Điều này thật khó khăn và tôi không tin nó là tối ưu ...
<.@!$?
Sau khi đệm và mở mã, điều này thể hiện lưới hex sau:
Điều này sử dụng một luồng điều khiển tương tự như chương trình mèo không có lỗi gần đây của tôi , di chuyển dọc theo các đường chéo. Để đạt được điều đó, chúng ta bắt đầu bằng cách làm chệch hướng con trỏ lệnh (IP) sang bên trái, nơi đường dẫn màu tím bao quanh góc dưới bên trái.
?
đọc đầu vào dưới dạng một số nguyên. !
in lại. .
chỉ là không-op. Bây giờ góc của lưới đóng vai trò là một nhánh:
Nếu đầu vào là 0
, IP sẽ tiếp tục dọc theo đường dẫn màu đỏ, đơn giản là kết thúc chương trình với @
.
Nếu đầu vào là 1
, IP sẽ tiếp tục trên đường dẫn màu xanh lá cây. Một lần nữa, .
chỉ là không hoạt động, nhưng $
tương đương với tấm bạt lò xo của Befunge: nó bỏ qua hướng dẫn tiếp theo. Sau khi gói, hướng dẫn tiếp theo sẽ là ?
, nhưng do $
thực thi thực sự tiếp tục trên đường dẫn màu xanh, bắt đầu bằng !
việc in một bản sao khác của 1
. Vòng lặp này chỉ chứa !..$
bây giờ được lặp lại vô thời hạn.
Một nghiên cứu về dòng điều khiển trong Hexagony ...
Tôi tin rằng giải pháp trên là tối ưu. Tôi đã viết một forcer brute, kiểm tra tất cả các chương trình Hexagony 6 byte, trong đó có ít nhất một chương trình ?!@
(cần thiết; tôi cũng đã kiểm tra :
và %
thay thế @
để chấm dứt với lỗi chia 0, nhưng điều đó cũng không giúp được gì). Kiểm tra in tất cả các chương trình mà a) tạo ra 0
đầu vào 0
và kết thúc và b) tạo ra ít nhất hai 1
giây (và không có gì khác) và không chấm dứt trong 60 tick đầu tiên của chương trình (200 tick cho các giải pháp 5 byte) . Tôi nghi ngờ rằng bất kỳ giải pháp hợp lệ nào cũng sẽ mất hơn 200 tick để in chính xác lần đầu tiên 0
hoặc lần thứ hai 1
trên một lưới nhỏ như vậy, vì vậy tôi không nghĩ rằng mình đã bỏ lỡ bất kỳ giải pháp tiềm năng nào.
Tìm kiếm không mang lại bất kỳ kết quả nào cho 5 byte, nhưng 57 kết quả cho 6 byte (sử dụng @
; không cần phải chấm dứt lỗi nếu chúng ta có thể giải quyết vấn đề này một cách sạch sẽ trong cùng một lượng byte). Trong số 57 chỉ có 6 là dương tính giả, thực tế chỉ in hai 1
s và sau đó đi vào một vòng lặp vô hạn mà không in thêm nữa. Một giải pháp được liệt kê hai lần vì nó chứa hai !
lệnh. Điều đó để lại chính xác 50 giải pháp hợp lệ.
Có một số lượng thoái hóa nhất định giữa các giải pháp trong đó một hoặc hai ký tự không đáng kể, ví dụ vì dù sao chúng thực sự không có tác dụng. Các giải pháp có thể được nhóm thành 23 bộ chương trình thực sự khác biệt (trong một số trường hợp, chỉ có một sự khác biệt về ký tự giữa hai bộ, nhưng nó thay đổi đáng kể luồng điều khiển, vì vậy tôi đã đếm riêng chúng). Hai trong số các nhóm thậm chí sử dụng nhiều con trỏ chỉ dẫn theo một cách rất bất ngờ. Vì tôi sẽ không bao giờ nghĩ ra hầu hết các cách này để sử dụng cành cây và gương, họ thực hiện một nghiên cứu rất thú vị về loại luồng điều khiển nào có thể có trong Hexagony, và tôi chắc chắn đã học được một số thủ thuật mới cho các sân golf trong tương lai.
Các tổng thể kiểm soát dòng chảy gần như luôn luôn giống nhau: đọc một số, in nó. Nếu nó 0
tìm được đường đến @
, nếu không cứ lặp đi lặp lại !
trong khi vẫn duy trì giá trị cạnh 1
. Có bốn trường hợp ngoại lệ đáng chú ý:
- Một giải pháp (một với hai
!
) in hai 1
s mỗi lần lặp qua lưới, do đó in nhanh gấp khoảng hai lần so với phần lớn các chương trình. Tôi đã đánh dấu một này với x2
bên dưới.
- Một vài giải pháp (những giải pháp có chứa
o
) thay thế 1
bằng 111
(mã ký tự của o
), do đó chúng in ba 1
s mỗi lần lặp, khiến chúng in nhanh gấp khoảng ba lần so với phần lớn các chương trình. Tôi đã đánh dấu những điều này với x3
bên dưới.
- Hai giải pháp nối thêm một
1
giá trị cạnh trong mỗi lần lặp (vì vậy 1
-> 11
-> 111
-> ...). Những bản in rất nhanh, nhưng cuối cùng chúng sẽ hết bộ nhớ. Tôi đã đánh dấu những điều này với OoM
bên dưới.
- Hai giải pháp đi vào một vòng lặp rất chặt chẽ, chỉ đơn giản là nảy qua lại
!
, in trên mỗi dấu kiểm khác (thay vì cứ sau 5 giây hoặc lâu hơn), khiến chúng nhanh hơn một chút (và gọn gàng hơn). Tôi đã đánh dấu những điều này với ><
bên dưới.
Đây là toàn bộ sở thú:
#1 #5 #12 #19
?!/$.@ ?$!>$@ .?!/$@ |!|?$@ # ><
?!/$1@ # OoM ?$!|$@ =?!/$@
?!/$=@ #20
?!/$\@ #6 #13 $@.?<!
?!/$o@ # x3 ?/!<|@ .?/!$@ $@1?<! # OoM
?!/$!@ # x2 =?/!$@ $@=?<!
#7 $@o?<! # x3
#2 ?\!<|@ #14
?!>$)@ \!?__@ #21
?!>$1@ #8 _>_!?@
?!>$o@ # x3 ?<!>$@ # >< #15
?!|$)@ \_?!$@ #22
?!|$1@ #9 <!@.$?
?!|$o@ # x3 ?\$!@$ #16 <!@/$?
\_?!_@ <!@=$?
#3 #10 <$@!$?
?!|)$@ ?~#!@) #17 <.@!$?
?!|1$@ ?~#!@1 $$?\@! </@!$?
?!|o$@ # x3 <=@!$?
#11 #18
#4 ?$)\@! \$?\@! #23
?_!<@> ?$1\@! <<@]!?
?$o\@! # x3
Sau đây là một hướng dẫn ngắn cho một số ít các nhóm đại diện. Đặc biệt là nhóm 10 và 23 rất đáng để kiểm tra. Có nhiều con đường thú vị và đôi khi phức tạp khác trong các nhóm khác, nhưng tôi nghĩ rằng tôi đã chán bạn đủ vào cuối của điều này. Đối với bất kỳ ai thực sự muốn học Hexagony, đây chắc chắn là những điều đáng để nghiên cứu, vì chúng thể hiện những công dụng thậm chí có thể hơn của gương và $
.
Nhóm 1
Điều này không phức tạp hơn nhiều so với giải pháp ban đầu của tôi, nhưng các con đường đi theo các hướng khác nhau. Nó cũng cho phép số lượng biến thể lớn nhất trong một ô, vì hầu hết không có quyền có thể được thay thế bằng 5 lệnh khác nhau mà vẫn làm cho điều này hợp lệ mà không thay đổi cấu trúc:
Nhóm 2
Cái này khá thú vị, vì nó chỉ di chuyển theo chiều ngang. Sau khi gói đến >
, IP đảo ngược ngay lập tức, lấy nhánh ở góc. Nó không hoàn toàn rõ ràng không có sơ đồ, nhưng trong trường hợp 1
chúng ta đi qua hàng đầu tiên một lần nữa, nhưng ngược lại lần này. Điều này cũng có nghĩa là chúng tôi gặp ?
lại, hiện trả về 0
(EOF). Điều này được cố định với )
(tăng) để tiếp tục in 1
s. Điều này cũng có 5 biến thể, )
cũng có thể 1
hoặc o
, và >
cũng có thể là |
:
Nhóm 3
Cái này trông gần giống với cái trước nhưng nó lộn xộn như địa ngục. Lên đến đánh |
và sau đó đi qua hàng dưới cùng hoặc trên cùng là như nhau. Nhưng trong trường hợp của một vòng lặp, $
nay bỏ qua so với )
vào gương. Vì vậy, chúng tôi đi theo con đường màu ngọc lam ở bên phải, bây giờ nhấn vào gia số, bỏ qua @
trước khi chúng tôi đi vòng quanh |
một lần nữa và sau đó quay trở lại con đường màu xanh lá cây ở trên cùng.
Nhóm 4
Tôi nghĩ rằng điều này là đặc biệt tiện lợi:
Chiếc _
gương ở góc trên cùng bên phải ban đầu là không có, vì vậy chúng tôi in !
và nhấn <
. Con 0
đường bây giờ chạm vào gương ngang và chấm dứt. Đường 1
dẫn có một quỹ đạo thực sự thú vị: mặc dù nó đi xuống, quấn vào !
, được chuyển hướng về phía ngang và sau đó lại quay trở !
lại . Sau đó, nó tiếp tục di chuyển trong hình dạng hình thoi này, in hai lần mỗi lần lặp (mỗi lần đánh dấu thứ ba).
Nhóm 8
Đây là một trong hai giải pháp với vòng lặp in thực sự chặt chẽ:
Các <
hoạt động như chi nhánh. Sau khi gói hai lần, 0
đánh @
. 1
mặt khác, đầu tiên bỏ qua ?
, sau đó >
gửi nó lên $
một lần nữa, vì vậy đó là bỏ qua @
. Sau đó, IP kết thúc vào con đường màu ngọc lam, nơi nó nảy qua lại giữa >
và <
(bao quanh các cạnh ở giữa).
Nhóm 10
Một trong hai nhóm sử dụng các con trỏ chỉ dẫn khác, và nó rất đẹp. Hexagony có 6 - mỗi cái bắt đầu từ một góc khác dọc theo cạnh kim đồng hồ, nhưng chỉ một trong số chúng hoạt động tại một thời điểm.
Như thường lệ, chúng tôi đọc với ?
. Bây giờ ~
là phủ định đơn phương: nó biến 1
thành a -1
. Tiếp theo, chúng tôi nhấn #
. Đây là một cách để chuyển đổi giữa các IP: nó lấy giá trị cạnh hiện tại là modulo 6 và chuyển sang IP tương ứng (IP được đánh số 0
theo chiều kim đồng hồ). Vì vậy, nếu đầu vào là 0
, thì IP chỉ đơn giản là giữ nguyên và đi thẳng vào !@
. Nhưng nếu đầu vào là 1
, thì giá trị hiện tại -1
là 5 (mod 6)
. Vì vậy, chúng tôi chuyển sang IP bắt đầu trên cùng một ô (đường dẫn màu xanh lá cây). Bây giờ #
là một no-op và ?
đặt cạnh bộ nhớ thành 0
. )
gia số để !
in a 1
. Bây giờ chúng tôi nhấn ~
một lần nữa để đảm bảo rằng#
vẫn là một no-op (trái ngược với việc chuyển chúng tôi sang IP 1 sẽ chấm dứt chương trình). Thật đáng ngạc nhiên khi mọi thứ khớp với nhau trong chương trình nhỏ này.
Nhóm 22
Chỉ cần lưu ý, đây là nhóm giải pháp ban đầu của tôi. Đây cũng là nhóm lớn nhất, bởi vì no-op có thể ở hai nơi khác nhau và có một số lựa chọn cho lệnh thực tế (không hiệu quả).
Nhóm 23
Đây là nhóm khác sử dụng nhiều IP. Trong thực tế, cái này sử dụng 3 IP khác nhau. Góc trên bên phải là một mớ hỗn độn, nhưng tôi sẽ cố gắng đưa bạn qua đây:
Vì vậy, sự khởi đầu bạn đã thấy trước đây: <
làm chệch hướng Đông Bắc, ?
đọc đầu vào. Bây giờ ]
là một cách khác để thay đổi giữa các IP: nó trao quyền điều khiển cho IP tiếp theo theo thứ tự theo chiều kim đồng hồ. Vì vậy, chúng tôi chuyển điều khiển sang con đường màu ngọc lam (mà tôi biết là khó nhìn thấy) bắt đầu ở góc Đông Bắc đi về hướng Đông Nam. Nó ngay lập tức được phản ánh bởi <
vì vậy nó kết thúc ở góc Đông Nam, đi theo hướng Tây Bắc. Nó cũng đạt được ]
vì vậy chúng tôi chuyển sang IP tiếp theo . Đây là con đường màu xám bắt đầu ở góc Đông, đi về hướng Tây Nam. Nó in đầu vào, sau đó kết thúc ở góc Đông Bắc. <
làm chệch đường đi vào chiều ngang, nơi nó được phản ánh bởi người khác <
. Bây giờ là cánh tay phải<
hoạt động như một nhánh: nếu đầu vào là 0
, IP di chuyển theo hướng Đông Bắc và kết thúc thành @
. Nếu đầu vào là 1
, IP di chuyển đến !
, kết thúc ở phía bên trái <
, nơi nó được phản chiếu ... bây giờ ở góc, nó quay trở lại !
, bị lệch về bên phải <
, bị phản xạ bởi bên trái <
và các đường dẫn bắt đầu kết thúc...
Khá lộn xộn, nhưng một mớ hỗn độn đẹp. :)
Các sơ đồ được tạo bằng HexagonyColorer tuyệt vời của Timwi .