Flex、AIR、Java、Androidなど

2月28日 2010

Devfest 2010のQuizのソースを晒してみる

Posted by: tachibana In: プログラミング

暗号化はwgetで、パッチワークと漢字変換サーバーはJavaで書きました。

http://twitter.com/stachibana/status/9465013343

私は本やリファレンスを読まずに書いてしまう人なので真似しない方がいいと思いますよ。

他にも公開されている方がいらっしゃるようなので拝見させてもらって勉強します。

まずパッチワーク。各マスから同じ文字が隣にあるマスを再帰的になめてIDを振っていき、最後に各行を数えてます。何の工夫もない、1.8秒くらいかかるコードです。

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;

public class Main {
	static ArrayList<String> source = new ArrayList<String>();
	static HashMap<String, String> doneHash = new HashMap<String, String>();
	static int x = 0;
	static int y = 0;
	static int cur = 0;
	public static void main(String[] args) {
		long start = System.currentTimeMillis();
		try{
			BufferedReader br = new BufferedReader(new FileReader(args[0]));
			String line;
			while ((line = br.readLine()) != null){
				source.add(line);
			}
		} catch (Exception e) {
			System.out.println("Invalid Parameter");
		}
		for(int y = 0; y < source.size(); y++){
			String str = source.get(y);
			for(int x = 0; x < str.length(); x++)
			{
				String _cur = "" + cur;
				checkRecursively(str.substring(x, x+1), y, x, _cur);
				cur++;
			}
		}
		HashMap<String, Integer> countMap = new HashMap<String, Integer>();
		ArrayList<HashMap<String, Integer>> countArray = new ArrayList<HashMap<String,Integer>>();
		int column = source.get(0).length();
		for(int i = 0; i < source.size(); i++){
			String str = "";
			for(int j = 0; j < column; j++){
				if(doneHash.get("" + i + ":"+ j) != null){
					str = doneHash.get("" + i + ":"+ j);
					if(countMap.get(str) == null){
						countMap.put(str, 1);
					}else{
						countMap.put(str, countMap.get(str)+1);
					}
				}
			}
		}
		Set set = countMap.keySet();
		Iterator it = set.iterator();
		String keyStr = "";
		while(it.hasNext()){
			HashMap<String, Integer> h = new HashMap<String, Integer>();
			keyStr = (String)it.next();
			h.put("id", Integer.parseInt(keyStr));
			h.put("count", countMap.get(keyStr));
			countArray.add(h);
		}
		Comparator<HashMap<String, Integer>> compToUse = new Comparator<HashMap<String, Integer>>(){
			public int compare(HashMap<String, Integer> object1, HashMap<String, Integer> object2) {
						Integer t1int = object1.get("count");
						Integer t2int = object2.get("count");
						return t2int.compareTo(t1int);
			}
		};
		Collections.sort(countArray, compToUse);
		String maxId = "" + countArray.get(0).get("id");
		String answer = "";
		for(int i = 0; i < source.size(); i++){
			int count = 0;
			for(int j = 0; j < column; j++){
				if(doneHash.get("" + i + ":"+ j) != null){
					if(doneHash.get("" + i + ":"+ j).equals(maxId)){
						count++;
					}
				}
			}
			answer += ("" + count + "\n");
		}
		long end = System.currentTimeMillis();
		System.out.println(answer + "\n by " + (end - start) + " miliseconds");
	}

	public synchronized static void checkRecursively(String str, int _y, int _x, String _cur){
		if(doneHash.get("" + _y + ":" + _x) == null){
			doneHash.put("" + _y + ":" + _x, _cur);
			try{
				if(str.equals(source.get(_y).substring(_x-1, _x))){
					checkRecursively(source.get(_y).substring(_x-1, _x), _y, _x-1, _cur);
				}
			} catch(Exception e){}
			try{
				if(str.equals(source.get(_y).substring(_x+1, _x+2))){
					checkRecursively(source.get(_y).substring(_x+1, _x+2), _y, _x+1, _cur);
				}
			} catch(Exception e){}
			try{
				if(str.equals(source.get(_y-1).substring(_x, _x+1))){
					checkRecursively(source.get(_y-1).substring(_x, _x+1), _y-1, _x, _cur);
				}
			} catch(Exception e){}
			try{
				if(str.equals(source.get(_y+1).substring(_x, _x+1))){
					checkRecursively(source.get(_y+1).substring(_x, _x+1), _y+1, _x, _cur);
				}
			} catch(Exception e){}
		}
	}

}

