fork download
  1. 【解答】
  2. 111,222,321,333,432,444,543,555,654,666,765,777,876,888,987,999
  3. 【感想・工夫した点など】
  4. 問題を読んだときは、探索が大変そうだという気がしましたが、
  5. 対称にした図形を求めれば良いということがわかり、道が開けました。
  6. 対称となる点を求める数式が完成したあとは、迷うことなく、解答にたどり着きました。
  7. nが奇数の場合の多角形の処理は別に考える必要がありそうだったのですが、
  8. 全て同じ処理で行うことができました。
  9. 前回の問題はお手上げだったのですが、今回は簡単でした。
  10. 【言語と処理系】
  11. ruby 2.0.0p598 (2014-11-13) [x64-mingw32]
  12. 【ソースコード】
  13. # 円周上を n 等分する点を考え、順に 点0, 点1, 点2, ... , 点(n - 1) とする
  14.  
  15. # 点 axis を通る対称軸で、点 pos と対称となる点を求める
  16. # なお、axis の少数第一位が 5 である場合は、
  17. # axis を少数第一位で切り捨てた値と、少数第一位で切り上げた値の間の点を通る対称軸とする
  18. def symmetry_pos(n, pos, axis)
  19. return (n - (n + pos - axis).floor % n + axis).floor % n
  20. end
  21.  
  22. # 点 axis を通る対称軸で、線分 line と対称となる線分を求める
  23. def symmetry_line(n, line, axis)
  24. return [symmetry_pos(n, line[0], axis), symmetry_pos(n, line[1], axis)].sort
  25. end
  26.  
  27. # 点 axis を通る対称軸で、図形 lines と対称となる図形を求める
  28. def symmetry(n, lines, axis)
  29. return lines.collect {|line| symmetry_line(n, line, axis)}
  30. end
  31.  
  32. # 点A, 点B, 点C, ...という形式を
  33. # 点0, 点1, 点2, ...といういう形式に変換する
  34. def convert(lines)
  35. line_set = []
  36. lines.each do |line|
  37. line_set << [line[0].ord - 'A'.ord, line[1].ord - 'A'.ord].sort
  38. end
  39. return line_set
  40. end
  41.  
  42. # 対称軸の数を数える
  43. def count_axis(n, lines)
  44. count = 0
  45. # 隣り合う点の間を通る対称軸は、0.5, 1.5, 2.5, ...として表す
  46. 0.step((n-1)/2.0, 0.5) do |i|
  47. if symmetry(n, lines, i).sort == lines.sort
  48. count += 1
  49. end
  50. end
  51. return count
  52. end
  53.  
  54. File.open("data.txt", "r") do |f|
  55. wrong_id = []
  56. while problem = f.gets
  57. id, a, i, answer = problem.strip.split(" ")
  58. n = a.to_i
  59. lines = i.split(",").collect {|line| line.split('')}
  60. answer = answer.to_i
  61.  
  62. # 点A, 点B, 点C, ...という形式を
  63. # 点0, 点1, 点2, ...といういう形式に変換
  64. lines = convert(lines)
  65.  
  66. # 対称軸の数を数える
  67. count = count_axis(n, lines)
  68.  
  69. if count != answer
  70. wrong_id << id
  71. end
  72. end
  73. puts wrong_id.join(",")
  74. end
Runtime error #stdin #stdout #stderr 0.02s 7448KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
prog.rb:1: invalid multibyte char (US-ASCII)