fork download
  1. # 全体のアイデア
  2. # ABともに左右に動いてみて、条件を満たす点へ移動
  3. # 上記移動を、ABが出会うまで繰り返す
  4. # ループに陥るのを避けるため、通過済点を記録・参照する
  5.  
  6. # 入力文字列から高さ配列を生成する
  7. # @param [String] a_s 入力文字列
  8. # @return [Int Array] w_r 生成された高さ配列
  9. # @example
  10. # make_seq "073:0" #=> [0, 1, 2, 3, 4, 5, 6, 7, 6, 5, 4, 3, 4, 5, 6, 7, 8, 9, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
  11. def make_seq a_s
  12. w_a = a_s.split(//).map { |e| e == ":" ? 10 : e.to_i }
  13. w_a = w_a.zip(w_a[1..-1])
  14. w_a.pop
  15. w_r = [0]
  16. w_a.each { |e|
  17. w_step = (e[0] < e[1]) ? 1 : -1
  18. while true
  19. e[0] += w_step
  20. w_r << e[0]
  21. break if e[0] == e[1]
  22. end
  23. }
  24. w_r
  25. end
  26.  
  27. # 数値配列から、所要ステップ数を計算する。
  28. # @param [Int Array] a_seq 入力配列
  29. # @return [Int] 所要ステップ数
  30. # @example
  31. # eval_seq [0, 1, 2, 3, 4, 5, 6, 7, 6, 5, 4, 3, 4, 5, 6, 7, 8, 9, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0] #=> 18
  32. def eval_seq a_seq
  33. w_max_range = a_seq.size - 1 # 移動許容範囲の最大位置
  34. w_remain = [[0, w_max_range]]
  35. pos1, pos2 = w_remain[0]
  36. h = {} # 通過済地点記録用のハッシュ
  37. h[[pos1, pos2]] = 0
  38.  
  39. while w_remain != []
  40. pos1, pos2 = w_remain.shift
  41. ((pos1 - 1)..(pos1 + 1)).each { |p1|
  42. ((pos2 - 1)..(pos2 + 1)).each { |p2|
  43. return h[[pos1, pos2]] + 1 if p1 == p2
  44. next if p1 < 0
  45. next if p2 > w_max_range
  46. next if a_seq[p1] != a_seq[p2]
  47. next if h[[p1, p2]] # 通過済は無視
  48. h[[p1, p2]] = h[[pos1, pos2]] + 1 # 通過済を記録
  49. w_remain << [p1, p2]
  50. }
  51. }
  52. end
  53. end
  54.  
  55. %w(
  56. 073:0
  57. 07362:450
  58. 06464:36470
  59. 0827171:28480
  60. 0737491:28180
  61. 05374734372747484:184618186912120
  62. ).map { |e|
  63. a = make_seq e
  64. printf "%10d <--- %s\n", (eval_seq a), e
  65. }
  66.  
Success #stdin #stdout 0.03s 9912KB
stdin
Standard input is empty
stdout
        18  <---  073:0
        36  <---  07362:450
        42  <---  06464:36470
        66  <---  0827171:28480
       146  <---  0737491:28180
       400  <---  05374734372747484:184618186912120