Складіть дві програми Brainfuck


10

Дано 2 фрагменти коду brainfuck Aі Bвиведіть код, Cякий має таку саму поведінку, як і запуск Bз введенням Aрезультату s. Зауважте, що Cмає працювати для будь-якого входу, який відповідає наступним припущенням, як ніби він був наданий A.

Ви можете припустити:

  1. Кінцеве введення.
  2. і А, і Б зупиняються.
  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є двома різними критеріями виграшу.
Мего

2
@Mego Я мав на увазі, якщо ти відповідеш мозковим шляхом, і ти виграєш, тебе прийняли
l4m2

1
Також. чи можете ви детальніше розповісти 4.Consistently allow or disallow cells to left. Основна відповідь вимагає, щоб клітинки ліворуч у відповіді працювали, але заборонити A, B і C, щоб не рухатися, пройшли перший байт. Діапазони моїх відповідей рухаються ліворуч у відповідях, A, B і C. Якщо правила для моєї програми та C можуть відрізнятися від A, і B, то я, безумовно, можу значно скоротити свою відповідь.
Сільвестер

1
Вся постановка проблеми стосується A, B і C, і лише два останні речення містять будь-які посилання на мову відповіді. Можливо, автор мав намір відповідь відповідати такому ж аромату, як A, B і C, але це не було моєї вини. Розв’язувачів не слід карати за відсутність передбачуваності авторів. У будь-якому випадку, дійсно тривіально додати кілька >с до початку моєї відповіді, щоб вона відповідала більш обмежувальному смаку (але для гольфу ми також повинні розглянути альтернативи). Крім того, мені здається зрозумілим, що A, B і C повинні бути в тому ж ароматі, як один у одного.
Мітч Шварц

1
Можливо, я зовсім не розумію виклику, але тестові справи №3 та №4, здається, суперечать.
Джеймс

Відповіді:


8

мозковий ебать, 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 за допомогою двоклітичних вузлів, при цьому особлива увага приділяється заміні .в A і ,B, щоб проміжний потік даних зберігався в блоці комірки зліва від імітованої стрічки. Схема заміни рядків:

  • Вставити >>перед A

  • І в А, і В замініть >на >[-]+>і <на<<

  • В А замініть .на>[-]-[>>]+[[>+<-]<[>+<-]<]>+[->>+]<[>>>-<<+[<<]<+>>>[>>]+<<<-]>[+<->]+</

  • Вставити >[>>]+>після A і перед B

  • В B замінити ,на,[,]>,<<[<<]<[[>]>>[>>]<+<[<<]<[<]>-]>[>]>>[>>]+<*


,[>,]<[.<]?,[...,]вхід 12345повертається 111, навіть з достатньою >раніше?
l4m2

@ l4m2 Хм, це працює для мене на TIO . ( ,[>,]<[.<]не вірно, але >,[>,]<[.<]є.)
Мітч Шварц

Отже, яке ваше "це дозволяє перейти ліворуч від стартової комірки"?
l4м2

1
Отже, у вашій відповіді потрібен BF, який починається посередині нескінченної стрічки, але природа A і B обмежена стандартом, коли людина починається спочатку комірки на нескінченній стрічці праворуч?
Сільвестер

1
Для цього рішення ліворуч від пускової комірки заборонено в A, B і C, але це дозволено в програмі (ми для зручності можемо це назвати D), яка приймає A і B, а потім виробляє C. I don Не думаю, що це дуже примітно, і це природний вибір, враховуючи характер рішення. Перехід ліворуч від старту має великі наслідки в контексті A, B і C, але це досить тривіально для D, і суб'єктивно створює приємніший досвід гольфу, а також трохи коротший рахунок, а також не повинен робити тестуючи будь-які більш виснажливі, так як легко додати >s до D за потребою.
Мітч Шварц

6

мозковий ебать , 1287 байт

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

Спробуйте в Інтернеті!

Ось! Код brainfuck, який складається з двох кодів. Використовуйте "!" щоб розділити два фрагменти вхідного коду. Наприклад , сниппета A: >,[>,]<[.<], фрагмент B: ,[...,]. Вхід для моєї програми: >,[>,]<[.<]!,[...,]. Він не припиниться, якщо ні "!" знаходиться.

Це по суті те саме, що і моя версія VBA. Згенерований код такий же, як у версії VBA (зауважте, що приклади в публікації VBA були зроблені до останньої зміни фрагментів мозгового ебать).

Пояснення

Це мій вихідний код:

