Vấn đề vòng lặp Brainf * ck


19

Tôi có một vấn đề đối với một câu lạc bộ mạng yêu cầu bạn in:

ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"!

Sử dụng Brainf ** k trong 29 byte hoặc ít hơn mà không sử dụng ký tự ','.

Tôi có một mã làm việc:

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

Tuy nhiên, vòng lặp của tôi quá dài, gửi cho tôi 16 byte vượt quá giới hạn.

Có cách nào hiệu quả hơn để đặt ô thứ hai và thứ ba thành 58 và 90 để tôi có thể chạy vòng lặp thứ hai của mình không? Hoặc có cách nào tốt hơn để làm tất cả những thứ này cùng nhau mà tôi không thấy?


1
Đối với câu hỏi của bạn, trong khi nó chỉ lưu bốn byte, thì thực sự tốt hơn để tạo 5990 và thay đổi -.thành .-, loại bỏ >.<.
Martin Ender

Tôi đã nhận được +[--->++<]>++++[.-]19 byte nhưng nó cũng in các ký tự điều khiển ...
Timtech

@MartinEnder Vâng xin lỗi về điều đó, tôi đã thấy bình luận của bạn trên bài đăng khác và thấy nhóm này có vẻ phù hợp hơn nhiều, tôi sẽ xóa nhóm trên SO vì nó không tạo ra nhiều câu trả lời.
Nick Rod

2
Tôi thực sự tò mò "câu lạc bộ mạng" này là gì, bởi vì cậu bé họ phải có một số tay golf thực sự giỏi!
Sp3000

Câu trả lời:


23

27 24 byte

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

Đã dành cả một ngày về cơ bản để viết một bác sĩ vũ phu và xem kết quả đến. Bây giờ tôi có thể quay lại để làm một số công việc thực tế ... Một ngày khác của vũ phu buộc sau ...

Hãy thử trực tuyến!

Thành phần ++[<++[++<]>>>+]khởi tạo băng thành

[130, 0, 0, 0, 91, 59, 0]
                       ^

đó là hoàn hảo cho những gì chúng ta cần!


8
Pháp sư. (´-´) ⊃ GoTo ☆. * ・。
primo

@primo Công bằng mà nói, tôi không biết điều gì đang xảy ra với cấu trúc khôn ngoan trong nửa đầu và tôi nghĩ rằng thực tế là bạn có thể đưa ra các thuật toán / kỹ thuật của riêng mình thật tuyệt vời :)
Sp3000

Băng ở cuối mỗi vòng lặp: codepad.org/ZoJUlQ8M . Hoàn toàn không trực quan rằng nó sẽ chấm dứt ở các giá trị mà nó làm hoặc thậm chí là tất cả;)
primo

1
Một thay thế 24:+[[>++<<]>->+>+]<[-<-.>]
primo

15

30 byte

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

Hãy thử trực tuyến!

85171 khá dễ dàng để tạo ra trong brainfuck (nghịch đảo mô-đun 3-3 ). 85 khá gần với 90171 khá gần với 177 ( 59 · 3 ), được sử dụng ở đây. Với một chút tin tặc, thay vào đó tôi có thể sản xuất 88176 .

Tuy nhiên, vẫn còn một byte ngắn của mục tiêu.

Đề xuất khác

Nói chung, nó ngắn hơn để lặp qua một danh sách, nhân với một hằng số, thay vì theo cách khác. Điều này đặc biệt đúng với 3 giá trị trở lên. Ví dụ: cái này:

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

có thể được viết như:

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

Chỉ có hai giá trị bên trong, vì vậy nó không có nhiều cải thiện trong trường hợp này. Trong thực tế, chỉ cần tái cấu trúc là ngắn hơn một byte:

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

Nhân 30 với 23 , thay vì 10 với 69 . Với đề xuất của Martin Büttner, điều này đã giảm xuống còn 38 byte, không có nhiều thay đổi so với ban đầu:

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

Tôi chưa bao giờ nghĩ về việc nhân số 58 và lặp lại với số lượng lớn hơn, điều đó hiệu quả hơn nhiều.
Nick Rod

4

34 byte

Bạn đã lưu 11 byte, nhưng vẫn còn 5 byte quá lâu ...

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

Tôi đã dành hàng giờ rồi, hy vọng ai đó có thể cải thiện điều này.

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.