Created
August 14, 2021 19:37
-
-
Save foxqstm/f1213cd2ad614103ed3ce24415978d3b to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "code", | |
"execution_count": 158, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"177\n", | |
"[[1, 6, 8, 11], [1, 6, 10, 11], [1, 6, 10, 15], [1, 6, 11, 15], [1, 6, 11, 16], [2, 3, 4, 5], [2, 3, 6, 9], [2, 5, 6, 11], [2, 5, 7, 11], [2, 5, 10, 15], [2, 6, 7, 10], [2, 6, 7, 12], [2, 6, 11, 12], [2, 6, 11, 14], [2, 6, 11, 16], [2, 7, 8, 12], [2, 7, 10, 11], [2, 7, 10, 14], [2, 7, 11, 14], [2, 7, 11, 16], [2, 7, 12, 15], [2, 7, 12, 16], [3, 4, 5, 6], [3, 4, 6, 9], [3, 4, 6, 11], [3, 5, 6, 10], [3, 6, 7, 8], [3, 6, 7, 12], [3, 6, 8, 10], [3, 6, 8, 12], [3, 6, 10, 11], [3, 6, 10, 14], [3, 6, 11, 14], [3, 6, 11, 16], [3, 7, 8, 10], [3, 7, 8, 12], [3, 7, 10, 11], [3, 7, 10, 14], [3, 7, 11, 14], [3, 7, 11, 16], [3, 7, 12, 15], [3, 7, 12, 16], [3, 8, 10, 11], [3, 8, 11, 14], [3, 8, 11, 15], [3, 8, 11, 16], [3, 8, 12, 15], [3, 8, 12, 16], [4, 6, 7, 8], [4, 6, 7, 10], [4, 6, 8, 11], [4, 7, 9, 10], [4, 7, 10, 13], [4, 7, 10, 14], [4, 7, 10, 15], [4, 7, 11, 14], [4, 7, 11, 15], [4, 7, 11, 16], [4, 7, 12, 15], [4, 7, 12, 16], [4, 8, 11, 14], [4, 8, 11, 15], [4, 8, 11, 16], [4, 8, 12, 15], [4, 8, 12, 16], [5, 6, 7, 9], [5, 6, 7, 11], [5, 6, 8, 11], [5, 6, 10, 15], [5, 6, 11, 12], [5, 6, 11, 15], [5, 6, 11, 16], [5, 7, 10, 12], [5, 10, 11, 15], [5, 10, 11, 16], [5, 10, 12, 15], [5, 10, 14, 15], [5, 10, 15, 16], [6, 7, 8, 9], [6, 7, 8, 11], [6, 7, 9, 10], [6, 7, 9, 12], [6, 7, 10, 12], [6, 7, 10, 13], [6, 7, 10, 15], [6, 7, 11, 15], [6, 7, 11, 16], [6, 7, 12, 15], [6, 7, 12, 16], [6, 8, 9, 11], [6, 8, 11, 12], [6, 9, 10, 15], [6, 9, 11, 12], [6, 9, 11, 15], [6, 9, 11, 16], [6, 9, 14, 15], [6, 10, 11, 14], [6, 10, 11, 16], [6, 10, 12, 15], [6, 10, 14, 15], [6, 10, 15, 16], [6, 11, 12, 15], [6, 11, 12, 16], [6, 11, 14, 15], [6, 11, 15, 16], [7, 8, 9, 10], [7, 8, 10, 12], [7, 8, 10, 13], [7, 8, 10, 14], [7, 8, 10, 15], [7, 8, 11, 14], [7, 8, 11, 15], [7, 8, 11, 16], [7, 8, 12, 15], [7, 8, 12, 16], [7, 9, 10, 11], [7, 9, 11, 14], [7, 10, 11, 12], [7, 10, 11, 14], [7, 10, 11, 16], [7, 10, 12, 13], [7, 10, 12, 14], [7, 10, 12, 15], [7, 10, 12, 16], [7, 10, 14, 15], [7, 10, 15, 16], [7, 11, 12, 14], [7, 11, 12, 15], [7, 11, 12, 16], [7, 11, 14, 15], [7, 11, 15, 16], [7, 12, 14, 15], [7, 12, 15, 16], [8, 9, 11, 14], [8, 10, 11, 12], [8, 10, 11, 13], [8, 10, 11, 14], [8, 10, 11, 15], [8, 10, 12, 15], [8, 11, 12, 14], [8, 11, 12, 15], [8, 11, 12, 16], [8, 11, 13, 14], [8, 11, 14, 15], [8, 11, 15, 16], [8, 12, 14, 15], [8, 12, 15, 16], [9, 10, 11, 15], [9, 10, 11, 16], [9, 10, 12, 15], [9, 10, 15, 16], [9, 11, 12, 14], [9, 11, 14, 16], [9, 12, 14, 15], [9, 14, 15, 16], [10, 11, 12, 13], [10, 11, 12, 14], [10, 11, 12, 15], [10, 11, 12, 16], [10, 11, 13, 15], [10, 11, 13, 16], [10, 11, 14, 16], [10, 11, 15, 16], [10, 12, 13, 15], [10, 12, 14, 15], [10, 12, 15, 16], [10, 13, 15, 16], [10, 14, 15, 16], [11, 12, 13, 14], [11, 12, 14, 15], [11, 12, 14, 16], [11, 12, 15, 16], [11, 13, 14, 16], [11, 14, 15, 16], [12, 13, 14, 15], [12, 14, 15, 16], [13, 14, 15, 16]]\n", | |
"\n", | |
"\n" | |
] | |
} | |
], | |
"source": [ | |
"import itertools\n", | |
"\n", | |
"Fn=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16] #4×4のマス目に番号を下から順に割り振る。\n", | |
"\n", | |
"\n", | |
"def d2(n): #2次元ベクトル表示\n", | |
" if n==1:\n", | |
" return (1,1)\n", | |
" elif n==2:\n", | |
" return (1,2)\n", | |
" elif n==3:\n", | |
" return (1,3)\n", | |
" elif n==4:\n", | |
" return (1,4)\n", | |
" elif n==5:\n", | |
" return (2,1)\n", | |
" elif n==6:\n", | |
" return (2,2)\n", | |
" elif n==7:\n", | |
" return (2,3)\n", | |
" elif n==8:\n", | |
" return (2,4)\n", | |
" elif n==9:\n", | |
" return (3,1)\n", | |
" elif n==10:\n", | |
" return (3,2)\n", | |
" elif n==11:\n", | |
" return (3,3)\n", | |
" elif n==12:\n", | |
" return (3,4)\n", | |
" elif n==13:\n", | |
" return (4,1)\n", | |
" elif n==14:\n", | |
" return (4,2)\n", | |
" elif n==15:\n", | |
" return (4,3)\n", | |
" elif n==16:\n", | |
" return (4,4)\n", | |
" \n", | |
"def dist(n,m):#n番目の四角形とm番目の四角形の距離の2乗\n", | |
" nd=d2(n)\n", | |
" md=d2(m)\n", | |
" \n", | |
" return (nd[0]-md[0])**2+(nd[1]-md[1])**2\n", | |
"\n", | |
"\"\"\"\n", | |
"def rot90(n):\n", | |
" if n==1:\n", | |
" return 4\n", | |
" if n==2:\n", | |
" return 8\n", | |
" if n==3:\n", | |
" return 12\n", | |
" if n==4:\n", | |
" return 16\n", | |
" if n==5:\n", | |
" return 3\n", | |
" if n==6:\n", | |
" return 7\n", | |
" if n==7:\n", | |
" return 11\n", | |
" if n==8:\n", | |
" return 15\n", | |
" if n==9:\n", | |
" return 2\n", | |
" if n==10:\n", | |
" return 6\n", | |
" if n==11:\n", | |
" return 10\n", | |
" if n==12:\n", | |
" return 14\n", | |
" if n==13:\n", | |
" return 1\n", | |
" if n==14:\n", | |
" return 5\n", | |
" if n==15:\n", | |
" return 9\n", | |
" if n==16:\n", | |
" return 13\n", | |
"\n", | |
"\n", | |
"def rot(PTET):\n", | |
" R1PTET=[]\n", | |
" for f in PTET:\n", | |
" rotal=[]\n", | |
" for a in f:\n", | |
" rotal.append(rot90(a)) \n", | |
" R1PTET.append(rotal)\n", | |
" return R1PTET\n", | |
"\"\"\"\n", | |
"\n", | |
"def shiftd1(n): #下方向へ1つ平行移動\n", | |
" if n in [1,2,3,4]:\n", | |
" return n\n", | |
" else:\n", | |
" return n-4\n", | |
"\n", | |
"def shiftd2(n): #下方向へ2つ平行移動\n", | |
" if n in [1,2,3,4]:\n", | |
" return n\n", | |
" else:\n", | |
" return n-8\n", | |
"\n", | |
"def shiftd3(n): #下方向へ3つ平行移動\n", | |
" if n in [1,2,3,4]:\n", | |
" return n\n", | |
" else:\n", | |
" return n-12\n", | |
"\n", | |
"def shiftl1(n):#左方向へ1つ平行移動\n", | |
" if n in [1,5,9,13]:\n", | |
" return n\n", | |
" else:\n", | |
" return n-1\n", | |
"\n", | |
" \n", | |
"def shiftl2(n):#左方向へ2つ平行移動\n", | |
" if n in [1,5,9,13]:\n", | |
" return n\n", | |
" else:\n", | |
" return n-2\n", | |
" \n", | |
"def shiftl3(n):#左方向へ3つ平行移動\n", | |
" if n in [1,5,9,13]:\n", | |
" return n\n", | |
" else:\n", | |
" return n-3\n", | |
" \n", | |
"def shift(PTET,PTET2): #PTET2の全ての可能な平行移動移動で移り変わったものがPTETにあれば消去する。\n", | |
" for f in PTET2:\n", | |
" al=[]\n", | |
" for a in f: \n", | |
" al.append(shiftd1(a))\n", | |
" if al in PTET:\n", | |
" PTET.remove(al)\n", | |
"\n", | |
" for f in PTET2:\n", | |
" al=[]\n", | |
" for a in f: \n", | |
" al.append(shiftd2(a))\n", | |
" if al in PTET:\n", | |
" PTET.remove(al)\n", | |
"\n", | |
" for f in PTET2:\n", | |
" al=[]\n", | |
" for a in f: \n", | |
" al.append(shiftd3(a))\n", | |
" if al in PTET:\n", | |
" PTET.remove(al)\n", | |
"\n", | |
" for f in PTET2:\n", | |
" al=[]\n", | |
" for a in f: \n", | |
" al.append(shiftl1(a))\n", | |
" if al in PTET:\n", | |
" PTET.remove(al)\n", | |
"\n", | |
" for f in PTET2:\n", | |
" al=[]\n", | |
" for a in f: \n", | |
" al.append(shiftl2(a))\n", | |
" if al in PTET:\n", | |
" PTET.remove(al)\n", | |
"\n", | |
" for f in PTET2:\n", | |
" al=[]\n", | |
" for a in f: \n", | |
" al.append(shiftl3(a))\n", | |
" if al in PTET:\n", | |
" PTET.remove(al)\n", | |
"\n", | |
" return PTET\n", | |
" \n", | |
"FT=list(itertools.combinations(Fn,4)) \n", | |
"\n", | |
"FL=[]\n", | |
"for f in FT:\n", | |
" FL.append(list(f))\n", | |
"\n", | |
"#print(FL)\n", | |
"#print('') \n", | |
"\n", | |
"PTET=[]\n", | |
"for f in FL:\n", | |
" BOOL=False\n", | |
" fi=list(itertools.permutations(f,4)) #4つの正方形の可能な順列の列挙\n", | |
" for path in fi: #4つの正方形を点または辺でつなぐ経路があるか探索\n", | |
" BOOL=True\n", | |
" bl=[]\n", | |
" for b in path:\n", | |
" bl.append(b)\n", | |
" if dist(bl[0],bl[1])<=2:\n", | |
" BOOL=BOOL and True\n", | |
" else:\n", | |
" BOOL=BOOL and False\n", | |
"# print(bl[0],bl[1],BOOL)\n", | |
" for i in range(1,3):\n", | |
" if dist(bl[i],bl[i+1])<=2:\n", | |
" BOOL=BOOL and True\n", | |
" else:\n", | |
" BOOL=BOOL and False\n", | |
"# print(bl[i],bl[i+1],BOOL)\n", | |
" if BOOL:\n", | |
" break\n", | |
" if BOOL:\n", | |
" PTET.append(f)\n", | |
"\n", | |
"PTET2=PTET\n", | |
"PTET=shift(PTET,PTET2)\n", | |
"\n", | |
"print(len(PTET))\n", | |
"print(PTET)\n", | |
"print('')\n", | |
"\n", | |
"\"\"\"\n", | |
"R1PTET=rot(PTET)\n", | |
"PTETF=shift(PTET,R1PTET)\n", | |
"R2PTET=shift(PTET,rot(rot(PTET)))\n", | |
"R3PTET=shift(PTET,rot(rot(rot(PTET))))\n", | |
"\n", | |
"print(len(R1PTET))\n", | |
"print(R1PTET)\n", | |
"\n", | |
"\"\"\"\n", | |
"print('')" | |
] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python 3", | |
"language": "python", | |
"name": "python3" | |
}, | |
"language_info": { | |
"codemirror_mode": { | |
"name": "ipython", | |
"version": 3 | |
}, | |
"file_extension": ".py", | |
"mimetype": "text/x-python", | |
"name": "python", | |
"nbconvert_exporter": "python", | |
"pygments_lexer": "ipython3", | |
"version": "3.6.5" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 2 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment