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}
합니다.