[아희PS] 별 찍기 - 3

난해한 프로그래밍 언어 중에서는 비교적 직관적이고(?) 체계적인(?) 아희로 별 찍기 문제를 풀어봅시다.

2019. 06. 12. #development #algorithm #aheui

문제

한 정수 n을 입력받으면, 첫 번째 줄에는 별(*) 5개, 다음 줄에는 4개, ..., 마지막 줄에는 별 1개를 출력하는 문제입니다.

예를 들어 5를 입력받았다면 출력해야할 결과는 다음과 같습니다.

*****
****
***
**
*

소스코드

삭반반밤발뚜
뚜벌번선더떠
삳방빠뿌빠맣삳붇
보해오챠속어가분
뭏뻥선차오뼈턱턱
삳먁툑뱓텩번

이 소스코드를 pseudo 코드로 옮기면 다음과 같습니다.

a = '*'
b = '\n'
c = input_int()
loop:
    d = c
    if d == 0:
        break

    loop:
        print(a)
        if d == 0:
                     print(b)
            break

도대체 어떻게 저 코드가 이렇게 해석이 되는지, 지금부터 한 글자 한 글자 해석해보겠습니다.

들어가기에 앞서, 아희에서 모음은 소스코드의 실행 방향을 나타낼 뿐, 동작에는 관여하지 않습니다. ㅏ는 오른쪽으로 한 칸, ㅜ는 아래로 한 칸, ㅛ는 위로 두 칸 등의 방식으로요. 예를들어 이라는 글자는 숫자(종성 ㅇ)를 입력(초성 ㅂ) 받고 오른쪽 글자(ㅏ)로 넘어갑니다.

따라서 아래에 코드를 풀어쓴 해석에서는 모음은 무시하시고, 초성과 종성을 중심으로 읽어보시는 것이 좋습니다.

1. 출력할 문자를 준비하기

이 문제에서 출력이 필요한 문자는 별(*)과 개행문자(CRLF) 두 종류입니다. 첫 두 줄은 이 두 글자를 마련하는 코드입니다.

우선 별(*)을 만들어봅시다. *의 아스키 코드 값인 42는 다음과 같이 만듭니다.

#1 삭반반밤발뚜
#2 ㅇㅇㅇㅇ더떠

이응()은 이 과정에서는 무시해도 되는 부분을 나타냅니다.

  • : 스택 'ㄱ' 을 선택합니다. 초성 ㅅ은 스택을 선택하는 동작을, 종성 ㄱ은 선택할 스택을 의미합니다.
  • 반반밤발 : 초성 ㅂ은 선택한 스택에 값을 집어넣는 동작입니다. 종성이 ㅇ이면 숫자를 입력받고, 아니면 종성의 획수에 해당하는 숫자를 넣습니다. 종성이 순서대로 ㄴ, ㄴ, ㅁ, ㄹ이므로 2, 2, 4, 5가 들어갑니다.
  • 뚜떠더 : 초성 ㄸ는 스택에서 두 값을 꺼내 곱하고, 결과를 다시 스택에 집어넣습니다. 비슷하게 ㄷ는 덧셈, ㅌ는 뺄셈을 수행합니다. 여기서는 5와 4를 꺼내어 곱하여 20을 만들고, 거기에 2를 꺼내어 곱하고, 마지막으로 2를 더하므로 5 * 4 * 2 + 2 = 42가 스택에 남아있게 됩니다.

이제 스택 'ㄱ'에는 42라는 값이 들어있습니다.

개행문자도 동일한 원리로 만들어 넣습니다. 개행문자의 아스키 코드는 10번입니다.

#2 뚜벌번선ㅇㅇ

스택 'ㄴ'에는 2와 5를 곱한 값인 10이 들어있게 됩니다.

2. 숫자를 입력받고 루프 시작하기

#3 삳방빠뿌ㅇㅇㅇㅇ
#4 ㅇㅇㅇ챠ㅇㅇㅇ

으로 새로운 스택 'ㄷ'을 선택한 뒤, 으로 하나의 정수(종성 ㅇ)를 입력(초성 ㅂ)받습니다. 여기서는 숫자 5가 입력되었다고 가정하겠습니다.

초성 ㅃ은 스택의 헤드값을 복제하는 명령입니다. 빠뿌 로 두 번 복제했으므로 스택 'ㄷ'에는 5가 세 개 들어있습니다.

초성 ㅊ은 if 문입니다. 현재 스택에서 하나의 값을 꺼내서, 그 값이 0이 아니면 모음의 방향대로, 0이면 모음의 반대 방향으로 이동합니다. 예를 들어 스택의 헤드값이 0인 상태에서 를 입력했다면 왼쪽으로 두 칸 이동합니다.

주의! 초성 ㅊ에서 비교에 사용된 값은 스택에서 사라집니다. 여기서는 5가 세 개 들어있는 시점에 ㅊ으로 비교를 했으므로 이제 두 개 남아있습니다. 두 값은 각각 pseudo 코드의 c와 d를 맡게 됩니다.