続いて漢字変換サーバー。DecimalFormat(“####,####”)でフォーマットしたあと各要素を万未満の数値に変換、その後億や兆をつけて返してます。

package biz.stachibana.quiz;
import java.text.DecimalFormat;

public class NumToKanji {

	static char[] c = "TEHMPKRNDQ".toCharArray();
	static char[] lc = "ABUFXZ".toCharArray();

	public static String getResult(long i){
		String result = "";
		DecimalFormat numFormat = new DecimalFormat("####,####");
		String str = numFormat.format(i);

		String[] al = str.split(",");

		if(al.length == 1){
			result = makeFirst(al[0]);
		}
		else if(al.length == 2){
			result += (makeFirst(al[0]) + Character.toString(lc[3]) + makeFirst(al[1]));
		}
		else if(al.length == 3){
			if(!makeFirst(al[2]).equals("")){
				result = makeFirst(al[2]);
			}
			if(!makeFirst(al[1]).equals("")){
				result = (makeFirst(al[1]) + Character.toString(lc[3]) + result);
			}
			result = (makeFirst(al[0]) + Character.toString(lc[4]) + result);
		}
		else if(al.length == 4){
			if(!makeFirst(al[3]).equals("")){
				result = makeFirst(al[3]);
			}
			if(!makeFirst(al[2]).equals("")){
				result = (makeFirst(al[2]) + Character.toString(lc[3]) + result);
			}
			if(!makeFirst(al[1]).equals("")){
				result = (makeFirst(al[1]) + Character.toString(lc[4]) + result);
			}
			result = (makeFirst(al[0]) + Character.toString(lc[5]) + result);
		}
		else{
			return "parameter must be less than 9,999,999,999,999,999";
		}
		return result;
	}

	public static String makeFirst(String str){
		String result = "";

		if(str.length() == 4){
			if(str.substring(0, 1).equals("0")){}
			else if(str.substring(0, 1).equals("1")){
				result += Character.toString(lc[2]);
			}
			else{
				result += (Character.toString(c[Integer.parseInt(str.substring(0, 1))]) + Character.toString(lc[2]));
			}
			if(str.substring(1, 2).equals("0")){}
			else if(str.substring(1, 2).equals("1")){
				result += Character.toString(lc[1]);
			}
			else{
				result += (Character.toString(c[Integer.parseInt(str.substring(1, 2))]) + Character.toString(lc[1]));
			}
			if(str.substring(2, 3).equals("0")){}
			else if(str.substring(2, 3).equals("1")){
				result += Character.toString(lc[0]);
			}
			else{
				result += (Character.toString(c[Integer.parseInt(str.substring(2, 3))]) + Character.toString(lc[0]));
			}
			if(!str.substring(3, 4).equals("0")) result += Character.toString(c[Integer.parseInt(str.substring(3, 4))]);
		}
		else if(str.length() == 3){
			if(str.substring(0, 1).equals("0")){}
			else if(str.substring(0, 1).equals("1")){
				result += Character.toString(lc[1]);
			}
			else{
				result += (Character.toString(c[Integer.parseInt(str.substring(0, 1))]) + Character.toString(lc[1]));
			}
			if(str.substring(1, 2).equals("0")){}
			else if(str.substring(1, 2).equals("1")){
				result += Character.toString(lc[0]);
			}
			else{
				result += (Character.toString(c[Integer.parseInt(str.substring(1, 2))]) + Character.toString(lc[0]));
			}
			if(!str.substring(2, 3).equals("0")) result += Character.toString(c[Integer.parseInt(str.substring(2, 3))]);
		}
		else if(str.length() == 2){
			if(str.substring(0, 1).equals("0")){}
			else if(str.substring(0, 1).equals("1")){
				result += Character.toString(lc[0]);
			}
			else{
				result += (Character.toString(c[Integer.parseInt(str.substring(0, 1))]) + Character.toString(lc[0]));
			}
			if(!str.substring(1, 2).equals("0")) result += Character.toString(c[Integer.parseInt(str.substring(1, 2))]);
		}
		else{
			result += Character.toString(c[Integer.parseInt(str.substring(0, 1))]);
		}

		return result;
	}
}

コード書く系の3問は正解しましたが、ハッカソン、Issue Tracker、Chrome Extensionはだめ。AndroidはAutomatic Task Killer出しておきました。

EasyFreeAds Blog News Facebook Twitter Myspace Friendfeed Technorati del.icio.us Digg Google Yahoo Buzz StumbleUpon

No Responses to "Devfest 2010のQuizのソースを晒してみる"

Comments are closed.

Categories

 

2017年9月
« 4月    
 123
45678910
11121314151617
18192021222324
252627282930  

About

Author: tachibana

  • ちょっとしたことはTwitterに書いています。こっちはアプリの公開等の時に更新されます。
  • 最近はもっぱらJavaとObjective Cです。AS3は飽きました。
  • スクリプト言語ではPerlが好きでしたが最近はGAE/Jで何でもやってます。
  • Linuxは自宅サーバー建てるのがやっとのレベルです。前の会社で何日も徹夜してやったのはいい思い出です。
  • アプリへのご要望などご意見等ありましたらお気軽にご連絡下さい。

Alternative content here