이번 디브온에서 미니대안언어축제가 진행되던 M2 밖에 텍스트큐브 부스에서 재미있는 코드골프 문제 풀기가 있었습니다. 150자 이하로 푸신 분들에게는 즉석에서 제공되는 원두커피와 텀블러가 상으로 주어졌다고 합니다. 문제는 아래와 같습니다. 이 결과가 나와야 하는데 언어 제약은 없답니다.
어제 1등은 강성훈님이 gzip으로 출력문자를 압축해서 쉘 스크립트 뒤에 덧붙이는 식으로 하여 73바이트까지 줄인 것이라고 합니다. 저는 집에 와서 J로 잠깐 풀어봤습니다. 30바이트입니다. ' *'{~(,{:)@|:@|.^:4]4=+/~|i:4 일단 이 코드를 이해하려면 J의 이디엄들을 이해해야 합니다. 몇 가지 덩어리가 눈에 띄는데요. ' *'{~(,{:)@|:@|.^:4]4=+/~|i:4 이 부분은 0과 1을 각기 빈칸과 *로 바꾸는 코드입니다. 뒤에 달린 ~는 능동형을 수동형으로 바꿔주는 것인데, 예를 들어 3-1은 2인데, 3-~1은 -2가 됩니다. 즉, 좌측과 우측 피연산자(operand)의 순서를 바꿔주는 부사(동사를 꾸며주는)입니다. 원래 형태는 0 1 3 2 1 {'ABCDEFG' 하면 오른쪽에서 0번째, 1번째, 3번째, 2번째, 1번째로 이루어진 스트링(ABDCB)을 반환하는 것이죠. 따라서 오른쪽에서 0과 1로 이루어진 행렬이 나오는데 그걸 빈칸과 *로 바꿔주는 역할을 합니다. ' *'{~(,{:)@|:@|.^:4]4=+/~|i:4 그 다음 부분은 J에서 포크라고 부르는 것인데, g와 h가 동사일 때 (g h) y는 y g (h y)와 같습니다. h한 걸 g한다라고 이해하면 쉽습니다. ,는 스트링이나 숫자를 추가(append)하는 것이고, {:는 마지막 원소를 가져오는(take last) 것입니다. 따라서 마지막 원소를 뒤에 추가한다고 보시면 됩니다. ' *'{~(,{:)@|:@|.^:4]4=+/~|i:4 이 부분은 행렬을 시계방향으로 90도 회전시킵니다. |:는 행렬의 행과 열을 바꿔주고(Axy를 Ayx로), |.는 행렬의 원소 순서(예컨대 행의 순서)를 거꾸로 뒤집습니다. 순서가 |.한 다음 |:이므로 결과적으로는 시계방향으로 90도 회전이 됩니다. 예컨대(아래 예에서 처음 세 칸 띄어쓴 것은 사용자가 입력하고 붙어나오는 건 컴퓨터가 보여주는 결과이며, NB에서 해당줄 끝까지는 주석)
' *'{~(,{:)@|:@|.^:4]4=+/~|i:4 이 부분은 앞의 동사를 4번 연속 적용하게 됩니다. 우리가 수학에서 아는 지수승(거듭 곱하기)의 외연을 확장한 겁니다. 예를 들어
앞 동사가 90도 회전한 다음에 맨 아래 원소(2차원 행렬에서 원소는 1차원 배열)를 복사해 붙이기였으므로, 이걸 4번 연속하면 원래 행렬의 네 테두리줄을 돌아가며 복사하는 셈이 됩니다. (마름모 꼭지점에서 하나씩 튀어나온 부분 처리) ' *'{~(,{:)@|:@|.^:4]4=+/~|i:4 이 부분은 마름모를 만드는 코드입니다. 아래를 보시면 이해가 되실 겁니다.
전체 코드의 실행순서는 위에서 설명한 것의 역순으로 됩니다. 따라서 마름모를 만들고, 그걸 90도씩 돌려가면서 꼭지점에 하나씩 점을 찍고(사실은 가장 바깥 라인을 복사), 그 행렬을 문자로 변환해주면 결과가 나옵니다.
|
메모장
이글루 파인더
최근 등록된 덧글
마음 고생 많이 하셨..
by Roeniss at 03/20 이글루스 문닫는다니.. by 유상민 at 03/14 http://ch.yes24.co.. by 최신주소 at 02/16 넵. 출처를 밝힌다면.. by 애자일컨설팅 at 01/11 안녕하세요! 개발 추.. by no-support at 01/09 좋은글 감사합니다... by 이범희 at 01/08 참고되었습니다. .. by tky7068 at 11/28 비교적 최근 논의를.. by 애자일컨설팅 at 06/17 흥미롭게 읽었습니다.. by 냠 at 05/31 이 아티클이 커뮤니티.. by 321 at 05/31 최근 등록된 트랙백
당신이 제자리 걸음인..
by 無地note 당신이 제자리 걸음인.. by 無地note 무엇을 프로그래밍 할.. by 용기와 희망의 블로그 어떤 회사의 개발자 .. by 뒷담화 기록보관소 채용퀴즈 풀기 by 기록하기 다음 디브온 2013 코.. by 浩然之氣 3차 2그룹 SLiPP .. by Confluence: SLiP.. 어떤 회사의 채용 퀴즈 by The note of Lege.. 회사에서 일을 하는게.. by 알팅스님의 개발 스토리 이전블로그
2021년 03월
2020년 05월 2020년 02월 2019년 09월 2018년 12월 2018년 04월 2018년 03월 2018년 02월 2017년 07월 2017년 05월 2017년 04월 2017년 03월 2016년 12월 2016년 11월 2016년 08월 2016년 07월 2015년 12월 2015년 11월 2015년 09월 2015년 08월 2015년 06월 2015년 05월 2015년 04월 2015년 03월 2015년 02월 2014년 12월 2014년 11월 2014년 09월 2014년 08월 2014년 03월 2014년 01월 2013년 12월 2013년 10월 2013년 08월 2013년 06월 2013년 05월 2013년 04월 2013년 02월 2012년 09월 2012년 08월 2012년 06월 2012년 05월 2012년 03월 2011년 12월 2011년 11월 2011년 10월 2011년 09월 2011년 04월 2011년 03월 2011년 02월 2011년 01월 2010년 12월 2010년 10월 2010년 09월 2010년 08월 2010년 07월 2010년 06월 2010년 05월 2010년 04월 2010년 03월 2010년 02월 2010년 01월 2009년 12월 2009년 11월 2009년 10월 2009년 09월 2009년 08월 2009년 07월 2009년 06월 2009년 05월 2009년 04월 2009년 03월 2009년 02월 2009년 01월 2008년 12월 2008년 11월 2008년 10월 2008년 09월 2008년 08월 2008년 07월 2008년 06월 2008년 05월 2008년 04월 2008년 03월 2008년 02월 2008년 01월 2007년 12월 2007년 11월 2007년 10월 2007년 09월 2007년 08월 2007년 07월 2007년 06월 2007년 05월 2007년 04월 2007년 03월 2007년 02월 2007년 01월 2006년 12월 2006년 11월 2006년 10월 2006년 09월 2006년 08월 2006년 07월 2006년 06월 2006년 05월 2006년 04월 2006년 03월 2006년 02월 라이프로그
|