[Farm System๐Ÿชด] ์ธ๊ณต์ง€๋Šฅ ์Šคํ„ฐ๋”” 4์ฃผ์ฐจ(ํ”ผ๋™์  ์•Œ๊ณ ๋ฆฌ์ฆ˜)

์žฌํ™(JH)ยท2025๋…„ 5์›” 24์ผ

๐Ÿ™Œ์„œ๋ก 

์ด๋ฒˆ ์ฃผ์ฐจ ์Šคํ„ฐ๋””๋Š” ๊ฐ„๋‹จํžˆ ์š”์•ฝํ•ด์„œ ๋งํ•˜๋ฉด ์ €๋ฒˆ์ฃผ์ฐจ๊นŒ์ง€ ๋ฐฐ์šด ํŒŒ์ด์ฌ๊ณผ ๋„˜ํŒŒ์ด๋ฅผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ†ตํ•ด ๋ณต์Šตํ•ด๋ณธ๋‹ค๋Š” ๋А๋‚Œ์ด ๊ฐ•ํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ๊ต์žฌ์—์„œ๋„ ๋ฌด์–ธ๊ฐˆ ์ƒˆ๋กœ์ด ๋ฐฐ์šฐ๊ธฐ ๋ณด๋‹ค๋Š” ์ˆซ์ž์•ผ๊ตฌ๋ผ๋Š” ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ํŒŒ์ด์ฌ, ๋„˜ํŒŒ์ด๋ฅผ ํ™œ์šฉํ•ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์งœ๋ณด๋Š” ๋А๋‚Œ์ด ๊ฐ•ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ์ €๋„ ์ด๋ฒˆ ์ฃผ์ฐจ ์Šคํ„ฐ๋””๋Š” ์ด๋•Œ๊นŒ์ง€ ๋ฐฐ์šด ํŒŒ์ด์ฌ๊ณผ ๊ฐ„๋‹จํ•œ ๋„˜ํŒŒ์ด๋ฅผ ๋ณต์Šตํ•˜๊ณ  ์ด์ •๋ฆฌ ํ•œ๋‹ค๋Š” ๋А๋‚Œ์œผ๋กœ ํ•™์Šตํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋กœ ์ œ๋ชฉ์ด ํ”ผ๋™์  ์•Œ๊ณ ๋ฆฌ์ฆ˜์ธ ์ด์œ ๋Š” ๊ต์žฌ์˜ ํ•„์ž๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ ์–ด๋†จ๋‹ค.
ํ•„์ž๊ฐ€ ๊ณ ์•ˆํ•œ ํ•ด๋ฒ•์— ๋”ฐ๋ผ์„œ๋งŒ ๋‹ต์„ ์ฐพ์•„๊ฐ„๋‹ค๋Š” ์ ์—์„œ ์ด ์žฅ์˜ ์ œ๋ชฉ์€ ํ”ผ๋™์  ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ผ ํ•˜์˜€๋‹ค.

๐Ÿงข์ˆซ์ž ์•ผ๊ตฌ

๊ต์žฌ์—์„  ์ด๋ฒˆ ์ฃผ์ฐจ ๋‚ด์šฉ ํ†ต์ฑ„๋กœ ์ˆซ์ž์•ผ๊ตฌ๋ผ๋Š” ๊ฒƒ์„ ํŒŒ์ด์ฌ, ๋„˜ํŒŒ์ด๋ฅผ ์ด์šฉํ•ด ์ž‘์„ฑํ•˜๊ณ  ์„ค๋ช…ํ•˜๋Š” ๋‚ด์šฉ์œผ๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

์ˆซ์ž์•ผ๊ตฌ๋ž€?

