Brainf *** NOP 생성


26

때로는 brainfuck 코드를 작성할 때 디버깅 을 장려 하기 위해 필요한 것보다 더 길게 만들어야 할 필요가 있다고 생각합니다 . 당신은 ><거기에 a 를 두들겨서 그것을 할 수 있지만, 그게 무슨 재미입니까? 코드를 읽는 사람을 혼동 시키려면 더 길고 적은 NOPey가 필요합니다.

Brainfuck 빠른 소개

Brainfuck 은 Urban Müller가 1993 년에 만든 난해한 프로그래밍 언어로 극도의 미니멀리즘으로 유명합니다. (위키 백과)

Brainfuck은 8 가지 명령을 기반으로하는 언어입니다 +-><,.[]. 코드는 Turing 머신과 같이 실행됩니다 : 값을 변경할 수있는 무한 테이프. 이 도전에서 우리는 처음 네 가지에 중점을 둘 것입니다.

+    increment the value at the pointer
-    decrement the value at the pointer
>    move the pointer right
<    move the pointer left

Brainfuck NOP

brainfuck NOP는 어떤 상태에서도 실행될 때 상태에 영향을 미치지 않는 일련의 brainfuck 문자입니다. 위에서 언급 한 4 개의 문자로 구성됩니다.

도전

문제는 실행될 때 주어진 길이의 무작위 brainfuck NOP를 생성하는 프로그램이나 함수를 작성하는 것입니다.

입력

음이 아닌 짝수 인 정수를 입력으로받습니다 n. (NOP는 홀수로 불가능합니다 n.)

산출

길이의 임의의 brainfuck NOP를 출력합니다 n.

규칙

  • NOP의 정의 : 프로그램의 출력이 brainfuck 프로그램의 어느 시점 에든 삽입 될 때, 상기 프로그램의 동작은 어떠한 방식으로도 변하지 않아야합니다. 즉, 인터프리터의 상태를 변경해서는 안됩니다.
    • 예를 들어 +>-<두 셀의 값을 다시 변경하지 않고 변경하기 때문에 올바르지 않습니다. 게시하기 전에 솔루션에 대한 솔루션을 테스트하십시오.
    • 또한 +>-<->+<NOP 만 제거하면 아무것도 줄일 수 없습니다 >< <> +- -+. 따라서 이들을 서로 삽입하는 알고리즘은 사용할 수 없습니다.
  • 길이의 모든 유효한 NOP n는 출력에 0이 아닌 가능성이 있어야합니다. 그러나 분포가 균일 할 필요는 없습니다.
  • 문제의 해석기는 임의의 정밀 세포로 된 무한한 두 배의 테이프를 가지고 있습니다. 즉, 양방향으로 무한대로 이동하고 각 셀을 무한대로 증감시킬 수 있습니다.
  • 프로그램은 내 컴퓨터에서 = 100 동안 1 분 이내에n 완료되어야 하므로 가능한 모든 NOP를 생성하고 하나를 선택하지 않습니다.
  • 유효하지 않은 입력 (정수가 아닌, 음수, 홀수 등)이 주어지면 충돌을 포함하여 원하는 모든 작업을 수행 할 수 있습니다.

채점

이것은 이므로 바이트 단위의 최단 답변이 이깁니다.

n= 4에 대한 모든 유효한 출력은 다음과 같습니다 .

++--    +-+-    +--+    --++    -+-+    -++-
>><<    ><><    ><<>    <<>>    <><>    <>><
><+-    ><-+    <>+-    <>-+
>+-<    >-+<    <+->    <-+>
+><-    -><+    +<>-    -<>+
+-><    -+><    +-<>    -+<>

n= 20에 대한 몇 가지 가능한 출력은 다음과 같습니다 .

+>>->+<->-<<<->>++<<
>+>-<+<->+-<>->+<-<+
+--+-++--++-+--+-++-
>>>>>>>>>+-<<<<<<<<<

18
여기에 +-<>당신이 요청 한대로 사용하지 않는 brainfuck NOP가 있습니다 :a
undergroundmonorail

