Algoogle

Algorithm for Programming Contest

AOJ 2529 Brainf*ck

Category: AOJ Tag: parsing

Brainf*ck

問題概要


解法


メモリは広く取ってあるらしいが, 移動に1文字使うので適当な範囲でやるのがよい.
奇数番目をwhileのカウント用, 偶数番目を文字の保存用にする.
メモリの決めた範囲内の保存された文字で現在の文字に一番近いものを選んで移動する.
メモリの値がその文字になるまで’+’または’-‘を出力する.
そのとき大きな数になる時はwhileをつかう. サンプルみたいにやればよい.

コード


(2529.cpp) download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <bits/stdc++.h>
using namespace std;
#define rep(i,a) for(int i = 0;i < (a); i++)

string s;
int memo[16];

int main(){
    cin >> s;
    int cur = 0, prev = 0;
    cout << '>';
    rep(i,s.size()){
        prev = cur;
        cur = 0;
        rep(j,16)if(abs(memo[cur]-s[i]) > abs(memo[j]-s[i]))
            cur = j;
        rep(j,abs(cur-prev)) cout << (cur-prev<0? "<<": ">>");
        int d = s[i] - memo[cur];
        int sr = sqrt(abs(d));
        memo[cur] = (int)s[i];
        if(abs(d) < 8) rep(j,abs(d)) cout << (d<0? '-': '+');
        else {
            cout << '<';
            rep(j,abs(d)/sr) cout << '+';
            cout << "[>";
            rep(j,sr) cout << (d<0? '-': '+');
            cout << "<-]>";
            rep(j,abs(d)-abs(d)/sr*sr) cout << (d<0? '-': '+');
        }
        cout << '.';
    }

    return 0;
}

Comments