'공부/파이썬'에 해당되는 글 1건

반응형

There is a popular puzzle where you try to guess the combination to a lock given some clues. For our purposes, the lock has exactly three wheels, each with values 0 through 9.

 

You must provide the clues on the command line and they must be of the form XYZ-R-W where:

XYZ = a possible combination of 3 digits, each 0-9

R = count of wheels that are the right digit in the right place (0-3)

W = count of wheels that are the right digit but in the wrong place (0-3)

The expectation is that you will use a brute form technique to solve this puzzle. Iterate through all 1,000 possible combinations and see which one(s) pass all the clues. Do NOT try to solve this puzzle the way a human would, using logic.

Additional rules:

1.       The number of clues can vary. If no clues are given you must print an error message.

2.       You must use a regular expression to validate the XYZ-R-W syntax.

3.       You do not need to do any additional validation of the XYZ, R, W parameters.

4.       You must print the list of clues given, all on one line.

5.       You must count the number of solutions found and print that count.

6.       If no solutions are found, you must print a message to that effect.

 

3 자릿수 조합 자물쇠가 있다. 이 자물쇠를 풀기 위한 힌트가 주어지는데

각각의 힌트는 XYZ-R-W의 형식으로 주어진다.

XYZ = 0-9 사이의 숫자 세 개

R = 해당 힌트 속 위치와 숫자가 일치하는 수의 개수 0~3 개 사이

W = 해당 힌트 속 숫자는 일치하지만 위치가 다른 수의 개수 0-3개 사이

 

이 프로그램은 처음에 주어지는 명령행 인자값을 제외한 사용자의 인풋을 받지 않는다.

 

추가 규칙:

1. 힌트의 갯수에는 제한이 없다. 만약 힌트가 없다면 에러 메시지를 출력해야 한다.

2. 정규 표현으로 XYZ-R-W 형식으로 힌트를 받아들여야 한다.

3. XYZ, R, W 인자 값에 대한 추가적인 확인은 할 필요 없다. (해도 상관은 없음)

4. 주어진 힌트를 한 줄에 출력해야 한다.

5. 모든 정답의 번호를 출력해야 한다. (예시 확인)

6. 만약 정답을 찾을 수 없다면 없다고 출력해야한다.

 

예시

 

//명령행 인자가 없을 경우

$ python3 lock.py 

Need to give some patterns of the form XYZ-R-W

 

# This is the sample from the picture above

$ python3 lock.py 682-1-0 614-0-1 206-0-2 738-0-0 380-0-1

Trying 682-1-0 614-0-1 206-0-2 738-0-0 380-0-1

*** Solution #1 is ... (there is exactly one answer, hidden)

 

//주어진 힌트 중에서 답을 찾을 수 없을 경우

$ python3 lock.py 682-1-0 614-0-1 206-0-2 738-0-0 380-0-1 314-1-0

Trying 682-1-0 614-0-1 206-0-2 738-0-0 380-0-1 314-1-0

No Solutions Found

 

//주어진 힌트 중에 답이 있을 경우

$ python3 lock.py 682-0-0 614-0-0 206-0-0 738-0-0

Trying 682-0-0 614-0-0 206-0-0 738-0-0

*** Solution #1 is 555

*** Solution #2 is 559

*** Solution #3 is 595

*** Solution #4 is 599

*** Solution #5 is 955

*** Solution #6 is 959

*** Solution #7 is 995

*** Solution #8 is 999

 

//형식에 맞지 않는 명령행 인자가 입력된 경우 1

$ python3 lock.py 682-1-0 614-0-1 w06-0-2 738-0-0 380-0-1

Invalid argument: w06-0-2

 

//형식에 맞지 않는 명령행 인자가 입력된 경우 2

# The 4 is invalid, must be 0-3

$ python3 lock.py 682-1-0 614-0-1 206-0-2 738-4-0 380-0-1

Invalid argument: 738-4-0

 


내 풀이 (My Solution):

 

#!/usr/bin/env python3

#lock.py written by Jinha Jeong






import re

import sys



#check if the given clues are invalid

def invalidClue(args):

    invalid=list()

    count=0

    c=sys.argv[1:].copy()

    for i in range(len(c)):

        r=re.match('^[0-9]{3}\-[0-3]\-[0-3]$', c[i])

        try:

            #this will through AttributeError, so force it to append the invalid clues:/

            if(r.group() != c[i]):

               invalid.append(c[i])

        except AttributeError:

               invalid.append(c[i])

               count += 1

    return count,invalid



#function to split sys.argv into usable variables    

def splitThem (raw_clue):

    a = list ()

    b = list ()

    c = list ()

    for i in range (len (raw_clue)):

        temp = raw_clue[i].split ('-')

        a.append (temp[0])

        b.append (temp[1])

        c.append (temp[2])

    return (a, b, c) 



#function to solve puzzle

def lockSolve(number, checknumber, right, wrong):

    count_right=0

    count_wrong=0

    comp_number=str(number).zfill(len(checknumber))

    for i in range(len(checknumber)):

        if comp_number[i] == checknumber[i]:

            count_right += 1

        if comp_number[i]!= checknumber[i] and comp_number[i] in checknumber:

            count_wrong += 1

    return right==count_right and wrong == count_wrong



            

            

#check and return the invalid clue list

(z,y)=invalidClue(sys.argv)

#list of clues

x=sys.argv[1:].copy()





#if no clues are given

if(len(x)==0):

    print("Need to give some patterns of the form XYZ-R-W")

    sys.exit()



#if all of the clues are valid print them in one line, otherwise print the invalid clues and terminate

if(z==0): 

    print("Trying", end=' ')

    for i in range(len(x)):

        print(x[i], end=' ')

    print()        

else: 

    print("Invalid argument:", end=' ')

    for i in range(len(y)):

        print(y[i], end=' ')

    sys.exit()




#split clues

(XYZ, R, W) = splitThem(x) 




solution_count=0

noSolution=0

              

for i in range(1000):

    arg_count=0  

    while(arg_count < len(x)):

            #number=str(digit1)+str(digit2)+str(digit3)      

        if lockSolve(i, XYZ[arg_count], int(R[arg_count]), int(W[arg_count])) and (arg_count == len(x)-1):

            solution_count += 1

            noSolution += 1

            print("*** Soultion #%d is " % solution_count,end='')

            print(str(i).zfill(3))

            break

        elif lockSolve(i, XYZ[arg_count], int(R[arg_count]), int(W[arg_count])):

            arg_count += 1

            continue

        else:

            break   

if noSolution == 0:

    print("No Solutions Found")

반응형
블로그 이미지

Ahan

책, 영화, 게임! 인생의 활력 요소가 되는 취미들을 하자!

,