どう書くの問題面白いですね。
PHPものは既にあったのでjsでやってみました。
ちょっと時間がかかってしまったかな。
解決方法ですが、
rootは時計回りでルートを列挙します
どこから来たのかをposで記録し、handleに従ってnext,posを計算するのを
繰り返しています
y-root.js
var root = {
A: ['D', 'C', 'B']
, B: ['A', 'C', 'E']
, C: ['A', 'F', 'B']
, D: ['A', 'E', 'F']
, E: ['B', 'F', 'D']
, F: ['C', 'D', 'E']
};
var test = function (input, output) {
'use strict';
var handle= {b: 0, r: -1, l: 1}
, now = 'A'
, pos = 2
, next
, result= input.split('')
.map(function(x) {return handle[x]; })
.reduce(function (x, y) {
next = root[now][(pos + y + 3) % 3];
pos = root[next].indexOf(now);
now = next;
return x + next;
}, now);
console.log(result === output);
};
var data = [
/*0*/ ["b", "AB" ],
/*1*/ ["l", "AD" ],
/*2*/ ["r", "AC" ],
/*3*/ ["bbb", "ABAB" ],
/*4*/ ["rrr", "ACBA" ],
/*5*/ ["blll", "ABCAB" ],
/*6*/ ["llll", "ADEBA" ],
/*7*/ ["rbrl", "ACADE" ],
/*8*/ ["brrrr", "ABEDAB" ],
/*9*/ ["llrrr", "ADEFDE" ],
/*10*/ ["lrlll", "ADFEDF" ],
/*11*/ ["lrrrr", "ADFCAD" ],
/*12*/ ["rllll", "ACFDAC" ],
/*13*/ ["blrrrr", "ABCFEBC" ],
/*14*/ ["brllll", "ABEFCBE" ],
/*15*/ ["bbrllrrr", "ABACFDEFD" ],
/*16*/ ["rrrrblll", "ACBACABCA" ],
/*17*/ ["llrlrrbrb", "ADEFCADABA" ],
/*18*/ ["rrrbrllrr", "ACBABEFCAD" ],
/*19*/ ["llrllblrll", "ADEFCBCADEB" ],
/*20*/ ["lrrlllrbrl", "ADFCBEFDFCB" ],
/*21*/ ["lllrbrrlbrl", "ADEBCBACFCAB" ],
/*22*/ ["rrrrrrlrbrl", "ACBACBADFDEB" ],
/*23*/ ["lbrbbrbrbbrr", "ADABABEBCBCFE" ],
/*24*/ ["rrrrlbrblllr", "ACBACFCACFDAB" ],
/*25*/ ["lbbrblrlrlbll", "ADADFDABCFDFED" ],
/*26*/ ["rrbbrlrlrblrl", "ACBCBADFEBEFDA" ],
/*27*/ ["blrllblbrrrrll", "ABCFDADEDABEDFE" ],
/*28*/ ["blrllrlbllrrbr", "ABCFDABCBEFDEDA" ],
/*29*/ ["lbrbbrllllrblrr", "ADABABEFCBEDEBCF" ],
/*30*/ ["rrrrbllrlrbrbrr", "ACBACABCFDEDADFC" ]
];
data.forEach(function (item) {
test (item[0], item[1]);
});
時間はロジックを思いつくまで10分くらい
コードはテスト込みで30分くらいでした。
(追記)
問題のリンク張り忘れを追加しました
(変更)
タイトルを変更しました。時間追加。