두 개의 Brainfuck 프로그램 작성


10

2 개 브레인 퍽 코드 단편을 감안 A하고 B, 출력 일부 브레인 퍽 코드 C실행하는 것과 같은 동작 갖는다 B의 입력으로 A의 결과. 주의 C가 주어진 것처럼, 다음과 같은 가정을 일치하는 입력을위한 필수 작업 A.

당신은 가정 할 수 있습니다 :

  1. 유한 입력.
  2. A와 B가 모두 정지합니다.
  3. EOF는 지속적으로 0이거나 지속적으로 -1입니다.
  4. 셀을 왼쪽으로 일관되게 허용 또는 허용하지 않음
  5. 제한이없는 테이프 (그렇지 않으면 요구 사항이 불가능할 수 있음)
  6. 일관되게 8 비트 래핑 또는 무한 정수
  7. EOF를 나타내는 바이트를 포함하는 스트림 (A 또는 B의 입력 또는 출력)이 없습니다.
  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가 첫 번째 바이트를 통과하지 못하도록 허용합니다. 대답 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 비트 랩핑 셀입니다.

A 다음 ?에 B 가 올 것으로 예상 합니다.

온라인으로 사용해보십시오

(이 답변은 음역 y/<>/></하고 앞에 붙임 으로써 1 바이트의 비용으로 시작을 떠날 수없는 brainfuck 인터프리터를 준수 할 수 있습니다 >.)

