Soạn hai chương trình Brainfuck


10

Cho 2 đoạn mã Brainfuck AB, xuất ra một số mã brainfuck Ccó hành vi tương tự như chạy Bvới đầu vào của Akết quả s. Lưu ý rằng Cphải hoạt động cho bất kỳ đầu vào nào khớp với các giả định sau, như thể nó được đưa ra A.

Bạn có thể giả sử:

  1. Đầu vào hữu hạn.
  2. cả A và B đều dừng lại.
  3. EOF luôn là 0 hoặc nhất quán -1.
  4. Liên tục cho phép hoặc không cho phép các tế bào bên trái
  5. Băng không giới hạn (nếu không yêu cầu có thể là không thể)
  6. Gói 8 bit hoặc số nguyên không giới hạn
  7. Không có luồng (đầu vào hoặc đầu ra cho A hoặc B) chứa byte đại diện cho EOF
  8. Mã A và B có thể chứa các ký tự có thể xuất hiện trong C của bạn và +-[]<>,.

Ví dụ: (EOF = 0)

A = ,[..,]
B = ,[...,]
C = ,[......,]

A = >,[>,]<[.<]
B = ,[...,]
C = >>>>,[[-<+<+<+>>>]>>>,]<<<<[.<]

A = >,[>,]<[.<]
B = ,[...,]
C = >,[>,]<[...<]

A = ,.
B = ,.
C = ,>,[,]<.

A = ,.
B = ,.
C = ,.

là những bài kiểm tra hợp lệ

Mã ngắn nhất trong mỗi ngôn ngữ giành chiến thắng. Người chiến thắng trong Brainfuck sẽ được chấp nhận.


7
Shortest code in each language winShortest Brainfuck solution will be acceptedlà hai tiêu chí chiến thắng khác nhau.
Mego

2
@Mego Ý tôi là nếu bạn trả lời trong brainfuck và bạn thắng, bạn được chấp nhận
l4m2

1
Cũng thế. bạn có thể giải thích trên 4.Consistently allow or disallow cells to left. Câu trả lời hàng đầu yêu cầu các ô bên trái trong câu trả lời hoạt động nhưng không cho phép A, B và C không di chuyển qua byte đầu tiên. Câu trả lời của tôi di chuyển sang trái trong câu trả lời, A, B và C. Nếu quy tắc cho chương trình của tôi và C có thể khác với A và B thì tôi chắc chắn có thể rút ngắn câu trả lời của tôi rất nhiều.
Sylwester

1
Toàn bộ tuyên bố vấn đề là về A, B và C, và chỉ hai câu cuối cùng làm cho bất kỳ tham chiếu đến ngôn ngữ của câu trả lời. Có lẽ tác giả đã có ý định cho câu trả lời có cùng hương vị với A, B và C, nhưng đó không phải là lỗi của tôi. Người giải quyết không nên bị trừng phạt vì thiếu tầm nhìn xa của tác giả. Ở bất cứ giá nào, việc thêm một vài >giây vào đầu câu trả lời của tôi để thực hiện theo một hương vị hạn chế hơn (nhưng đối với golf, chúng ta cũng nên xem xét các lựa chọn thay thế). Ngoài ra, dường như rõ ràng với tôi rằng A, B và C phải có cùng hương vị với nhau.
Mitch Schwartz

1
Có thể tôi hoàn toàn hiểu sai về thử thách, nhưng các trường hợp thử nghiệm # 3 và # 4 dường như đụng độ.
James

Câu trả lời:


8

Brainfuck, 526 byte

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

Định dạng:

