아래 답안은 반드시 유일한 정답이 아닙니다. Befunge의 특성상 가능한 답안은 여러 가지 있을 수 있습니다. 다른 방법으로 푸는 방법을 생각해 보시는 것도 좋겠지요.
이 실습은 본래 슬라이드에는 없으나 난이도 조절을 위해 급조(…)되었습니다.
9부터 1까지 차례대로 출력하는 프로그램을 짜 봅시다. 다만, 문자열을 그대로 출력하는 건 금지합니다. 반드시 루프에서 숫자를 1씩 감소시켜서 만드셔야 합니다.
비교와 숫자 출력, 그리고 다음 루프를 위해 1 감소시키는 것들을 모두 하려면 원래 숫자가 3번 중복되어야 한다(= 2번 복제되어야 한다)는 게 포인트입니다.
9>::#v_@
^-1.<
0보다 큰 숫자 n을 입력받아서 1×2×…×n을 출력하는 프로그램을 짜 봅시다.
4 → 24, 10 → 3628800
- 이제부터는 도움말을 보셔도 됩니다.
- 잘 모르겠으면 스택에 무슨 내용이 들어가야 할지 그림을 그려 봅시다.
g
/p
를 안 쓰는 방법도 있지만 쓰는 편이 더 쉽습니다.
두 가지 접근이 있는데 하나는 g
/p
명령을 쓰는 방법입니다. 맨 왼쪽 위 칸(0행 0열)은 처음 시작 이후 다시 돌아가지 않으므로 이 칸을 임시 변수처럼 쓸 수 있습니다.
&00p1v >$.@
1-00p>00g:!#^_*00g
다른 방법은 스택에 n부터 1까지의 숫자를 모두 넣은 뒤에 한 번에 다 곱하는 방법입니다.
&>:1-#v_>\:#v_$.@
^ -1:< ^ *\<
소문자 영어 낱말을 입력받아서 그 중 모음(aeiou)을
*
,#
,@
,?
넷 중 하나로 바꾸는 프로그램을 짜 봅시다. 로마자 소문자가 아닌 글자가 나오면 바로 종료하세요.antidisestablishmentarianism → #nt*d*s#st?bl*shm@nt@r*@n#sm
- 한 번에 모든 코드를 짜려고 하지 말고 부분 부분을 짜서 합쳐 보세요.
- 코드에 배열을 넣으려면 어떻게 해야 할까요?
?
명령으로 들어가는 방향과 나오는 방향이 같을 경우를 잘 생각해 보세요.
?
명령에서 4개의 방향을 모두 쓰면서 들어가는 방향과는 또 구분하기 위해 들어가기 직전 #
명령으로 점프해서 반사되는 경우를 처리하는 게 포인트입니다. 배열 읽기를 어떻게 구현하는지도 유심히 보세요.
~:"a"\`#@_:"z"`#@_:"a"-4g"*"-!#v_ >,
>$#v?"*"^
> "#"^
abcdefghijklmnopqrstuvwxyz >"@"^
*...*...*.....*.....*..... >"?"^
미니 로또 번호 생성기
- 숫자 n을 하나 입력받아서, 1부터 27까지의 숫자를 n개 출력합니다.
- n은 1과 27 사이라고 가정합시다. 오류 체크를 할 필요는 없습니다.
- 각 숫자 사이에는 공백을 넣어 주세요. (참고: 우리가 사용하는 인터프리터는 숫자를 출력할 때 뒤에 공백을 같이 출력하지 않습니다. 직접 출력해 주셔야 합니다.)
- 여섯 개의 숫자는 서로 겹쳐서는 안됩니다.
- 숫자의 순서는 관계 없습니다. 겹치지만 않으면 됩니다.
- 가능하면 모든 숫자가 나올 확률을 비슷하게 해 주세요.
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+^ @