차번호판의 숫자를 사칙연산으로 0으로 만들 수 있을까요?

이상한 짓을 합니다.

  • 저만 그러는지는 모르겠는데, 저는 숫자 4개로 구성된 차 번호판을 보면 사칙연산을 해보는 버릇이 있습니다. 제가 공대에 속해 있어서 그런지는 모르겠는데, 제 주위에도 이런 친구들이 몇몇 있습니다.
  • 아무튼, 하다보면 대부분 되는 것 같은데 몇 개는 안되는 것들이 있어요. 그럴 때, “내가 못하는 건가 저게 안되는건가”라는 생각이 들곤 합니다.
  • 그래서 간단하게 코딩해보기로 했습니다.

  • constraint는 다음과 같아요.
    • 사칙연산(+, /, *, -)만 가능
    • 순서 바꾸기 불가
    • 괄호는 가능
import numpy as np 

def calc_a_b(a, b):## a, b에 대한 사칙연산 결과를 리스트로 리턴
    a, b = float(a), float(b)
    r_lst = [a+b, a-b, a*b]
    return set(r_lst+[a/b]) if b!=0 else set(r_lst)
def calc_a_b_c(a, b, c):## a, b, c의 사칙연산 결과를 리스트로 리턴
    r_lst = [y for x in calc_a_b(a, b) for y in calc_a_b(x, c)]
    return set(r_lst + [y for x in calc_a_b(b, c) for y in calc_a_b(a, x)])
def calc_a_b_c_d(a, b, c, d):## a, b, c, d의 사칙연산 결과를 리스트로 리턴 
    r_lst = [ y for x in calc_a_b_c(a, b, c) for y in calc_a_b(x, d)]
    r_lst += [ y for x in calc_a_b_c(b,c,d) for y in calc_a_b(a, x)]
    r_lst += [ x for bc in calc_a_b(b, c) for x in calc_a_b_c(a, bc, d)]
    return set(r_lst)
    
car_plate_nums = [f'{i:0>4d}' for i in range(0, 10000)]
result = [True if 0 in calc_a_b_c_d(*plate_num) else False for plate_num in car_plate_nums ]
print(f"0으로 만들어지는 비율: {np.mean(result):.4f}")
0으로 만들어지는 비율: 0.8500
  • 만약, %가 가능하다고 하면 어떻게 될까요?
import numpy as np 

def calc_a_b(a, b):
    a, b = float(a), float(b)
    r_lst = [a+b, a-b, a*b]
    return set(r_lst+[a/b, a%b]) if b!=0 else set(r_lst)
def calc_a_b_c(a, b, c):
    r_lst = [y for x in calc_a_b(a, b) for y in calc_a_b(x, c)]
    return set(r_lst + [y for x in calc_a_b(b, c) for y in calc_a_b(a, x)])
def calc_a_b_c_d(a, b, c, d):
    r_lst = [ y for x in calc_a_b_c(a, b, c) for y in calc_a_b(x, d)]
    r_lst += [ y for x in calc_a_b_c(b,c,d) for y in calc_a_b(a, x)]
    r_lst += [ x for bc in calc_a_b(b, c) for x in calc_a_b_c(a, bc, d)]
    return set(r_lst)
    

car_plate_nums = [f'{i:0>4d}' for i in range(0, 10000)]
result = [True if 0 in calc_a_b_c_d(*plate_num) else False for plate_num in car_plate_nums ]
print(f"0으로 만들어지는 비율: {np.mean(result):.4f}")
  • 다 되는군요.
0으로 만들어지는 비율: 1.0000

wrap-up

  • 간단하네요. 앞으로는 하다 안되면 modulo를 사용해서 하도록 하겠습니다. 약간 뭔가 tricky하기는 한데 그래도.

댓글남기기