'์ˆซ์ž์•ผ๊ตฌ'๋ผ๊ณ  ๊ทธ๋ƒฅ ๋“ค์œผ๋ฉด ๋ฌด์—‡์ธ์ง€ ๊ฐ์ด ์•ˆ์˜ค์‹ค ์ˆ˜๋„ ์žˆ๋Š”๋ฐ ๊ทœ์น™์„ ๋“ค์œผ๋ฉด ์•„? ํ•˜๊ณ  ์ƒ๊ฐ๋‚˜์‹ค ์ˆ˜ ์žˆ์„ ๊ฒ๋‹ˆ๋‹ค. ์•„๋งˆ ๋‹ค๋“ค ํ•œ๋ฒˆ์”ฉ ํ•ด๋ดค์„ ๊ฒ๋‹ˆ๋‹ค(์ €๋„ ๊ธฐ์–ต์†์—์„œ ์ดˆ๋”ฉ๋•Œ ํ•ด๋ณธ๊ฒŒ ๋– ์˜ค๋ฅด๋„ค์š”..ใ…Žใ…Ž).

๊ฐ์ž 3/4์ž๋ฆฌ์˜ ์ˆซ์ž๋ฅผ ์ž„์˜๋กœ ์ •ํ•œ ๋’ค, ์„œ๋กœ์—๊ฒŒ 3/4์ž๋ฆฌ์˜ ์ˆซ์ž๋ฅผ ๋ถˆ๋Ÿฌ์„œ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•œ๋‹ค. 
๊ทธ๋ฆฌ๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ํ† ๋Œ€๋กœ ์ƒ๋Œ€๊ฐ€ ์ ์€ ์ˆซ์ž๋ฅผ ์˜ˆ์ƒํ•œ ๋’ค ๋งžํžŒ๋‹ค.
์‚ฌ์šฉ๋˜๋Š” ์ˆซ์ž๋Š” 0์—์„œ 9๊นŒ์ง€ ์„œ๋กœ ๋‹ค๋ฅธ ์ˆซ์ž์ด๋‹ค. 
๊ฒฝ์šฐ์— ๋”ฐ๋ผ 0์€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ๋„ ํ•˜๋ฉฐ 0์ด ์ฒซ๋ฒˆ์งธ ์ˆซ์ž๋กœ ์˜ฌ ์ˆ˜ ์—†๊ฒŒํ•˜๋Š” ๋ฃฐ๋„ ์žˆ๋‹ค.

1. ์ˆซ์ž๋Š” ๋งž์ง€๋งŒ ์œ„์น˜๊ฐ€ ํ‹€๋ ธ์„ ๋•Œ๋Š” BALL.

2. ์ˆซ์ž์™€ ์œ„์น˜๊ฐ€ ์ „๋ถ€ ๋งž์œผ๋ฉด STRIKE.
(๋ฌผ๋ก  ๋ฌด์—‡์ด BALL์ด๊ณ  STRIKE์ธ์ง€๋Š” ์•Œ๋ ค์ฃผ์ง€ ์•Š๋Š”๋‹ค.)

3. ์ˆซ์ž์™€ ์œ„์น˜๊ฐ€ ์ „๋ถ€ ํ‹€๋ฆฌ๋ฉด OUT. 

- ๋‘ ์ˆซ์ž๊ฐ€ ์ค‘๋ณต๋˜๋ฉด ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ๋งŽ์•„์ ธ์„œ ๊ทธ๋Ÿฐ์ง€ ์ค‘๋ณต ์ˆซ์ž๋Š” ์ž˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ €ํฌ๊ฐ€ ํ•™์Šตํ•  ์ฝ”๋“œ๋Š” ์ •๋‹ต ์ˆซ์ž๋ฅผ 3์ž๋ฆฌ๋กœ ํ•˜๊ณ  0์€ ํฌํ•จํ•˜์ง€ ์•Š์€ 1~9๊นŒ์ง€ ์ˆซ์ž๋กœ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ˆซ์ž ์ค‘๋ณต๋„ ์—†๋‹ค๊ณ  ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ์ฝ”๋“œ๋ฅผ ์งœ๊ธฐ์ „ ์‚ฌ์šฉํ•  ํŒจํ‚ค์ง€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
import numpy as np

์‘๋‹ต์ž ์ฝ”๋“œ