-<+++++<+<+++++<-[+++++++[<++++++++>-]<--->>]
<<--<--<+..<<<<
,
[
  [<+> >+<-]
  ----[>-<----]>
  [
    not question mark
    +
    [
      not greater than
      ++
      [
        not less than
        ++++++++++++++
        [
          not period
          ++
          [
            not comma
            [-]<
          ]
          <<<
          [
            comma B
            >-->>> -.>>>.<<<.>.>.<<.+>>--..>.<..<.>.>..<++.<.>..>.<..<.>--.>>.<<
            .>.<..<.>.>.<.<.>++.<<.>.>.>.<.<.>..>.<..<.>>>.<<--.++<<<
          ]
          >>>>[<]<
        ]
        >
        [
          period
          <<<<
          [
            B
            >
          ]
          >
          [
            A
            +>>> >>.>.<<<.>.<.>>>.<.[.<.>>>]<++[<<.<.>>.<<--.<<.>.>.++>>>-]<<<<.
            >.>>.<.<<<.>>..>>.<<<.>--.>.<++...<<.>>--..>>.<.<..<.>.>>.<<++...>.<
            ..<.>>>.<<--...++<<[.>]<<<--.<<.>>++.<.>>>.<<--.++<<<
          ]
        ]
        <
      ]
      >
      [
        less than
        <<<.>>
      ]
      <
    ]
    >
    [
      greater than
      >>.>.<<<.>.>>>.[<]
    ]
    <
  ]
  >
  [
    question mark
    >>.>.<..<.>>>.[<]
    <<<+>->>
  ]
  <<.[-]>,
]

Đối với A, B và C: EOF = 0, các ô còn lại bắt đầu không được phép, các ô gói 8 bit.

Mong đợi A theo ?sau là B.

Dùng thử trực tuyến

(Câu trả lời này có thể được thực hiện theo một trình thông dịch Brainfuck không cho phép đi bên trái bắt đầu với chi phí một byte bằng cách chuyển ngữ y/<>/></và trả trước a >.)

Ý tưởng cơ bản là sử dụng một loạt các thay thế chuỗi để mô phỏng các băng của A và B bằng các nút 2 ô, đặc biệt chú ý đến việc thay thế .trong A và ,B để luồng dữ liệu trung gian được giữ trong một khối các tế bào ở bên trái của băng mô phỏng. Sơ đồ thay thế chuỗi là:

  • Chèn >>trước A

  • Trong cả A và B, thay thế >bằng >[-]+><bằng<<

  • Trong A, thay thế .bằng>[-]-[>>]+[[>+<-]<[>+<-]<]>+[->>+]<[>>>-<<+[<<]<+>>>[>>]+<<<-]>[+<->]+</

  • Chèn >[>>]+>sau A và trước B

  • Trong B, thay thế ,bằng,[,]>,<<[<<]<[[>]>>[>>]<+<[<<]<[<]>-]>[>]>>[>>]+<*


,[>,]<[.<]?,[...,]đầu vào 12345trở lại 111, thậm chí với đủ >trước?
l4m2

@ l4m2 Hmm, nó hoạt động với tôi trên TIO . ( ,[>,]<[.<]không hợp lệ nhưng >,[>,]<[.<]là.)
Mitch Schwartz

Vì vậy, "nó cho phép đi về bên trái của ô bắt đầu" là gì?
l4m2

1
Vì vậy, câu trả lời của bạn cần một BF bắt đầu ở giữa một băng vô hạn, nhưng bản chất của A và B bị giới hạn ở tiêu chuẩn nơi người ta bắt đầu ở ô đầu tiên trên một băng vô hạn ở bên phải?
Sylwester

1
Đối với giải pháp này, đi bên trái của ô bắt đầu không được phép trong A, B và C, nhưng nó được cho phép trong chương trình (chúng tôi có thể gọi nó là D để thuận tiện) lấy A và B rồi tạo ra C. Tôi không 'T nghĩ rằng điều này là rất đáng chú ý, và là một lựa chọn tự nhiên dựa trên bản chất của giải pháp. Đi về bên trái của sự khởi đầu có những hậu quả lớn trong bối cảnh của A, B và C, nhưng nó khá tầm thường đối với D, và chủ quan tạo ra trải nghiệm chơi golf thú vị hơn cũng như điểm số ngắn hơn một chút, và cũng không nên thực hiện thử nghiệm bất kỳ tẻ nhạt hơn, vì nó dễ dàng để thêm >s vào D khi cần thiết.
Mitch Schwartz

