from __future__ import print_function
from sys import stdin
import time	           # sleep 함수를 포함한 라이브러리

def printf(str, *args):
	print(str % args, end='')

# my_opening 함수는 처음으로 화면에 안내를 출력
def my_opening():
	printf("# 지금부터 여러분을 신비한 마술의 세계로 초대한다.\n\n\n")
	printf("1 - 31의 숫자 중 마음에 드는 숫자를 생각하라. \n\n")

# my_card 함수가 index번째 카드에 있는 숫자들을 화면에 출력해 사용자부터 0이나 1을 입력받음
def my_card(index):
	cardname = chr(ord('A') + index - 1)
	
	while True:
		printf("   --------- %s 카드 ---------\n" % cardname )
		# 해당 for 문은 index번째 카드에 있는 숫자들을 출력
		for i in range(0, 4):
			for j in range(0, 4):
				printf("%7d" % card[index-1][4*i + j])
			printf("\n")
		printf("   --------------------------\n")
		printf("\n\n")
		printf("%s 카드에 생각한 숫자가 있다면 YES(1번), 없다면 NO(0번)를 선택하라. : \n" % cardname)
		result = int(stdin.readline())  # 사용자가 생각한 수가 index번째 카드에 있으면 1을, 아니면 0을 입력하면 그것을 a에 저장
		printf("\n\n")
		if result>-1 and result<2:      # 사용자가 입력한 문자가 0이나 1이면 a를 반환하고, 잘못된 입력이면 다시 index번째 카드를 출력
			return result

# my_res 함수는 사용자가 생각한 숫자를 출력
def my_res(a,b,c,d,e):
	'''2진수를 10진수로 변환하는 것처럼 사용자로부터 얻은 a,b,c,d,e에 대해 계산을 진행, 즉 
   a,b,c,d,e 비트열이라고 가정해 이를 10진수로 변경하면 사용자가 생각한 숫자가 나타남'''
	res = (e*2*2*2*2) + (d*2*2*2) + (c*2*2) + (b*2) + (a)
	printf("당신이 마음에 드는 숫자는 %d이다.\n\n\n" % res);
	printf("신기하지 않은가?\n");  


# 5개의 카드를 위한 2차원 배열 정의 및 초기화
card = [
	[1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31],
	[2,3,6,7,10,11,14,15,18,19,22,23,26,27,30,31],
	[4,5,6,7,12,13,14,15,20,21,22,23,28,29,30,31],
	[8,9,10,11,12,13,14,15,24,25,26,27,28,29,30,31],
	[16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31]
	]

my_opening()						
   # 이 함수로 화면에 안내를 출력

time.sleep(3)					
printf("\n생각했는가? 시작하려면 엔터를 클릭하라.")
stdin.readline()					

print("\n\n")
a = my_card(1)						
    # 사용자에게 첫 번째 카드를 보여주고 1이나 0을 a에 저장
b = my_card(2)						
    # 사용자에게 두 번째 카드를 보여주고 1이나 0을 b에 저장
c = my_card(3)						
    # 사용자에게 세 번째 카드를 보여주고 1이나 0을 c에 저장
d = my_card(4)						
    # 사용자에게 네 번째 카드를 보여주고 1이나 0을 d에 저장
e = my_card(5)						
    # 사용자에게 다섯 번째 카드를 보여주고 1이나 0을 e에 저장

my_res(a,b,c,d,e)    # 사용자가 생각한 숫자를 계산해서 화면에 출력
