독특한 출력을 가진 Brainf *** 서브 프로그램


19

100 바이트 long brainfuck (BF) 프로그램을 작성해야합니다.

결과적으로 100 개의 새로운 (99 바이트 길이) 프로그램이 가능한 모든 방법으로 하나의 문자가 제거됩니다. 프로그램에 대한 예 ++.>.5 개 서브 프로그램은 +.>., +.>., ++>., ++..++.>.

점수는 100 개의 프로그램이 생성하는 고유 한 출력의 수입니다. 높은 점수가 좋습니다.

세부

  • 첫 문자를 출력하면 프로그램이 종료됩니다.
  • 빈 출력을 생성하는 유효하지 않거나 종료되지 않는 프로그램 및 프로그램은 점수에 포함되지 않습니다.
  • BF 셀은 8 비트 랩핑 셀입니다. (255 + 1 = 0, 0-1 = 255)
  • 프로그램에 입력이 없습니다. ,코드에서 사용 하면 현재 셀이로 설정됩니다 0.
  • 시작 위치의 왼쪽에 셀이 없습니다. 예를 들어, <.유효하지 않지만 .<실행이에서 종료 될 때 유효합니다 .. 테이프는 다른 방향으로 제한이 없습니다.
  • 불균형 대괄호 ( [])가있는 프로그램 은 유효하지 않습니다.
  • 점수를 변경하지 않고 100 바이트로 쉽게 확장 할 수 있으므로 원래 프로그램은 100 바이트보다 짧을 수 있습니다.
  • 원래 프로그램이 유효한 BF 코드 일 필요는 없습니다.

당신이 사용할 수있는 이 python3 프로그램 (ideone 링크) 답변의 점수를 결정합니다. 장기 실행 프로그램의 경우 maxstep변수 를 수정해야 할 수도 있습니다 .

간단하게하기 위해이 프로그램은 100 바이트보다 짧습니다.

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

Score: 3

Explanation:

Subprogram     => Output

