99병의 맥주

위키백과, 우리 모두의 백과사전.
Asadal (토론 | 기여)님의 2015년 5월 27일 (수) 03:20 판

99병의 맥주(영어: 99 Bottles of Beer)는 미국캐나다민요로, 영국동요 중 하나인 열 개의 녹색 병(Ten Green Bottles)에서 파생되었다.

내용

다음과 같은 가사가 계속 반복된다.

이렇게 해서 1병씩 줄어들다가 마지막에는 다음과 같이 된다.

과학 참조

컴퓨터 과학자도널드 커누스노래의 복잡성과 관련해서 에 의해 노래가 복잡했음을 입증하였다.

컴퓨터 프로그램에는 노래 가사를 출력하는 것이 있다. 이는 반복과 같은 Hello world 프로그램과 유사하다. Hello World와 마찬가지로 이는 컴퓨터 프로그래밍을 공부하는 사람들한테 프로그래밍 언어간의 차이를 시험해볼 수 있다.

프로그래밍

99병의 맥주는 프로그래밍에서 반복문(for)과 조건문(if) 구현 연습에 이용되기도 한다. 반복문은 99병에서 1병씩 줄여 0병이 될 때까지 반복할 때 쓰고, 조건문은 99병에서 계속 줄여 나가다 막판에 ‘1병’을 표시하는 부분에서 ‘1 bottles’가 아닌 ‘1 bottle’이라고 표시되게 하고 0병이 남았다는 구절을 더 이상 맥주가 없다는 구절로 대체하는 데 필요하다. 병의 숫자는 아라비아 숫자로 출력되게 하는 경우가 많으며, 더 복잡하게 수정해서 영어 숫자의 형식으로 나오게 하는 것도 가능하다.

코드 예제

다음은 베이직에서 99병의 맥주 출력 프로그램을 구현한 예제이다.

10 FOR I = 99 TO 1 STEP -1
20 MODE = 1: GOSUB 120
30 PRINT I; "bottle" + BOTTLES$ + " of beer on the wall,"; I; "bottle" + BOTTLES$ + " of beer."
40 MODE = 2: GOSUB 120
50 GOSUB 140
60 PRINT " Take one down and pass it around,"; DSP$; " bottle" + BOTTLES$ + " of beer on the wall."
70 PRINT
80 NEXT I
90 PRINT " No more bottles of beer on the wall, no more bottles of beer."
100 PRINT " Go to the store and buy some more. 99 bottles of beer."
110 END
120 IF I = MODE THEN BOTTLES$ = "" ELSE BOTTLES$ = "s"
130 RETURN
140 IF I - 1 = 0 THEN NOB$ = " no more" ELSE DSP$ = STR$(I - 1)
150 RETURN

한국어 코드 예제

다음은 베이직에서 한국어로 번역된 99병의 맥주 출력 프로그램을 구현한 예제이다. 구조를 조금 복잡하게 하여 ‘아흔아홉 병’의 형식으로 표시되게 하였다.

10 OPTION BASE 0
20 DIM TENDIGIT$(9)
30 DIM ONEDIGIT$(9)
40 FOR I = 1 TO 9
50 READ TENDIGIT$(I)
60 NEXT I
70 FOR I = 1 TO 9
80 READ ONEDIGIT$(I)
90 NEXT I
100 FOR I = 99 TO 1 STEP -1
110 J = I: GOSUB 210
120 PRINT " "; DSP$; " 병의 맥주가 벽장에 있네, "; DSP$; " 병의 맥주라네."
130 J = I - 1: GOSUB 210
140 GOSUB 240
150 PRINT "하나를 내려서 넘겨주었네, "; NOB$
160 PRINT
170 NEXT I
180 PRINT " 더 이상 벽장에 맥주가 없네, 더 이상 맥주는 없다네."
190 PRINT "가게에 가서 더 사왔네, 아흔아홉 병의 맥주가 벽장에 있네."
200 END
210 DSP$ = TENDIGIT$(INT(J / 10)) + ONEDIGIT$(J MOD 10)
220 IF DSP$ = "스물" THEN DSP$ = "스무"
230 RETURN
240 IF I - 1 = 0 THEN NOB$ = "더 이상 벽장에 맥주가 없네." ELSE NOB$ = DSP$ + " 병의 맥주가 벽장에 있네."
250 RETURN
260 DATA "열", "스물", "서른", "마흔", "쉰", "예순", "일흔", "여든", "아흔"
270 DATA "한", "두", "세", "네", "다섯", "여섯", "일곱", "여덟", "아홉"

한국어에는 명사의 단수/복수 구분이 없으므로 bottle/bottles 관련 처리를 생략한 대신 ‘스물’이 수관형사로 쓰일 경우 ㄹ탈락에 의해 ‘스물 병’이 아닌 ‘스무 병’으로 표시되도록 처리하였다. 실행하면 다음과 같이 나온다.

  아흔아홉 병의 맥주가 벽장에 있네, 아흔아홉 병의 맥주라네.
하나를 내려서 넘겨주었네, 아흔여덟 병의 맥주가 벽장에 있네.

  아흔여덟 병의 맥주가 벽장에 있네, 아흔여덟 병의 맥주라네.
하나를 내려서 넘겨주었네, 아흔일곱 병의 맥주가 벽장에 있네.

  아흔일곱 병의 맥주가 벽장에 있네, 아흔일곱 병의 맥주라네.
하나를 내려서 넘겨주었네, 아흔여섯 병의 맥주가 벽장에 있네.

(중간 생략)

  스물한 병의 맥주가 벽장에 있네, 스물한 병의 맥주라네.
하나를 내려서 넘겨주었네, 스무 병의 맥주가 벽장에 있네.

  스무 병의 맥주가 벽장에 있네, 스무 병의 맥주라네.
하나를 내려서 넘겨주었네, 열아홉 병의 맥주가 벽장에 있네.

(중간 생략)

   병의 맥주가 벽장에 있네,  병의 맥주라네.
하나를 내려서 넘겨주었네,  이상 벽장에 맥주가 없네.

   이상 벽장에 맥주가 없네,  이상 맥주는 없다네.
가게에 가서  사왔네, 아흔아홉 병의 맥주가 벽장에 있네.

같이 보기

바깥 고리