6

Brainfuck , 1287 byte

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

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

Nó đây rồi! Mã brainfuck bao gồm hai mã brainfuck. Sử dụng một "!" để tách hai đoạn mã đầu vào. Ví dụ: đoạn A : >,[>,]<[.<], đoạn B : ,[...,]. Đầu vào cho chương trình của tôi : >,[>,]<[.<]!,[...,]. Nó sẽ không chấm dứt nếu không có "!" được tìm thấy.

Điều này về cơ bản giống như Phiên bản VBA của tôi. Mã được tạo giống như trong phiên bản VBA (lưu ý rằng các ví dụ trong bài đăng VBA đã được thực hiện trước khi có thay đổi mới nhất trong đoạn trích brainfuck).

Giải trình

Đây là mã nguồn của tôi:

[ 
Tape: "+"(43) "-"(45) "<"(60) ">"(62) "["(91) "]"(93) readA(1) printInput(0) input else exitIf exitElse
]

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

<<<.....<<.>>....<<.>>.<<..>... print init routine
>>>>[                           while readA
  >+                              set printInput = true
  >,                              read character
  ->[-]++++[-<-------->]          decrease input by 33 to check for "!"
  +                               set else flag

  # A check for "!"
  <[                              if input not "!"
    >>                              go to exitIf
  ]
  >[                              else
    <<-                             set printInput = false
    <-                              set readA = false
    <<<..>.<.....>>.<<<.....>>.<<<< print routine between A and B
    .>>..>>.<<<.>>>>.<<<...>>>.<<.<
    <<..>>>>.<<<..>>.....<<<..>>>>>
    .<<<<<.>>>>.<<<.>.....<<.>>>>>.
    <<<<.>>..>>>
    >>>>>                           go to exitElse
  ]

  # A check for "dot"
  <<<----- ----- ---              decrease input by 13 (total 46) to check for dot
  [                               if input not dot
    >>                              go to exitIf
  ]
  >[                              else
    <<-                             set printInput = false
    <<<<..<<.>..>>.<<<.>.<<.>>>.... print list storing routine
    <<<.>>>>.<<<.>.....<<.>>>>>.<<<
    <<.>>>>.<<<..>>.....<<<..>>>>>.
    <<<<..>..<<.>>>..<<<.>>>>.<<<.>
    .....<<.>>>>>.<<<<.>.<<..>>>>.<
    <<..>>.....<<<..>>>>>.<<<<..>..
    >>>.<<<.>>.<<<.>>.<<<.>>.>>>.<<
    ....<<<.>>>>.<<<.>.....<<.>>>>>
    .<<<<<.>>>>.<<<..>>.....<<<..>>
    >>>.<<.....<<.>>>.<<<.>.....<<.
    >>>>>.<<<<.>.<<..>>>>.<<<..>>..
    ...<<<..>>>>>.<<<<.>..>>>>>
    >>>>                            go to exitElse
  ]

  # A check for "less than"
  <<<----- ----- ----             decrease input by 14 (total 60) to check for "less than"
  [                               if input not "less than"
    >>                              go to exitIf
  ]
  >[                              else
    <<-                             set printInput = false
    <<<<<...>>.<<<<.>>>>>.<<<<.>..>>>>> print A move left routine
    >>>>                            go to exitElse
  ]

  # A check for "greater than"
  <<<--                           decrease input by 2 (total 62) to check for "greater than"
  [                               if input not "greater than"
    >>                              go to exitIf
  ]
  >[                              else
    <<-                             set printInput = false
    <<<<.......>.<<<<.>>>>>.<<<<.>..>>>>> print A move right routine
    >>>>                            go to exitElse
  ]

  # print remaining character
  <<<<[                           if printInput
    +++++++[->++++++++<]>--.<     print original character
  ]

<                               go to readA
]

