Thực hiện một chương trình kéo dài hơn


16

Lenguage là một phương ngữ brainfuck nổi tiếng với việc phá vỡ các thách thức hạn chế nguồn. Đó là bởi vì Lenguage chỉ quan tâm đến độ dài của nguồn chứ không phải nội dung.

Đầu tiên, độ dài của chương trình được tính toán. Sau đó, độ dài cho biết được chuyển đổi thành nhị phân và được đệm trái bởi các số 0 thành bội số 3. Chuỗi nhị phân kết quả được chia thành các đoạn gồm 3 bit, mỗi bit được dịch thành lệnh brainfuck như sau:

000 -> +
001 -> -
010 -> >
011 -> <
100 -> .
101 -> ,
110 -> [
111 -> ]

Cuối cùng, chương trình được chạy dưới dạng brainfuck 1 .

Từ đây, thách thức khá đơn giản, hãy viết một chương trình kéo dài không có đầu vào và tạo ra một đầu ra bao gồm một byte lặp lại số nguyên lần, trong đó lớn hơn độ dài của chương trình của bạn.nn

Câu trả lời sẽ được tính bằng byte với ít byte hơn.

Đây là một chương trình hacky để tính toán độ dài từ brainfuck


1: Đối với thử thách này, chúng tôi sẽ sử dụng các ô quấn và băng không quấn.


3
+[.]Tôi có thắng không : P
Quintec

3
Có lẽ sẽ thú vị hơn khi ghi điểm về độ dài của đầu ra?
Jo King

@JoKing Đó là một ý tưởng tốt. Thật không may, nó có vẻ là một chút muộn cho điều đó.
Thuật sĩ lúa mì

2
Ngoài ra, tại sao quine được gắn thẻ này?
Hiện thân của sự thiếu hiểu biết

1
+]23n

Câu trả lời:


15

8437495638205698686671 byte

Điều này chuyển sang chương trình brainfuck:

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

231584178474632390847141970017375815706539969331281128078915168015826259279614

Điều này được tính bởi hàm

f(n)=2*f(n-1)+n
f(0)=0

với đầu vào là 255.

Giải trình:

-[         Loop 255 times
  >>[>]    Move to the end of a series of positive cells (initially empty)
  +        Add one cell to the end
  [-       Loop over each cell 
    >[>]+  Add one cell to the end
    .      Print a SOH byte
    [<]+   Restore current cell
  <]       Move to next cell
<-]        Decrement counter

4

9093903938998324939360576240306155985031832511491088836321985855167849863863065731015823 byte

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

Mà in chính xác

298333629248008269731638612618517353495058861384016275770860733328251135402804732197446995616017112134460464130233444058136509123809012106419446593183683387659250431692751255099808162970657410517657862174602556590616568690423540284801267472920128909691902547970614008613488242333460665145840144517097342073878746293059960326132795671583153307437896728515625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

250255

Tín dụng đi đến @hvd trong câu trả lời Brainfuck này , vì vậy hãy đảm bảo nâng cao anh ấy!

Giải trình:

Tôi sẽ viết một lời giải thích cho riêng mình, nhưng nhận ra lời giải thích của @hvd đã có sẵn, vì vậy tôi sẽ trích dẫn nó ở đây:

>>>>>> là cần thiết để lại một chút không gian làm việc.

-tạo ra 255 ( kể từ 0 - 1 = 255 khi chúng ta có các ô bao bọc ).

[[->>>+<<<]------>>>-] biến điều này thành 255 bản sao của giá trị 250, đưa ra một băng trông giống như:

0 0 0 0 0 0 250 0 0 250 0 0 ... 250 0 0 [0]

<<<[<<<]+ di chuyển con trỏ dữ liệu trở lại và hoàn thành dữ liệu ban đầu:

0 0 0 [1] 0 0 250 0 0 250 0 0 ...

Sau đó đến vòng lặp: [+...-]ban đầu đặt 1 thành 2, được đặt lại thành 1 ở cuối vòng lặp. Vòng lặp chấm dứt khi thân vòng đã đặt 2 thành 1.

Bây giờ, các số 2 250 250 250 ... 250 đại diện cho một bộ đếm, trong cơ sở 250, với mỗi số một lớn hơn chữ số mà nó đại diện.

  • [>>>]<<<di chuyển tất cả các bên phải. Vì mỗi chữ số được biểu thị bằng một số khác không, điều này là không đáng kể.

  • ->+[<[+>-]>[-<<<<->+>>------>>]<<<<]>>-giảm bộ đếm xuống 1. Bắt đầu với chữ số cuối: chữ số bị giảm. Nếu nó vẫn tích cực, chúng tôi đã hoàn thành. Nếu nó biến thành 0, đặt nó thành 250 và tiếp tục với chữ số trước đó.

  • [<<<].>>>di chuyển con trỏ trở lại trước chữ số bên trái nhất và đây là thời điểm tốt để in một byte NUL. Sau đó đặt lại vị trí chính xác cho chữ số bên trái nhất, để xem chúng ta đã hoàn thành chưa.

Để xác minh tính đúng đắn, thay đổi ban đầu -để +để in 250 1 NUL byte, ++cho 250 2 vv


4

19326644346528796447 byte

Mã Brainfuck:

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

Bản in

57896044618658097711785492504343953926634992332820282019728792003956564819967

byte rỗng.

Nó hoạt động như thế này:

mem[i]=255;
do
    while(--mem[i]){
        mem[i+1]=mem[i+2]=mem[i];
        mem[i]=1;
        i+=2;
    }
while(mem[--i]);

Khá đệ quy đơn giản.

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.