# http://nabetani.sakura.ne.jp/hena/orde09_penwa/
# by @Nabetani
require "minitest/autorun"
class TestRunner < Minitest::Test
def setup
@f=->input{
d, l, x, y = 0, 0, 0, 0
memo = [[l, x, y]]
input.chars.each { |c|
if c == ?F
d, l, x, y = d.zero? \
? [0, l^3, x + (l[0]^l[1])*(1.5 <=> l), y] \
: [d + (d%2 <=> 0.5),
((d%2 + l/2)%2 + l%2 + 1 + l)%4,
x + (1 + (0 <=> ((l[0]^l[1]) + d - 2)%5))*(l%2 <=> 0.5),
y + 1[(((l[0]^l[1])*2 + 1)*d%5 - 2)%5/2 <=> 0]*(0.5 <=> ((d + 1 + l[0]*2 + (l[0]^l[1])*2)%5 - 1)/2)]
if index = memo.push([l, x, y])[0..-2].index(memo[-1])
return [memo.size - 1, index] * ?,
end
else
d = (d + (?b <=> c)) % 5
end
}
?-
}
end
def test_run
DATA.each{|data|
input, expected = data.chomp.match(/test\(\s*\"(.+)\",\s*\"(.+)\"\s*\)/)[1..2]
assert_equal expected, @f[input]
}
end
end
__END__
/*0*/ test( "FcFcFaF", "3,0" );
/*1*/ test( "FccFaaFcFcF", "-" );
/*2*/ test( "ccFaF", "-" );
/*3*/ test( "cFcFaaF", "-" );
/*4*/ test( "aFccFcFcF", "4,1" );
/*5*/ test( "cFaFaFaFaaF", "4,0" );
/*6*/ test( "cFccFaFaaFaF", "5,1" );
/*7*/ test( "cFaaFaaFcFcFccF", "5,2" );
/*8*/ test( "aaFaFaaFaFccFaFccF", "6,0" );
/*9*/ test( "aaFaaFcFccFcFccFccFaF", "6,1" );
/*10*/ test( "aFccFccFaaFccFcFcFcFaF", "7,4" );
/*11*/ test( "ccFaaFaaFaFccFaaFaFcFccFaaF", "-" );
/*12*/ test( "aaFaFaFcFaFaaFaFaFaaFccFaaFaaF", "8,3" );
/*13*/ test( "aaFccFaFaFccFaaFaaFaaFccFccFcFaFaF", "13,10" );
/*14*/ test( "aFaFaaFaaFaaFccFaFccFaFaaFccFccFaaFccF", "11,0" );
/*15*/ test( "ccFccFcFaaFaaFaFccFaaFaFcFaaFaaFcFcFcF", "10,2" );
/*16*/ test( "aaFaaFaaFccFccFaFaaFaaFaFccFcFcFccFaaFaFccFccF", "10,3" );
/*17*/ test( "ccFaFccFaaFaaFcFccFaFcFccFccFaaFccFaFaaFaFaFccF", "11,3" );
/*18*/ test( "cFcFaFaaFaFccFaaFcFaFaaFccFaFaaFccFaFcFaaFccFcF", "12,0" );
/*19*/ test( "cFaFaaFcFaaFaaFaFccFaaFcFaaFccFaaFccFaFcFccFaFaFaFcFcF", "19,16" );
/*20*/ test( "aFaFccFaaFccFccFaFccFaFaaFccFaaFccFcFccFaFaFccFaaFccFcF", "15,11" );
/*21*/ test( "aFccFccFccFaaFaaFcFcFaaFccFaFcFccFaaFaFcFaaFcFaFccFccFaFaF", "23,20" );
/*22*/ test( "cFaFaaFcFaFaaFccFccFaaFaFccFccFccFaFaFccFccFccFaaFcFcFcFaF", "22,18" );
/*23*/ test( "aFcFaFccFccFaFccFaaFaFaaFaaFaFcFaFcFcFcFaFaFaaFaaFaFaaFcFccFaF", "14,4" );
/*24*/ test( "cFaFaaFcFaFccFcFccFaFaaFaaFaFcFccFccFaFcFaFaaFccFaFaFccFcFaFaFaaF", "22,19" );
/*25*/ test( "aaFaaFaFcFccFaaFcFaaFccFaFaFcFaFaaFaFaFaFcFccFaFaaFcFcFccFccFccFcF", "16,11" );
/*26*/ test( "cFaaFaFcFaFaaFccFaaFaFccFccFaaFccFcFaFaaFaaFaFccFcFccFccFaFaaFcFcFaF", "26,23" );
/*27*/ test( "cFaaFccFaFcFaFcFaaFccFaFccFaaFcFaFaaFccFaaFccFcFaFaaFaFcFccFccFaFcFaaFccFcF", "-" );
/*28*/ test( "ccFccFaaFaFccFaaFaaFcFccFaaFaFcFccFccFccFaFaaFcFaFccFaaFcFcFaFccFaFccFaaFaaFaF", "-" );
/*29*/ test( "aaFccFaFccFccFaaFccFaFcFccFaFccFcFcFaFcFcFaaFaaFcFccFccFcFaFaaFaFcFcFaaFaaFaaF", "19,5" );
/*30*/ test( "aFaaFccFaFaaFaaFccFccFaFcFaaFaaFaaFccFaFccFaaFaaFaFccFccFcFaaFaFccFccFaFcFaaFccF", "-" );
/*31*/ test( "aaFaFaaFcFccFccFaFcFaaFaaFaFccFccFccFaFaaFccFcFaaFccFaaFccFaaFccFccFccFcFaaFcFaaFccF", "30,23" );
/*32*/ test( "aaFccFaFaaFccFcFaFccFaFcFccFaaFccFaFcFaaFccFaaFaFccFccFccFcFccFaFccFcFaaFaFcFccFcFaFaaF", "32,17" );
/*33*/ test( "ccFcFcFaFaaFaFaaFccFcFccFaFcFaFccFaaFcFccFcFaaFcFaaFcFaaFaaFcFaaFaFaFaFaaFccFaaFcFcFaFaF", "18,14" );
/*34*/ test( "ccFaFaaFaaFcFaaFaaFaaFaaFaaFaFccFcFaaFaFcFccFaaFcFaFaaFccFccFaaFcFaaFaaFaaFccFaaFcFcFaFaFccFaFcFccF", "17,0" );
/*35*/ test( "aaFccFccFaFcFaFcFaFccFccFccFaFccFccFcFaFcFaaFccFcFccFccFaaFcFccFaaFccFccFaFccFcFcFaaFaFccFcFaaFaaFcF", "24,11" );
/*36*/ test( "aaFccFaFccFaaFaaFcFaFcFaFcFaaFaaFccFaFcFaFaaFcFaaFaFcFaaFccFcFaaFccFaaFccFaaFccFcFaFcFaFccFaaFaaFccFaaF", "-" );
/*37*/ test( "aFaaFaFaaFcFccFaaFccFaFcFaaFccFccFcFcFaFaFcFccFcFccFaaFcFaFcFaaFcFaFaaFccFaaFccFaFaaFaFcFaFccFaFaaFaFaaF", "17,14" );
/*38*/ test( "aaFcFaaFccFaaFaaFcFaaFccFccFaFcFaFcFccFcFaaFaaFaFcFaFcFaaFcFaFaaFaFccFccFccFcFaFaFcFcFaFcFaaFcFaaFcFcFaaF", "27,23" );
/*39*/ test( "ccFaFccFaFcFaFccFcFaaFccFccFcFaFccFccFaaFaaFaFaaFcFaaFccFcFaaFcFccFaaFcFaFccFccFaFccFaaFaaFcFcFccFaFccFcFcF", "25,18" );
/*40*/ test( "cFcFccFaFaaFaaFccFccFcFccFccFaFcFaaFcFccFccFcFccFaFaFaFaFaFaaFaFcFaFccFcFccFaaFccFaaFccFcFaFaaFccFaFccFcFaaF", "16,4" );
/*41*/ test( "aFcFcFaaFcFaaFcFaFaaFaaFaaFaFcFccFccFccFaFaaFaFaaFaaFcFcFccFaFaaFcFaFaaFccFaaFcFccFcFcFccFaaFcFaFccFaaFaaFccF", "19,15" );
/*42*/ test( "ccFaaFcFaFccFaFccFaFcFaaFaaFccFaaFccFcFaFaFccFaFaaFaFaaFaFaaFaaFccFaaFaFcFaaFaFaFcFaaFcFaFaaFaaFcFccFaaFaFaFaF", "22,17" );
/*43*/ test( "aaFcFaaFaFcFccFccFaFaFccFaFaaFaFcFccFaaFaaFaaFcFccFccFaFaaFccFcFaFaFcFaaFcFcFcFccFccFaaFcFcFaFccFccFccFaaFcFaaFcF", "14,5" );
/*44*/ test( "cFcFaFccFaaFaFccFaFccFaaFaFccFaaFaaFccFaaFccFaaFccFaFaaFaFaFaaFaaFccFaFcFaaFcFcFaFaFcFcFcFaFaaFcFaFcFaaFccFccFcFaaFaFccF", "10,1" );
/*45*/ test( "ccFaFcFaaFcFccFaFccFaaFccFaaFaaFcFaaFccFaaFccFccFcFaaFaaFcFaaFccFaaFcFcFaaFaFaFccFcFaFaFaFccFccFccFccFccFccFcFcFccFccFcF", "25,13" );
/*46*/ test( "aFccFaFcFaFcFaaFaaFcFaaFccFaFaaFaFcFaFaaFaaFaaFccFaaFaaFccFccFccFccFccFaaFaFcFaFaFccFaFccFcFccFcFcFccFcFccFccFccFccFccFaF", "18,8" );
/*47*/ test( "cFaaFcFaaFaFcFccFaaFcFccFcFaFccFaaFaaFccFccFccFaFcFccFcFaaFcFcFccFcFccFaFaFccFccFcFaFaFaaFcFaFcFccFccFccFaaFaFaFccFcFccFccF", "25,22" );
/*48*/ test( "aaFcFccFcFaFcFaFaFcFccFaFaaFaFcFccFccFaaFccFccFaaFaaFccFaaFaaFccFaaFccFcFaaFaFcFaFcFccFaaFccFaFaFccFaaFcFaaFaFccFaaFaaFccFccFcFaF", "-" );
/*49*/ test( "aFaaFccFccFaaFaaFccFccFaaFaaFaFcFccFaFcFaaFaFccFaaFccFaFcFaFccFaaFaaFaFccFaFaaFaaFcFaaFccFaaFcFaFccFccFaaFaaFaaFaaFccFcFccFaaFaFaaFaaF", "-" );
/*50*/ test( "aaFcFccFccFaFccFaFccFaaFaaFaaFccFaaFaaFccFaaFccFaFaaFccFccFaaFcFccFaFccFcFaaFaFccFccFccFaaFaFccFccFaFaaFccFccFccFaaFccFccFaFaFcFaFccFccF", "-" );