주어진 길이의 문자열을 출력하는 Brainf_ck 프로그램 생성


11

친구가 독특한 잠금 시스템을 갖춘 금고에 침입하려고합니다. 특정 지점에서 일정한 수의 온화한 노크가 필요합니다. 친구가 숫자 (1 ... 99999 범위)를 발견하고 필요한 노크를 생성하는 가제트를 보유하고 있습니다. 그러나 가젯은 Brainfuck 인터프리터입니다! 따라서 친구는 Brainfuck 프로그램에 피드를 제공해야합니다. Brainfuck 프로그램은 가능한 짧아야합니다 (가젯의 I / O가 느림).

당신의 임무는 그를 돕는 것입니다! 숫자를 입력으로 받아들이고 입력 N하지 않고 Brainprint 프로그램을 출력 하는 프로그램 또는 서브 루틴을 어떤 언어로든 작성하십시오. 입력 하지 않고 인쇄 가능한 ASCII 문자의 문자열을 출력합니다 (범위 문자-코드 범위는 33 ...). 길이 126) N.

예 : input 10의 경우 출력은

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

(그러나 단축 될 수 있다고 확신합니다!)

점수는 다음 값에 대한 출력 길이의 합입니다 N(임의의 숫자 임).

55
68
15
28
841
838
522
846
4898
9004
9363
3810
13230
67175
37231
44701

아, 그리고 당신은 트위터에 의해 당신의 친구에게 당신의 코드 (생성기 프로그램)를 전송할 것입니다. 그래서 확실히 그건 만든다 140 자 이하!


PS Brainfuck 언어는 많은 변형이 있습니다. 테이프가 양방향에서 무한대 (또는 "원형 및 충분히 큰")이고 셀에 32 비트 int 용량 (유한하고 최대 99999까지 숫자를 보유 할 수 있음)이 있다고 가정 해 봅시다. 또한 랩핑 없음 : 셀이 오버플로되면 시스템이 자체 파괴됩니다!


2
"다음 N 값 (임의의 숫자)"은 xkcd.com/221을
cirpis

참고로 공백 문자 (문자 코드 32)는 일반적으로 인쇄 가능한 ASCII 범위에 포함됩니다. 범위를 명시 적으로 정의했기 때문에 실제로 도전에 차이가 없습니다.
Martin Ender

3
brainfuck의 셀을 임의의 폭 정수로 가정 할 수 있습니까? 그렇지 않다면 어떻게 그리고 언제 포장합니까?
orlp

1
적어도 67175 +를 포함 할 수 있다고 가정하는 것이 좋습니다.
orlp

@anatolyg 나는 나중에 그것을 깨달았습니다. 죄송합니다.
Esolanging 과일

답변:


3

파이썬 2, 점수 : 1021

나는이 콘테스트가 꽤 오래되었다는 것을 깨달았지만 여전히 게시 된 것보다 더 나은 솔루션을 찾았 기 때문에 게시했습니다.

다음은 작업을 수행하는 102 바이트 파이썬 스크립트입니다.

n=input()
s='>'
while n:
    s+='>'+'+'*(n%5+1);n/=5
print s+'[->[-<+++++>]<<]<+++++++[>+++++<-]>>[-<.>]'

아이디어는 N에 대한 기본 5 인코딩을 사용하는 것입니다 (적어도 현재 "무작위로 보이지 않는 것처럼 보이지만 OP에 의해 임의로 선택된 것처럼 보이는 현재 입력에 가장 적합한 기본")하고 일반적인 Brainfuck 알고리즘을 작성하는 것입니다. 임의의 길이의 숫자를 디코딩하십시오 (변환의 끝을 감지하기 위해 숫자가 1 씩 증가함에 따라 숫자가 인코딩됩니다). 나는 문자 35를 인쇄하기로 선택했지만 #문자 36 $은 동일합니다.

점수를 얻기 위해 다음 bash 스크립트를 실행할 수 있습니다.