>>,                             read next character
[                               while input
  <+                              set printInput = true

  # B check for comma
  >>++++[-<----- ---->]+<+        decrement input by 44 to check for comma
  [                               if input not comma
    >>                              go to exitIf
  ]
  >[                              else
    <<-                             set printInput = false
    <<<.<<<.>>>>.<<..<<.>>.>.<..... print B list reading routine
    >>.<<<<<.>>>>.<<<.>.....<<.>>>>
    >.<<<<.>>...>.<<<.>...>>.<<....
    .>>>.<<....<<<.>>>>.<<<.>>.....
    <<<.>>>>>.<<<<.>..<<.>>>...>.<.
    ....>>.<<<<<.>>>>.<<<.>.....<<.
    >>>>>.<<<<.>>...>>.<<..<<.>>>.<
    <.....>>>.<<....<<<.>>>>.<<<.>>
    .....<<<.>>>>>.<<<..>>>>> 
    >>>>                            go to exitElse
  ]

  # B check for "less than"
  <<<----- ----- ----- -          decrease input by 16 (total 60) to check for "less than"
  [                               if input not "less than"
    >>                              go to exitIf
  ]
  >[                              else
    <<-                             set printInput = false
    <<<<<.....>>>>>                 print B move left routine
    >>>>                            go to exitElse
  ]

  # B check for "greater than"
  <<<--                           decrease input by 2 (total 62) to check for "greater than"
  [                               if input not "greater than"
    >>                              go to exitIf
  ]
  >[                              else
    <<-                             set printInput = false
    <<<<.....>>>>                   print B move right routine
    >>>>                            go to exitElse
  ]

  # print remaining character
  <<<<[                           if printInput
    +++++++[->++++++++<]>--.<     print original character
  ]

>,                              input next character
]


@ l4m2: Xin lỗi, tôi đã mắc một chút lỗi trong dữ liệu thử nghiệm. Tôi đã viết >[,>]<[.<]!,[...,], vì vậy đoạn A không xuất ra bất cứ điều gì. Tất nhiên nó phải là >,[>,]<[.<]!,[...,]một ví dụ làm việc.
Dorian

5

VBA, 512 489 479 byte

Sub f(A,B):Debug.?">>>>>->>>>->--<<<"&Replace(Replace(Replace(A,"<","<<<[+]-<<"),">",">>>>>>>[+]-<<"),".",">>-<<[-<+>>>>+[-<<<<<+]+[-->>>>>++]--<<+>>+[-<<<<<+]-<++[-->>>>>++]--<<]<[->+<]>>>>+[-<<<<<+]+[-->>>>>++]>>>>>-[-<<<<<+]-<++[-->>>>>++]-<<")&">>[>>>>>]<<<<<[+<<[-]<<<]>++[-->>>>>++]+[-<<<<<+]->>"&Replace(Replace(Replace(B,"<","<<<<<"),">",">>>>>"),",","[-]>>->[>>>>>]+[-<<<<<+]->>>[-<<<[<<<<<]>>>>+[->>>>>+]-<<+>>>[>>>>>]+[-<<<<<+]->>>]>>-[<<<<<]>>>>+[->>>>>+]<<"):End Sub

Giải trình

Mã VBA thay đổi mã brainfuck theo cách, rằng đầu ra của đoạn A sẽ được lưu trong danh sách và đầu vào của đoạn B sẽ được đọc từ danh sách đó.

Đầu tiên nó khởi tạo một số biến

>>>>>->>>>->--<<<

Sau đó nó đọc đoạn A và thay thế tất cả <bằng cách <<<[+]-<<, mỗi >bằng >>>>>>>[+]-<<và mọi .bởi thói quen lưu trữ

