Đã được chứng minh tối ưu!
((([()][()][()])))
Hãy thử trực tuyến!
Giải trình
Brain-Flak, Brain-Flueue, Solitairelak và Fλak
([()][()][()]) Push -3
( ) Copy
( ) Copy
Bản in này:
-3
-3
-3
(Có một dòng mới)
Brain-Flak cổ điển
Brain-Flak Classic là phiên bản gốc của Brain-Flak và có một số khác biệt quan trọng so với Brain-Flak hiện đại. Trong BFC [...]
in nội dung của nó chứ không phải phủ nhận nó.
[()] Print 1
[()] Print 1
[()] Print 1
( ) Push 3
( ) Push 3
( ) Push 3
Khi kết thúc thực hiện nội dung của ngăn xếp ( 3 3 3
) được in.
Bản in này:
1
1
1
3
3
3
(Có một dòng mới)
Flakcats
Flakcats khá khác biệt so với 4 flak khác và tôi ngạc nhiên khi nó hoạt động trong Flakcats. Ba toán tử ở đây gần giống như các toán tử mà Brain-Flak sử dụng.
Sự khác biệt chính trong chương trình đặc biệt này giữa Flakcats là (...)
toán tử trong Flakcats tương đương với ([{}]...)
Brain-Flak. Tuy nhiên, điều này không tạo ra sự khác biệt đối với chúng tôi bởi vì nó thu thập các số không và do đó hoạt động giống như cách mà Brain-Flak làm.
Đây là chương trình được biên dịch thành Brian-Flak:
([{}]([{}]([{}][()][()][()])))
Bản in này:
-3
-3
-3
(Có một dòng mới)
Bằng chứng về sự tối ưu trong Brain-Flak và Solitairelak
Đây không phải là một bằng chứng chính thức, mà là một bằng chứng không chính thức sẽ phải được mở rộng để được thực hiện nghiêm ngặt hơn
Do các hạn chế, các chương trình Brain-Flak phải là một chuỗi cân bằng và độ dài chương trình phải là bội số của 3 bất kỳ đệ trình hợp lệ nào phải là bội số của 6 chiều dài. Điều này có nghĩa là bất kỳ giải pháp nhỏ hơn 18 phải có chiều dài 12.
Do các dòng đầu ra kéo theo dòng mới, chiều cao cuối cùng của ngăn xếp phải là bội số của ba hoặc chúng tôi sẽ phá vỡ các hạn chế về đầu ra.
Bất kỳ đệ trình hợp lệ nào có độ dài 12 phải có 2 loại dấu ngoặc (có ít hơn sẽ phá vỡ các hạn chế về số lượng ký tự riêng biệt và nhiều hơn có nghĩa là nhiều hơn 12 ký tự). Vì chương trình tạo đầu ra nên nó phải có lực đẩy.
Điều này để chúng tôi chọn bộ niềng răng khác của chúng tôi. Các tùy chọn là:
<...>/<>
Điều này không thành công bởi vì chúng ta cần tạo ra "giá trị" để tạo ra bất kỳ số nào khác 0, chúng ta phải từ bỏ ()
để tạo một số khiến cho không thể đẩy quá hai lần.
[...]/[]
Điều này thất bại vì lý do tương tự cuối cùng thất bại. Niềng răng vuông thực sự rất tệ trong việc tạo ra giá trị. Đơn []
nguyên có thể tạo ra giá trị nhưng chúng ta cần đẩy số trước và sau đó chúng ta không có đủ số dư để đẩy ba lần.
{...}/{}
Điều này rất hứa hẹn, chúng ta có thể tạo một vòng lặp và sử dụng một vòng ()
để đẩy nhiều lần, nhưng than ôi là không thể.
Để vòng lặp kết thúc, phải có một số 0 trên ngăn xếp tại một số điểm và để chúng ta có đầu ra chính xác, chúng ta phải có một cái gì đó khác 0 trên ngăn xếp ở cuối chương trình. Kể từ khi chúng tôi có không phải []
và cũng không <>
số không vào cuối vòng lặp phải có một số không tiềm ẩn từ tận đáy của ngăn xếp. Điều này có nghĩa là vòng lặp không thể thêm bất kỳ số mới nào vào ngăn xếp khiến nó trở nên vô dụng.
Vì không có lựa chọn niềng răng nào có thể tạo ra một chương trình có độ dài 12 nên không thể tồn tại.
Vì Solitairelak là một tập hợp con của Brain-Flak, bất kỳ chương trình miniflak ngắn nào cũng sẽ là một chương trình Brain-Flak ngắn hơn và do đó không tồn tại.
Bằng chứng về sự tối ưu trong Brain-Flueue
Brain-Flueue là một ngôn ngữ đùa dựa trên Brain-Flak. Hai người rất giống nhau, thông dịch viên của họ giống hệt nhau ở mọi nơi trừ hai dòng. Sự khác biệt giữa hai loại, như tên gọi của chúng, Brain-Flueue lưu trữ dữ liệu của nó trong hàng đợi trong khi Brain-Flak lưu trữ dữ liệu của nó trong ngăn xếp.
Để bắt đầu, chúng tôi có các hạn chế tương tự đối với kích thước chương trình do Brain-Flak tạo ra, do đó chúng tôi đang tìm kiếm một chương trình có kích thước 12. Ngoài ra, chúng tôi sẽ cần một (...)
để tạo bất kỳ đầu ra và một cặp khác. các cặp <>
và []
các cặp không hoạt động trong Brain-Flueue vì lý do chính xác giống như chúng không hoạt động trong Brain-Flak.
Bây giờ chúng tôi biết rằng chương trình của chúng tôi phải bao gồm các nhân vật ((())){{{}}}
.
Thông qua các phương pháp tương tự được sử dụng trong bằng chứng trước đây, chúng tôi có thể chứng minh rằng phải có một vòng lặp trong chương trình cuối cùng.
Bây giờ đây là nơi các bằng chứng khác nhau, bởi vì Brain-Flueue hoạt động trên các hàng đợi thay vì ngăn xếp chương trình có thể thoát khỏi một vòng lặp với các giá trị trên hàng đợi.
Để thoát khỏi vòng lặp, chúng ta sẽ cần một số 0 trong hàng đợi (hoặc một hàng đợi trống nhưng nếu hàng đợi trống, chúng ta gặp vấn đề tương tự như Brain-Flak), điều này có nghĩa là chúng ta sẽ phải mở chương trình của ({})
mình để tạo số không. Chúng ta sẽ cần một cú đẩy bên trong vòng lặp để đẩy số lượng vật phẩm cần thiết vào hàng đợi. Chúng ta cũng sẽ cần phải đẩy một số khác không trước vòng lặp để chúng ta có thể nhập vào vòng lặp; điều này sẽ chi phí chúng tôi ở mức tối thiểu (())
. Bây giờ chúng tôi đã sử dụng nhiều parens hơn chúng tôi có.
Do đó, không có chương trình Brain-Flueue để thực hiện nhiệm vụ 12 byte và hơn nữa, chương trình của chúng tôi là tối ưu.
Giải pháp sau đây là tối ưu trong Flakcats và Brain-Flak Classic.
((([][][])))
Giải trình
[][][] -3
((( ))) push 3 times
Giải pháp thay thế não 24 byte thay thế
(<((<((<(())>)())>)())>)
Hãy thử trực tuyến!
((<((<((<>)())>)())>)())
Hãy thử trực tuyến!
((((((()()()){}){}){})))
Hãy thử trực tuyến!