์šฐ์„  ์ปดํ“จํ„ฐ๊ฐ€ ์‘๋‹ต์ž ์—ญํ• ์„ ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
(์‘๋‹ต์ž๋ผ ํ•จ์€ ์ปดํ“จํ„ฐ๊ฐ€ ์ˆซ์ž 3๊ฐœ๋ฅผ ์ •ํ•˜๊ณ  ๋ฌธ์ œ๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค ์ƒ๊ฐํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰ ์ปดํ“จํ„ฐ๊ฐ€ ์ŠคํŠธ๋ผ์ดํฌ๊ฐ€ ๋ช‡๊ฐœ์ธ์ง€, ๋ณผ์ด ๋ช‡๊ฐœ์ธ์ง€ ๋“ฑ์„ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.)

rsp_nums = [i for i in range(1, 10)]
rsp_nums = np.random.choice(rsp_nums, size = 3, replace = False)

์šฐ์„  ์œ„ ์ฝ”๋“œ๋Š” ์ปดํ“จํ„ฐ ์‘๋‹ต์ž๊ฐ€ ์‚ฌ์šฉํ•  ์ˆซ์ž๋ฅผ ๋ฌด์ž‘์œ„์ ์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

1๋ถ€ํ„ฐ 9๊นŒ์ง€์˜ ์ •์ˆ˜ ์•„ํ™‰๊ฐœ๊ฐ€ ํฌํ•จ๋œ ๋ฆฌ์ŠคํŠธ rsp_nums๋ฅผ ์ƒ์„ฑํ•œ ๋‹ค์Œ, np.random.choice๋ฅผ ์‚ฌ์šฉํ•ด์„œ rsp_nums์— ํฌํ•จ๋œ ์ˆซ์ž ์ค‘์—์„œ ์„ธ๊ฐœ์˜ ์ˆซ์ž๋ฅผ ์ค‘๋ณต์ด ์—†๋„๋ก ๋ฌด์ž‘์œ„์ ์œผ๋กœ ์„ ํƒํ•˜๋„๋ก ํ•œ ํ›„ ๋ฐ˜ํ™˜๋˜๋Š” ๋ฐฐ์—ด ๊ฐ์ฒด์— rsp_nums๋ฅผ ๋‹ค์‹œ ๋ถ™์—ฌ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.


๋‹ค์Œ ์•„๋ž˜ ์ฝ”๋“œ๋Š” rsp_nums๋ฐฐ์—ด๊ณผ ํ•ด๊ฒฐ์ž(๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์‚ฌ๋žŒ)๊ฐ€ ์ถ”์ธกํ•œ ์„ธ ๊ฐœ์˜ ์ˆซ์ž๊ฐ€ ๋‹ด๊ธด guess ๋ฆฌ์ŠคํŠธ๋ฅผ ์ž…๋ ฅ๋ฐ›๊ณ  ์‘๋‹ตํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

def get_response_from_guess(rsp_nums, guess):
	n_stk = 0
    n_bll = 0
    for i in range(3):
    	if guess[i] == rsp_nums[i]:
        	n_stk += 1
        elif guess[i] in rsp_nums:
        	n_bll += 1
        else:
        	pass
    respose = (n_stk, n_bll)
    return response

n_stk์™€ n_bll์€ ๊ฐ๊ฐ ์ŠคํŠธ๋ผ์ดํฌ์™€ ๋ณผ์˜ ๊ฐœ์ˆ˜์ด๊ณ  rsp_nums์™€ guess๋ฅผ ๊ฐ๊ฐ if๋ฌธ์„ ํ†ตํ•ด ๋น„๊ตํ•ด๊ฐ€๋ฉฐ ์ŠคํŠธ๋ผ์ดํฌ์™€ ๋ณผ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ฆ๊ฐ€์‹œ์ผœ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.


