2011年1月20日木曜日

E 人類の幸福とはなにか?

この記事はgivemacの応募用の小論文を書いたものです。

応募はソースコードでも何でも自由と書いてあったので、ある方法でスクランブルした小論文を解くプログラムとセットで応募したいと思います。

次のスクランブルされた文字列を改行もそのままで標準入力に流しこむと元の答えが出てきます。
環境によってソースコードが動かない可能性も考えてWindows用のバイナリも用意しておきました。
solve.exe, data.txt
x善類寄がのて設なとの護き々遠童考な供をがな。なま
の付鎖意っに少こな施生人永養う大た児額水子ど集れそ
な人ら続連しいくも由りてもにちえ金なで栄、をいるル
す幸う至国なう活隣でいはるい莫い育養ら飲誰りしのま
よすい飲ま生はせ自合いと訪が方をも金寄はっみかセっ
福るに業いに先とをる福けがもれっ付度たがに連か恵お
水たむて進々送不わ死付れき付摂ておあをの自う金鎖ド
とと工死住。のて。幸だ、で登たて今意分ろ鎖できので
っないこ人っ一るで寄な場寄りしろげし連あす連。ン起
はいまむりくいこのあにるるのよ、善るたがだ人こ引そ
恵かいると、か方限いすか、らだ。うのる一めル鎖っラ
う何がれ多るの類がめす。だうらがこ必続の当たりドを
なは。れにか差り。人誰多かるx。意なはに人寄っでた
か、もでな大のなた付先は。かれと要くでくたた1付た
でらに人き格にxは破くいならち善このそ類もら。れ名
今。う続きいきる寄進分む子」でな困金なば幸そのなだ
こま類界かはそ気ち人びのなに知持いれのいな-は匿な
今ま善ろくず子ち工を住自学供と貧けにお福、安は-い
の起つの世。供れ病打々、こ「をも気はだの-と-の、
で、実意だ世、供た業金にうそのい苦のが人もで-だ-
かそ幸いが、x子をた発がてと、と顔うし-る-てりう
日のの現福い界ち現の国お開いし頃はルる買む-ろ-し
、なとでがこ在なのんた途1大。つなに人た-えてか乗
日本な連すはでとが達国いく人人人た名ド。たを-う育
かは本では鎖る伊はなさ直上る、のずにっ前1そっ名。

#include <string>
#include <iostream> 
#include <clocale>
using namespace std;

#define W 25
#define H 25

int direction[8][2] = {
    { -1, -2 },
    { 1, -2},
    { -2, -1},
    { -2, 1},
    { -1, 2},
    { 1, 2},
    { 2, -1},
    { 2, 1}
};

int mapdata[H][W];
int order[H*W][2];

int getmap(int x, int y){
    if (y < 0 || y >= H) return 1;
    if (x < 0 || x >= W) return 1;
    return mapdata[y][x];
}

void getorder(int x, int y){
    mapdata[y][x] = 1;
    order[0][0] = x;
    order[0][1] = y;
    for (int i = 1; i < H*W; i++){
        int a[2] = {0xff, -1};
        for (int j = 0; j < 8; j++){
            int xx = x + direction[j][0];
            int yy = y + direction[j][1];
            if (getmap(xx, yy) == 0){
                int movable = 0;
                for (int k = 0; k < 8; k++){
                    int xxx = xx + direction[k][0];
                    int yyy = yy + direction[k][1];
                    if (getmap(xxx, yyy) == 0) movable++;
                }
                if (a[0] > movable) {
                    a[0] = movable;
                    a[1] = j;
                }
            }
        }
        if (a[1] == -1) break;
        x += direction[a[1]][0];
        y += direction[a[1]][1];
        mapdata[y][x] = 1;
        order[i][0] = x;
        order[i][1] = y;
    }
}

int main(){
    getorder(0,0); 
    setlocale(LC_ALL, "");
    wstring data[H];
    for (int i = 0; i < H; i++){
        wcin >> data[i];
    }

    for (int i = 0; i < W*H; i++){
        int x = order[i][0];
        int y = order[i][1];
        wchar_t c = data[y][x];
        if (c == L'x'){
            wcout << endl << L" ";
        }else if (c != L'-'){
            wcout << c;
        }
    }
}

01/24: Ubuntuとg++の組み合わせでも動くようにコード調整してみた。

0 件のコメント:

コメントを投稿