Mê cung , 28 25 24 23 22 byte
" >
?!?:|}\{@
@\?"":)!
Đây là niềm vui điên rồ! :) Đó là chương trình Labyrinth nén dày đặc nhất mà tôi đã viết cho đến nay. Tôi đã có rất nhiều phiên bản ở mức 20 và 21 byte gần như hoạt động mà tôi vẫn nghi ngờ điều này là tối ưu ...
Này có đầu vào như một danh sách tích cực số nguyên (với một dấu phân cách tùy ý), và in kết quả để STDOUT là số nguyên linefeed được phân định.
Cuộc săn tìm 20/21 byte: Tôi đã kiểm tra tất cả các chương trình có dạng
" XX
?!?X}\{@
@\?XX)!
Ở đâu X
là bất kỳ ký tự hợp lý bởi brute force, nhưng không tìm thấy bất kỳ giải pháp hợp lệ. Tất nhiên điều đó không có nghĩa là một giải pháp ngắn hơn không tồn tại, nhưng không thể buộc các chương trình 20 byte mà không có một số giả định kha khá về cấu trúc của nó.
Giải trình
(Lời giải thích hơi lỗi thời, nhưng tôi vẫn không tin rằng giải pháp là tối ưu, vì vậy tôi sẽ chờ đợi để cập nhật điều này.)
Vì vậy, thông thường các chương trình Labyrinth được cho là trông giống như mê cung. Trong khi con trỏ lệnh nằm trong một hành lang, nó sẽ đi theo hành lang đó. Khi IP chạm vào bất kỳ loại đường giao nhau nào, hướng được xác định dựa trên giá trị cao nhất của ngăn xếp chính của Labyrinth (Labyrinth có hai ngăn xếp, với số lượng vô hạn ở dưới cùng). Điều đó thường có nghĩa là bất kỳ vòng lặp không tầm thường nào cũng sẽ khá tốn kém, bởi vì nếu bạn có các ô không tường ở khắp mọi nơi thì mọi thứ đều là một điểm nối và trong hầu hết các trường hợp, đỉnh của ngăn xếp sẽ không có giá trị phù hợp cho IP để đi theo con đường bạn muốn nó đi. Vì vậy, những gì bạn làm là bạn phóng to các vòng lặp sao cho chúng có một tổng thể ở trung tâm chỉ với một điểm vào và thoát được xác định rõ ràng.
Nhưng lần này tôi thực sự may mắn và mọi thứ rất phù hợp với nhau, đến nỗi tôi có thể nghiền nát tất cả thành một khối lớn. :)
Kiểm soát luồng bắt đầu tại _
Nam đi. Việc _
đẩy số 0 lên ngăn xếp chính. Điều đó có vẻ như không có, nhưng điều này làm tăng độ sâu ngăn xếp (không ngầm) 1
mà chúng ta sẽ cần sau này.
?
đọc một số nguyên từ STDIN. Nếu không có số nguyên nào được đọc, điều này sẽ đẩy số không. Trong trường hợp đó, IP tiếp tục di chuyển về phía Nam và @
chấm dứt chương trình ngay lập tức (vì danh sách đầu vào trống). Nếu không, IP quay về hướng Đông.
Bây giờ chúng ta đang bước vào một vòng lặp rất chặt chẽ với hai điểm thoát:
!?;
\?
;
!
in số nguyên trở lại STDOUT, chỉ để lại số 0 trên ngăn xếp. IP tiếp tục di chuyển về phía Đông và?
đọc số nguyên tiếp theo. Nếu đó là con số không, chúng ta có quyền và di chuyển về phía Nam. ?
đọc một số khác (chỉ số chẵn tiếp theo). Một lần nữa, nếu đó là khác không, chúng ta có quyền và di chuyển về phía Tây.
Sau đó \
in một nguồn cấp dữ liệu mà không thay đổi ngăn xếp, vì vậy chúng tôi có quyền khác, di chuyển về phía Bắc.!
in số nguyên chẵn tiếp theo đó. Vì hiện tại có ít nhất một số nguyên chỉ số lẻ (dương) trên ngăn xếp, chúng tôi tiếp tục rẽ phải và vòng lặp lặp lại.
Khi một trong hai thứ đó ?
chạm đến cuối danh sách, chúng sẽ đẩy số 0 và di chuyển thẳng lên phần tương ứng;
, loại bỏ số 0 đó.
Trong trường hợp chỉ có một yếu tố duy nhất trong danh sách, chúng tôi đã hoàn thành (vì chúng tôi đã in ngay lập tức), vì vậy IP sẽ tiếp tục di chuyển về phía Đông đến @
, chấm dứt chương trình (in dấu vết linefeed trên đường).
Mặt khác, chúng ta cũng cần in các số nguyên chỉ số lẻ. Trong trường hợp đó, hai đường dẫn (từ hai điểm thoát của vòng lặp thứ nhất) hợp nhất ở giữa "
, quay về hướng Đông trong cả hai trường hợp.
_
đẩy số 0 để tránh rẽ trái vào @
và ;
loại bỏ số 0 đó. Bây giờ chúng ta nhập một vòng lặp mới:
"}
""
IP nhập cái này vào ô dưới cùng bên trái, di chuyển về phía Bắc, đi vòng vòng theo chiều kim đồng hồ. Sự }
dịch chuyển đỉnh của ngăn xếp chính sang ngăn phụ. Mặc dù vẫn còn một phần tử trên ngăn xếp, IP vẫn tiếp tục làm việc của nó. Khi mọi thứ đã được chuyển sang ngăn xếp phụ trợ (và đảo ngược trong quy trình), IP sẽ tiếp tục di chuyển về phía Đông, đi vào vòng lặp cuối cùng:
\{@
#!
\
in lại một nguồn cấp dữ liệu một lần nữa, {
di chuyển một mục từ ngăn xếp phụ trở lại chính. Nếu đó vẫn là một mục trong danh sách, nó sẽ là số dương và IP sẽ quay về hướng Nam, nơi mục được in !
. Sau đó #
đẩy độ sâu ngăn xếp (và bây giờ đây là nơi ban đầu _
rất quan trọng, bởi vì điều này #
đảm bảo độ sâu ngăn xếp dương), do đó IP vẫn quay đúng, qua \
và {
lại.
Sau khi chúng tôi in mọi thứ, {
kéo số 0 từ dưới cùng của ngăn xếp phụ trợ, IP tiếp tục về phía Đông và @
chấm dứt chương trình.