>>>>>>>[+]-<<"),".",">>->+[-<<<<<+]+[-->>>>>++]>>>>>-[-<<<<<+]-<++[-->>>>>++]--<<[-<+>>>>+[-<<<<<+]+[-->>>>>++]--<<+>>+[-<<<<<+]-<++[-->>>>>++]--<<]<[->+<]>>>+<<

sau đó nó xóa bộ nhớ của đoạn A và thay đổi danh sách được lưu trữ, vì vậy nó có thể được đọc làm đầu vào cho đoạn B:

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

Sau đó, đoạn B sẽ được đọc, mọi thứ <sẽ được thay thế <<<<<, mọi thứ >sẽ được thay thế >>>>>và mọi thứ ,sẽ được thay thế bởi thói quen đọc danh sách:

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

Mã nguồn Brainfuck

Đây là nguồn của tôi cho các phần brainfuck của mã. Tôi sẽ giải thích chi tiết sau.

[
Tape: tempMem data out/in dataAnchors outAnchors (all repeating)
dataAnchors of Snippet A: -1 = memory has been used, -2 = active memory cell for copying to out/in
dataAnchors of Snippet B: -1 = active memory cell for copying from out/in
outAnchors of Snippet A: -1 = start of list, -2 = next output position
outAnchors of Snippet B: -1 = character has been read (or start of input)
]

### Init
>>              two blank data cells (for non wrapping pointer)
>>>-            set start of input
>> >>-          set first "used" flag
>--             set end of input
<<<             return to first usable data cell

### A move right routine
>>>>>           move to the next data cell
>>[+]-          clear and set "used" flag
<<              return to data cell

### A move left routine
<<<[+]-         clear and set "used" flag of previous data cell
<<              go to data cell

### A print routine
>>-             set flag
<<[             while value greater 0
  -               decrement value
  <+              increment tempMem
  >>>>+[-<<<<<+]  find start of input
  +[-->>>>>++]--  find end of input
  <<+             increment input
  >>+[-<<<<<+]-   find start of input
  <++[-->>>>>++]--find flag
  <<              go to active data cell
]
<[->+<]         move stored value back to data
>>>>+[-<<<<<+]  find start of input
+[-->>>>>++]    find end of input
>>>>>-          set new end of input
[-<<<<<+]-      return to start of input
<++[-->>>>>++]- return to and delete data flag
<<              go to data cell

### After snippet A: Delete memory of A and configure out/in list
>>[>>>>>]<<<<< go to last used data
[+<<[-]<<<]    delete each data
>++[-->>>>>++] find and delete end of input flag
+[-<<<<<+]-    go to start of input
>>             go to first data cell

### B move right routine
>>>>>          go to next data cell

### B move left routine
<<<<<          go to previous data cell

### B reading routine
[-]                      set cell = 0
>>-                      set flag
>[>>>>>]+[-<<<<<+]-      find start of input
>>>[                     if value greater 0
  -                        decrement value
  <<<[<<<<<]>>>>           go to initial start of input (combined with next)
  +[->>>>>+]-              find mem cell flag
  <<+                      increment mem cell
  >>>[>>>>>]+[-<<<<<+]->>> return to input cell
]
>>-                      set new start of input
[<<<<<]>>>>              go to initial start of input (combined with next)
+[->>>>>+]               find and delete mem cell flag
<<                       go to mem cell

Đầu ra cho trường hợp thử nghiệm 1: f ",[..,]",",[...,]"

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

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

Đầu ra cho trường hợp thử nghiệm 2: f ">,[>,]<[.<]",",[...,]"

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

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

Đầu ra cho trường hợp thử nghiệm 3: f ",.",",."

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

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

Trường hợp thử nghiệm phức tạp: Đoạn A: Xây dựng tam giác bảng chữ cái >+++++[<+++++>-]<+[>>[>[.>]]>++++++++++.--[<++++++++>-]<[+.<]<-]>>,>[.>]++++++++++.[<[.<]>,>[.>]<] Hãy thử trực tuyến!

