fukuriko

日記とか

試験問題を解いてみた

2010-05-04 01:04:52 |  プログラミング
遅ればせながら、
人材獲得作戦・4 試験問題

を解いてみました。A*(えーあすた)というアルゴリズムは知らなかったので
「反復深化深さ優先探索」で解いてみました。意外とスッキリ書けたかなぁ。
かかった時間は大体1時間くらいでした。

ちなみに、空白の多い迷路だと、探索に時間がかかりすぎるので Lv3判定ですねw

public class Maze { char route[][]; int depth; String maze[] = { "**************************", "*S* * *", "* * * * ************* *", "* * * ************ *", "* * *", "************** ***********", "* *", "** ***********************", "* * G *", "* * *********** * *", "* * ******* * *", "* * *", "**************************", }; public static void main(String[] args) { new Maze().start(); } void start() { int sy = 0; int sx = 0; for (String s : maze) { sx = s.indexOf('S'); if (sx > -1) { break; } sy++; } for (;;) { route = new char[maze.length][maze[0].length()]; if (find(sx, sy , 0)) { answer(); break; } depth++; } } boolean find(int x, int y,int count) { if (count == depth) { if (screen(x, y) == 'G') { return true; } return false; } if (route[y][x] != '\0') { return false; } if (screen(x, y) == '*') { return false; } route[y][x] = '$'; if (find(x + 1, y , count + 1) || find(x - 1, y, count + 1) || find(x, y + 1, count + 1) || find(x, y - 1, count + 1)) { return true; } route[y][x] = '\0'; return false; } void answer() { for (int y = 0; y < maze.length; y++) { for (int x = 0; x < maze[0].length(); x++) { if (route[y][x] != '\0' && screen(x,y) != 'S') { System.out.print(route[y][x]); } else { System.out.print(screen(x, y)); } } System.out.println(); } System.out.println(); } char screen(int x, int y) { return maze[y].charAt(x); } }

実行結果
************************** *S* * $$$$ * *$* *$$* $************* * *$* $$* $$************ * *$$$$* $$$$$ * **************$*********** * $$$$$$$$$$$$$ * **$*********************** * $$$$$* $$$$$$$$$$$$$G * * * $$$$*********** * * * * ******* * * * * * **************************


パレット

2010-03-29 01:29:53 |  プログラミング
知り合いからHPの作成を頼まれて、その作業を少々

土曜日に仕事っぽい事をするのはソンした気になってしまいがちだけど、、、
何かの縁って訳で、頼りにされること自体は悪い気しないなぁ。


で、サンプルを見せたが、、、
「うち(会社)のイメージカラーはオレンジなんだよねぇ、全体的にオレンジ系でまとめてくれないなかなぁ?」
と、とりあえずOKしたものの既に画像の作り直しはチョット面倒だなぁ。。。


青をベースにロゴとかの画像を作成したので、
ビットマップのパレットの青・赤を入れ替えると、うまいことオレンジに
なることが分かったので、プログラミングで回避!

gif や jpeg をいったん 256色 bitmap で保存して、パレットを交換する
プログラムで 青⇔赤 を実行して新たな bitmap ファイルとして保存。
あとは、gif や jpeg に戻しました。

思ったよりうまいこと行ったので良かった。
プログラミングが出来てよかったよ、、ほんとww

ソースは↓の通り。256色ビットマップ専用です。ちなみに、Visual C++ 6.0 で作りました。


#include <windows.h>
#include <stdio.h>

PBITMAPINFO readFile(char *fileName) {

	BITMAPFILEHEADER biFileHeader;
	size_t siz = sizeof(BITMAPINFO) + 255 * sizeof(RGBQUAD);
	PBITMAPINFO lpbi = (PBITMAPINFO)malloc(siz);

	FILE *fp = fopen(fileName,"rb");
	fread(&biFileHeader,1,sizeof(BITMAPFILEHEADER),fp);
	fread(lpbi,1,siz,fp);
	fclose(fp);
	return lpbi;
}

void createFile(char *fileName,PBITMAPINFO lpbi) {

	BITMAPFILEHEADER biFileHeader;
	char newFileName[256];

	sprintf(newFileName,"%s.bmp",fileName);

	FILE *fp1 = fopen(fileName,"rb");
	FILE *fp2 = fopen(newFileName,"wb");

	fread(&biFileHeader,1,sizeof(BITMAPFILEHEADER),fp1);
	fwrite(&biFileHeader,1,sizeof(BITMAPFILEHEADER),fp2);

	size_t siz = sizeof(BITMAPINFO) + 255 * sizeof(RGBQUAD);
	fseek(fp1,siz,SEEK_CUR);
	fwrite(lpbi,1,siz,fp2);

	while(!feof(fp1)) {
		int c = fgetc(fp1);
		fputc(c,fp2);
	}

	fclose(fp1);
	fclose(fp2);

}

void main(int argc,char *argv[]) {

	PBITMAPINFO lpbi = readFile(argv[1]) ;

	for (int i = 0 ; i <256 ; i++) {bmiColors[i].rgbRed;
		int g = lpbi->bmiColors[i].rgbGreen;
		int b = lpbi->bmiColors[i].rgbBlue;

		lpbi->bmiColors[i].rgbRed = (BYTE)b;
		lpbi->bmiColors[i].rgbGreen = (BYTE)g;
		lpbi->bmiColors[i].rgbBlue = (BYTE)r;

	}

	createFile(argv[1],lpbi);

	free(lpbi);

}


