# 실습 및 퀴즈의 답안 아래 답안은 반드시 유일한 정답이 아닙니다. 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 >"@"^ *...*...*.....*.....*..... >"?"^ ~~~~ ## 퀴즈 > **미니 로또 번호 생성기** > > * 숫자 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+^ @ ~~~~