3. 별 찍기

#3 ㅇㅇㅇㅇ빠맣삳붇
#4 ㅇㅇㅇ챠속어가분
#5 ㅇㅇㅇ차ㅇ뼈턱턱

시작점은 4열의 부터입니다. d가 0이 아닌 값이 들어있다면 어속빠맣삳붙분턱턱뼈차 의 순서대로 실행됩니다.

  • : 초성 ㅇ은 기능이 없습니다. 코드를 짤 공간이 부족하거나 빈 공간을 채워넣어할 때 이용하면 편리합니다.
  • 속빠맣 : 스택 'ㄱ'에 들어있는 값을 복제해서 문자로(종성 ㅎ) 출력(초성 ㅁ) 합니다. 스택 'ㄱ'에 넣어두었던 *이 출력될 것입니다. 조건문(초성 ㅊ)을 이용했을 때와 마찬가지로, 출력된 값은 스택에서 사라지기 때문에 출력하기 전에 스택의 값을 복제해주었습니다.
  • 삳붇분턱턱 : d의 값을 1만큼 뺍니다. 애석하게도 한글에는 1획짜리 종성이 없어 스택에 바로 1을 넣을 수 없습니다. (앞서 말했듯이, 종성 ㅇ은 정수의 입력에 사용됩니다.) 따라서 붇분턱 으로 3과 2를 넣고 두 값을 뺄셈하여 1을 만들어주었습니다.
  • 뼈차 : d의 값이 0인지 아닌지 비교합니다.

3-1. d가 0이 아니라면?

#4 ㅇㅇㅇㅇ속ㅇㅇㅇ
#5 ㅇㅇㅇ차오ㅇㅇㅇ

d의 값이 0이 아니라면 (즉, 0보다 크다면) 의 오른쪽으로 이동할 것이고, 를 거쳐 부터 다시 시작합니다. 즉 루프를 돌게 됩니다. (=> 3번 단계로 이동)

3-2. d가 0이라면?

ㅇㅇ빠뿌ㅇㅇㅇㅇ
ㅇㅇ오챠ㅇㅇㅇㅇ
뭏뻥선차ㅇㅇㅇㅇ
삳먁툑뱓텩번

루프를 돌고 나면 별이 한 줄에 필요한 개수만큼 출력되어있을 것이고, d의 값이 0이 됩니다. 이제 5번째 줄의 에서 모음의 반대 방향인 왼쪽으로 이동하여 선뻥뭏삳먁뱓번텩툑오빠뿌챠 의 순서로 코드가 실행됩니다.

  • 선뻥뭏 : 스택 'ㄴ'에 들어있는 개행문자를 문자로 출력합니다.
  • 삳먁 : 스택 'ㄷ'에 들어있는 d는 제 역할을 다했으므로, 꺼내서 버립니다. 이제 스택에는 c에 해당하는 값인 5 하나만 들어있습니다.
  • 뱓번텩툑오 : 이제 c의 값에서 1을 뺍니다. 1은 앞에서와 동일하게 3과 2를 넣고 두 값을 빼서 만듭니다.
  • 빠뿌 : 스택에 들어있는 값을 두 번 복사합니다. 이제 스택에는 4가 세 개 들어있습니다. 뭔가 익숙한 행동인 것 같다구요? 2번 과정으로 되돌아왔거든요! (=> 2번 단계로 이동)

2번 과정으로 되돌아가서, 이제 4를 기준으로 별을 찍습니다. 당연히 네 개가 찍히겠지요. 같은 과정을 3, 2, 1이 될 때까지 반복합니다. 그러면 어느 순간, c가 0이 되는 시점이 오겠죠?

4. c가 0이라면?

#3 ㅇ해ㅇ챠ㅇㅇㅇㅇ

에서 값이 0인지 비교합니다. 0이라면 ㅑ의 반대 방향인 왼쪽으로 두 칸으로 이동합니다. 그곳에서 라는 문자가 있네요.

초성 ㅎ은 프로그램 종료를 의미합니다. 즉 프로그램 실행이 완결된 것입니다.

아희에서는 감사하게도 AVIS라는 웹 편집기를 제공합니다. 편집기에서 위 코드를 실행해보면 다음과 같은 결과가 나옵니다.

예전에도 몇 번 아희로 코딩을 했던 적이 있는데, 하면 할 수록 난해한 프로그래밍 언어 중에서는 비교적 직관적이고 체계가 잘 잡혀있다는 생각이 듭니다. 여러분은 어떠신가요?

코드 해석에 궁금한 점이나 이것도 아희로 풀면 재밌을 것 같다는 문제가 있다면 댓글로 추천해주세요. 시간 날 때 짬짬이 풀어보겠습니다.

길고 무식한 글 읽어주셔서 감사합니다.

크리에이티브 커먼즈 라이선스

이 저작물은 크리에이티브 커먼즈 저작자표시-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.

© 2011 - 2020 Do Hoerin, LYnLab