Đoạn B: Sắp xếp đầu vào theo thứ tự tăng dần >>,[>>,]<<[[-<+<]>[>[>>]<[.[-]<[[>>+<<-]<]>>]>]<<] Hãy thử trực tuyến!

Kết quả:

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

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


Cảm ơn bạn. Tôi biết điều này là khá nhiều vô căn cứ. Tôi chỉ muốn cung cấp mã làm việc đầu tiên. Cũng sẽ thay đổi phần não bộ của mã.
Dorian

5

Brainfuck , 785 byte

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

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

Để tách A khỏi BI đã chọn /.

Giải thích:

Mã thực tế mà tạo ra đây chỉ là một đọc lặp với một lá cờ cho A / B và một công tắc làm giảm đầu vào để tìm kiếm >, <, /, ,, và .và nếu không chỉ cần đầu ra đầu vào. Nó thực sự chỉ là một bộ chuyển mã trong đó mã được mã hóa nằm trong cấu trúc dữ liệu sao cho nó không can thiệp vào dữ liệu được lưu trữ từ A hoặc nhau. Chỉ /cần di chuyển các tế bào hoạt động đến các tế bào không sử dụng đầu tiên. Ban đầu tôi đã làm sạch nó, nhưng điều đó làm cho chương trình và đầu ra lớn hơn.

Kết quả chương trình có mô hình bộ nhớ sau:

|0|input*|cz|d0|c0|d2|c0|...

Sự csụp đổ. czluôn luôn 0Nó chỉ ra vị trí trong dữ liệu BF được mô phỏng của con trỏ. Giá trị hoạt động là -1 trong khi tất cả các ô được truy cập sẽ có 1. Trong các hoạt động như aprintbreadmột số ccó được ý nghĩa đặc biệt.

In mã A bỏ qua tất cả các ô 1 byte để chừa chỗ cho thêm một byte đầu vào, đó là các bản sao có bản sao lưu trong các byte tiếp theo bị vỡ để sao chép lại.

Đọc mã B tìm nạp đầu vào từ đầu vào. Ở đây bị phá hủy là ok và khi bạn "đọc" byte cuối cùng, bạn nhận được 0 là EOF bất kể việc thực hiện.

Tôi bắt đầu làm mã mở rộng BrainFuck tạo ra kết quả EBF. Hầu hết các gỡ lỗi đã được thực hiện trên các tệp kết quả và sau đó cập nhật vào nguồn đã tạo ra nó. Sau đó, tôi chỉ chạy các hoạt động độc lập để có đầu ra BF, nhưng tôi nhận thấy câu trả lời của Dorian, điều này đã đánh bại tôi trong thời gian dài nên tôi tiếp tục chơi golf nguồn EBF cho đầu ra BF nhỏ hơn. Nguồn ban đầu khá dễ đọc và đơn giản so với những thứ khác tôi đã làm với nó:

:bck
:i
:t
:z
:r
:rc
:rz

