[파이썬 원격 강의 과제]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 < 3에 int(3)을 해줬는데도 안된다. 잠깐. count에 int를 씌우면?
2)count에 int를 씌우고, 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} 아웃")
'스파르타코딩클럽[AI트랙 3기] > 파이썬 과제' 카테고리의 다른 글
| [파이썬 원격 강의 과제]220915 #5 조건문, 반복문 (0) | 2022.09.21 |
|---|---|
| [파이썬 원격 강의 과제]220914 #4 파이썬 심화 문법 사용해보기 (0) | 2022.09.21 |
| [파이썬 원격 강의 과제]220913 #3 클래스 활용해보기 (0) | 2022.09.21 |
| [파이썬 원격 강의 과제] 220906 #1 계산기 만들어보기 (0) | 2022.09.18 |