Brainf에서 임의로 큰 셀을 제로로 만듭니다 ***


28

당신의 임무는 Brainfuck 변형에서 현재 셀을 0으로 만드는 코드 조각을 작성하는 것입니다. 각 셀은 정상적인 0에서 255 대신 임의의 큰 크기 의 부호있는 정수를 포함 할 수 있습니다 .

현재 셀 의 왼쪽에 l 개의 셀이 있고 처음에 0 인 r 개의 셀 이 있다고 가정 할 수 있습니다 . 프로그램은 이러한 l + r +1 셀 에만 액세스 할 수 있습니다 . 코드가 끝나면 l + r 추가 셀을 0으로 유지하고 원래 위치에서 현재 셀에 대한 포인터를 남겨 두십시오 .

입 / 출력을 사용할 수 없습니다.

가장 작은 l + r을 가진 코드가 이깁니다. 동점이 있으면 가장 짧은 코드가 승리합니다. 참조를 위해 프로그램의 시간 복잡성을 언급하는 것이 좋습니다. 여기서 n 은 현재 셀에서 원래 정수의 절대 값입니다.

유용한 도구

mbomb007의 TIO에서이 인터프리터를 사용 하여이 변형에서 Brainfuck 프로그램을 테스트 할 수 있습니다..

boothby 로이 답변에 인터프리터를 사용할 수도 있습니다 (다른 Python 답변도 작동하지만 테스트하지는 않았습니다).


I have tagged it code-golf because I think we will reach the optimal l+r quickly.
jimmy23013

2
그것은 당신의 의견에서 들리는 것처럼, 당신은 임의의 큰 정수를 의미했습니다. 양수이거나 음수 일 수 있습니다. 이것은 일부 사람들의 영어 방언의 차이이므로 매우 긍정적이거나 부정적 일 수 있음을 분명히하는 것이 도움이 될 수 있습니다.
isaacg

4
@ jimmy23013 서명 된 셀이있는 BF 인터프리터가 있습니까?
mbomb007

@ mbomb007 codegolf.stackexchange.com/a/3085/25180 그러나 아마도 너무 골프 ...
jimmy23013

1
@Mego Why? In the "real" challenge, you must also get the optimal l+r, which will probably make it more difficult to reduce the code size.
jimmy23013

답변:


17

l + r = 0 + 2 = 2, 55 53 51 바이트

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

l + r = 1 + 2 = 3, 46 44 바이트

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

내 자신의 알고리즘. 포인터는 0으로 설정해야하는 숫자에서 시작해야합니다. 시간 복잡도는 O (n ^ 2)입니다.

작동 방식 :

  • 우리는 숫자로 시작합니다 n.
  • 우리는 1을 증가 시키므로 숫자는 n+1입니다.
  • 우리는 2를 줄이므로 숫자는 n+1-2 = n-1
  • 우리는 3을 증가 시키므로 숫자는 n-1+3 = n+2입니다.
  • 우리는 4를 줄이므로 숫자는 n+2-4 = n-2입니다.

우리는 프로세스를 반복하여 0이 될 때까지 각 단계에서 증가 / 감소를 증가시킵니다.


2
내가 "이것은 불가능하다"단계를 지나간 후에 내가 생각한 알고리즘은 정확히 : P
ETHproductions

9

l + r = 0 + 2 = 2; 58 바이트

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

복잡도는 O (n ^ 2)입니다.

다음은 테스트 프로그램 생성기이므로 작동하지 않는 경우 실제로 테스트하려고 시도한 것을 볼 수 있습니다 ...

p='''
>+<
[
>
[<->>+<-]
>+<
<[>]>
[<<+>+>-]
<
[->+<]
>[<]>
+ [-<+>]
<<
]
> [-] <
'''

p = ''.join(p.split())

cpp = '''
#include <bits/stdc++.h>
using namespace std;
void test(int q) {
long long t[3] = {q, 0, 0};
int i = 0;
ZZZ
printf("q=%d %lld %lld %lld\\n", q, t[0], t[1], t[2]);
}
int main() {
while(true) {
    int q; cin >> q; test(q);
}
}
'''

d = {
'>': '++i; assert(i<3);',
'<': '--i; assert(i>=0);',
'+': '++t[i];',
'-': '--t[i];',
'[': 'while(t[i]){',
']': '}',
}

print cpp.replace('ZZZ', ''.join(d[c] for c in p))

방금 만든 인터프리터를 사용하여 테스트 할 수 있습니다. 댓글보기
mbomb007 17 년

그것은 나에게 효과가있는 것 같습니다.
mbomb007 17 년

2
이것은 최적의 l + r이어야합니다. 1이 불가능하다는 빠른 증거 : 스페어 셀이 0에 도달하는 각 지점에서 원래 셀 값 (테이프 헤드 위치 및 명령 포인터) 외에 유한 한 양의 데이터 만 저장할 수 있습니다. 그 시점에서 최소한 한 방향으로 메인 셀을 얼마나 멀리 조정할 수 있는지에 제한이 있습니다.

@ais523 There could be other equivalent ones. It'd be interesting if someone creates l+r = 1+1.
mbomb007
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.