i=0
while read p; do
  i=$((i+`echo $p | python convert.py | wc -m`))
done
echo $i

작은 숫자에 대한 곱셈으로 인코딩을 대체하고 각 숫자를 인코딩하기위한 최상의 기반을 선택하는 고급 프로그램을 사용하면 958 Brainfuck 문자에 도달 할 수 있지만 Python은 순서가 너무 장황합니다 (그리고 꽤 나쁘거나 게으른 골퍼입니다) 변환기를 144 바이트로 가져옵니다.


이것은 좋은 생각입니다! 어쩌면 나는이 답변을 향상시키기 위해 한 번 사용할 것입니다 (파이썬에서 950 미만의 점수를 얻기 위해 스크립트를 작성했지만 충분히 짧은 골프 언어를 모르는 경우).
anatolyg

8

점수 : 193,313

140 자 (147 자이므로 너무 가까이 !!) 미만이어서 이길 수는 없지만 멋지다고 생각했습니다.

43 더하기 부호와 N마침표를 인쇄 합니다. 그리 최적이 아닙니다.

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

누구든지 이것을 줄일 수 있다면 나는 그것을 좋아할 것입니다.


Brainfuck을 사용하면 테이프에서 입력을받는 "서브 루틴"을 만드는 것으로 충분할 것입니다. "표준 입력 장치"에서 읽을 필요는 없습니다.
anatolyg

@anatolyg 아마 80 ~ 90 자 정도가 훨씬 쉬워집니다. 변경해야합니까?
mdc32

5

J, 총점 = 1481

(이전 입력 및 설명을 보려면 개정 내역을 확인하십시오.)

f10=.('>++++++++++<';'')rplc~;@([:(<@('+++++[>+++++++<-]>>+',;@((<'[>++++++++++')#~#)),[<@(']',~'<-','<.>'#~],[,])"0 #-i.@# )10#.inv])

이 함수는 입력 숫자의 10 진수를 기준으로 중첩 된 BF 루프를 생성합니다. 모든 합리적인 근거를 확인하고 가장 작은 BF 코드를 선택하면 적은 양으로 점수가 향상됩니다.

테스트 세트의 BF 프로그램 :

   f10 every 55 68 15 28 841 838 522 846 4898 9004 9363 3810 13230 67175 37231 44701
+++++[>+++++++<-]>>+[>++++++++++[-<<.....>>]<-<.....>]                                                                                     
+++++[>+++++++<-]>>+[>++++++++++[-<<......>>]<-<........>]                                                                                 
+++++[>+++++++<-]>>+[>++++++++++[-<<.>>]<-<.....>]                                                                                         
+++++[>+++++++<-]>>+[>++++++++++[-<<..>>]<-<........>]                                                                                     
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[-<<<........>>>]<-<<....>>]<-<.>]                                                             
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[-<<<........>>>]<-<<...>>]<-<........>]                                                       
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[-<<<.....>>>]<-<<..>>]<-<..>]                                                                 
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[-<<<........>>>]<-<<....>>]<-<......>]                                                        
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[>++++++++++[-<<<<....>>>>]<-<<<........>>>]<-<<.........>>]<-<........>]                      
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[>++++++++++[-<<<<.........>>>>]<-<<<>>>]<-<<>>]<-<....>]                                      
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[>++++++++++[-<<<<.........>>>>]<-<<<...>>>]<-<<......>>]<-<...>]                              
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[>++++++++++[-<<<<...>>>>]<-<<<........>>>]<-<<.>>]<-<>]                                       
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[>++++++++++[>++++++++++[-<<<<<.>>>>>]<-<<<<...>>>>]<-<<<..>>>]<-<<...>>]<-<>]                 
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[>++++++++++[>++++++++++[-<<<<<......>>>>>]<-<<<<.......>>>>]<-<<<.>>>]<-<<.......>>]<-<.....>]
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[>++++++++++[>++++++++++[-<<<<<...>>>>>]<-<<<<.......>>>>]<-<<<..>>>]<-<<...>>]<-<.>]          
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[>++++++++++[>++++++++++[-<<<<<....>>>>>]<-<<<<....>>>>]<-<<<.......>>>]<-<<>>]<-<.>]          

