暗号化は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出しておきました。
最近のコメント