변경이력

돌아가기
13 205개 문자 추가 6개 문자 삭제

2016/11/13 16:06

Lee SeungChan

39개 나오는거 같네요. 간략한 풀이 과정입니다. a1 a2 a3 a4 a5 a6 a7 a8 a9 의 각각의 합을 b 라고 하면 a1+a2+a3=b a4+a5+a6=b a7+a8+a9=b f1) sum(a[1:9])=3*b 가 성립하고 a1+a5+a9=b a2+a5+a8=b a3+a5+a7=b a4+a5+a6=b f2) 3*a5+sum(a[1:9])=4*b 가 성립하게 됩니다. f1)-f2) 를 하면 f3) a5=b/3 이게 되죠 이걸 가지고 마방진에 다시 입력을 해보면 b/3+d1 b/3+d2 b/3+d3 b/3+d4 b/3+0 b/3+d6 b/3+d7 b/3+d8 b/3+d9 이렇게 적어도 큰 문제는 없을거구요 d1+b/3 + 0+b/3 +d9+b/3 = b d2+b/3 + 0+b/3 +d8+b/3 = b d3+b/3 + 0+b/3 +d7+b/3 = b d4+b/3 + 0+b/3 +d6+b/3 = b 이 성립하게되고 d9=-d1 d8=-d2 d7=-d3 d6=-d4 가 됩니다. 다시 적어보면 b/3+d1 b/3+d2 b/3+d3 b/3+d4 b/3+0 b/3-d4 b/3-d3 b/3-d2 b/3-d1 이 변화에는 큰 문제 없어보입니다. 이제 양측 끝쪽 가로 세로의 식을 적어보면 f3) b/3+d1 + b/3+d2 + b/3+d3 = b f4) b/3+d3 + b/3-d4 + b/3-d1 = b 이고 d3=d4+d1 이 되고 -d2=d4+2*d1 가 되는것을 확인해볼수 있습니다. 즉 편차값 2개(d4,d1)가 있다면 이 두개를 더한값(d3=d4+d1)과 이 두개중 하나를 더 더한값 (-d2=d4+2*d1) 으로 편차값은 구성될수 있다고 볼수 있습니다. 그 내용을 python 3 로 표현하였습니다. ```{.python} #마방진 테스트 함수 입니다. def is_mabang(test): _1st_line=sum(test[0:3]) _2nd_line=sum(test[3:6]) _3rd_line=sum(test[6:9]) _1st_col=sum(test[0::3]) _2nd_col=sum(test[1::3]) _3rd_col=sum(test[2::3]) RAO=sum(test[0::4]) LAO=sum(test[2:7:2]) result=[_1st_line,_2nd_line,_3rd_line,_1st_col,_2nd_col,_3rd_col,RAO,LAO] return len(set(result))==1 #솟수 생성함수입니다. def core03(l): if l<20: return [2, 3, 5, 7, 11, 13, 17, 19] SqrtL=int(l**0.5) TargetSet =set(range(SqrtL,l)) TinyPrimeList=core03(int(l**0.50)+1) for i in TinyPrimeList: TargetSet = TargetSet -set(range(i*2,l,i)) result= sorted(list(set(TinyPrimeList + list(sorted(TargetSet))))) return result #500까지의 prime number 를 구합니다. total_prime_list=core03(500) #print(len(total_prime_list)) #갯수는 95개군요. #이번에 알게된 재미난 툴 itertools 입니다. import itertools ''' #뭔가.. 헛짓을 했더랬죠 이걸 실행시키면 hell gate 를 여는 느낌입니다. test01=itertools.permutations(total_prime_list,9) k=0 for j in test01: k+=1 print(j) if k==200: break test01=itertools.combinations(total_prime_list,9) k=0 for j in test01: k+=1 print(k) ''' result01=[] #중간 숫자를 기준으로 평균값이 중간이 나오는 숫자쌍을 찾아봅니다. for i in total_prime_list[4:-4]: temp=[] temp.append(i) if len(total_prime_list[total_prime_list.index(i)+1:])>=len(total_prime_list[:total_prime_list.index(i)]): for j in total_prime_list[:total_prime_list.index(i)]: if i-j+i in total_prime_list: temp.append(j) temp.append(i-j+i) else: for j in total_prime_list[total_prime_list.index(i)+1:]: if i-j+i in total_prime_list: temp.append(j) temp.append(i-j+i) #그러고는 그게 9개가 넘는지 확인하는 과정입니다. if len(temp)>9: result01.append(sorted(temp)) #편차 a b c d(오름차순) 와 중간값 m 으로 9개의 숫자로 이루어진 마방진을 구성한다치면 #c==a+b 이며 d==a*2+b 또는 d==a+b*2일 경우 마방진이 성립하더군요.. 이외의 방법이 더 있을수 있지만 #제가 가지고 있는 마방진의 지식은 이것이 전부였습니다. #그래서 찾습니다. 꾸역꾸역 #itertools.combinations 란 함수는 리스트 내부에서 주어진 숫자의 갯수만큼의 조합을 찾아내 주는...(말이 어렵습니다) #경우의 수 를 모두 찾아주지만 순서는 신경쓰지 않는... 아시죠? 중학교땐가 고등학교때인가.. .. result02=[] import itertools for i in result01: temp01=[] temp02=sorted([i[(len(i)-1)//2]-x for x in i[:(len(i)-1)//2]]) for j in itertools.combinations(temp02[:-2],2): if sum(j) in temp02: if sum(j)+j[0] in temp02: result02.append([i[(len(i)-1)//2],j[0],j[1],sum(j),sum(j)+j[0]]) #한주영님의 지적으로 뒤늦게 추가. 또한번 더 수정! elif sum(j)+j[1] in temp02: result02.append([i[(len(i)-1)//2],j[0],j[1],sum(j),sum(j)+j[1]]) #검산과정입니다 한주영님의 지적으로 버그 수정을 완료하였습니다. result03=[] result04=[] for i in result02: result03.append(sorted([i[0],i[0]-i[1],i[0]+i[1],i[0]-i[2],i[0]+i[2],i[0]-i[3],i[0]+i[3],i[0]-i[4],i[0]+i[4]])) for i in result03: temp1=[] temp2=[] #d==a*2+b(a<b) 인 경우는 오름차수의 리스트가 다음과 같은 변형을 줄때 마방진이 형성됩니다. for j in [1,6,5,8,4,0,3,2,7]: temp1.append(i[j]) #d==b*2+a(a<b) 인 경우는 오름차수의 리스트가 다음과 같은 변형을 줄때 마방진이 형성됩니다. for j in [6,5,1,0,4,8,7,3,2]: temp2.append(i[j]) if is_mabang(temp1): result04.append(temp1) elif is_mabang(temp2): result04.append(temp2) else: print(i) ''' In [1]: result04 Out[1]: [[17, 89, 71, 113, 59, 5, 47, 29, 101], [41, 89, 83, 113, 71, 29, 59, 53, 101], [103, 79, 37, 7, 73, 139, 109, 67, 43], [29, 131, 107, 167, 89, 11, 71, 47, 149], [139, 127, 43, 7, 103, 199, 163, 79, 67], [37, 151, 139, 211, 109, 7, 79, 67, 181], [157, 151, 73, 43, 127, 211, 181, 103, 97], [43, 181, 157, 241, 127, 13, 97, 73, 211], [173, 149, 71, 29, 131, 233, 191, 113, 89], [47, 191, 173, 263, 137, 11, 101, 83, 227], [199, 151, 67, 7, 139, 271, 211, 127, 79], [59, 197, 191, 281, 149, 17, 107, 101, 239], [61, 199, 193, 283, 151, 19, 109, 103, 241], [37, 271, 163, 283, 157, 31, 151, 43, 277], [71, 233, 197, 293, 167, 41, 137, 101, 263], [53, 251, 197, 311, 167, 23, 137, 83, 281], [233, 197, 89, 29, 173, 317, 257, 149, 113], [257, 191, 89, 11, 179, 347, 269, 167, 101], [251, 233, 89, 29, 191, 353, 293, 149, 131], [71, 269, 233, 353, 191, 29, 149, 113, 311], [73, 277, 229, 349, 193, 37, 157, 109, 313], [43, 349, 241, 409, 211, 13, 181, 73, 379], [137, 281, 263, 353, 227, 101, 191, 173, 317], [317, 263, 101, 11, 227, 443, 353, 191, 137], [89, 347, 281, 431, 239, 47, 197, 131, 389], [73, 379, 271, 439, 241, 43, 211, 103, 409], [331, 283, 109, 19, 241, 463, 373, 199, 151], [61, 379, 283, 463, 241, 19, 199, 103, 421], [71, 419, 263, 443, 251, 59, 239, 83, 431], [41, 443, 269, 479, 251, 23, 233, 59, 461], [47, 443, 281, 491, 257, 23, 233, 71, 467], [173, 347, 269, 359, 263, 167, 257, 179, 353], [137, 359, 293, 419, 263, 107, 233, 167, 389], [59, 467, 281, 491, 269, 47, 257, 71, 479], [149, 347, 311, 431, 269, 107, 227, 191, 389], [347, 311, 149, 71, 269, 467, 389, 227, 191], [359, 311, 137, 47, 269, 491, 401, 227, 179], [103, 379, 331, 499, 271, 43, 211, 163, 439], [101, 431, 311, 491, 281, 71, 251, 131, 461], [167, 359, 353, 479, 293, 107, 233, 227, 419]] In [2]: len(result04) Out[2]: 3940 ```
39개 나오는거 같네요. 간략한 풀이 과정입니다. a1 a2 a3 a4 a5 a6 a7 a8 a9 의 각각의 합을 b 라고 하면 a1+a2+a3=b a4+a5+a6=b a7+a8+a9=b f1) sum(a[1:9])=3*b 가 성립하고 a1+a5+a9=b a2+a5+a8=b a3+a5+a7=b a4+a5+a6=b f2) 3*a5+sum(a[1:9])=4*b 가 성립하게 됩니다. f1)-f2) 를 하면 f3) a5=b/3 이게 되죠 이걸 가지고 마방진에 다시 입력을 해보면 b/3+d1 b/3+d2 b/3+d3 b/3+d4 b/3+0 b/3+d6 b/3+d7 b/3+d8 b/3+d9 이렇게 적어도 큰 문제는 없을거구요 d1+b/3 + 0+b/3 +d9+b/3 = b d2+b/3 + 0+b/3 +d8+b/3 = b d3+b/3 + 0+b/3 +d7+b/3 = b d4+b/3 + 0+b/3 +d6+b/3 = b 이 성립하게되고 d9=-d1 d8=-d2 d7=-d3 d6=-d4 가 됩니다. 다시 적어보면 b/3+d1 b/3+d2 b/3+d3 b/3+d4 b/3+0 b/3-d4 b/3-d3 b/3-d2 b/3-d1 이 변화에는 큰 문제 없어보입니다. 이제 양측 끝쪽 가로 세로의 식을 적어보면 f3) b/3+d1 + b/3+d2 + b/3+d3 = b f4) b/3+d3 + b/3-d4 + b/3-d1 = b 이고 d3=d4+d1 이 되고 -d2=d4+2*d1 가 되는것을 확인해볼수 있습니다. 즉 편차값 2개(d4,d1)가 있다면 이 두개를 더한값(d3=d4+d1)과 이 두개중 하나를 더 더한값 (-d2=d4+2*d1) 으로 편차값은 구성될수 있다고 볼수 있습니다. 그 내용을 python 3 로 표현하였습니다. ```{.python} #마방진 테스트 함수 입니다. def is_mabang(test): _1st_line=sum(test[0:3]) _2nd_line=sum(test[3:6]) _3rd_line=sum(test[6:9]) _1st_col=sum(test[0::3]) _2nd_col=sum(test[1::3]) _3rd_col=sum(test[2::3]) RAO=sum(test[0::4]) LAO=sum(test[2:7:2]) result=[_1st_line,_2nd_line,_3rd_line,_1st_col,_2nd_col,_3rd_col,RAO,LAO] return len(set(result))==1 #솟수 생성함수입니다. def core03(l): if l<20: return [2, 3, 5, 7, 11, 13, 17, 19] SqrtL=int(l**0.5) TargetSet =set(range(SqrtL,l)) TinyPrimeList=core03(int(l**0.50)+1) for i in TinyPrimeList: TargetSet = TargetSet -set(range(i*2,l,i)) result= sorted(list(set(TinyPrimeList + list(sorted(TargetSet))))) return result #500까지의 prime number 를 구합니다. total_prime_list=core03(500) #print(len(total_prime_list)) #갯수는 95개군요. #이번에 알게된 재미난 툴 itertools 입니다. import itertools ''' #뭔가.. 헛짓을 했더랬죠 이걸 실행시키면 hell gate 를 여는 느낌입니다. test01=itertools.permutations(total_prime_list,9) k=0 for j in test01: k+=1 print(j) if k==200: break test01=itertools.combinations(total_prime_list,9) k=0 for j in test01: k+=1 print(k) ''' result01=[] #중간 숫자를 기준으로 평균값이 중간이 나오는 숫자쌍을 찾아봅니다. for i in total_prime_list[4:-4]: temp=[] temp.append(i) if len(total_prime_list[total_prime_list.index(i)+1:])>=len(total_prime_list[:total_prime_list.index(i)]): for j in total_prime_list[:total_prime_list.index(i)]: if i-j+i in total_prime_list: temp.append(j) temp.append(i-j+i) else: for j in total_prime_list[total_prime_list.index(i)+1:]: if i-j+i in total_prime_list: temp.append(j) temp.append(i-j+i) #그러고는 그게 9개가 넘는지 확인하는 과정입니다. if len(temp)>9: result01.append(sorted(temp)) #편차 a b c d(오름차순) 와 중간값 m 으로 9개의 숫자로 이루어진 마방진을 구성한다치면 #c==a+b 이며 d==a*2+b 또는 d==a+b*2일 경우 마방진이 성립하더군요.. 이외의 방법이 더 있을수 있지만 #제가 가지고 있는 마방진의 지식은 이것이 전부였습니다. #그래서 찾습니다. 꾸역꾸역 #itertools.combinations 란 함수는 리스트 내부에서 주어진 숫자의 갯수만큼의 조합을 찾아내 주는...(말이 어렵습니다) #경우의 수 를 모두 찾아주지만 순서는 신경쓰지 않는... 아시죠? 중학교땐가 고등학교때인가.. .. result02=[] import itertools for i in result01: temp01=[] temp02=sorted([i[(len(i)-1)//2]-x for x in i[:(len(i)-1)//2]]) for j in itertools.combinations(temp02[:-2],2): if sum(j) in temp02: if sum(j)+j[0] in temp02: result02.append([i[(len(i)-1)//2],j[0],j[1],sum(j),sum(j)+j[0]]) #한주영님의 지적으로 뒤늦게 추가. 또한번 더 수정! elif sum(j)+j[1] in temp02: result02.append([i[(len(i)-1)//2],j[0],j[1],sum(j),sum(j)+j[1]]) #검산과정입니다 한주영님의 지적으로 버그 수정을 완료하였습니다. result03=[] result04=[] for i in result02: result03.append(sorted([i[0],i[0]-i[1],i[0]+i[1],i[0]-i[2],i[0]+i[2],i[0]-i[3],i[0]+i[3],i[0]-i[4],i[0]+i[4]])) for i in result03: temp1=[] temp2=[] #d==a*2+b(a<b) 인 경우는 오름차수의 리스트가 다음과 같은 변형을 줄때 마방진이 형성됩니다. for j in [1,6,5,8,4,0,3,2,7]: temp1.append(i[j]) #d==b*2+a(a<b) 인 경우는 오름차수의 리스트가 다음과 같은 변형을 줄때 마방진이 형성됩니다. for j in [6,5,1,0,4,8,7,3,2]: temp2.append(i[j]) if is_mabang(temp1): result04.append(temp1) elif is_mabang(temp2): result04.append(temp2) else: print(i) ''' In [1]: result04 Out[1]: [[17, 89, 71, 113, 59, 5, 47, 29, 101], [41, 89, 83, 113, 71, 29, 59, 53, 101], [103, 79, 37, 7, 73, 139, 109, 67, 43], [29, 131, 107, 167, 89, 11, 71, 47, 149], [139, 127, 43, 7, 103, 199, 163, 79, 67], [37, 151, 139, 211, 109, 7, 79, 67, 181], [157, 151, 73, 43, 127, 211, 181, 103, 97], [43, 181, 157, 241, 127, 13, 97, 73, 211], [173, 149, 71, 29, 131, 233, 191, 113, 89], [47, 191, 173, 263, 137, 11, 101, 83, 227], [199, 151, 67, 7, 139, 271, 211, 127, 79], [59, 197, 191, 281, 149, 17, 107, 101, 239], [61, 199, 193, 283, 151, 19, 109, 103, 241], [37, 271, 163, 283, 157, 31, 151, 43, 277], [71, 233, 197, 293, 167, 41, 137, 101, 263], [53, 251, 197, 311, 167, 23, 137, 83, 281], [233, 197, 89, 29, 173, 317, 257, 149, 113], [257, 191, 89, 11, 179, 347, 269, 167, 101], [251, 233, 89, 29, 191, 353, 293, 149, 131], [71, 269, 233, 353, 191, 29, 149, 113, 311], [73, 277, 229, 349, 193, 37, 157, 109, 313], [43, 349, 241, 409, 211, 13, 181, 73, 379], [137, 281, 263, 353, 227, 101, 191, 173, 317], [317, 263, 101, 11, 227, 443, 353, 191, 137], [89, 347, 281, 431, 239, 47, 197, 131, 389], [73, 379, 271, 439, 241, 43, 211, 103, 409], [331, 283, 109, 19, 241, 463, 373, 199, 151], [61, 379, 283, 463, 241, 19, 199, 103, 421], [71, 419, 263, 443, 251, 59, 239, 83, 431], [41, 443, 269, 479, 251, 23, 233, 59, 461], [47, 443, 281, 491, 257, 23, 233, 71, 467], [173, 347, 269, 359, 263, 167, 257, 179, 353], [137, 359, 293, 419, 263, 107, 233, 167, 389], [59, 467, 281, 491, 269, 47, 257, 71, 479], [149, 347, 311, 431, 269, 107, 227, 191, 389], [347, 311, 149, 71, 269, 467, 389, 227, 191], [359, 311, 137, 47, 269, 491, 401, 227, 179], [103, 379, 331, 499, 271, 43, 211, 163, 439], [101, 431, 311, 491, 281, 71, 251, 131, 461], [167, 359, 353, 479, 293, 107, 233, 227, 419]] In [2]: len(result04) Out[2]: 3940 ```
12 637개 문자 추가 287개 문자 삭제

2016/11/11 18:37

Lee SeungChan

11 1249개 문자 추가 1239개 문자 삭제

2016/11/11 07:02

Lee SeungChan

10 64개 문자 추가

2016/11/11 06:57

Lee SeungChan

9 960개 문자 추가 43개 문자 삭제

2016/11/11 06:56

Lee SeungChan

8 11개 문자 추가

2016/11/10 02:08

Lee SeungChan

7 11개 문자 추가

2016/11/10 02:04

Lee SeungChan

6 1781개 문자 추가

2016/11/10 02:02

Lee SeungChan

5 147개 문자 추가 2개 문자 삭제

2016/11/10 01:57

Lee SeungChan

4 303개 문자 추가 48개 문자 삭제

2016/11/09 15:13

Lee SeungChan

3 736개 문자 추가 24개 문자 삭제

2016/11/09 15:04

Lee SeungChan

2 307개 문자 추가 411개 문자 삭제

2016/11/09 14:45

Lee SeungChan

1 Original

2016/11/09 14:29

Lee SeungChan

코딩도장

코딩도장은 프로그래밍 문제풀이를 통해서 코딩 실력을 수련(Practice)하는 곳입니다.