기본적인 아이디어는 대체에게 주어진 특별한주의와 함께, 2 셀 노드를 사용하여 A와 B의 테이프를 시뮬레이션하기 위해 문자열 교체의 시리즈를 사용하는 것입니다 .(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에서 허용되지 않지만 A와 B를 취한 다음 C를 생성하는 프로그램에서는 편의상 D라고 할 수 있습니다. 이것이 매우 놀랍지 않다고 생각하고 솔루션의 성격을 고려할 때 자연스러운 선택입니다. 시작의 왼쪽으로 가면 A, B 및 C의 맥락에서 중요한 결과를 초래할 수 있지만, D에게는 아주 사소한 것이며, 주관적으로보다 즐거운 골프 경험과 약간 더 짧은 점수를 주어야합니다. >필요에 따라 D 를 앞에 추가하기 쉽기 때문에 더 지루한 테스트가 필요합니다.
Mitch Schwartz

6

brainfuck , 1287 바이트

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

온라인으로 사용해보십시오!

여기있어! 두 개의 brainfuck 코드를 구성하는 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는 아무것도 출력하지 않습니다. 물론 그것은 >,[>,]<[.<]!,[...,]실례가 되어야합니다 .
Dorian

5

VBA, 512 489 479 바이트

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

설명

VBA 코드는 스 니펫 A의 출력이 목록에 저장되고 스 니펫 B의 입력이 해당 목록에서 읽히도록 방식으로 brainfuck 코드를 변경합니다.

먼저 일부 변수를 초기화합니다.

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

그런 다음 코드 조각 읽고 모든 대체 <하여 <<<[+]-<<모든, >에 의해 >>>>>>>[+]-<<모든 .수납 루틴

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

그런 다음 스 니펫 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 바이트

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

온라인으로 사용해보십시오!

BI에서 A를 분리하려면을 (를) 선택했습니다 /.

설명 :

이 생성되는 실제 코드는 A / B를위한 플래그 찾기 위해 상기 입력 스위치 감소 단지 읽기 루프 >, <, /, ,,와 .달리 단지 출력을 입력한다. 실제로는 변환 된 코드가 A 또는 서로의 저장된 데이터를 방해하지 않도록 데이터 구조 내에있는 트랜스 필러 일뿐입니다. 는 /단지 제 않는 셀 활성 세포 이동. 나는 원래 그것을 정리했지만 프로그램과 출력을 크게 만듭니다.

프로그램 결과는 다음과 같은 메모리 모델을 갖습니다.

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

c무너질 것입니다. cz항상 0에뮬레이트 된 BF 데이터에서 포인터의 위치를 ​​나타냅니다. 방문한 모든 셀의 값은 -1이지만 활성 값은 -1 1입니다. 같은 작업에서 aprint그리고 bread일부는 c특별한 의미를 얻는다.

코드 인쇄는 1 바이트 이상의 모든 셀을 건너 뛰어 한 바이트 이상의 입력을위한 공간을 남겨두고 다음 바이트의 백업으로 복사하여 다시 복사합니다.

B 코드 읽기는 입력에서 입력을 가져옵니다. 여기서 파괴적인 것은 괜찮으며 마지막 바이트를 "읽을"때 구현에 관계없이 0을 EOF로 얻습니다.

EBF 결과를 만드는 Extended BrainFuck 코드 로 시작했습니다 . 대부분의 디버깅은 결과 파일에서 수행 된 후이를 생성 한 소스로 업데이트됩니다. 그런 다음 BF 출력을 얻기 위해 독립적으로 작업을 실행하지만 Dorian의 대답을 발견하여 길이가 길어 졌기 때문에 작은 BF 출력을 위해 EBF 소스를 계속 사용했습니다. 원래 소스는 내가 한 다른 것들과 비교하여 읽기 쉽고 간단합니다.

: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의 모든 출력이 0이 아닌 것을 사용하도록 탐색 체계를 변경할 수 있다고 생각합니까?
Mitch Schwartz

무슨 말인지 잘 모르겠습니다. A가 ->->,.B가 인 ,.경우 선호하는 통역사가 TIO와 동일한 C를 생성하고 C가 통역사에서 예상대로 작동합니까? TIO 에서는 실패 하기 때문 입니다. (현재 삭제 된 의견에 대한 답변으로 이것을 작성했습니다.)
Mitch Schwartz

@MitchSchwartz 댓글 주셔서 감사합니다. 나는 -1사용자 데이터 를 스캔 할 것으로 기대하지 않았기 때문에 약간 건방진 했지만 실제로는 "활성 셀로 이동, 0으로"라인에서 수행했습니다. 내 대답을 업데이트 한 다음 바이트 : -O를 추가했지만 적어도 작동합니다. BTW. -1B에서 입력을 가져올 때 스캔을 사용하지 않으면 복사로 활성 바이트를 이동해야 >[-<+]<하므로로 대체 +[-<+]-하여 저장하는 것보다 많은 문자를 추가 [<]합니다. 복사하지 않으면 사용중인 바이트가 완료되었는지 알 수없고 모든 바이트를 복사 할 수 없습니다.
Sylwester

그럼 내 언급 [-<+](저장 바이트 반대) 등의 입력, 버그를 제거에 관하여도 실제로 있었다 -./,>++++++[<++++++>-]<.인쇄해야하는 #것이 아니라 %. :) 그러나 바이트를 절약 할 수있는 기회가 있다고 생각합니다. 행운을 빕니다! 나는 당신이 한 일을 보았을 때 결국 무한 테이프가 골퍼라고 생각하게 만들지 만 이중 무한 테이프 솔루션을 최적화하려고 노력할 것입니다.
Mitch Schwartz

따라서 코드를 자세히 살펴본 결과 설정이 매우 비슷하며 올바른 무한 테이프를 사용하는 것이 내 이중 테이프보다 골프에 훨씬 좋습니다. 우리의 아이디어를 결합한 솔루션에 대한 최근의 sed 업데이트를 참조하십시오. 골프 C가이 문제의 가장 흥미로운 부분이라고 생각하지만, 문자열 교체 프로그램을 그보다 더 짧게 만들 수있는 여지가 있습니다.
Mitch 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 ,[...,].
도리안

아, 이건 내 멍청한 감시 야, 너무 서둘러. 고칠 수 있지만 지금은 삭제해야합니다.
Mitch Schwartz

@ 도리안 지금 고쳐야합니다. (계속 살펴 보겠습니다.) 실수를 지적 해 주셔서 감사하고 불편을 드려 죄송합니다.
Mitch Schwartz

예를 들어 s/x/>>/g맨 끝을 가짐으로써 일부 바이트를 절약 할 수 있다는 것을 알고 있지만 현재 출력을 단축시키는 개선에 더 관심이 있습니다.
Mitch Schwartz
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.