;;; outputs a header with most of the result logic
{cinit
  |"
    ;; memory model of the result 
    ML/i/z/d/c
    PTR=1/1/2
    :iz:i:z:d:c:d2:c2

    ;; moves pointer back. Bad things will happen to 
    ;; A output if out of bounds
    {backward @d2 $c2++ $c-- $d
    }

    ;; moves pointer forward
    {forward $c++ $c2[-]- $d2 @d
    }

    ;; stores the current cell in input a the start of bf data
    {aprint
      $c2(-)+                 ; mark next cell as used even if it maybe
      $c[$c2]                 ; go to the end of used data
      $c((->+)$d(->+)@d2)     ; as long as c is something move d and c one place right
      @i$c+[->>+]@c           ; go to active cell, zero it
      $d(-                    ; copy: 
        $c2+                  ; backup in c2 
        $z[<<]@z              ; back to i
        $i+ $c[>>]@c          ; increement and back to zero carry
      )
      $c2-(- $d+)+            ; copy backup in c2 back to d
      $c-                     ; mark active cell
      $d                      ; move to d
    }

    ;; removes all the data from A. And initializes for B
    {aend
      $c[$c2]
      $c((-)<(-)<@c)@z
      $c-$d
    }

    ;; instead of read b fetched from input area
    {bread
      (-)>+@c2          ; clear d and c
      $c[$z]            ; go to z
      $i<[<] @iz        ; go to iz
      $i(-$iz+)         ; switch places between i and iz
      $iz(-             ; copy from iz to d
         $z[>]@z        ; move to z
         $c[$c2]        ; move to the current c 
         $d2+           ; increase d
         $c[$z]         ; back to z
         $i[$iz]        ; back to iz
         @i             ; but since we shave switched correct
      )
      $z[>]@z           ; go back to z
      $c[$c2]-          ; move to active cell and make it -1
      $d2 @d            ; go to d
    }

    $c-$d               ; init. Go to c t mark it active, then go to d
    "
  (-)
}

{cmain
  &cinit
  $t,(
    (-$i+$bck+) ; pour to i and bck

    ;; switch ( $i ) cases '<>,./' using $t
    $t+++++++(-$i------)+$i--; ,
    ($i--; .
      ($i-; /
        ($i-------------; <
          ($i--; >
            ((-) $t(-)  $bck.)
              $t (- |"&forward "(-) )
          ) $t (- |"&backward "(-) )
        ) $t (- |"&aend "(-) $r+ )
      ) $t (- $rc+$r[$rc-$bck.$rc]@r$rc[- |"&aprint "(-) $rz])
    ) $t (- $rc+$r[$rc-|"&bread "(-)]@r$rc[-$bck.$rz])
    $bck (-) ; clear backup
      $t,    ; read into t
  )
}

&cmain

Nếu tôi đã hiểu đúng, [->+]trong chương trình C gây ra lỗi cho các đầu vào như ->->,./,.và điều này có thể được khắc phục bằng cách sử dụng [->>+](đảm bảo con trỏ bắt đầu trên một ô có tính chẵn lẻ mong muốn). Đối với [-<+], tôi nghĩ rằng bạn có thể thay đổi lược đồ điều hướng để dựa vào tất cả đầu ra của A là khác không?
Mitch Schwartz

Tôi không chắc ý của bạn là gì. Khi A là ->->,.và B là ,., trình thông dịch ưa thích của bạn có tạo ra C giống như TIO không và C có hoạt động như mong đợi trên trình thông dịch của bạn không? Bởi vì nó thất bại trên TIO . (Tôi đã viết bài này để phản hồi lại một bình luận hiện đã bị xóa.)
Mitch Schwartz

@MitchSchwartz Cảm ơn bình luận của bạn. Tôi hơi tự phụ vì tôi không mong đợi quét -1dữ liệu người dùng, nhưng thực sự tôi đã thực hiện trên dòng "đi đến tế bào hoạt động, không có nó". Tôi đã cập nhật câu trả lời của mình và sau đó tôi đã thêm một byte: -O nhưng ít nhất nó cũng hoạt động. BTW. Nếu tôi không sử dụng quét -1để tìm nạp đầu vào trong B, tôi sẽ phải di chuyển byte hoạt động bằng một bản sao >[-<+]<và do đó tôi thêm nhiều ký tự hơn tôi lưu bằng cách thay thế +[-<+]-bằng [<]. Nếu bạn không sao chép, bạn sẽ không thể biết liệu byte bạn đã hoàn thành và sao chép tất cả các byte.
Sylwester

