[파이썬 원격 강의 과제]220907 #2 숫자 야구 만들기

2022. 9. 21. 11:16스파르타코딩클럽[AI트랙 3기]/파이썬 과제

▶내가짠 코드

*1차시도

#모듈 삽입
import random
game = set()
#몇개의 숫자로 게임 할지 지정
def get_answer(count):
result=[]
if count < int(3):
print("3이상의 값을 입력해주세요.")

elif count > int(10):
print("10이하의 값을 입력해주세요.")

else:
for _ in range(count):
game = set()

while len(game) < input():
game.add(random.randint(0,9))

result.append(game)

return result

game_numbers = get_answer(input())
print(game_numbers)

 

1)TypeError: '<' not supported between instances of 'str' and 'int'

=>뭔가 잘못됐다. 문자열과 정수를 구분 못하는 것 같은데.. 그래서 count < 3int(3)을 해줬는데도 안된다. 잠깐. countint를 씌우면?

2)countint를 씌우고, while문에도 int(input())을 해줬는데 결과는 처참하다. 입력값을 몇 개를 받은 거지? 3을 입력했을 때 입력값은 14개를 받고 출력은 같은 값끼리 4, 3, 3 받았다.

 

can=[3,4,5,6,7,8,9,10]

def game_set(length):
for i in range(length)
game += can[random.randrange(0.len(can))]
return game

def = main():
length =input()
game = gaem_set(length)
print(game)

main()

*2차시도

import random
print('숫자야구게임을 시작합니다.')
#1사용자 입력값 입력
game_amount=int(input('게임을 진행할 숫자만큼의 값을 입력해주세요:'))
#0<game_amount<11

def get_answer(count):
 answer=set()
 if count < 3:
     print('3이상의 값을 입력하세요')
 elif count > 10:
     print('10이하의 값을 입력하세요')

 else:
 for i in range(game_amount):
    answer =set()

 

▶다른사람이 짠 코드

#1) 프로그램이 시작되면 슷자야구 게임을 몇 자리 숫자로 할 건지 입력 받아 주세요
    #- 3을 입력할 경우 해당 숫자야구 게임은 3자릿수로 진행, 최대 10자리

a = int(input())

#2) 첫 번째 입력을 받은 자릿수 만큼 후 파이썬으로 중복 없는 랜덤한 수를 생성해 주세요
#list가 나와야하고 list의 개수는 a 
#list = []에서 시작해서 .append해서 추가해주는 것으로 함.
#어디까지 추가해주냐면 length 입력해준 값까지.
#그러면 
def answer(): #로 함수 지정해주고
answer_list = []
 for i in range(a):
answer_list.append(a)

list.append(a(length))
#그리고 랜덤한 숫자 생성 : range(0,9)이용해서 해주기. 몇개를 해줘야하냐면 a 개


#3)사용자가 숫자를 입력 했을 때 숫자야구 게임의 규칙에 맞게 ball / out count를 출력해 주세요
int(input().split())#한 것이 자리, 숫자 맞을때 s / 숫자만 맞을 때 b / 없을 때 out

##inde
#4) 사용자가 정답을 맞춘 경우 아래 항목들을 출력해 주세요
    #- 사용자가 정답을 맞추기까지 입력 한 횟수
    #- 사용자가 게임을 시작해서 정답을 맞추기까지 소요된 시간
   # - 정답을 맞춘 시점의 날짜/시간
#5) 게임을 진행하던 도중, “exit”을 입력할 경우 프로그램을 종료해 주세요

▶이창호 튜터님 답안 코드

import random
import time
from datetime import datetime

# CASE 1
"""
number_list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
random.shuffle(number_list)

random_numbers = number_list[0:length] # 0:5

print(random_numbers)
"""
# CASE 2
"""
number_list = [x for x in range(10)] # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

random_numbers = []

for _ in range(length):
    random_numbers.append(number_list.pop(random.randrange(0, len(number_list))))

print(random_numbers)
"""

# CASE 3
def main():
    length = int(input("자릿수를 입력해주세요 : "))
    random_numbers = set()

    while len(random_numbers) < length:
        random_numbers.add(random.randint(0, 9))

    random_numbers = list(random_numbers)
    random.shuffle(random_numbers)

    start_time = time.time()
    try_count = 0

    while True:
        input_number = input("값을 입력해주세요 (종료 - exit): ")
        if input_number == "exit":
            return
        
        try_count += 1
        out_count = 0

        ball_count = 0
        strike_count = 0

        for i, v in enumerate(input_number):
            v = int(v)
            if v not in random_numbers: # 포함돼있지 않은 경우
                out_count += 1
                
            else: # 포함돼 있는 경우
                if random_numbers[i] == v:
                    strike_count += 1
                else:
                    ball_count += 1
                    
        if strike_count == length:
            print("########################")
            print("정답입니다!!")
            print(f"소요 시간 : {time.time() - start_time:.2f}")
            print(f"클리어 일자 : {datetime.now()}")
            print(f"도전 횟수 : {try_count}")
            print("########################")
            return
        
        print(f"{ball_count}볼 {strike_count}스트라이크 {out_count}아웃")

main()

▶코드 해부(단계별 코드 풀이)

1.사용자의 입력을 받아 n개의 중복되지 않는 랜덤한 숫자 생성

