GNU sed、356バイト
課題は、文字のストリームの単純な変換を必要とします。 sed
、ストリームエディタは言語の明らかな選択です;-)
/[FRBL]/bx # Jump to label x if relative
:y # label y (start of abs->rel loop)
/[FRBL]$/q # quit if string ends in rel char
s/(^|[FRBL])N/\1F/;ty # Substitute next abs char with
s/(^|[FRBL])E/\1R/;tr # rel char, then jump to
s/(^|[FRBL])S/\1B/;tb # relevant rotation label if
s/(^|[FRBL])W/\1L/;tl # a match was found
by # loop back to y
:r;y/NESW/WNES/;by # Rotation labels: transform then
:b;y/NESW/SWNE/;by # loop back to y
:l;y/NESW/ESWN/;by
:x # label x (start of rel->abs loop)
/^[NESW]/q # quit if string starts w/ abs char
/F([NESW]|$)/s/F([NESW]|$)/N\1/ # Matches for each direction:
/R([NESW]|$)/y/NESW/ESWN/;s/R([NESW]|$)/E\1/ # rotate, then substitute
/B([NESW]|$)/y/NESW/SWNE/;s/B([NESW]|$)/S\1/
/L([NESW]|$)/y/NESW/WNES/;s/L([NESW]|$)/W\1/
bx # loop back to x
(ゴルフスコアの計算のために削除されたコメントとスペース)
出力:
$ sed -rf absrel.sed <<< NNWEESEE
FFLBFRLF
$ sed -rf absrel.sed <<< FFLBFRLF
NNWEESEE
$
説明:
ここでの考え方は、参照フレームを変更する{N, E, S, W}
と、との間の直接マッピングが常に存在するということです{F, R, B, L}
。
絶対から相対の場合、文字列を順方向に処理します。マッピング{N, E, S, W}
する各文字について{F, R, B, L}
、残りを回転させます[NESW]
ばかりの文字に従って文字をせ、次の文字に移動します。
絶対に相対する場合は、逆を行います。文字列を逆方向に処理し、後続のすべて[NESW]
の文字を直前の文字に従って回転させます。その後、我々はその文字をマップ{N, E, S, W}
に{F, R, B, L}
我々は文字列の先頭に到達するまで、。