パッチワーク問題 ( Google Dev Fest ) を解いてみました。

2010-03-15 02:44:00 |  プログラミング
昼寝しすぎて、眠れなかったので


Google Dev Festの パッチワーク問題を解いてみましたw
いろいろな回答例が公開されていて、今更ですが

ソースは Java です。「解ければいいでしょ」って感じで、かなり雑なソースです
(久しぶりに、再帰呼出しつかったよw)

さーて、もう寝よう

PatchWork.java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class PatchWork {
	
	private String board[] ;
	private char[][] temp;
	private int count;
	private int max;
	private List<Integer> pos = new ArrayList<Integer>();
	private int rowCounter[] ;
	
	public static void main(String[] args) {
		new PatchWork().start();
	}

	private void disp() {
		for (int y = 0 ; y < temp.length ; y++) {
			for (int x = 0 ; x < temp[y].length ; x++) {
				System.out.print(temp[y][x]);
			}
			System.out.println();
		}
		System.out.println();
	}
	
	public void start() {
		
		init();

		clear();

		for (int y = 0 ; y < temp.length ; y++) {
			for (int x = 0 ; x < temp[y].length ; x++) {
				if (temp[y][x] != '_') {

					count = 0;
					
					search(y,x,temp[y][x]);
					
					if (count >= max) {
						if (count > max) {
							pos.clear();
						}
						pos.add(x << 16 | y);
						max = count;
					}
					
				}
			}
		}

		clear();
		
		for (int xy : pos) {
			int y = xy & 0xffff;
			int x = xy >> 16;
			search(y,x,temp[y][x]);
		}

		disp();
		
		for (int y = 0 ; y < rowCounter.length ; y++) {
			System.out.println(rowCounter[y]);
		}
		
	}
	
	private void init() {
		InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("input.txt");
		BufferedReader br = new BufferedReader(new InputStreamReader(in));
		
		try {
			String line;
			List<String> lines = new ArrayList<String>();
			while ((line = br.readLine()) != null) {
				lines.add(line);
			}
			
			board = lines.toArray(new String[0]);
			
		} catch (IOException e) {
			throw new RuntimeException("ファイル読み込み失敗",e);
		}
		
	}
	
	private void clear() {
		
		temp = new char[board.length][];
		
		for (int i = 0 ; i < board.length ; i++) {
			temp[i] = board[i].toCharArray();
		}
		rowCounter = new int[temp.length];
	}
	
	private void search(int y,int x,char c) {
		
		count++;

		rowCounter[y]++;
		
		temp[y][x] = '_';

		if (y - 1 >= 0) {
			if (temp[y - 1][x] == c) {
				search(y - 1, x, c);
			}
		}

		if (y + 1 < temp.length) {
			if (temp[y + 1][x] == c) {
				search(y + 1, x, c);
			}
		}
		
		if (x - 1 >= 0) {
			if (temp[y][x - 1] == c) {
				search(y, x - 1, c);
			}
		}

		if (x + 1 < temp[y].length) {
			if (temp[y][x + 1] == c) {
				search(y, x + 1, c);
			}
		}

	}
	
}


なぁんだw

2009-02-02 05:54:26 |  プログラミング
Windowsが休止モードになってくれない問題はデフラグすることで大丈夫になったっぽい

昨日、Google先生で検索した結果ページが
全て有害サイトと判定されてしまってリンク先に飛べなくなっていたw
自分のPCがウィルスにかかったかと思っていたがどうやらGoogle先生自体がアレだったらしい。。。

 参考リンク:http://www.iza.ne.jp/news/newsarticle/it/217931/slideshow/149904/

まぁ、原因がわかってしまうと、なぁんだって感じですねw

まぁ、天下のGoogleでもこんなことがあるんですねぇ

風邪をひいてました(´・ω・`)ショボーン

2009-01-17 01:19:31 |  プログラミング

「変数についてどう説明するのがいいのだろうか」
 http://cheebow.info/chemt/archives/2009/01/about_variable.html

ま、いろいろな考え方があって良いと思います。
ただ、簡単な表現を使っているから良いとか難しい言葉を使っているからダメって
ことは無いと思います。
(伝えたい)相手に伝わるか否かが大事かと

( ´・ω・)y─┛~~~oΟ◯

で、今週は風邪をひいてました。Σ( ̄ロ ̄lll)
熱はほとんど無かったけど頭痛が、
で、そんな時に限って休めない週だったりで
そんなわけで、録画した番組は観れてません!

土日で消化する!


DRY

2009-01-08 00:46:42 |  プログラミング

「DRY (Don't Repeat Yoursel) の意味を勘違いしてたかも」
 http://d.hatena.ne.jp/kwatch/20090105/1231162464

ぁぁ、自分も勘違いしていました



だからたとえば、ActiveRecord が DB スキーマから
情報をとってきてモデルクラスを自動設定するのは、
まさに情報の重複をなくしているから、DRY といえる。


こっちが本来のDRYの考え方だったんですねぇ
納得ですw

で、久しぶりに「今日の日記」

年明けから、今出向している現場に自社の人間が2名ほど来ている。
別のプロジェクトをしているが、まぁ自社の人間がいるのは
いろいろと心強いものだ。

掛け持ちでやっているプロジェクトもあって、
年明けから忙しいw
年末も2日ほど、休日出勤して、、、
楽しみだった正月休みも、なんかイマイチだったなぁ

4月になったら有給でもとって楽になりたいなぁ