1
단순하지 않은 NOP가 존재하지 않는다고 생각하므로 해당 자격을 제거 할 수 있습니다. .부작용이 ,있으며를 사용하지 않고는 복구 할 수없는 값을 덮어 씁니다 []. 그러나 []값을 0으로 설정합니다. 또한 []영향을받는 셀이 처음에 0이라는 것을 확신 할 수 없다면 값을 덮어 씁니다 (따라서 복구하기 위해 다른 것이 필요 합니다). 그러나와 같은 셀을 검색해야 [>]하며 원래 위치로 안정적으로 돌아갈 수 없습니다.
Martin Ender

4
@Eumel "문제의 두뇌 해석기는 임의의 정밀 세포의 이중 무한 테이프를 가지고 있습니다."
Martin Ender

2
참고주세요 "브레인 퍽은"더 이상 질문 제목으로 허용되는 시스템 수준에서. 비 ASCII 문자를 사용하여 제한을 피할 수있는 것으로 보입니다. 앞으로이 제한 사항을 준수하십시오.
Alex A.

2
@undergroundmonorail 글쎄, 그것은 튜링 완료입니다 ... 기술적으로 다른 언어와 마찬가지로 PRNG를 작성할 수 있습니다. (비록 힘들 수 있습니다 파종.)
PurkkaKoodari

답변:


13

CJam, 62 59 바이트

3 바이트를 절약 해 준 nhahtdh에게 감사합니다.

각각의 no-op가 유한 확률로 나타나는 한 특정 분포에 대한 요구 사항이 없기 때문에 균형 잡힌 숫자 -+와를 포함하는 문자열을 생성 <>하고 NOP인지 테스트하여 정렬하면 간단히 단순화 할 수 있습니다. 그렇지 않습니다.

물론 더 긴 입력의 경우 거의 항상 출력이 정렬되지만 결과적으로 8주어진 길이의 NOP를 생성 할 수 있는지 와 같은 입력을 사용하여 코드를 테스트 할 수 있습니다 .

ri_0a*\2/{;"-+<>":L2/mR}%smr:SL["Xa.Xm"3/2e*L]z:sers~0-S$S?

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


1
예 ... 임의의 제한은 10 초 미만의 n = 1000이어야합니다. 컴퓨터는 오늘날 금식하는 길입니다 ^^ 알고리즘 응답이 n = 1000 일 때도 1 초 안에 해결하기 때문에
Falco

더 큰 n의 경우 균형 잡힌 문자열이 NOP가 아닌 경우 출력을 정렬하는 것이 가능하다고 생각합니다. 분포가 심하게 왜곡되었지만 질문에 의해 허용됩니다.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ 그것은 깔끔한 아이디어입니다.
Martin Ender

@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ 감사합니다. 실제로 여기에도 3 바이트가 절약됩니다.
Martin Ender

16

CJam, 118 116 바이트

이것은 약간 손에 들었습니다 ... 특히 후반은 골프를 좋아하는 것처럼 보입니다.

ri2/_)mr:R-"<>"R*mr_'=fm0\{1$+}%+__&e`]:\{mr1aa..+}*\@](\z:~\{~\("+-"*mr1$3$e=[{_,)mr_2$<@@>}*+]@@f{`1$`={(}@?\}W<}/

여기에서 테스트하십시오.

이것은 N = 100거의 즉시 처리 됩니다. 지금 코드의 전체 분석을 작성할 시간이 없으므로 알고리즘은 다음과 같습니다.

  • 의 임의의 균형 잡힌 캐릭터 생성 <>임의 (심지어) 사이의 길이 0N포함합니다.
  • 테이프 헤드 위치를이 어레이에 리플하십시오. 예를 "<>><"하게된다 [0 '< -1 '> 0 '> 1 '< 0].
  • 프로세스에서 도달 한 모든 직위 목록을 가져옵니다.
  • 이러한 각 위치에 대해 빈 문자열을 초기화하십시오. 또한 길이의 문자열에 도달하기 위해 남은 문자 쌍 수를 결정하십시오 N.
  • 나머지 각 쌍 +-에 대해 임의 위치의 문자열에 추가하십시오 .
  • 모든 문자열을 섞습니다.
  • 각 위치에 대해 리플 배열에서 해당 위치가 발생하는 빈도를 결정하고 해당 문자열을 많은 (임의 길이) 청크로 나눕니다.
  • riffled 배열에서 위치 발생을 임의의 청크로 바꿉니다.

