Tế bào ở cuối cầu vồng


31

Tất cả chúng ta đều biết, hoặc ít nhất đã nghe nói về brainfuck , một trong những ngôn ngữ bí truyền nổi tiếng và có ảnh hưởng nhất. Trong khi ngày nay hầu hết các triển khai sử dụng một băng vô hạn, trình biên dịch gốc của Urban Müller có một băng gồm 30000 ô. Một sự thật ít được biết đến * là thực sự có một giá trị đặc biệt ở phần cuối của băng, một thứ gần như không bao giờ được tương tác với trong một chương trình cân não thông thường.

Mặc dù bạn có thể in giá trị này với 29999 >giây và a ., brainfuck được biết đến với các giải pháp ngắn gọn và súc tích, vì vậy mục tiêu của bạn là in giá trị này với số lượng ký tự tối thiểu.

*viễn tưởng

Quy tắc:

  • Một bồi dưỡng về các hướng dẫn brainfuck:
    • +/ -: Tăng / giảm ô hiện tại, gói từ 255 đến 0 khi tăng 255 và ngược lại
    • </ >: Di chuyển con trỏ sang trái / phải trên băng
    • .: In giá trị của ô hiện tại.
    • [: Nhảy tới tương ứng ]nếu giá trị tại ô là 0
    • ]: Nhảy tới tương ứng [nếu giá trị tại ô không bằng 0
  • Trong trường hợp này ,(Nhận đầu vào) không làm gì cả, vì trình biên dịch gốc không thay đổi ô trên EOF và chương trình này sẽ không nhận được đầu vào.
  • Băng ban đầu chứa đầy tất cả 0, ngoại trừ ô 30000, chứa giá trị không xác định
  • Con trỏ bắt đầu từ ô 1 và sẽ kết thúc ở ô 30000, sau khi in nó.
  • Các ô ở bên trái của 1 và bên phải của 30000 có hành vi không xác định, vì vậy các giải pháp không nên truy cập vào các ô này.
  • Lưu ý rằng giá trị tại 30000 có thể là một 0, vì vậy chỉ đơn giản lặp cho đến khi bạn nhấn một tổ chức phi zero tế bào sẽ không làm việc.
  • Bạn nên in chỉ giá trị ở cell 30000
  • Giải pháp ngắn nhất sẽ thắng!
    • Tie-breaker là chương trình hiệu quả hơn (thực hiện trong các bước ít nhất), theo sau là thời gian gửi nhanh nhất.

Mẹo: Esolanging Fruit gợi ý sử dụng https://copy.sh/brainfuck để kiểm tra mã của bạn. Thông số kỹ thuật được mô tả trong thử thách này và bạn có thể chọn aborttùy chọn để chương trình của bạn tạm dừng nếu vượt quá giới hạn.


Sandbox (đã xóa)
Jo King

3
1 byte : .. Tôi thắng.
Esolanging Fruit

1
@EsolangingFnut Hãy để tôi có những ảo tưởng của tôi xin vui lòng ...
Jo King

1
Tôi đề nghị thay đổi quy tắc thành "ban đầu tất cả các ô có giá trị 0, ngoại trừ ô cuối cùng có giá trị không xác định".
dùng202729

4
Mẹo cho bất cứ ai làm điều này: copy.sh/brainfuck có lẽ là trang web tốt nhất để thực hiện việc này, vì nó thực hiện BF như được mô tả trong thử thách này và có băng 30k theo mặc định. Di chuyển ngay qua phần cuối của băng làm cho trình thông dịch bị treo.
Esolanging Fruit

Câu trả lời:


17

54 byte

------[>+++<--]>[->----[-[->+<]<[->+<]>>]<]>>>>>>>>>>.

119 x 252 = 29988. Vòng lặp lồng đơn giản.

Tôi đã sử dụng công cụ này để xác minh rằng con trỏ dừng ở 29999.


12

50 byte

>+[>+[<]>->+]>-<<[>>-------[[>]+[<]>-]<<-]>>>[>]>.

Hãy thử nó ở đây!

Phần đầu tiên ( >+[>+[<]>->+]>-<<) thiết lập băng như

0*12 121' 0 110

Phần tiếp theo ( [>>-------[[>]+[<]>-]<<-]) lặp lại 121 lần, nối thêm 249 1giây vào cuối băng mỗi lần. Nếu bạn nhanh chóng với toán học, bạn có thể nhận ra kết quả 121 * 249 này trong 30129 1giây, nhưng lần lặp đầu tiên có 110 còn lại để xử lý và chỉ gắn ( 110-7) 103 1giây vào băng, nghĩa là chỉ có 29983 1giây. Các băng cuối cùng trông như:

0*12 0' 0 0 1*29983 0 ???

Và một cuối cùng >>>[>]>.để in giá trị.

Một số thuật toán lưu ý khác:

  • 252 * 119 = 29988 (cũng 50 byte)
  • 163 * 184 = 29992 (56 byte)
  • 204 * 147 = 29988 (60 byte)
  • 153 * 196 = 29988 (56 byte)
  • 191 * 157 = 29987 (57 byte)
  • 254 * 118 = 29972 (56 byte)
    • Đây là cái tôi coi là gần nhất với nhịp 50, vì các byte bổ sung về cơ bản chỉ là đi thêm khoảng cách. Nếu tôi có thể tìm thấy một thuật toán tạo ra 118 và di chuyển xa hơn 14 ô, thì điều này có thể đánh bại nó.

3

81

-[+>+[<]>++]<<+[-->-[-<]>]>-[>[->+[[->+<]<]>>>]<[-<<+>>]<<<-]>-------[[->+<]>-]>.

Điều này di chuyển hơn 150 tế bào 200 lần.

Thời gian này dài hơn nhiều so với mong muốn của tôi và có một trở ngại nghiêm trọng đối với việc chơi golf:

Tôi không còn biết tại sao tôi làm việc.

Điều này được lấp đầy với sự bù đắp cho những người ngoài cuộc đến mức một số người trong số họ có thể hủy bỏ. Tôi đã thêm và xóa nhiều phân đoạn khác nhau đến mức tôi không còn nhớ tại sao tôi đặt một số thứ nhất định ở đó (ví dụ: tại sao phần đầu tiên khởi tạo các ô băng thành 199 và 151 thay vì 200 và 150?).

Đây là phiên bản nhận xét của tôi về dù sao quái dị này, với hy vọng rằng tôi (hoặc người khác) có thể thấy chúng hữu ích:

-[+>+[<]>++]<<+[-->-[-<]>]>-

0 0 0 199' 155

[
  n' k 0
  >[
    n k' j
    ->+[[->+<]<]>
    0' n k-1 j+1 OR
    n 0 0' j+1
    >>
  ]
  0*k n 0 0 k 0'
  <[-<<+>>]<<<-
  0*k n-1' k
]
>-------[[->+<]>-]>.

Điều này không thực sự in giá trị và nếu giá trị dương thì nó sẽ tràn ra. Nhưng một nỗ lực lớn
Jo King

Sau đó thêm một ., nó sẽ giúp?
dùng202729

1
@JoKing Đã sửa.
Esolanging Fruit
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.