makeplex salon:あなたのスキルで飯は食えるか? 史上最大のコーディングスキル判定 (2/2) - ITmedia エンタープライズ via kwout
GW突入!
で、やっと時間ができたので、
「あなたのスキルで飯は食えるか? 史上最大のコーディングスキル判定」
の問題をやってみました。言語は Java で3時間くらいかかった、あんまスマートじゃない気が。。。
ロジックは、とりあえず、順子・刻子の組み合わせを全て抽出したら、
頭を見つけて、残った牌が「待ち」というアプローチで探索してみました。
。。。ぁ、七対子は対応してませんw
記事には40分くらいで解いた人もいるとか...凄すぎる
出力結果:
1112224588899
(111)(222)(888)(99)[45]
1122335556799
(123)(123)(555)(99)[67]
(123)(123)(567)(55)[99]
(123)(123)(567)(99)[55]
1112223335559
(111)(222)(333)(555)[9]
(123)(123)(123)(555)[9]
1223344888999
(123)(234)(888)(999)[4]
(123)(888)(999)(44)[23]
(234)(234)(888)(999)[1]
1112345678999
(111)(234)(567)(99)[89]
(111)(234)(567)(999)[8]
(111)(234)(678)(999)[5]
(111)(234)(789)(99)[56]
(111)(345)(678)(999)[2]
(111)(456)(789)(99)[23]
(123)(456)(789)(11)[99]
(123)(456)(789)(99)[11]
(123)(456)(999)(11)[78]
(123)(678)(999)(11)[45]
(345)(678)(999)(11)[12]
GW突入!
で、やっと時間ができたので、
「あなたのスキルで飯は食えるか? 史上最大のコーディングスキル判定」
の問題をやってみました。言語は Java で3時間くらいかかった、あんまスマートじゃない気が。。。
ロジックは、とりあえず、順子・刻子の組み合わせを全て抽出したら、
頭を見つけて、残った牌が「待ち」というアプローチで探索してみました。
。。。ぁ、七対子は対応してませんw
記事には40分くらいで解いた人もいるとか...凄すぎる
import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Stack; public class WorkOut { List<Integer> list = new ArrayList<Integer>(); boolean[] isUsed; Stack<Integer> number = new Stack<Integer>(); List<List<Integer>> patterns = new ArrayList<List<Integer>>(); Stack<List<Integer>> stack = new Stack<List<Integer>>(); List<String> resultList = new ArrayList<String>(); public static void main(String[] args) { new WorkOut().start("1112224588899"); new WorkOut().start("1122335556799"); new WorkOut().start("1112223335559"); new WorkOut().start("1223344888999"); new WorkOut().start("1112345678999"); } void start(String s) { System.out.println(s); init(s); checkPear(0); checkCombine(0); for (String result : resultList) { System.out.println(result); } System.out.println(); } void init(String s) { for (Character c : s.toCharArray()) { if (Character.isDigit(c)) { list.add(Integer.parseInt(String.valueOf(c))); } } Collections.sort(list); isUsed = new boolean[list.size()]; } String getResult() { StringBuilder sb = new StringBuilder(); for (int i = 0 ; i < stack.size() ; i++) { if (i < stack.size() - 1) { sb.append("("); } else { sb.append("["); } for (int j : stack.get(i)) { sb.append(list.get(j)); } if (i < stack.size() - 1) { sb.append(")"); } else { sb.append("]"); } } return sb.toString(); } boolean checkAblableSpace(List<Integer> list) { for (int i : list) { if (isUsed[i]) { return false; } } for (int i : list) { isUsed[i] = true; } return true; } void removeAblableSpace(List<Integer> list) { for (int i : list) { isUsed[i] = false; } } void checkMati() { List<Integer> mList = new ArrayList<Integer>(); for (int i = 0 ; i < isUsed.length ; i++) { if (!isUsed[i]) { mList.add(i); } } String result = null; stack.push(mList); if (mList.size () == 1) { result = getResult(); } else if (mList.size() > 1) { if (list.get(mList.get(0)) == list.get(mList.get(1))) { result = getResult(); } if (list.get(mList.get(0)) + 1 == list.get(mList.get(1))) { result = getResult(); } if (list.get(mList.get(0)) + 2 == list.get(mList.get(1))) { result = getResult(); } } stack.pop(); if (result != null) { if (!resultList.contains(result)) { resultList.add(result); } } for (int i : mList) { isUsed[i] = false; } } void checkAtama(int pos) { if (number.size() > 1) { if (list.get(number.get(0)) == list.get(number.get(1))) { stack.push(number); checkMati(); stack.pop(); } return; } for (int i = pos ; i < isUsed.length ; i++) { if (!isUsed[i]) { isUsed[i] = true; number.push(i); checkAtama(i + 1); number.pop(); isUsed[i] = false; } } } void checkCombine(int pos) { if (stack.size() == 3) { checkAtama(0); } else if (stack.size() == 4) { checkMati(); } if (pos == patterns.size()) { return ; } for (int i = pos ; i < patterns.size() ; i++) { if (checkAblableSpace(patterns.get(i))) { stack.push(patterns.get(i)); checkCombine(i+1); removeAblableSpace(patterns.get(i)); stack.pop(); } } } void checkPear(int pos) { if (number.size() == 3) { if (isKotsu() || isJuntsu()) { patterns.add(new ArrayList<Integer>(number)); } } for (int i = pos; i < isUsed.length; i++) { if (!isUsed[i]) { isUsed[i] = true; number.push(i); checkPear(i + 1); number.pop(); isUsed[i] = false; } } } boolean isKotsu() { int[] num = new int[] { list.get(number.get(0)), list.get(number.get(1)), list.get(number.get(2)) }; if (num[0] + 1 == num[1] && num[1] + 1 == num[2]) { return true; } return false; } boolean isJuntsu() { int[] num = new int[] { list.get(number.get(0)), list.get(number.get(1)), list.get(number.get(2)) }; if (num[0] == num[1] && num[1] == num[2]) { return true; } return false; } }
出力結果:
1112224588899
(111)(222)(888)(99)[45]
1122335556799
(123)(123)(555)(99)[67]
(123)(123)(567)(55)[99]
(123)(123)(567)(99)[55]
1112223335559
(111)(222)(333)(555)[9]
(123)(123)(123)(555)[9]
1223344888999
(123)(234)(888)(999)[4]
(123)(888)(999)(44)[23]
(234)(234)(888)(999)[1]
1112345678999
(111)(234)(567)(99)[89]
(111)(234)(567)(999)[8]
(111)(234)(678)(999)[5]
(111)(234)(789)(99)[56]
(111)(345)(678)(999)[2]
(111)(456)(789)(99)[23]
(123)(456)(789)(11)[99]
(123)(456)(789)(99)[11]
(123)(456)(999)(11)[78]
(123)(678)(999)(11)[45]
(345)(678)(999)(11)[12]