Écrivez l'image suivante (picntu.png).
Vous pouvez analyser et exécuter cette image. Le côté supérieur est la zone de stockage des pièces. Exécutez le côté inférieur. Allez de haut à gauche et descendez. Comme Python, les retraits représentent des blocs. Comme les graphiques de tortues, il est d'abord aux coordonnées (x = 0, y = 0) et fait face au nord. Vous pouvez le déplacer avec une commande.
bash
docker run -it --rm tsutomu7/picntu ./picntu picntu.png
>>>
0 0
0 2
2 2
2 0
--go: Faites un pas. (D'abord à (0, 0).) --back: Recule d'une étape. --gauche: tourner vers la gauche. (Première face au nord.) --droite: tourner vers la droite. --def Number: définit un sous-programme numérique. La portée de la définition est déterminée par le tiret. --run Number: Exécute un sous-programme numérique. --lop Number: Répéter pour le numéro. La plage de répétition est déterminée par l'indentation. --pri Number: génère un nombre. --if = Number: détermine si le nombre est égal à la valeur en mémoire. La plage est déterminée par le retrait. --if <nombre: détermine si le nombre dépasse la valeur en mémoire. --if> Number: détermine si le nombre est inférieur à la valeur de la mémoire. --set Number: définit le numéro en mémoire. --add Number: ajoute un numéro à la mémoire. --sub Number: soustrait le nombre de la mémoire. --Si vous laissez le nombre vide, la valeur de la mémoire sera utilisée. Vous ne pouvez avoir qu'un seul numéro en mémoire.
--Nombre: les nombres vont de 0 à 9, 10 revenant à 0. --i, j: compteur de lop. La première boucle est i et la deuxième boucle est j. --x, y: représente les coordonnées. --r: indique l'orientation. Nord = 0, Est = 1. Sud = 2, Ouest = 3.
échantillon
def 0 | pri x | pri y
lop 4 | run 0
| lop 2 | go
| right
La description
Si vous placez le fichier image dans / tmp, vous pouvez l'exécuter comme suit. Vous pouvez changer la taille de l'image, mais ne changez pas la position des pièces.
bash
docker run -it --rm -v /tmp:/tmp tsutomu7/picntu ./picntu /tmp/Nom du fichier image
Si vous spécifiez un deuxième argument, vous pouvez voir le python créé à partir de l'image.
bash
docker run -it --rm tsutomu7/picntu ./picntu picntu.png 0
>>>
i, j, x, y, r, c = 0, 0, 0, 0, 0, 0
dx, dy = [0, 1, 0, 9], [1, 0, 9, 0]
def f0():
print("\n%d" % x, end="");print(" %d" % y, end="");
for i in range(4):
f0();
for j in range(2):
globals()["x"], globals()["y"] = (x + dx[r]) % 10, (y + dy[r]) % 10;
globals()["r"] = (r + 1) % 4;
0 0
0 2
2 2
2 0
Faites ce qui suit, spécifiez le fichier et appuyez sur "Exécuter".
bash
docker run -it -d -p 5000:5000 tsutomu7/picntu
firefox localhost:5000
picntu.py
import cv2, sys, unionfind
if len(sys.argv) <= 1:
print('%s image_file' % sys.argv[0][:-3])
exit()
im = cv2.imread(sys.argv[1])
imtop = im[5:13, 4:86] # top of card
r1 = cv2.matchTemplate(im[160:], imtop, cv2.TM_CCOEFF_NORMED)
scom = 'go back lop if_eq set ' \
'left right else if_lt add ' \
'def run pri if_gt sub'.split()
slit = '0 1 i 2 3 j 4 5 x 6 7 y 8 9 r'.split()
coms = [] # command list
for y, x in [(i, j) for i, p in enumerate(r1 >= 0.999)
for j, q in enumerate(p) if q]:
imcom = im[y+173:y+197,x+9:x+49]
r2 = cv2.matchTemplate(im[:150,:460], imcom, cv2.TM_CCOEFF_NORMED)
_, v, _, (x2, y2) = cv2.minMaxLoc(r2)
if v < 0.999:
continue
i = (x2+33)//92 + (y2+8)//52*5
arg = 'c'
if i > 7 or (i+1)%6 > 2:
r3 = cv2.matchTemplate(im[9:147,465:545], im[y+173:y+193,x+53:x+70],
cv2.TM_CCOEFF_NORMED)
_, v, _, (x3, y3) = cv2.minMaxLoc(r3)
if v >= 0.999:
arg = slit[(x3+8)//26 + (y3+7)//25*3]
coms.append([-1, -1, scom[i], arg, x, y])
n = len(coms)
ux = unionfind.unionfind(n)
uy = unionfind.unionfind(n)
for i in range(n):
coi = coms[i]
for j in range(i+1, n):
coj = coms[j]
if abs(coi[4] - coj[4]) < 12:
ux.unite(i, j)
if abs(coi[5] - coj[5]) < 12:
uy.unite(i, j)
for i, g in enumerate(sorted(ux.groups(), key=lambda g: coms[g[0]][4])):
for j in g:
coms[j][1] = i
for i, g in enumerate(sorted(uy.groups(), key=lambda g: coms[g[0]][5])):
for j in g:
coms[j][0] = i
ex = []
ex.append('i, j, x, y, r, c = 0, 0, 0, 0, 0, 0\n')
ex.append('dx, dy = [0, 1, 0, 9], [1, 0, 9, 0]\n')
pr, s, lp = 0, ' ', []
for v, t, com, a, _, _ in sorted(coms):
if v > pr or s[-1] == ':':
ex.append('\n' + ' '*t)
if com == 'go':
s = 'globals()["x"], globals()["y"] = (x + dx[r]) % 10, (y + dy[r]) % 10;'
elif com == 'back':
s = 'globals()["x"], globals()["y"] = (x + dx[(r + 2) % 4]) % 10, (y + dy[(r + 2) % 4]) % 10;'
elif com == 'left':
s = 'globals()["r"] = (r + 3) % 4;'
elif com == 'right':
s = 'globals()["r"] = (r + 1) % 4;'
elif com == 'def':
s = 'def f%s():' % a
elif com == 'run':
s = 'f%s();' % a
elif com == 'lop':
while lp and lp[-1] >= t:
lp.pop()
s = 'for %s in range(%s):' % ('ijklmn'[len(lp)], a)
lp.append(t)
elif com == 'else':
s = 'else:'
elif com == 'pri':
s = 'print("%s%%d" %% %s, end="");' % (' ' if v == pr and s[0] == 'p' else '\\n', a)
elif com == 'if_eq':
s = 'if c == %s:' % a
elif com == 'if_lt':
s = 'if c < %s:' % a
elif com == 'if_gt':
s = 'if c > %s:' % a
elif com == 'set':
s = 'globals()["c"] = %s;' % a
elif com == 'add':
s = 'globals()["c"] += %s;' % a
elif com == 'sub':
s = 'globals()["c"] -= %s;' % a
ex.append(s)
pr = v
if len(sys.argv) > 2:
print(''.join(ex))
exec(''.join(ex))
print()
référence: Jouer avec une tortue avec des graphiques de tortue (Partie 1) «Cubetto» où même les enfants de 3 ans peuvent apprendre la programmation avec des jouets
Recommended Posts