테스트 세트의 컴퓨팅 점수 :

   +/#@> f10 each 55 68 15 28 841 838 522 846 4898 9004 9363 3810 13230 67175 37231 44701
1481

3

피츠, 1702

N + x의 인수를 사용하여 숫자를 재구성합니다.

+holN+]++">>"*"+"Q"<<"mjk(">>"j">"m*"+"kP+Qd"<[[->[->+>+<<]>>[-<<+>>]<<<]>[-]>[-<<+>>]<<<]>"*"-"d"<<")50"++++++[>++++++<-]>>[<.>-]"

이것에 대한 2출력 ++. 이제 BF에서 아무것도 인쇄하지 않습니다.
randomra

@randomra 좋은 캐치, 이것은 업데이트하는 동안 발생했습니다, 나는 그것을 고칠 것입니다.
orlp

@randomra 고정해야합니다 (물론).
orlp

3

CJam, 52 (74) 108 바이트 = 총 1,304 1,244 1,210

ri5b_,1>{(_3<{\(@5*+}*\+}*W%)\{T+_2>:T5*-_0>"-+"=\z*}%\T+'+*a+W%{"[->+++++<]>"\}*">x[>x<-]<[->>.<<]"'x/'+6**

테스트 스크립트 (온라인 인터프리터에서 느림) :

q~]
{
_[0:T;
5b_,1>{(_3<{\(@5*+}*\+}*W%)\{T+_2>:T5*-_0>"-+"=\z*}%\T+'+*a+W%{"[->+++++<]>"\}*">x[>x<-]<[->>.<<]"'x/'+6**
]s
_[L:RL@0\
"-+><.]"['('){+\_{)}0?@\}{@\+\_{)}0?}{R1$c+:R;}]:`"]a"{{_aa+1$4G#%{:~~1}{;0}?}g}`+a+er:~:~
];R,@=!"Error."N+*o
}%s,

나는 자기 파괴에 관한 부분을 보지 못했습니다. 그러나 어쨌든 넘치지 않습니다.
jimmy23013

어떻게 작동합니까?
아나톨리 그

@anatolyg 첫 번째 버전은 기본 5의 숫자를 간단히 생성합니다. 이후 버전은 첫 두 자리에 대해 특별한 경우를 추가하고 감소도 사용했습니다.
jimmy23013

@ user23013 죄송합니다. 사양이 변경되지 않았습니다. (그에 따라 답변이 업데이트되었습니다.)
randomra

2

Befunge-98, N + 41, 총 = 193281

&>'+\:v
v^-1,\_
' >1-:v
>v^,+'_
,'    :
>ff3++^
>2f*+v
^>/9+:,
>'>,61v
, v*6+<
^/2,:<@
v >+2+,
>'<,']^

나는 그것이 나쁘다는 것을 알고 있지만 오늘 Befunge를 쓰는 느낌이 들었습니다. Befunge의 가장 큰 장점은 프로그램이 실제 골프 언어보다 이해하기 어렵다는 것입니다. 특히 코드를 재사용 할 때 더욱 그렇습니다.

Martin Büttner의 CJam 답변 과 비슷한 알고리즘을 사용합니다 .

(N +'s)>+++++++++++++++++++++++++++++++++<[->.<]


1

Befunge-93-24 + N, 총계 = 193009

&>">>]-<]-<++++>[++++>[+++"v
v  ,,,,,,,,,,,,,,,,,,,,,,, <
>:v
,v_@
"1
.-
"
^<

이것은 접두어 +++[>++++[>++++<-]<-]>>를 사용하여 첫 번째 테이프 색인을 24 자로 '0'으로 설정합니다. Befunge 프로그램은 매우 기본적이고 N '와 함께 출력합니다.' 문자.


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