Skip to content

Instantly share code, notes, and snippets.

@foxqstm
Created August 14, 2021 19:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save foxqstm/f1213cd2ad614103ed3ce24415978d3b to your computer and use it in GitHub Desktop.
Save foxqstm/f1213cd2ad614103ed3ce24415978d3b to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"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