#第19回オフラインリアルタイムどう書くの参考問題を解答
##お題
三和数 〜 横へな 2014.3.7 参考問題
http://nabetani.sakura.ne.jp/hena/ord19sanwa/
##言語
JavaScript
##開発環境
iPhone5S + "Textastic Code Editor for iPhone"
パソコンが無いので(苦笑)
##実装時間
合計で5時間くらいはかかったと思います。
JavaScript初学者なのでハマりまくりました。
##実行時間
iPhone5Sで12分くらい
(バッテリーは10%くらい消費します。)
##解答
何らかの方法でrun()をたたいて頂けると動作します。
いちいちalertが出るのはいいわけを参照してください…
script.js
// 三和数かな?
function IsTreeAddingNumber(elem, n1, n2, n3) {
var flags = new Array(elem.length);
// コンビネーション生成用
var addingArray = new Uint32Array(4);
addingArray[0] = parseInt(0); //未使用の意味
addingArray[1] = parseInt(n1);
addingArray[2] = parseInt(n2);
addingArray[3] = parseInt(n3);
var length = addingArray.length;
// ハマり for-inが思ってたのと違うのでforで書いておく
// 全組み合わせで和算
for (var ind1 = 0; ind1 < length; ind1++)
for (var ind2 = 0; ind2 < length; ind2++)
for (var ind3 = 0; ind3 < length; ind3++) {
// ハマり 足し算ができない
var total = eval(addingArray[ind1]) + eval(addingArray[ind2]) + eval(addingArray[ind3]);
for (var idx = 0; idx < elem.length; idx++) {
// ハマり 同値判定が失敗evalがいいらしい
if (total == eval(elem[idx])) {
flags[idx] = true;
}
}
}
// 全て見つかったか確認
for (var i = 0; i < elem.length; i++) {
if(flags[i] !== true) return false;
}
return true;
}
// テストパターン走行
function run() {
/*0*/ test( "3,11,12,102,111,120", "1,10,100" );
/*1*/ test( "10,20,30,35,70", "many" );
/*2*/ test( "1,5,20,80", "none" );
/*3*/ test( "1,2,3,4,5,6,7,8,9,10,11,12,13,14", "many" );
/*4*/ test( "1,2,3,4,5,6,7,8,9,10,11,12,13,14,15", "1,4,5" );
/*5*/ test( "1,2,3,4,5,6,7,8,9,10,11,12,13,14,17", "none" );
/*6*/ test( "1,2,3,4,5,6,7,8,9,10,11,12,13,14,18", "1,4,6" );
/*7*/ test( "5,6,7,8,9,10,11,12,13,14,15,16", "2,5,6" );
/*8*/ test( "9,10,11,12,13,14,15,16,17,18,19", "4,5,7" );
/*9*/ test( "11,36,37,45,55,70,71", "1,10,35" );
/*10*/ test( "92,93,94,95,96,97,98,99", "30,32,33" );
/*11*/ test( "95,96,97,98,99,100", "many" );
/*12*/ test( "27,30,34,37,43,44,46,51,57", "10,17,23" );
/*13*/ test( "6,10,13,17,65,73,76,80", "none" );
/*14*/ test( "12,19,21,29,85", "none" );
/*15*/ test( "1,2,8,10,14,23,58,62,64", "none" );
/*16*/ test( "4,22,25,31,44,50,58,69,71,72,73,77", "none" );
/*17*/ test( "8,16,26,27,42,53,65,69,81,83,88,99", "none" );
/*18*/ test( "9,10,23,24,28,33,38,39,58,68,84", "none" );
/*19*/ test( "11,16,24,26,88", "none" );
/*20*/ test( "24,33,47,56,63,66,75,78,89,93", "none" );
/*21*/ test( "7,26,72,77", "many" );
/*23*/ test( "9,14,48,89", "many" );
/*24*/ test( "69,76,77,83", "many" );
/*25*/ test( "11,14,24", "many" );
/*26*/ test( "8,25,75,93", "many" );
/*27*/ test( "11,55,93,98,99", "many" );
/*28*/ test( "71,83,87", "many" );
/*29*/ test( "22,76,77,92", "7,15,62" );
/*30*/ test( "33,61,66,83,95", "17,33,61" );
/*31*/ test( "6,16,49,55,72", "6,16,33" );
/*32*/ test( "62,85,97,98", "12,25,73" );
/*33*/ test( "54,60,67,70,72", "20,25,27" );
/*34*/ test( "54,61,68,84,87", "27,30,34" );
/*35*/ test( "65,67,69,75,79,89,99", "21,23,33" );
/*36*/ test( "69,72,80,81,89", "23,24,33" );
/*37*/ test( "1,2,3", "many" );
}
// テスト実行
function test(pattern, result) {
var patternArray = pattern.split(",");
var ret = entry(patternArray);
alert(ret);
// 結果の確認
if(result == ret) console.log("OK");
else console.log("NG");
}
// 三和数の元を返す
// なければnone 一意に決まらないmany
function entry(elem) {
var maxVal = Math.max.apply(null, elem);
var minVal = Math.min.apply(null, elem);
var ans = [];
for (var n1 = 0; n1 <= minVal; n1++) {
for (var n2 = n1 + 1; n2 < maxVal; n2++) {
for (var n3 = n2 + 1; n3 <= maxVal; n3++) {
if (IsTreeAddingNumber(elem, n1, n2, n3) == true) {
var str = n1 + "," + n2 + "," + n3;
ans.push(str);
}
}
}
}
if (ans.length == 1) {
console.log(ans[0]);
return ans[0];
} else if (ans.length == 0) {
console.log("none");
return "none";
} else {
console.log("many");
return "many";
}
}
##いいわけ
- 俺たちの高速化はこれからだー
- JavaScriptの定石がわからんです
- 途中でalertしているのは、これを出しておかないと動いてるのか止まっているのか不安になるからです。あとconsole.logが更新されないし。
- インデントがアレなのはiPhoneで書いたから。
- ウンコードでも何でもいいので、とにかく何かしらをoutputしたかったので投稿しました