์œ„์˜ ์ฝ”๋“œ๋“ค์„ ๋ฐ”ํƒ•์œผ๋กœ ์‘๋‹ต์ž ํด๋ž˜์Šค๋ฅผ ๊ตฌํ˜„ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
class Responder():
	
    def __init__(self):
    	self.rsp_nums = np.random.choice(
        [i for i in range(1, 10), size = 3, replace = False)
    
    def get_response_from_guess(rsp_nums, guess):
		n_stk = 0
    	n_bll = 0
    	
        for i in range(3):
    		if guess[i] == rsp_nums[i]:
        		n_stk += 1
       	 	elif guess[i] in rsp_nums:
       	 		n_bll += 1
        	else:
        		pass
    	
        respose = (n_stk, n_bll)
    	
        return response

๋งˆ์ง€๋ง‰์œผ๋กœ ์ž…๋ ฅ์„ ๋ฐ›์•„ guess๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

while True:
	guess = input("Guess:")
    if len(guess) == 3 and len(set(guess))==3:
    	break
guess = [int(item) for item in guess]

๋ˆˆ ์—ฌ๊ฒจ ๋ณผ ๊ตฌ๊ฐ„์€ len(set(guess)) == 3 ์ด๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. ์ €ํฌ๋Š” ์ค‘๋ณต์ˆซ์ž๋ฅผ ๋ฐ›์ง€ ์•Š๊ธฐ๋กœ ํ•˜์˜€๊ธฐ์— set์„ ์ด์šฉํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
(์ง‘ํ•ฉ์€ ์ค‘๋ณต์ˆซ์ž๋ฅผ countํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด์ฃ )

์ด๋ ‡๊ฒŒ ์‘๋‹ต์ž ์ฝ”๋“œ๋ฅผ ์งœ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ์ž ์ฝ”๋“œ

ํ•ด๊ฒฐ์ž๋Š” ์‘๋‹ต์ž์™€ ๋ฐ˜๋Œ€๋กœ ๋ฌธ์ œ๋ฅผ ๋งž์ถ”๋Š” ๊ฒฝ์šฐ๋ผ๊ณ  ๋ณด๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰ guess๋ฅผ ์ž…๋ ฅํ•˜๊ณ  ๊ฒฐ๊ณผ๋กœ ์•Œ๊ฒŒ๋˜๋Š” (num_str, num_bll)์„ ํ†ตํ•ด ๋‹ต์„ ์ถ”๋ก ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด์ฃ .
์ผ์ข…์˜ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ฉฐ ๊ฒฐ๊ณผ๋ฅผ 8๊ฐœ๋กœ ๊ตฌ๋ถ„์ด ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ๋ธŒ๋ฃจํƒ€ํฌ์Šค ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ผ ๋ณด์…”๋„ ๋ฉ๋‹ˆ๋‹ค.

๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋Š” 3S0B, 0S3B, 1S2B, 1S0B, 0S1B, 2S0B, 1S1B, 0S2B ์ž…๋‹ˆ๋‹ค.
(S๋Š” ์ŠคํŠธ๋ผ์ดํฌ ๊ฐœ์ˆ˜, B์€ ๋ณผ์˜ ๊ฐœ์ˆ˜ ์ž…๋‹ˆ๋‹ค.)

ํ•ด๊ฒฐ์ž ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

numbers = [i for i in range(1, 10)]

while True:
	init_guess = np.random.choice(nubers, size = 3, replace = False)
    
    nubers.remove(init_guess[0])
    nubers.remove(init_guess[1])
    nubers.remove(init_guess[2])
    
    pirnt("guess:", "".join([str(n) for n in init_guess]))
    
    #human input
    n_stk = int(input("n strikes:"))
    n_bll = int(input("n balls :"))
    response = (n_stk, n_bll)
    
    if response == (3, 0) or reponse != (0, 0):
    	break
    
    if response == (0, 3):
    	guesser = Guesser_0S3B(init_guess)
    
    if response == (1, 2):
    	guesser = Guesser_0S3B(init_guess)
    
    if response == (1, 0):
    	guesser = Guesser_0S3B(init_guess)
    
    if response == (0, 1):
    	guesser = Guesser_0S3B(init_guess)
	
    if response == (2, 0):
    	guesser = Guesser_0S3B(init_guess)
	
    if response == (1, 1):
    	guesser = Guesser_0S3B(init_guess)
	
    if response == (0, 2):
    	guesser = Guesser_0S3B(init_guess)

1๋ถ€ํ„ฐ 9๊นŒ์ง€์˜ ์ˆซ์ž์ค‘ 3๊ฐœ๋ฅผ ๊ณจ๋ผ guess๋กœ ์ •ํ•˜๊ณ  ์›๋ž˜ 1๋ถ€ํ„ฐ 9๊นŒ์ง€๊ฐ€ ์žˆ๋Š” number์—์„œ guess๋กœ ๊ณ ๋ฅธ ๊ฒƒ๋“ค์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

๊ทธ ํ›„ ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ๋‚˜๋ˆ ์„œ ํด๋ž˜์Šค๋ฅผ ์‹คํ–‰์‹œํ‚ต๋‹ˆ๋‹ค. ๋งŒ์•ฝ (3, 0)์ธ ๊ฒฝ์šฐ ์ •๋‹ต์„ ๋งž์ถ˜ ๊ฒƒ์ด๊ธฐ์— ์ถ”์ธก์„ ํ•˜์ง€ ์•Š๊ณ  break๋ฅผ ํ†ตํ•ด ๊ทธ๋งŒ๋‘ก๋‹ˆ๋‹ค. (0, 0)์ธ ๊ฒฝ์šฐ ๋‚จ์€ number ์ค‘ ๋‹ค์‹œ guess๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ํƒ์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.

์œ„ ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ํ•ด๊ฒฐ์ž ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ๊ฐ€ ๊ฑฐ์˜ ๊ฐ™๊ณ  ๊ธธ์ด๊ฐ€ ๊ธธ๊ธฐ์— ์ฝ”๋“œ๋Š” ์ƒ๋žตํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ถ”์ธก๊ธฐ ํด๋ž˜์Šค

์ถ”์ธก๊ธฐ ํด๋ž˜์Šค๋Š” ์œ„ ํ•ด๊ฒฐ์ž ์ฝ”๋“œ์—์„œ guesser๋กœ ๋ฐ›๋Š” ํด๋ž˜์Šค๋“ค์ด๋ผ ๋ณด์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
์ฆ‰, ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ์ถ”์ธก๊ธฐ ํด๋ž˜์Šค๋ฅผ ๋‹ค๋ฅด๊ฒŒ ํ•˜์—ฌ ์ •๋‹ต ์ˆซ์ž๋ฅผ ์ถ”์ธก์„ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

(3, 0)๊ณผ (0, 0)์€ ์ด ์ถ”์ธก๊ธฐ ํด๋ž˜์Šค๊ฐ€ ํ•„์š” ์—†์œผ๋ฏ€๋กœ ์ด๊ฒƒ๋“ค์„ ์ œ์™ธํ•œ 7๊ฐœ์˜ ์ถ”์ธก๊ธฐ ํด๋ž˜์Šค๊ฐ€ ์žˆ๋Š”๋ฐ ์ „๋ถ€ ๋ฐฉ๋ฒ•์€ ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์— 2๊ฐ€์ง€ ๊ฒฝ์šฐ๋งŒ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ํ™•์ธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

Guesser_0S3B ํด๋ž˜์Šค

์ถ”์ธกํ•œ ์ˆซ์ž๊ฐ€ abc๋ผ ํ•˜๋ฉด ์ด a, b, c ์„ธ๊ฐœ์˜ ์ˆซ์ž ๋ชจ๋‘ ์ •๋‹ต ์ˆซ์ž์ด์ง€๋งŒ ์ž๋ฆฌ๋งŒ ์ „๋ถ€ ํ‹€๋ฆฐ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ์ฆ‰ ์ตœ๋Œ€ ๋‹ค์„ฏ๋ฒˆ์˜ ์‹œ๋„๋กœ ์ •๋‹ต์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

class Guesser_0S3B():
	
    def __init__(self, init_guess):
    	self.init_guess = init_guess
        self.branch_id = 1
    
    def make_guess(self, response = None):
    	[a,b,c] = [self.init_guess[0],self.init_guess[1],self.init_guess[2])
        
        if self.branch_id == 1: next_guess = [a,c,b]
        if self.branch_id == 2: next_guess = [b,a,c]
        if self.branch_id == 3: next_guess = [c,a,b]
        if self.branch_id == 4: next_guess = [b,c,a]
        if self.branch_id == 5: next_guess = [c,b,a]
        
        self.branch_id += 1
        
        return next_guess

acb, bac, cab, bca, cba ์ˆœ์œผ๋กœ ์ตœ๋Œ€ ๋‹ค์„ฏ๋ฒˆ์˜ ์‹œ๋„๋กœ ์ •๋‹ต์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.
branch_id๋กœ ์ถ”์ธก๊ณผ์ •์„ ๊ธฐ์–ตํ•˜๋„๋ก ํ•˜์˜€๋‹ค.

Guesser_2S0B ํด๋ž˜์Šค

๋‘ ๊ฐœ์˜ ์ˆซ์ž๊ฐ€ ์ •๋‹ต ์ˆซ์ž์ด๋ฉฐ ์ž๋ฆฌ๊นŒ์ง€ ๋งž๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

abxaxcxbc
abc2S0B2S0B2S0B
acb1S1B1S1B0S2B
bac
cab
bca
cba1S1B0S2B

์œ„ ํ‘œ์™€ ๊ฐ™์ด ๊ฒฝ์šฐ๊ฐ€ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋Š”๋ฐ ํ‘œ๋ฅผ ํ•ด์„ํ•˜์ž๋ฉด ์œ„ ์ฒซ์งธ ์ค„์€ ab, ac, bc๊ฐ€ ์ •๋‹ต ์ˆซ์ž์ผ ๊ฒฝ์šฐ๋ฅผ ๋œปํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์™ผ์ชฝ ๊ฒฝ์šฐ๋“ค์ด ์ž๋ฆฌ๋ฅผ ๋ฐ”๊ฟจ์„ ๊ฒฝ์šฐ์ด๊ณ ์š”.

์ฆ‰ ์ฒ˜์Œ์— b์™€ c์˜ ์ž๋ฆฌ๋ฅผ ๋ฐ”๊ฟจ๋Š”๋ฐ 0S2B๊ฐ€ ๋˜๋ฉด b์™€ c๊ฐ€ ์ •๋‹ต์ˆซ์ž์ž…๋‹ˆ๋‹ค. ๊ทธ ์™ธ์—๋Š” a, b ํ˜น์€ a, c์ด๊ณ ์š”. ๊ทธํ›„ cba์ˆœ์œผ๋กœ guess๋กœ ํ•˜์—ฌ 1S1B์ธ ๊ฒฝ์šฐ a์™€ b๊ฐ€, 0S2B์ธ ๊ฒฝ์šฐ a์™€ c๊ฐ€ ์ •๋‹ต ์ˆซ์ž์ž…๋‹ˆ๋‹ค.

์ด๊ฑธ ํ† ๋Œ€๋กœ ์•„๋ž˜์ฒ˜๋Ÿผ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

class Guesser_2S0B():
	def __init__(self, numbers, init_guess):
    	self.numbers = numbers
        self.init_guess = init_guess
        self.branch_id = 1
    
    def make_guess(self, response=None):
    	[a,b,c] = [self.init_guess[0],self.init_guess[1],slef.init_guess[2]]
        
        if self.branch_id == 1:
        	next_guess[a,c,b]
            self.branch_id = 2
            return next_guess
        
        if self.branch_id == 2 and response == (0,2):
        	self.branch_id = "xbc"
        
        if self.branch_id == 2 and response == (1,1):
        	 next_guess = [c,b,a]
             self.branch_id = 21
             return next_guess
         
         #--------------------------------------------
         
         if self.branch_id == 21 and response == (1,1):
         	self.branch_id == "abx"
         
         if self.branch_id == 21 and response == (0,2):
         	self.branch_id == "axc"
      	 
         #--------------------------------------------
         
         if self.branch_id == "xbc":
         	x = self.numbers.pop()
            next_guess = [x,b,c]
            return next_guess
            
        if self.branch_id == "abx":
         	x = self.numbers.pop()
            next_guess = [a,b,x]
            return next_guess
            
        if self.branch_id == "axc":
         	x = self.numbers.pop()
            next_guess = [a,x,c]
            return next_guess

์œ„ ๋‘ ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๊ณ ๋„ ์ด์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๐ŸŒˆ์ƒ‰ ์กฐํ•ฉ ๋งž์ถ”๊ธฐ ๊ฒŒ์ž„

์œ„ ์˜ˆ์‹œ์™€ ๋น„์Šทํ•˜๊ฒŒ ์ƒ‰ ์กฐํ•ฉ ๋งž์ถ”๊ธฐ ๊ฒŒ์ž„ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

import numpy as np
from itertools import permutations

# ์ƒ‰์ƒ ํ›„๋ณด
COLORS = ["red", "blue", "green", "yellow", "purple", "orange"]

# ์‚ฌ์šฉ์ž ์ž…๋ ฅ
def get_secret_color_combination():
 while True:
     user_input = input(f"๋น„๋ฐ€ ์ƒ‰ ์กฐํ•ฉ 3๊ฐœ๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š” (์˜ˆ: red blue green): ").split()
     if len(user_input) == 3 and len(set(user_input)) == 3 
     and all(c in COLORS for c in user_input):
         return user_input
     print("์ž…๋ ฅ์ด ์ž˜๋ชป๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ์ƒ‰์ƒ:", COLORS)

# ํ”ผ๋“œ๋ฐฑ ํ•จ์ˆ˜
def get_feedback(guess, answer):
 exact = sum([g == a for g, a in zip(guess, answer)])
 partial = sum([(g in answer) and (g != answer[i]) for i, g in enumerate(guess)])
 return exact, partial

# ์ถ”์ธก ํด๋ž˜์Šค
class ColorGuesser:
 def __init__(self):
     self.candidates = list(permutations(COLORS, 3))
     self.prev_guess = None
     self.first_guess_done = False

 def make_guess(self, feedback=None):
     if not self.first_guess_done:
         # ์ฒซ ์ถ”์ธก์€ np.random.choice๋กœ ๋ฌด์ž‘์œ„๋กœ ๋ฝ‘๊ธฐ
         self.prev_guess = list(np.random.choice(COLORS, size=3, replace=False))
         self.first_guess_done = True
         return self.prev_guess
     else:
         # ์ด์ „ ํ”ผ๋“œ๋ฐฑ๊ณผ ์ผ์น˜ํ•˜๋Š” ํ›„๋ณด๋งŒ ๋‚จ๊ธฐ๊ณ  ๋ฌด์ž‘์œ„ ์„ ํƒ
         self.candidates = [
             c for c in self.candidates
             if get_feedback(list(c), self.prev_guess) == feedback
         ]
         if not self.candidates:
             raise ValueError("ํ›„๋ณด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ž…๋ ฅ์ด ์ž˜๋ชป๋˜์—ˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.")
         idx = np.random.choice(len(self.candidates))
         self.prev_guess = list(self.candidates[idx])
         return self.prev_guess

# ๊ฒŒ์ž„ ์‹คํ–‰
def play_color_game():
 print("์ƒ‰ ์กฐํ•ฉ ์ถ”์ธก ๊ฒŒ์ž„ - ์ปดํ“จํ„ฐ๊ฐ€ ๋งž์ถฅ๋‹ˆ๋‹ค!")
 secret = get_secret_color_combination()
 guesser = ColorGuesser()

 attempts = 0
 feedback = None

 while True:
     guess = guesser.make_guess(feedback)
     attempts += 1
     print(f"[{attempts}] ์ปดํ“จํ„ฐ ์ถ”์ธก: {guess}")

     feedback = get_feedback(guess, secret)
     print(f" โ†’ ์ •ํ™•: {feedback[0]}๊ฐœ, ์ƒ‰๋งŒ ๋งž์Œ: {feedback[1]}๊ฐœ")

     if feedback[0] == 3:
         print(f"\n ์ปดํ“จํ„ฐ๊ฐ€ {attempts}๋ฒˆ ๋งŒ์— ๋น„๋ฐ€ ์ƒ‰ ์กฐํ•ฉ์„ ๋งž์ท„์Šต๋‹ˆ๋‹ค!")
         break

# ์‹คํ–‰
if __name__ == "__main__":
 play_color_game()

๐Ÿ˜Š๋งˆ๋ฌด๋ฆฌ

์ด๋•Œ๊นŒ์ง€ ๋ฐฐ์šด python๊ณผ numpy์˜ np.random์„ ์ด์šฉํ•˜์—ฌ ์ˆซ์ž์•ผ๊ตฌ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑ ๊ฐ€๋Šฅํ•˜์˜€์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ ๋น„์Šทํ•œ ์˜ˆ์ œ์ธ ์ƒ‰ ์กฐํ•ฉ ๋งž์ถ”๊ธฐ ๊ฒŒ์ž„ ๋˜ํ•œ ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.
(์ƒ‰ ์กฐํ•ฉ ๋งž์ถ”๊ธฐ ๊ฒŒ์ž„์€ ๊ต์žฌ์— ์—†๋Š” ์˜ˆ์ œ)
์‚ฌ์‹ค ์—ฌ๊ธฐ์„œ numpy๋Š” ๊ฑฐ์˜ ์•ˆ ์“ฐ์˜€๊ธฐ์— ์‚ฌ์‹ค์ƒ python์œผ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ณต๋ถ€๋ฅผ ํ•˜์˜€๋‹ค๊ณ  ๋ด๋„ ๋  ๋“ฏ ํ•ฉ๋‹ˆ๋‹ค.

์ง€๊ธˆ๊นŒ์ง€ ๊ต์žฌ๋ฅผ 4์žฅ๊นŒ์ง€ ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์Šคํ„ฐ๋””๋ฅผ 1์ฃผ์ฐจ๋‹น ํ•œ ์žฅ์”ฉ ๋‚˜๊ฐ€๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๋‹น์—ฐํ•˜๊ธด ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์— ๊ณต๋ถ€ํ•  5์žฅ์€ ์ƒํƒœ์™€ ํ–‰๋™์ด๋ผ๋Š” ๋‹จ์›์ž…๋‹ˆ๋‹ค. 6์žฅ๊ณผ 7์žฅ์€ ๊ฐ๊ฐ ๋ฏธ๋‹ˆ๋งฅ์Šค์™€ ๋ชฌํ…Œ์นด๋ฅผ๋กœ ํŠธ๋ฆฌ ํƒ์ƒ‰๋ฒ•์— ๋Œ€ํ•ด ํ•™์Šต์„ ํ•  ๊ฒƒ์ธ๋ฐ 5์žฅ์€ ์ด์— ๊ธฐ์ดˆ๊ฐ€ ๋˜๋Š” ์ƒํƒœ์™€ ํ–‰๋™์— ๋”ฐ๋ฅธ ์ƒํƒœ์˜ ๋ณ€ํ™”๋ฅผ ์•Œ๋ ค์ค„ ์ƒํƒœ ํด๋ž˜์Šค์— ๋Œ€ํ•ด ํ•™์Šตํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด์ œ๋ถ€ํ„ฐ ์ธ๊ณต์ง€๋Šฅ์˜ ํ•™์Šต์— ๊ด€ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ž์„ธํžˆ ํ•™์Šตํ•˜๊ฒŒ ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚ด์šฉ๋„ ์ ์  ์–ด๋ ค์›Œ ์งˆ๊ฒƒ ๊ฐ™์œผ๋‹ˆ ์—ด์‹ฌํžˆ ํ•ด๋ณด์•„์•ผ ๊ฒ ์Šต๋‹ˆ๋‹ค. ์š”์ฆ˜ ๋‚ ์”จ๊ฐ€ ๋”์›Œ์ง€๊ณ  ์žˆ๋Š”๋ฐ ์ด ๊ธ€์„ ๋ณด์‹œ๋Š” ๋ถ„๋“ค ๋ชจ๋‘ ์‹œ์›ํ•œ ์—ฌ๋ฆ„ ๋˜์…จ์œผ๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค!

๋ฒˆ์™ธ๋กœ ๋ฉ”ํƒ€๋ชฝ ๊ท€์—ฝ์ง€ ์•Š๋‚˜์š”? ๋ฉ”ํƒ€๋ชฝ์€ ์‚ฌ๋ž‘์ž…๋‹ˆ๋‹ค๐Ÿ’œ

profile
I'm free to be whatever I

0๊ฐœ์˜ ๋Œ“๊ธ€