CodeIQ:あしあと

私自身が表題の問題を解いた時のプログラムについて解説します。
問題の詳細は「あしあと」(CodeIQ)を参照してください。

問題の概要

問題を引用します。
出る杭はいいぞ
仕様
9x9のマップの中を標準入力の内容に応じて移動します。
移動するとあしあとが残ります。
どのようなあしあとが残ったか標準出力してください。

標準入力

  • 「^v<>」のどれかの文字を組み合わせた文字列が入力されます
  • ^ は上に移動です
  • v は下に移動です
  • < は左に移動です
  • > は右に移動です
【例】
>>>>>>>>vvvvvvvv<<<<<<<<^^^^^^^^

標準出力
  • 9文字x9行の文字列を出力してください
  • 1行目1文字目の位置をスタート地点とします
  • スタート地点は必ず「あしあと」が残ります
  • 同じ場所を2回通った場合は「あしあと」が残ります
  • 移動した場所は「Y」(半角大文字のワイ)を出力してください。鳥の足跡をイメージしています。
  • 移動しなかった場所は「x」(半角小文字のエックス)を出力してください

例(標準入力の説明の入力が行われた場合の出力結果)
YYYYYYYYY
YxxxxxxxY
YxxxxxxxY
YxxxxxxxY
YxxxxxxxY
YxxxxxxxY
YxxxxxxxY
YxxxxxxxY
YYYYYYYYY

その他の仕様
・標準入力の末尾には改行があります
・標準出力の末尾に改行をつけてください
・移動回数は最大で48回です
・標準入力の仕様で説明した内容以外の入力は行われません(不正入力に対するチェックは不要)
・9x9からはみ出す位置への移動をするような入力は行われません(不正入力に対するチェックは不要)

Samples
Sample1
標準入力
>>>>>>>>vvvvvvvv<<<<<<<<^^^^^^^^

標準出力
YYYYYYYYY
YxxxxxxxY
YxxxxxxxY
YxxxxxxxY
YxxxxxxxY
YxxxxxxxY
YxxxxxxxY
YxxxxxxxY
YYYYYYYYY

Sample2
標準入力
>>vv>>vv>>vv>>vv

標準出力
YYYxxxxxx
xxYxxxxxx
xxYYYxxxx
xxxxYxxxx
xxxxYYYxx
xxxxxxYxx
xxxxxxYYY
xxxxxxxxY
xxxxxxxxY

Sample3
標準入力
>><vvv^>>><vvv

標準出力
YYYxxxxxx
xYxxxxxxx
xYYYYxxxx
xYxYxxxxx
xxxYxxxxx
xxxYxxxxx
xxxxxxxxx
xxxxxxxxx
xxxxxxxxx

私のプログラム

Rubyで解答しています。

#!/usr/bin/ruby

def solve(input)
	map = Array.new(9){Array.new(9, 'x')}
	map[0][0] = 'Y'
	pos = [0,0]

	dir = {
		'^' => [-1,0],
		'v' => [1,0],
		'<' => [0,-1],
		'>' => [0,1],
	}

	input.chars{|a|
		pos = [pos[0] + dir[a][0], pos[1] + dir[a][1]]
		map[pos[0]][pos[1]] = 'Y'
	}

	return map
end

def printResult(map)
	map.each{|arr| puts arr.join("")}
end

# main
while line = gets
	line.strip!
	if line.empty? then next end

	track = solve(line)
	printResult(track)
end

解説

経路探索ではなく単に移動した場所をチェックするだけの簡単な問題です。

main

入力値をsolve()関数に渡して移動を処理し、printResult()で結果を印字します。

solve(input)

9×9の2次元配列('x'で初期化)を用意し、移動した場所を'Y'に置換してゆくだけです。
移動方向を連想配列dirにしてあるので、入力値を1文字ずつ取り出して移動方向を取得し、座標を順次計算しながら2次元配列の文字を置換してゆけばOKです。

printResult(map)

2次元配列を文字列として印字するだけです。

雑感

『同じ場所を2回通った場合は「あしあと」が残ります』という文に少々混乱させられましたが特に意味はありませんでした。