เขียนโปรแกรม Brainfuck สองโปรแกรม


10

ให้ตัวอย่างโค้ด brainfuck 2 อันAและBเอาท์พุทโค้ด brainfuck บางอย่างCที่มีพฤติกรรมเช่นเดียวBกับการรันด้วยอินพุตของAผลลัพธ์ โปรดทราบว่าCการทำงานต้องให้ป้อนข้อมูลใด ๆ Aที่ตรงกับสมมติฐานดังต่อไปนี้ราวกับว่ามันถูกมอบให้กับ

คุณสามารถสันนิษฐานได้ว่า:

  1. อินพุต จำกัด
  2. ทั้ง A และ B หยุดทำงาน
  3. EOF มีค่า 0 หรือ -1 อย่างสม่ำเสมอ
  4. อนุญาตหรือทิ้งเซลล์อย่างสม่ำเสมอ
  5. เทปที่ไม่มีขอบเขต (ไม่เช่นนั้นอาจเป็นไปไม่ได้)
  6. การตัดอย่างต่อเนื่อง 8 บิตหรือจำนวนเต็มไม่ จำกัด
  7. ไม่มีสตรีม (อินพุตหรือเอาต์พุตสำหรับ A หรือ B) มีไบต์เป็นตัวแทน EOF
  8. รหัส A และ B สามารถมีอักขระที่อาจปรากฏใน C ของคุณและ +-[]<>,.

เช่น (EOF = 0)

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

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

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

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

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

เป็นการทดสอบที่ถูกต้อง

รหัสสั้นที่สุดในแต่ละภาษาชนะ ผู้ชนะใน Brainfuck จะได้รับการยอมรับ


7
Shortest code in each language winและShortest Brainfuck solution will be acceptedเป็นสองเกณฑ์การชนะที่แตกต่างกัน
Mego

2
@Mego ฉันหมายความว่าถ้าคุณตอบใน brainfuck และคุณชนะคุณได้รับการยอมรับ
l4m2

1
ด้วย 4.Consistently allow or disallow cells to leftคุณสามารถทำอย่างละเอียดใน คำตอบนำหน้าต้องใช้เซลล์ด้านซ้ายในคำตอบเพื่อทำงาน แต่ไม่อนุญาต A, B และ C เพื่อไม่ย้ายผ่านไบต์แรก คำตอบของฉัน diallows เลื่อนไปทางซ้ายในคำตอบ A, B และ C หากกฎสำหรับโปรแกรมของฉันและ C อาจแตกต่างจาก A และ B ดังนั้นฉันแน่นอนสามารถย่อคำตอบของฉันได้มาก
Sylwester

1
คำแถลงปัญหาทั้งหมดเกี่ยวกับ A, B และ C และมีเพียงสองประโยคเท่านั้นที่มีการอ้างอิงถึงภาษาของคำตอบ บางทีผู้เขียนตั้งใจจะให้คำตอบนั้นมีรสชาติเหมือน A, B และ C แต่นั่นไม่ใช่ความผิดของฉัน ไม่ควรลงโทษนักแก้ปัญหาเนื่องจากการมองการณ์ไกลของผู้เขียนปัญหา ไม่ว่าจะในอัตราใดก็ตามมันเป็นเรื่องเล็กน้อยที่จะเพิ่ม>คำตอบของฉันลงไปเล็กน้อยเพื่อให้สอดคล้องกับรสชาติที่ จำกัด มากขึ้น (แต่สำหรับกอล์ฟเราควรพิจารณาทางเลือกอื่น ๆ ด้วย) นอกจากนี้ยังเป็นที่ชัดเจนสำหรับฉันว่า A, B และ C จะต้องมีรสชาติเหมือนกัน
Mitch Schwartz

1
บางทีฉันอาจเข้าใจผิดโดยสิ้นเชิง แต่กรณีทดสอบ # 3 และ # 4 ดูเหมือนจะขัดแย้งกัน
James

คำตอบ:


8

brainfuck, 526 ไบต์

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

จัดรูปแบบ:

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

ด้วยความเคารพต่อ A, B และ C: EOF = 0 เซลล์ที่เหลืออยู่ของการเริ่มต้นไม่อนุญาตเซลล์การห่อแบบ 8 บิต

คาดว่าจะตามด้วย?ตามด้วยบี