"""
1.사용자 입력값 입력
2.컴퓨터 랜덤값 생성
3.두개값비교
4.비교한 값 출력
5.게임 종료
6.시간계산
"""
#1. 사용자의 입력을 받아 n개의 중복되지 않는 랜덤한 숫자 생성
"""
####case 1 :random shuffle, list 활용
import random

length = int(input()) #개발 완료 후 사용가자 input으로 변경 예정

if length < 3 :
    print('3이상 입력해라')

elif length > 11 :
    print('10이하  입력해라')

else:
    number_list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    random.shuffle(number_list)

    random_numbers = number_list[0:length] #0부터 9까지 랜덤한 숫자만큼의 요소들이 리스트안에 생성

    print(random_numbers)

###Case 2 : pop 이용
import random
length = int(input())# 우선 고정값으로 줌

if length < 3 :
    print('3이상 입력해라')

elif length > 11 :
    print('10이하  입력해라')
else:

    number_list = [x for x in range(10)] #이거는 number_list = [0,1.2.3.4.5.6.7.8.9]랑 똑같은 것임.
    random_numbers=[] #빈 리스트 만듦

    #random_numbers = number_list.pop() #기본적으로는 리스트의 마지막 숫자를 출력. 그러나 숫자를 넣으면 넣은 숫자만큼의 인덱스의 숫자가 빠짐. 이때 인덱스는 1번째 자리 0부터 시작

    for _ in range(length): #들어온 length의 숫자만큼 반복
        random_numbers.append(number_list.pop(random.randrange(0, len(number_list))))#random_numbers에 요소를 하나씩 추가
         #0,숫자안해주는  이유는 pop하면 숫자가 리스트가 하나씩 줄어드는데 만약에 9라도 입력하면 에러남.

    print(random_numbers) #마지막숫자를 빼서 그 숫자가 변수가 된 것임. 그래서 9
"""
###case 3 : 튜플이용
def main():
    import random

    length = int(input("자리수를 입력해주세요:"))# 우선 고정값으로 줌

    if length < 3 :
        print('3이상 입력해라')

    elif length > 11 :
        print('10이하  입력해라')
    else:

        random_numbers = set() #set자료형은 순서가 없음. 그러나 적은 개수는 자동으로 정렬해줌. 그래서 set을 list로 변경해줌. **참고

        while len(random_numbers) < length : #len(random_numbers)가 length보다 커지면 while문을 그만 둠. 부둥호를 쓰려면 length에 int 해줘야함. 위에서 length자체에 해줘서 무관
            random_numbers.add(random.randint(0,9)) #randint는 마지막 숫자 포함함 / randrange는 마지막 숫자 포함 안함

        random_numbers = list(random_numbers) #**두번째줄에서 set자료형을 list 자료형으로 바꿔줌. 그리고 순서를 섞어준다. ***참고
        random.shuffle(random_numbers) #***순서 섞어주기

        print(random_numbers)

#2프로그램이 시작된 시간을 기록
import time
    start_time = time.time()

#3사용자의 입력을 받고, 입력 받을때 마다 try count를 1씩 더하기
    try_count = 0

    while True: #++
        input_number = input("값을 입력해주세요(종료는 exit) :")
        if input_number == "exit":
            return
        try_count +=1
        out_count = 0 #&에서 올라옴.

        ball_count = 0
        strike_count = 0

        #4사용자 입력 x와 랜덤하게 생성된 y 두 숫자 비교하기(enumerate 이용)
        for i, v in enumerate(input_number): #사용자가 입력한 값은 스트링으로 돼어있음 input에 "41232"입력했다고 가정. 그럼 enumerate돌리면 0 4/1 1/2 2/3 3/4 2과 같이 나옴.
            v = int(v) #v는 int로 바꿔줌. 원래 v는 str인데 위에 random_numbers와 비교하기 위해서는 int가 되어야 비교 가능
            if v not in random_numbers: #같은 숫자 포함 안되있는 경우
                out_count += 1  #해줘야하는데 해당 변수가 없으므로 위에 out_count = 0 해서 올려줌 &
            else: #같은 숫자 포함된 경우, 경우의 수는 두가지(볼, 스트라이크) 그래서 아웃카운트 밑에 볼이랑 스트라이크 카운트 넣어줌. &
                if random_numbers[i] == v : #여기서 enumerate사용한 이유가 나옴. 입력된 숫자에 순서까지 가져오기때문에 i(rabdom_numbers의 i번째 수)랑 v(input_number의 숫자)랑 같으면
                    strike_count += 1

                else:
                    ball_count += 1

#5 사용자가 exit를 입력하거나 정답을 맞출때까지 3,4번 동작을 무한하게 반복 > 위에 ++확인
    #처음 지정안했지만 프로그램 작성할때는 함수로 정의해주어야함. 그래야 return 사용해서 함수 멈추기 편함.
    #while True 넣어주고 input_number 밑에 if input_number == "exit":하고 바로 아랫줄에 return

#6 사용자의 입력이 1번에서 생성한 숫자가 일치할 경우 필요한 정보 출력하고 프로그램 종료
 #a - try_count / 시간계산 / 날짜 시각출력
import datetime
        if strike_count == length: #length가 strike+count랑 개수 같으면 정답. 이 코드는  다양하게 사용 가능. 리스트끼리 비교해줘도 되고 다양함.
            print("#####################") #단순히 출력해주는 것
            print("정답입니다!")
            print(f"소요시간 : {time.time()-start_time:.2f}") #현재시간 - 시작시간 맨뒤에 :.2f하면 소수점 둘째짜리 까지 표현.
            print(f"클리어 일자:{datetime.now()}") #위에서 import datetime 해줘야함.
            print(f"도전횟수:{try_count}") #while문 돌때마다 +1됨.
            print("#####################")
            return

#7 정답을 못마춘 경우 볼카운트, 스트라이크카운트 출력
        print(f"{ball_count} 볼, {strike_count} 스트라이크, {out_count} 아웃")