[ 
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 нічого не видає. Звичайно, це має бути >,[>,]<[.<]!,[...,]робочим прикладом.
Доріан

5

VBA, 512 489 479 байт

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

Пояснення

Код VBA таким чином змінює код мозкового запису, що вихід фрагмента A буде зберігатися у списку, а вхід фрагмента B буде прочитаний із цього списку.

Він спочатку ініціалізує деякі змінні

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

Потім він читає фрагмент A і замінює кожен <на <<<[+]-<<кожен >по >>>>>>>[+]-<<і кожен .по накопичення рутина

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

після цього він видаляє пам'ять фрагмента A і вносить зміни до збереженого списку, щоб його можна було прочитати як вхід для фрагмента B:

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

Потім буде прочитаний фрагмент B, кожен <буде замінений на <<<<<кожен >, замінений на >>>>>кожен ,і буде замінено процедурою читання списку:

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

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: Сортування вхідних даних у порядку зростання >>,[>>,]<<[[-<+<]>[>[>>]<[.[-]<[[>>+<<-]<]>>]>]<<] Спробуйте в Інтернеті!

Результат:

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

Спробуйте в Інтернеті!


Дякую. Я знаю, що це дуже необачно. Я просто хотів надати перший робочий код. Також внесе зміни до мозкової частини коду.
Доріан

5

Brainfuck , 785 байт

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

Спробуйте в Інтернеті!

Для розділення A від BI вибрали /.

Пояснення:

Фактичний код , який генерує це тільки для читання циклу з прапором для A / B і перемикач , який зменшує вхід для пошуку >, <, /, ,, і .та в іншому випадку просто вихідний вхід. Насправді це просто транспілятор, де перероблений код живе в структурі даних таким чином, що він не перешкоджає збереженим даним A або один одного. /Просто переміщує активний осередок в першу невикористану осередок. Я спочатку його прибирав, але це збільшує програму та вихід.

Результат програми має таку модель пам'яті:

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

cЄ покришити. czЦе завжди 0вказує, де в моїх емульованих BF даних вказівник. Активне значення -1, тоді як усі відвідувані клітини матимуть 1. У таких операціях, як aprintі breadдеякі, cнабувають особливого значення.

Друк коду пропускає всі клітинки на 1 байт, щоб залишати місце для ще одного байтового введення, який копії з резервною копією в наступних байтах розсипається для копіювання назад.

B-код зчитування отримує вхід з введення. Тут руйнівно нормально, і коли ви "читаєте" останній байт, ви отримуєте 0 як EOF незалежно від реалізації.

Я почав як розширений код BrainFuck, що дає результат EBF. Більшу частину налагодження було зроблено на результатах, а потім оновлення до джерела, яке її генерувало. Тоді я просто запускаю операції незалежно, щоб отримати вихід BF, але я помітив відповідь Доріана, який бив мене в довжину, тому я продовжував гольфувати джерело 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 є ненульовим?
Мітч Шварц

Я не впевнений, що ти маєш на увазі. Коли A є ->->,.і B є ,., чи бажаний перекладач виробляє той самий C, що і TIO, і чи працює C, як очікувалося на вашому перекладачі? Тому що це не в TIO . (Я написав це у відповідь на коментар, який зараз видалено.)
Мітч Шварц

@MitchSchwartz Дякуємо за ваш коментар Я був трохи зухвалим, оскільки не сподівався сканувати -1хоч дані користувача, але я дійсно робив у рядку "перейти до активної комірки, нуль". Я оновив свою відповідь, а потім додав байт: -О, але принаймні це працює. До речі. Якщо я не використовую -1функцію сканування для для отримання даних в B, мені доведеться перемістити активний байт з копією, >[-<+]<і таким чином я додаю більше знаків, ніж я заощаджую, замінивши +[-<+]-на [<]. Якщо ви не скопіюєте, ви не зможете дізнатися, чи був готовий байт закінчений, і скопіюйте всі байти.
Сільвестер

Добре, що моя згадка [-<+]була насправді також щодо усунення помилок (на відміну від збереження байтів) для введення типу -./,>++++++[<++++++>-]<., який повинен друкувати, #а не %. :) Але я бачу певні можливості для збереження байтів. Удачі! Я спробую оптимізувати своє подвійне нескінченне рішення стрічки, хоча побачення того, що ви зробили, змушує мене думати, можливо, врешті-решт, нескінченна стрічка є гравцем.
Мітч Шварц

Тож, уважніше вивчивши ваш код, я виявив, що наші налаштування дуже схожі, і що ви використовуєте правильну нескінченну стрічку набагато краще для гольфу, ніж мою подвійну нескінченну стрічку. Перегляньте моє нещодавнє оновлення седу щодо рішення, яке поєднує наші ідеї. Я відчуваю, що гольф C - найцікавіша частина цієї проблеми, але є також можливість зробити програму заміни струни коротшою поза цією проблемою ...
Мітч Шварц

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 на другому.

Спробуйте в Інтернеті

При цьому використовуються двоклітинні вузли для імітації стрічок A і B, вихід A займає суміжні клітини зліва від крайнього лівого вузла.

Альтернативне 173-байтове рішення:

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

Спробуйте в Інтернеті

Спочатку мій дизайн базувався на подвійній нескінченній стрічці, яка потребувала значно більшої роботи для переміщення ліворуч (переміщення даних при проходженні за межі лівої лівої комірки, що раніше зустрічалася) та переходу від А до В (очищення даних замість того, щоб просто проїхати повз крайню праву клітинку раніше зустрічався).

Дякуємо Сільвестру та Доріану за хитрощі та ідеї.


Це виглядає чудово. На жаль, це не вдається на першому тесті. Програма A ,[..,]і B програми ,[...,].
Доріан

О, це дурний нагляд з мого боку, я занадто поспішив. Це можна виправити, але зараз я повинен його видалити.
Мітч Шварц

@Dorian Це має бути виправлено зараз. (Я продовжую його переглядати.) Дякуємо, що вказали на помилку, і вибачте за незручності.
Мітч Шварц

Я знаю, що деякі байти можна зберегти, наприклад, маючи s/x/>>/gв самому кінці, але мене більше цікавлять вдосконалення, які скоротять вихід.
Мітч Шварц
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.