ลองออนไลน์

(คำตอบนี้สามารถทำกับล่ามสมองที่ไม่อนุญาตให้ออกจากจุดเริ่มต้นที่ค่าใช้จ่ายของหนึ่งไบต์โดยการทับศัพท์y/<>/></และการ>เตรียมการ)

แนวคิดพื้นฐานคือการใช้ชุดของการแทนที่สตริงเพื่อจำลองเทปของ A และ B โดยใช้โหนด 2 เซลล์ด้วยความสนใจเป็นพิเศษในการแทนที่.ใน A และ,ใน B เพื่อให้สตรีมข้อมูลระดับกลางถูกเก็บไว้ในบล็อกของ เซลล์ทางด้านซ้ายของเทปจำลอง ชุดรูปแบบการเปลี่ยนสตริงคือ:

  • ใส่>>ก่อน A

  • ในทั้ง A และ B ให้แทนที่>ด้วย>[-]+>และ<ด้วย<<

  • ใน A ให้แทนที่.ด้วย>[-]-[>>]+[[>+<-]<[>+<-]<]>+[->>+]<[>>>-<<+[<<]<+>>>[>>]+<<<-]>[+<->]+</

  • แทรก>[>>]+>หลังจาก A และก่อน B

  • ใน B แทนที่,ด้วย,[,]>,<<[<<]<[[>]>>[>>]<+<[<<]<[<]>-]>[>]>>[>>]+<*


,[>,]<[.<]?,[...,]ป้อน12345กลับ111แม้มีเพียงพอ>มาก่อนหรือไม่
l4m2

@ l4m2 อืมก็ทำงานสำหรับฉันใน TIO ( ,[>,]<[.<]ไม่ถูกต้อง แต่>,[>,]<[.<]เป็น.)
Mitch Schwartz

ดังนั้น "ของคุณจะช่วยให้ไปทางซ้ายของเซลล์เริ่มต้น" คืออะไร?
l4m2

1
ดังนั้นคำตอบของคุณต้องการ BF ที่เริ่มต้นในช่วงกลางของเทปที่ไม่มีที่สิ้นสุด แต่ธรรมชาติของ A และ B นั้น จำกัด อยู่ที่มาตรฐานที่หนึ่งเริ่มต้นที่เซลล์แรกบนเทปที่ไม่มีที่สิ้นสุดไปทางขวา?
Sylwester

1
สำหรับวิธีนี้การไปทางซ้ายของเซลล์เริ่มต้นไม่ได้รับอนุญาตใน A, B และ C แต่อนุญาตให้ใช้ในโปรแกรม (เราอาจเรียกมันว่า D เพื่อความสะดวก) ที่ใช้ A และ B จากนั้นสร้าง C ฉัน ไม่คิดว่ามันจะโดดเด่นมากและเป็นทางเลือกที่เป็นธรรมชาติให้ธรรมชาติของการแก้ปัญหา การไปทางซ้ายของการเริ่มมีผลกระทบที่สำคัญในบริบทของ A, B และ C แต่มันค่อนข้างเล็กน้อยสำหรับ D และทำให้ผู้เล่นมีประสบการณ์การเล่นกอล์ฟที่สนุกสนานมากขึ้นรวมถึงคะแนนที่สั้นกว่าเล็กน้อยและไม่ควรทำ ทดสอบที่น่าเบื่อกว่านี้เนื่องจากง่ายต่อการเติม>s ถึง D ตามต้องการ
Mitch Schwartz

6

brainfuck , 1287 ไบต์

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

ลองออนไลน์!

นี่ไง! รหัส brainfuck ที่ประกอบด้วยสองรหัส brainfuck ใช้ "!" เพื่อแยกข้อมูลโค้ดสองชุด ยกตัวอย่างเช่นข้อมูลโค้ด A: >,[>,]<[.<]ตัวอย่างข้อมูล ,[...,]B: ป้อนข้อมูลสำหรับโปรแกรมของฉัน: >,[>,]<[.<]!,[...,]. จะไม่ยุติหากไม่มี "!" พบว่า

สิ่งนี้ทำหน้าที่เหมือนกับ VBA เวอร์ชันของฉัน รหัสที่สร้างขึ้นเหมือนกับในรุ่น VBA (โปรดทราบว่าตัวอย่างในโพสต์ VBA ถูกสร้างขึ้นก่อนการเปลี่ยนแปลงล่าสุดในตัวอย่าง brainfuck)

