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}
,直到到达字符串的开头。