Zero an arbitrarily large cell in Brainf***
l+r = 0+2 = 2, 55 53 51 bytes
[>+[-<+>>+<]<[>]>[+[-<+<->>]<[->+<]]>[-<+>]<<]>[-]<
l+r = 1+2 = 3, 46 44 bytes
[[>+[-<+<+>>]<[<+[->->+<<]]>]>[>]<[-]<<[-]>]
My own algorithm. The pointer should begin at the number that needs to be zeroed. The time complexity is O(n^2).
How it works:
- We start with the number
n
. - We increment one, so the number becomes
n+1
. - We decrement two, so the number becomes
n+1-2 = n-1
- We increment three, so the number becomes
n-1+3 = n+2
. - We decrement four, so the number becomes
n+2-4 = n-2
.
We repeat the process, increasing the in-/decrement each step, until we get zero.
l + r = 0 + 2 = 2; 58 bytes
>+<[>[<->>+<-]>+<<[>]>[<<+>+>-]<[->+<]>[<]>+[-<+>]<<]>[-]<
The complexity is O(n^2).
The following is my testing program generator, so you can see that I actually tried to test it in case it doesn't work...
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))