คำอธิบาย

นี่คือรหัสที่มาของฉัน:

[ 
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: ขออภัยฉันทำผิดเล็กน้อยในข้อมูลการทดสอบ ฉันเขียน>[,>]<[.<]!,[...,]ดังนั้นข้อมูลโค้ด A จึงไม่ส่งออกอะไรเลย แน่นอนมันต้อง>,[>,]<[.<]!,[...,]เป็นตัวอย่างการทำงาน
Dorian

5

VBA, 512 489 479 ไบต์

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

คำอธิบาย

โค้ด VBA เปลี่ยนโค้ด brainfuck ในทางที่เอาต์พุตของโค้ด A จะถูกเก็บไว้ในรายการและอินพุตของโค้ด B จะถูกอ่านจากรายการนั้น

มันเริ่มต้นตัวแปรบางตัวก่อน

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

จากนั้นก็จะอ่านข้อมูลเท่านั้นและแทนที่ทุก<โดย<<<[+]-<<ทุก>โดย>>>>>>>[+]-<<คนและทุกคน.โดยขั้นตอนการจัดเก็บ

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

หลังจากนั้นจะลบหน่วยความจำของข้อมูลย่อย A และทำการเปลี่ยนแปลงรายการที่เก็บไว้ดังนั้นจึงสามารถอ่านได้เป็นข้อมูลป้อนเข้าสำหรับตัวอย่างข้อมูล B:

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

จากนั้นข้อมูลโค้ด B จะถูกอ่านทุกคน<จะถูกแทนที่ด้วย<<<<<ทุกคน>จะถูกแทนที่ด้วย>>>>>และทุกคน,จะถูกแทนที่ด้วยรูทีนการอ่านรายการ:

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

รหัสที่มา Brainfuck

นี่คือที่มาของฉันสำหรับส่วน brainfuck ของรหัส ฉันจะอธิบายรายละเอียดในภายหลัง

[
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

เอาต์พุตสำหรับกรณีทดสอบ 1: f ",[..,]",",[...,]"

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

ลองออนไลน์!

เอาต์พุตสำหรับกรณีทดสอบ 2: f ">,[>,]<[.<]",",[...,]"

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

ลองออนไลน์!

เอาต์พุตสำหรับกรณีทดสอบ 3: f ",.",",."

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

ลองออนไลน์!

กรณีทดสอบที่ซับซ้อน: ตัวอย่าง A: สร้างสามเหลี่ยมตัวอักษร>+++++[<+++++>-]<+[>>[>[.>]]>++++++++++.--[<++++++++>-]<[+.<]<-]>>,>[.>]++++++++++.[<[.<]>,>[.>]<] ลองออนไลน์!

ตัวอย่าง B: เรียงลำดับข้อมูลเรียงจากน้อยไปมาก>>,[>>,]<<[[-<+<]>[>[>>]<[.[-]<[[>>+<<-]<]>>]>]<<] ลองออนไลน์!

ผลลัพธ์:

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

ลองออนไลน์!


ขอบคุณ. ฉันรู้ว่านี่เป็นสิ่งที่ไม่ดีนัก ฉันแค่ต้องการให้รหัสการทำงานแรก จะทำการเปลี่ยนแปลงในส่วนของ brainfuck ของรหัสด้วย
Dorian

5

Brainfuck , 785 ไบต์

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

ลองออนไลน์!

ที่จะแยกจาก BI /เลือกใช้สำหรับ

ชี้แจง:

รหัสจริงที่สร้างนี้เป็นเพียงการอ่านวงที่มีธงสำหรับ A / B และสวิทช์ที่ช่วยลดการป้อนข้อมูลที่จะมองหาที่>, <, /, ,และ.และอื่น ๆ เพียงแค่การส่งออกการป้อนข้อมูล อันที่จริงมันเป็นเพียง transpiler ที่รหัส transpiled อาศัยอยู่ในโครงสร้างข้อมูลเช่นที่จะไม่ยุ่งเกี่ยวกับข้อมูลที่เก็บไว้จาก A หรือกันและกัน /เพียงแค่ย้ายเซลล์ที่ใช้งานกับมือถือที่ไม่ได้ใช้ครั้งแรก ฉันทำความสะอาดมันตอนแรก แต่นั่นทำให้โปรแกรมและผลลัพธ์ใหญ่ขึ้น

ผลลัพธ์ของโปรแกรมมีรูปแบบหน่วยความจำต่อไปนี้:

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

cเป็นพัง czอยู่เสมอ0มันชี้ให้เห็นว่าในตัวชี้ข้อมูล BF ของฉันที่ถูกจำลอง ค่าที่ใช้งานอยู่ในขณะ -1 1เซลล์เข้าเยี่ยมชมทุกคนจะมี ในการดำเนินการเช่นaprintและbreadบางคนcได้รับความหมายพิเศษ

การพิมพ์รหัส A จะข้ามเซลล์ทั้งหมด 1 ไบต์เพื่อออกจากห้องเพื่อป้อนข้อมูลอีกหนึ่งไบต์ซึ่งเป็นสำเนาที่มีการสำรองข้อมูลในไบต์ถัดไปจะพังเพื่อคัดลอกกลับ

B-code จะอ่านข้อมูลจากอินพุต การทำลายที่นี่ก็โอเคและเมื่อคุณ "อ่าน" ไบต์สุดท้ายคุณจะได้รับ 0 เป็น EOF โดยไม่คำนึงถึงการใช้งาน

ฉันเริ่มจากการเป็นรหัสExtended BrainFuck ที่ทำให้ได้ผลลัพธ์ EBF การดีบักส่วนใหญ่ทำในไฟล์ผลลัพธ์แล้วอัปเดตเป็นแหล่งที่สร้างขึ้น จากนั้นฉันก็จัดการการดำเนินการอย่างอิสระเพื่อรับเอาท์พุท BF แต่ฉันสังเกตเห็นคำตอบของโดเรียนซึ่งเอาชนะฉันได้ในความยาว แหล่งต้นฉบับค่อนข้างอ่านง่ายและเรียบง่ายเมื่อเทียบกับสิ่งอื่น ๆ ที่ฉันเคยทำ:

: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

หากฉันเข้าใจอย่างถูกต้อง[->+]ในโปรแกรม C ทำให้เกิดความล้มเหลวสำหรับอินพุตเช่น->->,./,.และสิ่งนี้สามารถแก้ไขได้โดยใช้[->>+](ทำให้แน่ใจว่าตัวชี้เริ่มต้นบนเซลล์ที่มีพาริตีที่ต้องการ) สำหรับ[-<+]ฉันคิดว่าคุณสามารถเปลี่ยนรูปแบบการนำทางเพื่อพึ่งพาผลลัพธ์ทั้งหมดของ A ที่ไม่ใช่ศูนย์
Mitch Schwartz

ฉันไม่แน่ใจว่าคุณหมายถึงอะไร เมื่อ A คือ->->,.และ B ,.ล่ามที่คุณต้องการจะสร้าง C เหมือนกับ TIO และ C ทำงานตามที่คาดไว้กับล่ามของคุณหรือไม่ เพราะมันล้มเหลวใน TIO (ฉันเขียนสิ่งนี้เพื่อตอบสนองต่อความคิดเห็นที่ถูกลบไปแล้วในตอนนี้)
Mitch Schwartz

@MitchSchwartz ขอบคุณสำหรับความคิดเห็นของคุณ ฉันค่อนข้างอวดดีเนื่องจากฉันไม่ได้คาดหวังว่าจะสแกนหา-1ข้อมูลผู้ใช้ แต่แน่นอนว่าฉันทำในบรรทัด "ไปที่เซลล์ที่ใช้งานอยู่ ฉันได้อัปเดตคำตอบแล้วฉันก็เพิ่มไบต์: -O แต่อย่างน้อยก็ใช้ได้ BTW ถ้าอิ่มไม่ได้ใช้สำหรับการสแกน-1เมื่อเรียกการป้อนข้อมูลใน B ผมจะต้องย้ายไบต์ที่ใช้งานพร้อมสำเนา>[-<+]<และทำให้ฉันจะเพิ่มตัวอักษรมากกว่าที่ฉันบันทึกโดยการแทนที่ด้วย+[-<+]- [<]หากคุณไม่คัดลอกคุณจะไม่สามารถทราบได้ว่าไบต์ที่คุณ compied เสร็จและคัดลอกไบต์ทั้งหมด
Sylwester

กล่าวถึงดีของฉัน[-<+]เป็นจริงยังอยู่ในเรื่องที่เกี่ยวกับการขจัดข้อบกพร่อง (เมื่อเทียบกับการประหยัดไบต์) สำหรับการป้อนข้อมูลเช่น-./,>++++++[<++++++>-]<.ที่ควรพิมพ์มากกว่า# %:) แต่ฉันเห็นโอกาสในการบันทึกไบต์ด้วย โชคดี! ฉันจะพยายามเพิ่มประสิทธิภาพการแก้ปัญหาเทปที่ไม่มีที่สิ้นสุดของฉันเป็นสองเท่าแม้ว่าการเห็นสิ่งที่คุณทำทำให้ฉันคิดว่าเทปที่ไม่มีที่สิ้นสุดที่เหมาะสมอาจเป็นนักกอล์ฟในท้ายที่สุด
Mitch Schwartz

ดังนั้นหลังจากตรวจสอบรหัสของคุณอย่างใกล้ชิดฉันพบว่าการตั้งค่าของเราคล้ายกันมากและการใช้เทปที่ไม่มีที่สิ้นสุดที่เหมาะสมของคุณนั้นดีกว่าสำหรับการเล่นกอล์ฟมากกว่าเทปที่ไม่มีขีด จำกัด สองเท่าของฉัน โปรดดูข้อมูลล่าสุดของฉันสำหรับวิธีการแก้ปัญหาที่ผสมผสานความคิดของเรา ผมรู้สึกว่าการเล่นกอล์ฟ C เป็นส่วนที่น่าสนใจที่สุดของปัญหานี้ แต่ยังมีห้องพักบางอย่างเพื่อให้อยู่นอกโปรแกรมสตริงทดแทนสั้นที่ ...
มิทช์ Schwartz

4

sed, 165 ไบต์

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

สำหรับรสชาติที่มี EOF = 0 เซลล์ที่เหลืออยู่ของเซลล์เริ่มต้นไม่อนุญาตให้ใช้เซลล์ปิดล้อม 8 บิต

คาดว่าโปรแกรม A ในบรรทัดแรกและ B ในบรรทัดที่สอง

ลองออนไลน์

สิ่งนี้ใช้โหนด 2 เซลล์เพื่อจำลองเทปของ A และ B โดยที่เอาต์พุตของ A ครอบครองเซลล์ต่อเนื่องทางด้านซ้ายของโหนดด้านซ้ายสุด

ทางเลือก 173 ไบต์:

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

ลองออนไลน์

เดิมการออกแบบของฉันใช้เทปอนันต์เป็นทวีคูณซึ่งจำเป็นต้องใช้งานมากในการเลื่อนไปทางซ้าย (การย้ายข้อมูลเมื่อผ่านเซลล์ด้านซ้ายสุดที่เคยพบมาก่อนหน้านี้) และการเปลี่ยนจาก A เป็น B (ล้างข้อมูลแทนที่จะเดินทางผ่านเซลล์ขวาสุดเท่านั้น พบก่อนหน้านี้)

ขอบคุณ Sylwester และ Dorian สำหรับเทคนิคและความคิด


มันดูดีมาก น่าเสียดายที่มันล้มเหลวในการทดสอบครั้งแรก โปรแกรม,[..,]และโปรแกรม ,[...,]B
Dorian

โอ้นี่เป็นการกำกับที่โง่เขลาในส่วนของฉันฉันรีบมากเกินไป แก้ไขได้ แต่ฉันควรลบทิ้งตอนนี้
Mitch Schwartz

@Dorian มันควรได้รับการแก้ไขในขณะนี้ (ฉันจะดูต่อไป) ขอขอบคุณที่ชี้ให้เห็นข้อผิดพลาดและขออภัยในความไม่สะดวก
Mitch Schwartz

ฉันรู้ว่าบางไบต์สามารถบันทึกได้เช่นโดยมีs/x/>>/gจุดจบที่สุด แต่ฉันสนใจในการปรับปรุงที่จะทำให้ผลผลิตสั้นลงในตอนนี้
Mitch Schwartz
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.