2011/10/22

기록의 의미로 다시 정리해보는 CodeGolf 용 Perl one-liner

Code Golf는 어떤 주어진 문제를 코드의 우아함, 가독성 등등따위는 제껴두고 수단과 방법을 가리지 않고 되도록이면 짧게 프로그래밍 할수록 높은 점수를 얻는 게임이다.

예전에 풀어본 문제를 기록을 남기는 의미에서 다시 정리해봄

문제)
http://kldp.org/node/112089

예를 들어, A.csv는

1   2   3
4   5   6

B.csv는
2   3   4
5   6   7
라면 같은 위치의 요소끼리 사칙연산 하려면?
답)
같은요소끼리 더하기
$ paste A.csv B.csv | perl -alpe '$_="@{[map$F[$_]+$F[$_+@F/2],0..$#F/2]}"'
3 5 7
9 11 13
문제)
http://codegolf.stackexchange.com/questions/3095/paint-that-fence
Paint the fence.
 
각 라인은 S L C 의 형태로 되어있다. S는 시작위치 L을 길이 C는 색깔을 뜻한다.
(시작위치는 0부터시작)
다음과 같은 라인에 대해서 규칙을 적용해서 펜스를 칠해나가면 펜스의 색은
오른쪽과 같을 것 이다.

0 3 1                      111...........
2 4 2                      112222........
1 2 3                      133222........
0 4 1                      111122........
7 3 5                      111122.555....

다 칠하고 난 다음 어떤색의 펜스가 얼만큼 있는지 다음과 같이

1 4
2 2
5 3

출력하는 코드를 작성하라.
답)
$ cat input.txt
0 3 1
2 4 2
1 2 3
0 4 1
7 3 5

$ cat input.txt  | perl -anE '@a[$F[0]..$F[0]+$F[1]]=($F[2])x$F[1];END{$i[$_]++for@a;$i[$_]&&say"$_ $i[$_]"for 1..$#i}'
1 4
2 1
5 3


아마 Perl 아니면 이보다 짧게 만들 수 있는 언어는 없을듯...
(요즘 보니 J란 언어가 다크호스 같긴 하지만서도..)