lynlab logo

blog

about

#development#algorithm#aheui

[아희PS] 별 찍기 - 3

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

profile picture

Hoerin Doh | 2019. 06. 12

문제

한 정수 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라는 웹 편집기를 제공합니다. 편집기에서 위 코드를 실행해보면 다음과 같은 결과가 나옵니다.

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

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

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

관련 포스트

asdf — 하나의 명령어로 관리하는 버전 매니저 썸네일

asdf — 하나의 명령어로 관리하는 버전 매니저

요즘 세상에 하나의 언어로 모든 시스템을 개발하는 경우는 보기 드뭅니다. asdf는 각각의 개발 환경을 플러그인 형식으로 만들어 하나의 명령어로 관리하기 위해 탄생했습니다.

Keybase와 GPG 키를 이용해 Git 커밋에 서명하기 썸네일

Keybase와 GPG 키를 이용해 Git 커밋에 서명하기

Git은 커밋한 사람의 이메일 주소를 검증하지 않습니다. 하지만 GPG 키를 이용해 커밋에 서명을 남기면 커밋한 사람이 본인임을 증명할 수 있습니다.

[Drone] 인메모리 볼륨을 활용해 CI 속도 향상하기 썸네일

[Drone] 인메모리 볼륨을 활용해 CI 속도 향상하기

데이터 IO 작업으로 인해 CI/CD 프로세스에 병목이 생긴다면, 인메모리 볼륨을 활용해 속도를 크게 향상시킬 수 있습니다.

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

본 사이트의 저작물은 별도의 언급이 없는 한 크리에이티브 커먼즈 저작자표시-동일조건변경허락 4.0  국제 라이선스에 따라 이용할 수 있습니다.

© 2011 - 2021 Hoerin Doh, All rights reserved.