끝난. 이것은 다음과 같은 관찰을 기반으로합니다.

  • 상관 NOP는 동일한 양이 있어야 <하고 >원래 위치로 테이프 헤드를 반환.
  • 각 테이프 셀이 감소하는 횟수만큼 증가하는 한 코드는 NOP입니다.

테이프 헤드가 지정된 셀에있는 모든 위치에 임의의 균형 잡힌 양의 +s와 -s 를 분배함으로써 가능한 모든 NOP를 찾을 수 있습니다.


4

Mathematica, 350 바이트

Quiet@(For[a="+",If[{##4}=={},#3!=0||Union@#!={0},Switch[#4,"+",#0[ReplacePart[#,#2->#[[#2]]+1],#2,#3,##5],"-",#0[ReplacePart[#,#2->#[[#2]]-1],#2,#3,##5],">",#0[#~Append~0,#2+1,#3+1,##5],"<",If[#2<2,#0[#~Prepend~0,1,#3-1,##5],#0[#,#2-1,#3-1,##5]]]]&@@{{0},1,0}~Join~Characters@a,a=""<>RandomSample@Flatten@RandomChoice[{{"+","-"},{">","<"}},#/2]];a)&

너무 오래? 예. 나도 신경써? 다른 사람이 유효한 답변을 게시 할 때까지는 그렇지 않습니다.


4
설명을 추가하여 사람들이 실제로 자신에게 이것이 유효하다는 것을 확신시킬 수 있습니까? :)
Martin Ender

정확히 어떻게 합니까 이 일을? 숫자로 함수를 호출하면 만 반환합니다 +.
Martin Ender

@ MartinBüttner Fixed ... 현재 NOP가 될 때까지 동일한 수의 +- -<- >쌍을 가진 임의의 프로그램을 생성 합니다. 그것의 절반은 간단한 BF 통역사가 가져옵니다.
LegionMammal978

실제로 1 분 안에 길이 100의 유효한 no-op를 생성합니까?
Martin Ender

@ MartinBüttner 네. 평균적으로 5 초 정도 걸립니다. 처음에는 완전히 임의의 프로그램을 시도했지만 길이 100에 대해서는 종료되지 않았습니다.
LegionMammal978


2

파이썬 3 , 163 바이트

from random import*
n=int(input())
p=0;d=[0]*n;a=choices(b'+-<>',k=n)
for c in a:d[p]+=c%2*(44-c);p+=~c%2*(c-61)
if p|any(d):a=n//2*b'+-'
print(*map(chr,a),sep='')

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

결과를 STDOUT에 인쇄하는 전체 프로그램. BF 코드를 실행하는 라인은 골프 용일 수 있습니다.

Tyilo의 접근 방식 채택; 생성 된 BF 코드가 NOP가 아닌 경우 완전히 버리고 다시 '+-'반복합니다.


N에 대한 제한 시간 = 100
l4m2

@ l4m2 그 요구 사항을 알지 못했습니다. 결정된.
Bubbler


1

Wolfram Language (Mathematica) , 224 바이트

(s=RandomSample[##&@@@Table["<"">",(r=RandomInteger)[#/2]]];While[(g=Length@s)<#,s=Insert[s=Insert[s,"+",i=r@g+1],"-",RandomChoice@@Select[GatherBy[0~Range~++g,Count[#,"<"]-Count[#,">"]&@Take[s,#]&],!FreeQ[#,i]&]+1]];""<>s)&

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

다음은 골프화되지 않은 (또는 미리 골프화 된) 버전입니다.

Function[{n},
 k = RandomInteger[n/2];
 s = RandomSample[## & @@@ Table["<" ">", k]];
 While[Length[s] < n,
   s = Insert[s, "+", i = RandomInteger[Length[s]] + 1];
   p = GatherBy[Range[0, Length[s]], 
     Count[#, "<"] - Count[#, ">"]& @ Take[s, #]&];
   j = RandomChoice @@ Select[p, ! FreeQ[#, i] &]];
   s = Insert[s, "-", j + 1];
   ];
 ""<>s]

우리는 먼저 사용할 임의의 숫자와 <의 숫자를 골라 >같은 수의 임의의 목록을 생성합니다.

나머지 문자를 채우려면을 추가 +할 위치를 선택한 다음 포인터가 같은 위치를 가리키는 위치를 찾아 -거기에 추가합니다 .

리스트가 length가 될 때까지 반복 n하고 결과를 문자열 화하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.