실습 및 퀴즈의 답안

아래 답안은 반드시 유일한 정답이 아닙니다. Befunge의 특성상 가능한 답안은 여러 가지 있을 수 있습니다. 다른 방법으로 푸는 방법을 생각해 보시는 것도 좋겠지요.

실습 1.5: 카운트다운

이 실습은 본래 슬라이드에는 없으나 난이도 조절을 위해 급조(…)되었습니다.

9부터 1까지 차례대로 출력하는 프로그램을 짜 봅시다. 다만, 문자열을 그대로 출력하는 건 금지합니다. 반드시 루프에서 숫자를 1씩 감소시켜서 만드셔야 합니다.

비교와 숫자 출력, 그리고 다음 루프를 위해 1 감소시키는 것들을 모두 하려면 원래 숫자가 3번 중복되어야 한다(= 2번 복제되어야 한다)는 게 포인트입니다.

9>::#v_@
 ^-1.<

실습 2: 팩토리얼

0보다 큰 숫자 n을 입력받아서 1×2×…×n을 출력하는 프로그램을 짜 봅시다.

4 → 24, 10 → 3628800
  1. 이제부터는 도움말을 보셔도 됩니다.
  2. 잘 모르겠으면 스택에 무슨 내용이 들어가야 할지 그림을 그려 봅시다.
  3. g/p를 안 쓰는 방법도 있지만 쓰는 편이 더 쉽습니다.

두 가지 접근이 있는데 하나는 g/p 명령을 쓰는 방법입니다. 맨 왼쪽 위 칸(0행 0열)은 처음 시작 이후 다시 돌아가지 않으므로 이 칸을 임시 변수처럼 쓸 수 있습니다.

&00p1v      >$.@
1-00p>00g:!#^_*00g

다른 방법은 스택에 n부터 1까지의 숫자를 모두 넣은 뒤에 한 번에 다 곱하는 방법입니다.

&>:1-#v_>\:#v_$.@
 ^ -1:< ^ *\<

실습 3: 낱말 검열

소문자 영어 낱말을 입력받아서 그 중 모음(aeiou)을 *, #, @, ? 넷 중 하나로 바꾸는 프로그램을 짜 봅시다. 로마자 소문자가 아닌 글자가 나오면 바로 종료하세요.

antidisestablishmentarianism → #nt*d*s#st?bl*shm@nt@r*@n#sm
  1. 한 번에 모든 코드를 짜려고 하지 말고 부분 부분을 짜서 합쳐 보세요.
  2. 코드에 배열을 넣으려면 어떻게 해야 할까요?
  3. ? 명령으로 들어가는 방향과 나오는 방향이 같을 경우를 잘 생각해 보세요.

? 명령에서 4개의 방향을 모두 쓰면서 들어가는 방향과는 또 구분하기 위해 들어가기 직전 # 명령으로 점프해서 반사되는 경우를 처리하는 게 포인트입니다. 배열 읽기를 어떻게 구현하는지도 유심히 보세요.

~:"a"\`#@_:"z"`#@_:"a"-4g"*"-!#v_      >,
                               >$#v?"*"^
                                  > "#"^
abcdefghijklmnopqrstuvwxyz         >"@"^
*...*...*.....*.....*.....         >"?"^

퀴즈

미니 로또 번호 생성기

1부터 3까지를 생성하는 코드:

v>1v
>?2>.@
 >3^

1부터 27까지를 생성하는 코드:

v>1v>0+v>0+  v
>?2>?3+>?9+  >.@
 >3^>6+^>9+9+^

생성을 n회 반복하는 코드:

&v                     <
  >1v>0+v>0+  v
 >?2>?3+>?9+  >." ",1-:|
  >3^>6+^>9+9+^        @

최종 코드 (실습 3의 코드와 비슷하게 5행을 배열처럼 쓰되, 읽기 말고 쓰기도 합니다):

&v                      <                <
  >1v>0+v>0+  v         $
 >?2>?3+>?9+  >:5g"*"-!#^_:"*"\5p." ",1-:|
  >3^>6+^>9+9+^                          @

이 코드의 기본 개념을 응용하면 1부터 45까지를 출력하는 코드도 만들 수 있습니다. 이걸로 생성한 번호로 로또에 당첨되시면 저에게도 좀… (굽신굽신)

&v           <                     <                <
  >0v>0+v    $    >1+v>0+v         $
 >?1>?3+>:4`#^_9*>?2+>?3+>:5g"*"-!#^_:"*"\5p." ",1-:|
  >2^>6+^         >3+^>6+^                          @