Cảm ơn FryAmTheEggman vì một số nguồn cảm hứng cần thiết cho giải pháp XOR.
0000 !@
0001 ?.|@!
0010 #?#!)@
0011 ?!@
0100 +?|@!?
0101 ??!@
0110 ?<@!!<_\~(
0111 ?<<@!
1000 )\!#?@{
1001 (~?/@#!
1010 ??|@!)
1011 \#??!1@
1100 ?(~!@
1101 ?.|@!)
1110 ?$@#)!<
1111 1!@
Tất cả các chương trình sử dụng 0
cho sai và 1
đúng.
Hãy thử trực tuyến! Đây không phải là bộ thử nghiệm, bạn sẽ phải sao chép trong các chương trình khác nhau và tự nhập liệu.
Giải pháp trên nằm trong phạm vi 2 byte tối ưu (trừ khi chúng ta thư giãn cách giải thích trung thực / giả dối, tôi đoán vậy). Tôi đã để một cuộc tìm kiếm vũ phu kéo dài gần hai ngày trên tất cả các chương trình phù hợp với độ dài 2 bên, tức là tối đa 7 byte (không hoàn toàn là tất cả các chương trình - Tôi đã đưa ra một vài giả định về mọi chương trình hợp lệ cần và không có gì chương trình hợp lệ có thể có). Tìm kiếm đã tìm thấy giải pháp cho 15 trong số 16 cổng có thể - và thường là nhiều hơn chỉ một. Bạn có thể tìm thấy một danh sách tất cả các giải pháp thay thế trong pastebin này , nơi tôi cũng đã nhóm chúng theo hành vi tương đương. Những giải pháp tôi đang trình bày ở trên tôi đã chọn vì chúng là giải pháp đơn giản nhất hoặc thú vị nhất và tôi sẽ thêm giải thích cho chúng vào ngày mai.
Đối với cổng thứ 16: XOR là cổng duy nhất dường như không thể được thực hiện trong 7 byte. Rất tiếc, một tìm kiếm vũ phu trên các chương trình lớn hơn là không khả thi với mã tôi hiện có. Vì vậy, XOR phải được viết bằng tay. Đoạn ngắn nhất tôi tìm thấy cho đến nay là chương trình 10 byte ở trên, dựa trên nỗ lực thất bại (nhưng rất gần) của FryAmTheEggman. Có thể tồn tại một giải pháp 8 byte hoặc 9 byte, nhưng ngoài ra, tất cả các giải pháp đó thực sự phải là tối ưu.
Giải thích
Cảnh báo: tường văn bản. Nếu không có ai quan tâm đến việc các chương trình Hexagony được nén thực sự này hoạt động như thế nào, tôi đã bao gồm các giải thích cho từng chương trình dưới đây. Tôi đã cố gắng chọn giải pháp đơn giản nhất cho mỗi cổng trong trường hợp có nhiều chương trình tối ưu tồn tại, để giữ cho các giải thích ngắn gọn hợp lý. Tuy nhiên, một số người trong số họ vẫn làm hỏng tâm trí, vì vậy tôi nghĩ rằng họ xứng đáng được trau chuốt hơn một chút.
0000
: Sai trái
Tôi không nghĩ rằng chúng ta sẽ cần một sơ đồ cho cái này:
! @
. . .
. .
Vì toàn bộ lưới bộ nhớ được khởi tạo thành số không, !
chỉ cần in số 0 và @
kết thúc chương trình.
Đây cũng là giải pháp 2 byte duy nhất.
0001
: Và
? .
| @ !
. .
Điều này về cơ bản thực hiện ngắn mạch . Biểu đồ màu xám bên dưới hiển thị phần đầu của chương trình, trong đó đầu vào đầu tiên được đọc ?
và con trỏ lệnh (IP) quấn quanh góc bên trái nơi |
gương phản chiếu nó. Bây giờ góc hoạt động như một điều kiện, như vậy có hai đường dẫn thực thi khác nhau tùy thuộc vào giá trị của đầu vào đầu tiên. Biểu đồ màu đỏ hiển thị luồng điều khiển cho A = 0
và sơ đồ màu xanh lá cây cho A = 1
:
Như bạn có thể thấy, khi A
có 0
, chúng ta chỉ cần in nó và chấm dứt (hãy nhớ rằng tất cả .
đều là no-op). Nhưng khi A
là 1
, sau đó IP đi qua dòng đầu tiên một lần nữa, đọc B
và in ấn mà thay thế.
Tổng cộng có mười sáu giải pháp 5 byte cho cổng này. Mười bốn trong số đó về cơ bản giống như ở trên, sử dụng >
thay thế |
hoặc thay thế .
bằng một lệnh có hiệu quả là không hoạt động, hoặc đặt ?
ở vị trí thứ hai:
?.|@! .?|@! ?=|@! =?|@! ?_|@! _?|@! ?0|@!
?.>@! .?>@! ?=>@! =?>@! ?_>@! _?>@! ?0>@!
Và sau đó, có hai giải pháp khác (tương đương với nhau). Những điều này cũng thực hiện logic ngắn mạch tương tự, nhưng các đường dẫn thực hiện hơi điên rồ hơn (và để lại như một bài tập cho người đọc):
?<!@|
?<!@<
0010
: A và không B
# ?
# ! )
@ .
Điều này cũng thực hiện một hình thức ngắn mạch, nhưng do việc sử dụng #
dòng điều khiển phức tạp hơn nhiều. #
là một chuyển đổi IP có điều kiện. Hexagony thực sự đến với sáu IP được dán nhãn 0
để 5
, mà bắt đầu trong vòng sáu góc của lưới điện, chỉ dọc theo cạnh chiều kim đồng hồ của họ (và chương trình luôn bắt đầu với IP 0
). Khi #
gặp a, giá trị hiện tại được lấy modulo 6
và luồng điều khiển tiếp tục với IP tương ứng. Tôi không chắc sự điên rồ nào đã khiến tôi thêm tính năng này, nhưng chắc chắn nó cho phép một số chương trình đáng ngạc nhiên (như chương trình này).
Chúng tôi sẽ phân biệt ba trường hợp. Khi A = 0
đó, chương trình khá đơn giản, bởi vì giá trị luôn luôn là 0
khi #
bắt gặp như vậy mà không IP chuyển đổi diễn ra:
#
không làm gì, ?
đọc A
(tức là cũng không làm gì), #
vẫn không làm gì, !
in 0
, )
tăng nó (điều này rất quan trọng, nếu không IP sẽ không nhảy sang dòng thứ ba), @
chấm dứt chương trình. Đủ đơn giản. Bây giờ hãy xem xét trường hợp (A, B) = (1, 0)
:
Đường dẫn màu đỏ vẫn tương ứng với IP 0
và tôi đã thêm đường dẫn màu xanh cho IP 1
. Chúng tôi thấy rằng sau khi ?
đọc A
( 1
lần này), các #
công tắc chuyển sang IP bắt đầu ở góc trên cùng bên phải. Điều đó có nghĩa là ?
có thể đọc B
( 0
). Bây giờ )
gia tăng đến mức 1
, #
ở góc trên bên trái không làm gì cả và chúng tôi vẫn giữ nguyên IP 1
. Các !
bản in 1
và IP bao quanh đường chéo trái. #
vẫn không làm gì và @
chấm dứt chương trình.
Cuối cùng, trường hợp thực sự kỳ lạ khi cả hai đầu vào là 1
:
Lần này, đầu vào thứ hai cũng 1
và )
tăng nó lên 2
. Điều đó có nghĩa là #
ở góc trên cùng bên trái khiến một IP khác chuyển sang IP 2
, biểu thị bằng màu xanh lam. Trên con đường đó, trước tiên chúng tôi tăng nó hơn nữa 3
(mặc dù điều đó không liên quan) và sau đó vượt qua ?
lần thứ ba. Vì hiện tại chúng tôi đã nhấn EOF (tức là đầu vào đã hết), ?
trả về 0
, !
in ra và @
kết thúc chương trình.
Đáng chú ý, đây là giải pháp 6 byte duy nhất cho cổng này.
0011
: A
? !
@ . .
. .
Điều này đủ đơn giản để chúng ta không cần một sơ đồ: ?
đọc A
, !
in nó, @
chấm dứt.
Đây là giải pháp 3 byte duy nhất cho cổng này. (Về nguyên tắc, điều đó cũng có thể thực hiện được ,;@
, nhưng tìm kiếm không bao gồm ;
, vì tôi không nghĩ nó có thể tiết kiệm byte !
cho nhiệm vụ này.)
0100
: B chứ không phải A
+ ?
| @ !
? .
Cái này đơn giản hơn nhiều so với "anh trai" của nó 0010
. Luồng điều khiển thực sự giống như chúng ta đã thấy ở trên cho 0001
(Và). Nếu A = 0
, sau đó IP đi qua dòng dưới, đọc B
và in trước khi kết thúc. Nếu A = 1
sau đó IP đi qua dòng đầu tiên, cũng đọc B
, nhưng +
thêm hai cạnh bộ nhớ không sử dụng để tất cả những gì nó làm là đặt lại giá trị hiện tại thành 0
, để !
luôn luôn in 0
.
Có khá nhiều lựa chọn thay thế 6 byte cho điều này (tổng cộng 42). Đầu tiên, có rất nhiều giải pháp tương đương như trên. Chúng ta lại có thể chọn tự do giữa |
và >
, và +
có thể được thay thế bằng bất kỳ lệnh nào khác mang lại cho chúng ta một cạnh trống:
"?|@!? &?|@!? '?|@!? *?|@!? +?|@!? -?|@!? ^?|@!? {?|@!? }?|@!?
"?>@!? &?>@!? '?>@!? *?>@!? +?>@!? -?>@!? ^?>@!? {?>@!? }?>@!?
Ngoài ra, chúng tôi cũng có thể sử dụng ]
thay vì ?
. ]
di chuyển đến IP tiếp theo (tức là chọn IP 1
), để chi nhánh này thay vào đó sử dụng lại ?
ở góc trên cùng bên phải. Điều đó mang lại cho 18 giải pháp khác:
"?|@!] &?|@!] '?|@!] *?|@!] +?|@!] -?|@!] ^?|@!] {?|@!] }?|@!]
"?>@!] &?>@!] '?>@!] *?>@!] +?>@!] -?>@!] ^?>@!] {?>@!] }?>@!]
Và sau đó, có sáu giải pháp khác mà tất cả đều hoạt động khác nhau với mức độ điên rồ khác nhau:
/[<@!? ?(#!@] ?(#>@! ?/@#/! [<<@!? [@$\!?
0101
: B
? ?
! @ .
. .
Woohoo, một cách đơn giản khác: đọc A
, đọc B
, in B
, chấm dứt. Thực tế có những lựa chọn thay thế cho điều này. Vì A
chỉ là một ký tự duy nhất, chúng ta cũng có thể đọc nó với ,
:
,?!@
Và cũng có tùy chọn sử dụng một chiếc ?
và sử dụng gương để chạy qua nó hai lần:
?|@! ?>@!
0110
: Xor
? < @
! ! < _
\ ~ ( . .
. . . .
. . .
Như tôi đã nói ở trên, đây là cổng duy nhất không phù hợp với chiều dài 2, vì vậy đây là giải pháp viết tay của FryAmTheEggman và tôi, và rất có khả năng nó không tối ưu. Có hai trường hợp để phân biệt. Nếu A = 0
luồng điều khiển khá đơn giản (vì trong trường hợp đó chúng ta chỉ cần in B
):
Chúng tôi bắt đầu trên con đường màu đỏ. ?
đọc A
, <
là một nhánh làm lệch hướng 0 bên trái. IP kết thúc ở phía dưới, sau đó _
là một gương khác và khi IP chạm vào góc, nó sẽ nằm ở góc trên cùng bên trái và tiếp tục trên đường dẫn màu xanh. ?
đọc B
, !
in nó Bây giờ (
giảm nó. Đây là quan trọng vì nó đảm bảo rằng giá trị là không tích cực (nó là một trong hai 0
hoặc -1
bây giờ). Điều đó làm cho IP bọc đến góc bên phải, nơi @
kết thúc chương trình.
Khi A = 1
mọi thứ trở nên phức tạp hơn một chút. Trong trường hợp đó, chúng tôi muốn in not B
, bản thân nó không quá khó, nhưng đường dẫn thực hiện hơi nhanh.
Lần này, <
làm lệch hướng quyền IP và tiếp theo <
chỉ hoạt động như một tấm gương. Vì vậy, IP đi qua cùng một đường dẫn ngược lại, đọc B
khi gặp ?
lại. IP kết thúc ở góc bên phải và tiếp tục trên đường dẫn màu xanh lá cây. Nó gặp gỡ tiếp theo (~
đó là "sụt lần, nhân với -1", trong đó giao dịch hoán đổi 0
và 1
và do đó tính not B
. \
chỉ là một tấm gương và !
in kết quả mong muốn. Sau đó ?
cố gắng trả về một số khác nhưng trả về số không. IP bây giờ tiếp tục ở góc dưới bên trái trên đường dẫn màu xanh. (
giảm, <
phản ánh,(
giảm lần nữa, để giá trị hiện tại là âm khi IP chạm vào góc. Nó di chuyển qua đường chéo bên phải phía dưới và sau đó nhấn @
để kết thúc chương trình.
0111
: Hoặc là
? <
< @ !
. .
Ngắn mạch hơn.
Các A = 0
trường hợp (đường màu đỏ) là một chút bối rối ở đây. IP bị lệch về bên trái, kết thúc ở góc dưới bên trái, ngay lập tức được phản ánh bởi <
và quay trở lại ?
để đọc B
. Sau đó nó sẽ kết thúc tốt đẹp vào góc rigt, in B
với !
và kết thúc.
Các A = 1
trường hợp (đường màu xanh lá cây) là một chút đơn giản hơn. Các <
chi nhánh lệch IP đúng, vì vậy chúng tôi chỉ đơn giản là in !
, quấn lại phía trên bên trái, và chấm dứt tại @
.
Chỉ có một giải pháp 5 byte khác:
\>?@!
Nó hoạt động về cơ bản giống nhau, nhưng các đường dẫn thực thi thực tế khá khác nhau và nó sử dụng một góc để phân nhánh thay vì a <
.
1000
: Cũng không
) \
! # ?
@ {
Đây có thể là chương trình yêu thích của tôi được tìm thấy trong tìm kiếm này. Điều thú vị nhất là việc triển khai này thực nor
sự hoạt động với tối đa 5 đầu vào. Tôi sẽ phải tìm hiểu chi tiết về mô hình bộ nhớ một chút để giải thích điều này. Vì vậy, khi làm mới nhanh, mô hình bộ nhớ của Hexagony là một lưới hình lục giác riêng biệt, trong đó mỗi cạnh chứa một giá trị nguyên (ban đầu đều bằng 0). Có một con trỏ bộ nhớ (MP) chỉ ra một cạnh và một hướng dọc theo cạnh đó (sao cho có hai cạnh lân cận phía trước và phía sau cạnh hiện tại, với các hàng xóm bên trái và bên phải có ý nghĩa). Dưới đây là sơ đồ các cạnh chúng ta sẽ sử dụng, với MP bắt đầu như màu đỏ:
Trước tiên chúng ta hãy xem xét trường hợp cả hai đầu vào là 0
:
Chúng ta bắt đầu trên con đường màu xám, mà chỉ đơn giản increments cạnh Một để 1
sao cho #
chuyển sang IP 1
đó là con đường màu xanh, bắt đầu ở góc trên bên phải. \
không có gì ở đó và ?
đọc một đầu vào. Chúng tôi bọc đến góc trên cùng bên trái, nơi )
gia tăng đầu vào đó. Bây giờ miễn là đầu vào bằng không, điều này sẽ dẫn đến một 1
, do đó #
không làm gì cả. Sau đó {
di chuyển MP ở phía bên trái, tức là trên phiên đầu tiên từ A đến B . Vì cạnh này vẫn có số 0 ban đầu, IP kết thúc trở lại góc trên cùng bên phải và trên cạnh bộ nhớ mới. Vì vậy, vòng lặp này sẽ tiếp tục miễn là ?
đọc số không, di chuyển MP xung quanh hình lục giác từ Bđến C đến D và cứ thế. Không quan trọng là ?
trả về 0 vì nó là đầu vào hay vì đó là EOF.
Sau sáu lần lặp thông qua vòng lặp này, {
trở về Một . Lần này, cạnh đã giữ giá trị 1
từ lần lặp đầu tiên, do đó, IP kết thúc ở góc bên trái và tiếp tục trên đường dẫn màu xanh lá cây thay thế. !
chỉ cần in nó 1
và @
chấm dứt chương trình.
Bây giờ nếu có bất kỳ đầu vào là 1
gì?
Sau đó ?
đọc nó 1
tại một số điểm và )
tăng nó lên 2
. Điều đó có nghĩa là #
bây giờ sẽ chuyển đổi IP một lần nữa và chúng tôi sẽ tiếp tục ở góc bên phải trên đường dẫn màu đỏ. ?
đọc một đầu vào khác (nếu có), điều này không thực sự quan trọng và {
di chuyển một cạnh hơn nữa. Đây phải là một cạnh không được sử dụng, do đó, nó hoạt động cho tối đa 5 đầu vào. IP kết thúc ở phía trên bên phải, nơi nó được phản ánh ngay lập tức và kết thúc ở góc bên trái. !
in 0
trên cạnh không sử dụng và #
chuyển trở lại IP 0
. IP đó vẫn đang chờ đợi trên đường #
, đi về phía tây nam (đường dẫn màu xám), vì vậy nó ngay lập tức chạm vào @
và chấm dứt chương trình.
Tổng cộng có bảy giải pháp 7 byte cho cổng này. 5 trong số chúng hoạt động tương tự như thế này và chỉ cần sử dụng các lệnh khác để di chuyển đến một cạnh không được sử dụng (và có thể đi xung quanh một hình lục giác khác hoặc theo một hướng khác):
)\!#?@" )\!#?@' )\!#?@^ )\!#?@{ )\!#?@}
Và có một loại giải pháp khác chỉ hoạt động với hai đầu vào, nhưng đường dẫn thực thi của chúng thậm chí còn lộn xộn hơn:
?]!|<)@ ?]!|<1@
1001
: Bình đẳng
( ~
? / @
# !
Điều này cũng làm cho việc sử dụng rất thông minh của lựa chọn IP có điều kiện. Chúng ta cần phân biệt lại giữa A = 0
và A = 1
. Trong trường hợp đầu tiên chúng tôi muốn in not B
, trong lần thứ hai chúng tôi muốn in B
. Đối với A = 0
chúng tôi cũng phân biệt hai trường hợp cho B
. Hãy bắt đầu với A = B = 0
:
Chúng tôi bắt đầu trên con đường màu xám. (~
có thể bỏ qua, IP kết thúc ở góc bên trái (vẫn trên đường dẫn màu xám) và đọc A
với ?
. (
giảm số đó, vì vậy chúng tôi nhận được -1
và bọc IP ở góc dưới bên trái. Bây giờ như tôi đã nói trước đó, #
lấy giá trị modulo 6
trước khi chọn IP, do đó, giá trị -1
thực sự thoát ra IP 5
, bắt đầu ở góc bên trái trên đường dẫn màu đỏ. ?
đọc B
, (
giảm dần để chúng ta vẫn ở trên IP 5
khi chúng ta nhấn #
lại. ~
phủ định -1
để IP kết thúc ở góc dưới bên phải, in 1
và chấm dứt.
Bây giờ nếu B
là 1
thay vào đó, giá trị hiện tại sẽ là 0
khi chúng ta nhấn #
lần thứ hai, vì vậy chúng tôi chuyển về IP 0
(nay trên con đường màu xanh lá cây). Điều đó đánh lần ?
thứ ba, mang lại 0
, !
in nó và @
chấm dứt.
Cuối cùng, trường hợp A = 1
. Lần này, giá trị hiện tại đã bằng không khi chúng ta nhấn #
lần đầu tiên, vì vậy điều này không bao giờ chuyển sang IP 5
ở vị trí đầu tiên. Chúng tôi chỉ đơn giản là tiếp tục ngay lập tức trên con đường màu xanh lá cây. ?
bây giờ không chỉ đưa ra số 0 mà B
thay vào đó trả về . !
in nó và @
chấm dứt một lần nữa.
Tổng cộng có ba giải pháp 7 byte cho cổng này. Hai cái còn lại hoạt động rất khác nhau (thậm chí là của nhau), và làm cho việc sử dụng thậm chí còn lạ hơn #
. Cụ thể, họ đọc một hoặc nhiều giá trị với ,
(đọc mã ký tự thay vì số nguyên) và sau đó sử dụng giá trị đó modulo 6 để chọn IP. Đó là các loại hạt đẹp.
),)#?@!
?~#,~!@
1010
: Không phải B
? ?
| @ !
) .
Cái này khá đơn giản. Đường dẫn thực thi là nhánh ngang mà chúng ta đã biết từ and
trước đó. ??
Đọc A
rồi ngay lập tức B
. Sau khi phản ánh tại |
và phân nhánh, B = 0
chúng ta sẽ thực hiện nhánh dưới cùng, trong đó )
tăng giá trị 1
mà sau đó được in bằng !
. Trên nhánh trên cùng (nếu B = 1
), ?
chỉ cần đặt lại cạnh 0
mà sau đó cũng được in bằng !
.
Có tám chương trình 6 byte cho cổng này. Bốn trong số chúng khá giống nhau, sử dụng >
thay vì |
hoặc 1
thay vì )
(hoặc cả hai):
??>@!) ??>@!1 ??|@!) ??|@!1
Hai sử dụng một lần ?
được sử dụng hai lần do một tấm gương. Việc phủ định sau đó xảy ra như chúng ta đã làm xor
với một trong hai (~
hoặc ~)
.
?>!)~@ ?>!~(@
Và cuối cùng, hai giải pháp sử dụng một chuyển đổi IP có điều kiện, bởi vì tại sao sử dụng cách đơn giản nếu một giải pháp phức tạp cũng hoạt động:
??#)!@ ??#1!@
1011
: B ngụ ý A
\ #
? ? !
1 @
Điều này sử dụng một số chuyển đổi IP khá phức tạp. A = 1
Lần này tôi sẽ bắt đầu với trường hợp này, vì nó đơn giản hơn:
Chúng ta bắt đầu trên con đường màu xám, mà đọc A
với ?
và sau đó chạm #
. Vì điều này A
là 1
chuyển sang IP 1
(đường dẫn màu xanh lá cây). Các !
ngay lập tức in đó, IP kết thúc tốt đẹp để phía trên bên trái, đọc B
(không cần thiết) và kết thúc.
Khi A = 0
mọi thứ trở nên thú vị hơn một chút. Trước tiên hãy xem xét A = B = 0
:
Lần này, #
không có gì và chúng tôi vẫn ở trên IP 0
(đường dẫn màu đỏ từ thời điểm đó trở đi). ?
đọc B
và 1
biến nó thành a 1
. Sau khi gói vào góc trên cùng bên trái, chúng tôi #
lại nhấn , vì vậy cuối cùng chúng tôi sẽ đi trên con đường màu xanh lá cây và in 1
như trước, trước khi chấm dứt.
Cuối cùng, đây là (A, B) = (0, 1)
trường hợp sai:
Lưu ý rằng tôi đã xóa đường dẫn màu xám ban đầu cho rõ ràng, nhưng chương trình bắt đầu theo cùng một cách và chúng tôi kết thúc trên đường dẫn màu đỏ như trước. Vì vậy, lần này lần thứ hai ?
trở lại 1
. Bây giờ chúng ta bắt gặp 1
. Tại thời điểm này, điều quan trọng là phải hiểu các chữ số thực sự làm gì trong Hexagony (cho đến nay chúng ta chỉ sử dụng chúng trên các số 0): khi gặp một chữ số, giá trị hiện tại được nhân với 10 và sau đó chữ số được thêm vào. Điều này thường được sử dụng để viết các số thập phân nguyên văn vào mã nguồn, nhưng nó có nghĩa là nó B = 1
thực sự được ánh xạ tới giá trị 11
. Vì vậy, khi chúng tôi nhấn #
, điều này được lấy modulo 6
để cung cấp 5
và do đó chúng tôi chuyển sang IP 5
(thay vì 1
như trước đây) và tiếp tục trên con đường màu xanh. Đánh?
lần thứ ba trả về số 0, do đó !
in ra và sau hai lần khác ?
, IP kết thúc ở phía dưới bên phải nơi chương trình kết thúc.
Có bốn giải pháp 7 byte cho vấn đề này và tất cả chúng đều hoạt động khác nhau:
#)/!?@$ <!?_@#1 \#??!1@ |/)#?@!
1100
: Không phải A
? (
~ ! @
. .
Chỉ là một tuyến tính đơn giản: đọc A
với ?
, phủ định với (~
, in với !
, chấm dứt với @
.
Có một giải pháp thay thế và ~)
thay vào đó là phủ nhận :
?~)!@
1101
: A ngụ ý B
? .
| @ !
) .
Điều này đơn giản hơn rất nhiều so với hàm ý ngược lại mà chúng ta vừa nói đến. Đây lại là một trong những chương trình nhánh ngang, giống như chương trình dành cho and
. Nếu A
có 0
, nó chỉ đơn giản là được tăng lên 1
trên nhánh dưới cùng và được in. Mặt khác, nhánh trên cùng được thực hiện lại trong đó ?
đọc B
và sau đó !
in nó.
Có một tấn lựa chọn thay thế ở đây (66 giải pháp trong tổng số), chủ yếu là do tự do lựa chọn hiệu quả không-ops. Để bắt đầu, chúng tôi có thể thay đổi giải pháp trên theo tất cả các cách tương tự có thể and
và chúng tôi cũng có thể chọn giữa )
và 1
:
?.|@!) .?|@!) ?=|@!) =?|@!) ?_|@!) _?|@!) ?0|@!)
?.|@!1 .?|@!1 ?=|@!1 =?|@!1 ?_|@!1 _?|@!1 ?0|@!1
?.>@!) .?>@!) ?=>@!) =?>@!) ?_>@!) _?>@!) ?0>@!)
?.>@!1 .?>@!1 ?=>@!1 =?>@!1 ?_>@!1 _?>@!1 ?0>@!1
Và sau đó, có một phiên bản khác sử dụng lựa chọn IP có điều kiện, trong đó lệnh đầu tiên có thể được chọn gần như tùy ý và cũng có một lựa chọn giữa )
và 1
cho một số tùy chọn sau:
"?#1!@ &?#1!@ '?#1!@ )?#1!@ *?#1!@ +?#1!@ -?#1!@ .?#1!@
0?#1!@ 1?#1!@ 2?#1!@ 3?#1!@ 4?#1!@ 5?#1!@ 6?#1!@ 7?#1!@
8?#1!@ 9?#1!@ =?#1!@ ^?#1!@ _?#1!@ {?#1!@ }?#1!@
"?#)!@ &?#)!@ '?#)!@ *?#)!@ +?#)!@ -?#)!@
0?#)!@ 2?#)!@ 4?#)!@ 6?#)!@
8?#)!@ ^?#)!@ _?#)!@ {?#)!@ }?#)!@
1110
: Không
? $
@ # )
! <
Cái phức tạp cuối cùng. Nếu bạn vẫn đang đọc, bạn gần như đã làm được. :) Trước A = 0
tiên hãy xem :
?
đọc A
rồi ta đánh $
. Đây là lệnh nhảy (như Befunge's #
) bỏ qua hướng dẫn tiếp theo để chúng tôi không chấm dứt @
. Thay vào đó, IP tiếp tục tại #
. Tuy nhiên kể từ khi A
là 0
, điều này không làm gì cả. )
tăng nó lên 1
để IP tiếp tục trên đường dẫn phía dưới nơi 1
in. Các <
lệch IP ở bên phải, nơi nó kết thúc tốt đẹp vào góc trái và chương trình chấm dứt.
Tiếp theo, khi đầu vào là (A, B) = (1, 0)
chúng ta gặp tình huống này:
Đó là về cơ bản giống như trước đây ngoại trừ việc tại #
chúng tôi chuyển sang IP 1
(đường màu xanh lá cây), nhưng vì B
là 0
chúng tôi chuyển về IP 0
khi chúng ta nhấn #
một lần thứ hai (con đường hiện nay màu xanh), nơi nó in 1
như trước đây.
Cuối cùng, A = B = 1
trường hợp:
Lần này, khi chúng tôi #
lần thứ hai, giá trị hiện tại vẫn còn 1
để chúng tôi không thay đổi IP lần nữa. Phản <
ánh nó và lần thứ ba chúng tôi đạt ?
được số không. Do đó, IP kết thúc ở phía dưới bên trái nơi !
in số 0 và chương trình kết thúc.
Có chín giải pháp 7 byte trong tổng số này. Thay thế đầu tiên chỉ đơn giản là sử dụng 1
thay vì )
:
?$@#1!<
Sau đó, có hai giải pháp giúp bạn thực hiện với số lượng chuyển đổi IP đang diễn ra:
)?#_[!@ 1?#_[!@
Những điều này thực sự đã thổi vào tâm trí tôi: phần thú vị là chuyển mạch IP có thể được sử dụng như một điều kiện hoãn lại. Các quy tắc chuyển đổi IP của ngôn ngữ sao cho IP hiện tại thực hiện một bước nữa trước khi chuyển đổi xảy ra. Nếu bước đó xảy ra để đi qua một góc, thì giá trị hiện tại sẽ quyết định IP nào sẽ tiếp tục nếu chúng ta chuyển trở lại nó. Chính xác điều này xảy ra khi đầu vào là A = B = 1
. Mặc dù điều này hoàn toàn phù hợp với cách tôi thiết kế ngôn ngữ, tôi chưa bao giờ nhận thức được ý nghĩa này của thông số kỹ thuật, vì vậy thật tuyệt khi ngôn ngữ của tôi dạy cho tôi một số thủ thuật mới: D.
Sau đó, có một giải pháp thứ ba có số lượng chuyển đổi IP thậm chí còn tệ hơn (mặc dù nó không sử dụng hiệu ứng có điều kiện bị trì hoãn đó):
>?1]#!@
Và sau đó có một cái khác:
?$@#)!<
Và sau đó có bốn giải pháp tương đương, sử dụng một số chuyển mạch IP không có điều kiện và thay vào đó thực hiện tất cả logic thông qua các nhánh và góc:
]<?<@!) ]<?<@!1 ]|?<@!) ]|?<@!1
1111
: Thật
1 !
@ . .
. .
Bạn đã kiếm được cho mình một thứ đơn giản cho đến cuối: đặt cạnh 1
, in bằng !
, chấm dứt với @
. :)
Tất nhiên, có một lựa chọn thay thế:
)!@
Như thường lệ, tất cả các sơ đồ luồng điều khiển được tạo bằng HexagonyColorer của Timwi's và sơ đồ bộ nhớ với EsotericIDE của anh ấy .