+,+[-]+><.-,-. => 1
+,+[-]+><.-,-. => 1
+++[-]+><.-,-. => 1
++,[-]+><.-,-. => 1
++,+-]+><.-,-. => None
++,+[]+><.-,-. => None
++,+[-+><.-,-. => None
++,+[-]><.-,-. => 0
++,+[-]+<.-,-. => None
++,+[-]+>.-,-. => 0
++,+[-]+><-,-. => 255
++,+[-]+><.,-. => 1
++,+[-]+><.--. => 1
++,+[-]+><.-,. => 1
++,+[-]+><.-,- => 1

Unique outputs are [0, 1, 255]    
Score is 3 for ++,+[-]+><.-,-. (length = 15)

동점 인 경우 더 짧은 코드를 가진 사람이 승자가됩니다. (세부 사항 섹션에 설명 된대로 프로그램의 길이가 100 바이트보다 짧을 수 있습니다.) 코드의 길이가 같은 경우 승자가 초기 포스터입니다.

보너스 퍼즐 : 대담한 제한없이 점수 100의 프로그램을 찾을 수 있습니까?


보너스 퍼즐을 풀었습니다. 답은 (검열)입니다.
AJMansfield

@AJMansfield 다른 사람들도 퍼즐에 대해 생각할 수 있도록 댓글을 편집 할 수 있습니까? 예 를 들어 솔루션을 pastebin.com 링크 로 변경하십시오 .
randomra

3
흠. 기존 답변에 대한 미세 개선을 찾으려고이 질문대한 유전자 최적화 프로그램을 작성 했지만 지금까지는 성공하지 못했습니다. 그들은 각각 79와 43에 붙어 있습니다. 아 잘 – 그것은 가치가 있었다!
wchargin

답변:


12

점수 : 35 41 69 78 79 83

(개행을 제거하십시오.)

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

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

정확히 왜 작동하는지 잘 모르겠습니다 ...

점수 : 79

X->>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>
+>+>+>+>+>+>+>+>+>+>+>+[>[-<+>>+<]+>[-<+>]<<<+]>>.

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

그것은 하였다 하는데 2 합계 * MEM [I] * I 및 어드레스가 오른쪽에서 왼쪽으로 카운트되는 셀의 개수 (+ CONST)를 추가한다. 승수 2와 셀 수는 다른 패리티를 갖는 + 및>를 제거 할 수 있습니다.

실제로 69 포인트 버전에서 그렇게 작동했습니다. 그러나 최신 버전은이를 깨뜨려 우연의 일치로 다른 것을 얻었습니다. 셀 수의 차이가있는 합 (i)을 제외하고는 sum (mem [i] * i + i + 1)을 계산하고 +와>를 제거하면 거의 동일합니다. +와>를 제거합니다.

보너스 :

+. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. + +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +


참고 : 제공된 스코어 프로그램으로 이를 테스트하는 경우 일부 서브 프로그램이 오랫동안 실행될 때 maxstep값 을 증가 시키십시오 (in def evaluate(r,maxstep=20000):).
randomra

1
다음 79으로 대체 ->+>+> ...하여 점수를 높일 수 있습니다.->,>+> ...
BrainSteel

@BrainSteel 방금 변경하지 않았습니다.
jimmy23013

9

점수 : 37 43

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

편집 : 이제 내 프로그램은 대괄호를 허용합니다. 그것으로 어떤 상도 얻지 않을 것이지만, 그것은 일부 가중치 RNG가 나를 위해 바쁜 일을하도록 만드는 것입니다.

이것은 내가 C로 작성한 프로그램에 의해 생성되었습니다.

모든 N문자가 제거 될 때마다 출력은 다음과 같습니다.

N = 0 => 158
N = 1 => 158
N = 2 => 158
N = 3 => 187
N = 4 => 129
N = 5 => 100
N = 6 => 158
N = 7 => 13
N = 8 => 1
N = 9 => 211
N = 10 => 129
N = 11 => 1
N = 12 => 57
N = 13 => 255
N = 14 => Mismatched Braces
N = 15 => 59
N = 16 => 11
N = 17 => 11
N = 18 => 11
N = 19 => 117
N = 20 => 11
N = 21 => 117
N = 22 => 166
N = 23 => Mismatched Braces
N = 24 => 206
N = 25 => 206
N = 26 => 206
N = 27 => 147
N = 28 => 147
N = 29 => 158
N = 30 => 148
N = 31 => 188
N = 32 => 51
N = 33 => 17
N = 34 => 84
N = 35 => 84
N = 36 => 84
N = 37 => 158
N = 38 => 158
N = 39 => 94
N = 40 => 46
N = 41 => 94
N = 42 => 94
N = 43 => 94
N = 44 => 17
N = 45 => 196
N = 46 => Mismatched Braces
N = 47 => 149
N = 48 => No Termination
N = 49 => No Termination
N = 50 => Mismatched Braces
N = 51 => Mismatched Braces
N = 52 => 45
N = 53 => 77
N = 54 => 45
N = 55 => 77
N = 56 => 50
N = 57 => 209
N = 58 => 50
N = 59 => 251
N = 60 => 249
N = 61 => 99
N = 62 => 99
N = 63 => 117
N = 64 => 89
N = 65 => 207
N = 66 => 89
N = 67 => 115
N = 68 => 115
N = 69 => 115
N = 70 => 95
N = 71 => Mismatched Braces
N = 72 => Mismatched Braces
N = 73 => 104
N = 74 => Mismatched Braces
N = 75 => No Termination
N = 76 => No Termination
N = 77 => No Termination
N = 78 => No Termination
N = 79 => Left Overflow
N = 80 => 3
N = 81 => 2
N = 82 => No Termination
N = 83 => Mismatched Braces
N = 84 => No Termination
N = 85 => 133
N = 86 => 133
N = 87 => 0
N = 88 => Mismatched Braces
N = 89 => 158
N = 90 => 0
N = 91 => 4
N = 92 => Mismatched Braces
N = 93 => 0
N = 94 => 158
N = 95 => Mismatched Braces
N = 96 => 0
N = 97 => 157
N = 98 => 159
N = 99 => None

총 37 개의 고유 출력이 있습니다 (숫자 순서).

0, 1, 2, 3, 4, 11, 13, 17, 45, 46, 50, 51, 57, 59, 77, 84, 89, 94, 95, 99,
100, 104, 115, 117, 129, 133, 147, 148, 149, 157, 158, 159, 166, 187, 188, 
196, 206, 207, 209, 211, 249, 251, 255

나는 이 솔루션이 최적이 아니라고 90 % 100 % 확신 하지만 그것이 매우 어려울 수 있음을 증명한다 . 분명한 몇 가지가 있습니다. 더없는 .마지막 문자까지 상징하는 것 같다 이동하는 방법으로 하고, 대괄호 ( []) 오히려 쓸모없는 것 같다 . 나는 여기에 약간의 생각을했다.

하자 L(도전, 바이트의 코드의 길이를 수 100), 및 n서브 프로그램의 고유 한 출력의 숫자.

들면 L=3, 여러 형태의 최적의 솔루션이있다 +-., n=2(이 경우, 출력은 1과 255이다 +.-.각각이.)이 풋위한 최선의 비율 L = 3n/L = 66.67%. 이 비율은 적어도 이길 수 없습니다 L<10.

의 경우 L=10, 솔루션은 그것을 무차별하게하기에 충분히 간단합니다. 최고의 솔루션은 다음과 같습니다 n = 6.

++>-->+<+. => 6
++>-->+<+. => 6
+++>->+<+. => 6
--->->+<+. => 6
++>---><+. => 6
+++>--><+. => 6
-->++>-<-. => 6
+++>+>-<-. => 6
--->+>-<-. => 6
-->+++><-. => 6
--->++><-. => 6

점수 비율은 n/L = 60%입니다.

마찬가지로 L->infinity, 잠재적으로 무한한 경우 255 개의 가능한 출력 만 있기 때문에 비율이 0에 가까워 야합니다 L.

그러나 비율은 균일하게 감소하지 않습니다. 에 대한 솔루션을 구성 할 수 없으므로 가능한 n=6, L=9가장 좋은 비율은 L=9입니다 5/9 = 55.56% < 60%.

이것은 질문을 얼마나 빨리 그리고 어떤 문제에서 비율을 낮추는가? 위해 L = 100, 그리고에서 10^9 checks/second, 그것은 최적의 솔루션을 bruteforce하는 데 시간이 더 우주의 수명보다 몇 배를 취할 것입니다. 이것에 대해 갈 우아한 방법이 있습니까? 그 아래로는 것을 나는 매우 의심 37%에 대한 L = 100.

비율은 실제로 최대로 증가합니다 L=100. 다른 답변을 확인하십시오.

위의 평가를 듣고 싶습니다. 결국 나는 끔찍하게 잘못되었을 수 있습니다 .

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