Vâng, đề cập của tôi [-<+]thực sự cũng liên quan đến việc loại bỏ các lỗi (trái ngược với việc lưu byte), cho đầu vào như -./,>++++++[<++++++>-]<., nên in #hơn là %. :) Nhưng tôi cũng thấy một số cơ hội để lưu byte. Chúc may mắn! Tôi sẽ cố gắng tối ưu hóa giải pháp băng vô hạn gấp đôi của mình, mặc dù việc nhìn thấy những gì bạn đã làm khiến tôi nghĩ có lẽ băng vô hạn phải là golfier cuối cùng.
Mitch Schwartz

Vì vậy, sau khi kiểm tra mã của bạn chặt chẽ hơn, tôi thấy rằng các thiết lập của chúng tôi rất giống nhau và việc bạn sử dụng băng vô hạn phải tốt hơn cho golf so với băng vô hạn gấp đôi của tôi. Xin vui lòng xem cập nhật sed gần đây của tôi cho một giải pháp kết hợp ý tưởng của chúng tôi. Tôi cảm thấy rằng chơi golf C là phần thú vị nhất của vấn đề này, nhưng cũng có một số chỗ để làm cho chương trình thay thế chuỗi ngắn hơn bên ngoài đó ...
Mitch Schwartz

4

sed, 165 byte

s > >[-]+> g
s < << g
1s \. >[-]-R+[[>+<-]<[>+<-]<]>+[->>+]<[>+>>-<L+>R+<<<-]>[<+>-]+< g
1s .* R&<R+> 
2s , ,[,]>,<L[[>]R<+L[<]>-]>[>]R+< g
s L <[<<]< g
s R >>[>>] g

Đối với các hương vị có EOF = 0, các ô còn lại bắt đầu không được phép, các ô gói 8 bit.

Dự kiến ​​chương trình A trên dòng đầu tiên và B trên dòng thứ hai.

Dùng thử trực tuyến

Điều này sử dụng các nút 2 ô để mô phỏng các băng của A và B, với đầu ra của A chiếm các ô liền kề ở bên trái của nút ngoài cùng bên trái.

Giải pháp thay thế 173 byte:

1i>>
s > >[-]+> g
s < << g
1s \. >[-]-[>>]+[[>+<-]<[>+<-]<]>+[->>+]<[>>>-<<+[<<]<+>>>[>>]+<<<-]>[<+>-]+< g
1a>[>>]+>
2s , ,[,]>,<<[<<]<[[>]>>[>>]<+<[<<]<[<]>-]>[>]>>[>>]+< g

Dùng thử trực tuyến

Ban đầu thiết kế của tôi dựa trên một cuộn băng vô hạn gấp đôi, đòi hỏi nhiều công việc hơn để di chuyển sang trái (di chuyển dữ liệu khi vượt qua ô ngoài cùng bên trái đã gặp trước đó) và để chuyển từ A sang B (xóa dữ liệu thay vì chỉ đi qua ô ngoài cùng bên phải đã gặp trước đây).

Cảm ơn Sylwester và Dorian cho các thủ thuật và ý tưởng.


Điều này có vẻ tuyệt vời. Thật không may, nó thất bại trong bài kiểm tra đầu tiên. Chương trình Một ,[..,]chương trình B ,[...,].
Dorian

Ồ, đây là một sự giám sát ngớ ngẩn về phía tôi, tôi đã vội vã quá nhiều. Nó có thể sửa được nhưng tôi nên xóa nó ngay bây giờ.
Mitch Schwartz

@Dorian Nó nên được sửa ngay bây giờ. (Tôi sẽ tiếp tục xem xét nó.) Cảm ơn bạn đã chỉ ra lỗi sai và xin lỗi vì sự bất tiện này.
Mitch Schwartz

Tôi biết rằng một số byte có thể được lưu bằng cách ví dụ như có s/x/>>/gở cuối, nhưng tôi quan tâm nhiều hơn đến các cải tiến sẽ rút ngắn đầu ra ngay bây giờ.
Mitch Schwartz
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.