본문 바로가기

프로그래밍/Python

카드마술 프로그램

카드마술 프로그램

 

기본적인 정보이론 분야의 실습 프로그램. $N$ 개의 정보를 분류하기 위해서는 최대 $\log_{2}{N}$개의 질문이 필요하다는 간단하고 기초적인 엔트로피 개념을 적용한 실습인데, 마술이라는 거창한 타이틀이 달려있다.

 

모르고 봤으면 신기했을려나...?

 

def trans_num(n: int, item: int) -> str:
    bin_str = bin(item)[2:]
    bin_str = '0' * (n - len(bin_str)) + bin_str
    return bin_str[::-1]

def make_deck(n: int) -> list[list[int]]:
    
    deck = [[] for _ in range(n)]
    arr = [i for i in range(2**n)]
    for item in arr:
        bin_str = trans_num(n, item)
        for i in range(n):
            if bin_str[i] == '1':
                deck[i].append(item)
    
    return deck

def show_card(n: int, deck: list[list[int]]) -> None:
    for i in range(n):
        print(f"CARD {i+1}:", deck[i])


ans = ""
n = int(input("사용할 카드 장수: "))

deck = make_deck(n)
show_card(n, deck)

print(f"마음 속으로 1부터 {2**n-1}까지 임의의 숫자를 생각하세요.")
for i in range(n):
    choice = input(f"생각한 카드가 {i+1}번째 카드에 있습니까?(Y/N): ")
    if choice == 'Y' or choice == 'y':
        ans += '1'
    elif choice == 'N' or choice == 'n':
        ans += '0'
    else:
        print("잘못 입력하셨습니다.")
        i -= 1

ans = int(ans[::-1], 2)
print(f"당신이 생각한 숫자는 {ans}입니다!")