=begin
【解答】
166,200,250,333,400,500,600,666,750,800,833
【感想・工夫した点など】
何度か試行錯誤しましたが、ほぼストレートで解答にたどり着けたと思います。
想定時間の30分程度で解答が出せました。
解答の数列ですが、下記に現れる数値のように思います。
ただ、1000 が含まれていないのがちょっと気になります。
1000/6,1000/5,1000/4,1000/3,1000/2,1000/1
166, 200, 250, 333, 500, 1000
2000/6,2000/5,2000/4,2000/3,2000/2
333, 400, 500, 666, 1000
3000/6,3000/5,3000/4,3000/3
500, 600, 750, 1000
4000/6,4000/5,4000/4
666, 800, 1000
5000/6,5000/5
833, 1000
6000/6
1000
※値は切り捨て
【言語と処理系】
ruby 1.9.3
【ソースコード】
=end
# ファイルから問題を読み込む
def load_problems( filename)
problems = File .open ( filename, "r" ) { | f|
f.map { | line| line.strip .split ( ' ' ) }
}
return problems
end
problems = load_problems( "data.txt" )
wrong_id =[ ]
problems.each do | problem|
id = problem[ 0 ]
vertex_num = problem[ 1 ] .to_i
vertexes = problem[ 2 ] .split ( "," )
answer = problem[ 3 ] .to_i
patterns = [ ]
triangles = vertexes.combination ( 3 ) .to_a
triangles.each do | triangle|
# 隣の頂点との距離(2つの頂点で挟まれる等分された円弧の数)を求める
# 3つの距離の組(順番を考慮する)をpatternに格納する
# 頂点がアルファベットの文字で表されているので、ASCIIコードを利用する
pattern = [ ]
( 0 ...2 ) .each do | i|
pattern << ( triangle[ i+ 1 ] .ord - triangle[ i] .ord ) % vertex_num
end
pattern << ( triangle[ 0 ] .ord - triangle[ 2 ] .ord + vertex_num) % vertex_num
# pattarnの先頭が最小値になるように距離の組のローテーションを行う
# これにより、同じパターンにそろえることができる
min = pattern.min
while pattern.uniq .length != 1 && ( pattern[ 0 ] != min || pattern[ - 1 ] == min)
pattern = pattern[ 1 ..- 1 ] + [ pattern[ 0 ] ]
end
patterns << pattern
end
if answer != patterns.uniq .length
wrong_id << id
end
end
puts wrong_id.join ( "," )
PWJlZ2luCuOAkOino+etlOOAkQoxNjYsMjAwLDI1MCwzMzMsNDAwLDUwMCw2MDAsNjY2LDc1MCw4MDAsODMzCgrjgJDmhJ/mg7Pjg7vlt6XlpKvjgZfjgZ/ngrnjgarjganjgJEK5L2V5bqm44GL6Kmm6KGM6Yyv6Kqk44GX44G+44GX44Gf44GM44CB44G744G844K544OI44Os44O844OI44Gn6Kej562U44Gr44Gf44Gp44KK552A44GR44Gf44Go5oCd44GE44G+44GZ44CCCuaDs+WumuaZgumWk+OBrjMw5YiG56iL5bqm44Gn6Kej562U44GM5Ye644Gb44G+44GX44Gf44CCCuino+etlOOBruaVsOWIl+OBp+OBmeOBjOOAgeS4i+iomOOBq+ePvuOCjOOCi+aVsOWApOOBruOCiOOBhuOBq+aAneOBhOOBvuOBmeOAggrjgZ/jgaDjgIExMDAwIOOBjOWQq+OBvuOCjOOBpuOBhOOBquOBhOOBruOBjOOBoeOCh+OBo+OBqOawl+OBq+OBquOCiuOBvuOBmeOAggoKMTAwMC82LDEwMDAvNSwxMDAwLzQsMTAwMC8zLDEwMDAvMiwxMDAwLzEKMTY2LCAgIDIwMCwgICAyNTAsICAgMzMzLCAgIDUwMCwgICAxMDAwCgoyMDAwLzYsMjAwMC81LDIwMDAvNCwyMDAwLzMsMjAwMC8yCjMzMywgICA0MDAsICAgNTAwLCAgIDY2NiwgICAxMDAwCgozMDAwLzYsMzAwMC81LDMwMDAvNCwzMDAwLzMKNTAwLCAgIDYwMCwgICA3NTAsICAgMTAwMAoKNDAwMC82LDQwMDAvNSw0MDAwLzQKNjY2LCAgIDgwMCwgICAxMDAwCgo1MDAwLzYsNTAwMC81CjgzMywgICAxMDAwCgo2MDAwLzYKMTAwMAoK4oC75YCk44Gv5YiH44KK5o2o44GmCgoK44CQ6KiA6Kqe44Go5Yem55CG57O744CRCnJ1YnkgMS45LjMKCuOAkOOCveODvOOCueOCs+ODvOODieOAkQo9ZW5kCgojIOODleOCoeOCpOODq+OBi+OCieWVj+mhjOOCkuiqreOBv+i+vOOCgApkZWYgbG9hZF9wcm9ibGVtcyhmaWxlbmFtZSkKICBwcm9ibGVtcyA9IEZpbGUub3BlbihmaWxlbmFtZSwgInIiKXsgfGZ8CiAgICBmLm1hcHsgfGxpbmV8IGxpbmUuc3RyaXAuc3BsaXQoJyAnKSB9CiAgfQogIHJldHVybiBwcm9ibGVtcwplbmQKCgpwcm9ibGVtcyA9IGxvYWRfcHJvYmxlbXMoImRhdGEudHh0IikKCndyb25nX2lkID1bXQpwcm9ibGVtcy5lYWNoIGRvIHxwcm9ibGVtfAogIGlkID0gcHJvYmxlbVswXQogIHZlcnRleF9udW0gPSBwcm9ibGVtWzFdLnRvX2kKICB2ZXJ0ZXhlcyA9IHByb2JsZW1bMl0uc3BsaXQoIiwiKQogIGFuc3dlciA9IHByb2JsZW1bM10udG9faQoKICBwYXR0ZXJucyA9IFtdCiAgdHJpYW5nbGVzID0gdmVydGV4ZXMuY29tYmluYXRpb24oMykudG9fYQogIHRyaWFuZ2xlcy5lYWNoIGRvIHx0cmlhbmdsZXwKICAgICMg6Zqj44Gu6aCC54K544Go44Gu6Led6Zui77yIMuOBpOOBrumggueCueOBp+aMn+OBvuOCjOOCi+etieWIhuOBleOCjOOBn+WGhuW8p+OBruaVsO+8ieOCkuaxguOCgeOCiwogICAgIyAz44Gk44Gu6Led6Zui44Gu57WE77yI6aCG55Wq44KS6ICD5oWu44GZ44KL77yJ44KScGF0dGVybuOBq+agvOe0jeOBmeOCiwogICAgIyDpoILngrnjgYzjgqLjg6vjg5XjgqHjg5njg4Pjg4jjga7mloflrZfjgafooajjgZXjgozjgabjgYTjgovjga7jgafjgIFBU0NJSeOCs+ODvOODieOCkuWIqeeUqOOBmeOCiwogICAgcGF0dGVybiA9IFtdCiAgICAoMC4uLjIpLmVhY2ggZG8gfGl8CiAgICAgIHBhdHRlcm4gPDwgKHRyaWFuZ2xlW2krMV0ub3JkIC0gdHJpYW5nbGVbaV0ub3JkKSAlIHZlcnRleF9udW0KICAgIGVuZAogICAgcGF0dGVybiA8PCAodHJpYW5nbGVbMF0ub3JkIC0gdHJpYW5nbGVbMl0ub3JkICsgdmVydGV4X251bSkgJSB2ZXJ0ZXhfbnVtCiAgICAjIHBhdHRhcm7jga7lhYjpoK3jgYzmnIDlsI/lgKTjgavjgarjgovjgojjgYbjgavot53pm6Ljga7ntYTjga7jg63jg7zjg4bjg7zjgrfjg6fjg7PjgpLooYzjgYYKICAgICMg44GT44KM44Gr44KI44KK44CB5ZCM44GY44OR44K/44O844Oz44Gr44Gd44KN44GI44KL44GT44Go44GM44Gn44GN44KLCiAgICBtaW4gPSBwYXR0ZXJuLm1pbgogICAgd2hpbGUgcGF0dGVybi51bmlxLmxlbmd0aCAhPSAxICYmIChwYXR0ZXJuWzBdICE9IG1pbiB8fCBwYXR0ZXJuWy0xXSA9PSBtaW4pCiAgICAgIHBhdHRlcm4gPSBwYXR0ZXJuWzEuLi0xXSArIFtwYXR0ZXJuWzBdXSAgCiAgICBlbmQKICAgIHBhdHRlcm5zIDw8IHBhdHRlcm4KICBlbmQKICBpZiBhbnN3ZXIgIT0gcGF0dGVybnMudW5pcS5sZW5ndGgKICAgIHdyb25nX2lkIDw8IGlkCiAgZW5kCmVuZAoKcHV0cyB3cm9uZ19pZC5qb2luKCIsIikK