Concours de rentrée 2020 - Défi Python de Xuanwu !
Posté le 23/09/2020 19:42
Salut à tous ! Comment les années précédentes, TI-Planet et Planète Casio organisent un concours de rentrée, une série de défis ouverts à tous pour profiter de logique, de programmation, et de calculatrices graphiques !
Après le
concours Galactik, le
triconcours et le
concours de rentrée 2019, nous sommes de retour avec de nouveaux défis ! Grâce à l'adoption des
fonctions de tracés en Python sur la majorité des modèles de calculatrices lycée, cette quatrième édition du concours te propose
trois défis tous en Python qui seront lancés chacun à leur tour.
• Le
défi de Xuanwu est un exercice de tracé à la tortue, qui commence dès maintenant et est ouvert jusqu'à 18 Octobre 2020 à minuit.
• Le
défi de Quetzalcoatl est un exercice de tracé par coordonnées.
• Le
défi du Léviathan est un problème d'intelligence artificielle.
Ces défis sont ouvert à tous et conçus pour être abordables dès le collège. Ce sont des jeux dans lequel tu dois utiliser un programme pour accomplir une tâche tout en maximisant un score ou en minimisant un coût. Dans le jargon on appelle ça un « problème d'optimisation », et si ça peut sembler compliqué tu verras que c'est en fait très simple.
Pour chaque défi, nous te fournissons un programme Python dans lequel tu peux programmer ta solution avant de l'envoyer. Grâce au travail de
Critor, tu peux concevoir ta solution sur pas moins de 13 modèles de calculatrices Python !
Tu peux participer à toutes les épreuves que tu veux et même envoyer plusieurs solutions pour la même épreuve si tu arrives à améliorer ton score. N'hésite pas à faire beaucoup de tests !
Les lots de cette année comprennent nombre calculatrices Python moyen et haut-de-gamme, ainsi que des raretés de goodies quasiment exclusifs à cette date, parfaits pour les fervents fans ! Le concours de rentrée est l'événement à ne pas rater !
Le défi Python de Xuanwu, le serpent-tortue
Alors que tu randonnais sur les causses du Larzac accompagné·e de ta calculatrice favorite, voici que tu découvres une profonde cavité cachée derrière un imposant rocher. Maladroit, tu glisses sur l'herbe mouillée et chutes d'une façon ironiquement prévisible dans la caverne.
Une fois tes esprits repris, à la lumière de ta calculatrice tu notes s'étendant devant toi un dédale de couloirs, en grande partie obstrué de terre et pierres. Un trésor géologique dont l'admiration n'est surpassée que par le mystère d'un véhicule d'excavation entreposé sous la terre et la poussière.
D'une technologie semble-t-il encore jamais vue, l'excavatrice est un assemblage de pièces de pierre couplées à un métal qui t'es inconnu. À peine t'en approches-tu que la machine se met à vrombir, et un mystérieux script de contrôle Python se télécharge comme par magie dans ta calculatrice...
Des malins auront remarqué une subtile indication de direction dans un coin de l'image.
Cependant, à la surprise de tous, la machine peut bel et bien tourner à gauche !
Ta chute a affaissé le rocher qui cachait l'entrée, aucune remontée n'est possible. Afin de retrouver la lumière du jour, te voilà forcé de piloter l'excavatrice jusqu'à la sortie du labyrinthe géologique qui s'étend devant toi. Mais si la machine semble bien démarrer, difficile de savoir pour combien de temps. Elle arrive à peine à avancer et les foreuses sont hors d'état de marche. Il va donc falloir contourner les roches et économiser ta consommation d'énergie durant le trajet...
Le défi se compose des 3 scripts Python que tu peux télécharger
en bas de cet article.
•
polycalc.py est la bibliothèque de compatibilité graphique permettant au défi de se lancer sur les 13 environnements Python supportés par ce concours.
•
laby.py contient la description du labyrinthe et les règles du jeu. À toi de voir ce que tu peux en tirer !
•
labytest.py est un exemple de soumission au concours.
L'excavatrice dispose de 3 contrôles pour tourner et avancer, représentés par 3 fonctions
avancer(),
a_gauche() et
a_droite() que tu dois utiliser pour atteindre la sortie. Voici un exemple de contrôle qui déplace la machine entre les premiers murs du labyrinthe :
#cas
from laby import *
def chemin():
avancer(1.5)
a_droite(1.5707963267948966)
avancer(1)
Tu peux l'évaluer pour obtenir ton score avec la fonction
aller_selon de
labytest.py.
from labytest import *
aller_selon(chemin)
Ton programme peut utiliser tous les outils Python de ton choix pour calculer son
chemin() et prendre des décisions. Tu peux notamment créer des variables, des boucles, ou des fonctions. Tu peux aussi démonter l'excavatrice et étudier le code que nous avons concocté dans
laby.py si tu veux comprendre le fonctionnement de cette machine antique.
Attention cependant, tu n'as pas le droit de lire ou modifier des éléments de
laby.py autrement qu'en utilisant les trois fonctions
avancer(),
a_gauche() et
a_droite(), sous peine de casser la machine et rester enfermé à jamais.
Comment participer
Pour participer, envoie ta participation par mail à l'addresse
info@tiplanet.org avec :
• En objet, « Défi de Xuanwu »
• Ton adresse postale complète avec ton nom et prénom
• Ton adresse mail (si différente de celle utilisée pour l'envoi)
• En option, ton pseudonyme sur TI-Planet ou Planète Casio (utilisé pour la liste des participants à la fin du concours)
• Un numéro de téléphone personnel valide (utilisé uniquement en cas d'urgence, notamment en cas de problème avec une participation ou lors d'un choix de lot contraint par le temps)
Les communautés de TI-Planet et Planète Casio sont sensibles aux problématiques d'informations personnelles. Les informations que tu soumets seront utilisées
uniquement pour le concours, puis supprimées lorsque l'événement sera terminé et les lots envoyés.
Lots de cette épreuve
Il y a
12 lots à remporter dans cette épreuve, fournis généreusement par les constructeurs
Casio,
Numworks,
Texas Instruments, le revendeur
Calcuso,
Bernard Parisse de
l'Institut Fourier (auteur de Xcas/KhiCAS), les associations
CreativeCalc et
UPECS gérant Planète Casio et TI-Planet, ainsi que
Hewlett-Packard avec des goodies de 2019 !
À cause de réorganisations importantes chez HP, le service marketing français a été délégué à une entreprise en République Tchèque, ce qui ne nous a pas permis d'obtenir de lots pour l'événement de cette année. Cependant, nous continous de supporter la HP Prime comme plateforme pour les soumissions.
Les participants ayant obtenus les 12 meilleurs coûts au défi pourront choisir chacun à leur tour un lot de leur choix.
2 lots Capricorne ♑ comprenant
1 calculatrice Casio Graph 90+E, 1 pack de goodies Casio, 1 goodie Xcas, et 1 pack de goodies TI-Planet & Planète Casio
2 lots Bélier ♈ comprenant
1 solution d'émulation Casio, 1 CD de vidéos Casio fx-CG20 ou catalogue de produits Casio, 1 pack de goodies Casio, 1 goodie Xcas, et 1 pack de goodies TI-Planet & Planète Casio
Le CD contient 42 vidéos d'environ 8 heures par
Jean-Michel Ferrard, originellement conçu pour la fx-CG 20 mais toujours applicable à la Graph 90+E, pour Windows et Mac.
La
solution d'émulation Casio est au choix parmi :
• Une clé USB 8 Go d'émulation permanente, avec les émulateurs
fx-92 Scientifique Collège+,
Graph 35+E II 3.30, et
Graph 90+E 3.40 à jour, pour Windows. Casio a annoncé que
les mises à jour seront disponibles pour ces clefs dans le futur. Le modèle blanc est la
clé Transcend 2019, le bleu est la clef
EMTEC 2020.
• Une license de 3 ans permettant d'installer le fx-CP400 Manager (Windows/Mac) et le fx-CG 500 Manager (Windows/Mac). Les deux sont similaires à la ClassPad 400+E.
1 lot Serpentaire ⛎ comprenant 1 goodie HP, 1 goodie Xcas et 1 pack de goodies TI-Planète-Casio
La clé USB HP a une capacité de 16 Go, le poster mesure 59.2x40 cm.
2 lots Sagittaire ♐ comprenant
1 calculatrice NumWorks N0110, 1 pack de goodies NumWorks, 1 goodie Xcas, et 1 pack de goodies TI-Planet & Planète Casio
2 lots Balance ♎ comprenant 1 couvercle NumWorks, 1 autocollant NumWorks, 1 enveloppe ou carte postale ou carte de visite-énigme NumWorks, 1 pack de goodies NumWorks, 1 goodie Xcas et 1 pack de goodies TI-Planet & Planète Casio
1 lot Taureau ♉ comprenant
1 calculatrice TI-Nspire CX II-T CAS, 1 licence logiciel TI-Nspire CAS élève, 1 pack de goodies TI, 1 goodie Xcas, et 1 pack de goodies TI-Planète-Casio
1 lot Lion ♌ comprenant
1 calculatrice TI-Nspire CX II-T, 1 licence logiciel TI-Nspire élève, 1 pack de goodies TI, 1 goodie Xcas et 1 pack de goodies TI-Planète-Casio
1 lot Gémeaux ♊ comprenant
1 calculatrice TI-83 Premium CE Edition Python, 1 adaptateur USB, 1 clavier USB, 1 pack de goodies TI et 1 pack de goodies TI-Planète-Casio
Tu peux trouver le détail des choix de goodies sur
l'article TI-Planet annonçant le concours. Un truc tout nouveau de cette année c'est les
batteries USB Casio de 2200 mAh, parfaites pour alimenter en urgence une calculatrice qui n'a plus de piles !
Ressources et téléchargement du programme
•
Scripts Python polycalc.py, laby.py et labytest.py
Pour participer sur Graph 35+E II, il faut disposer de la mise à jour vers l'OS 3.30 qui introduit les fonctions de dessin en Python. Pour Graph 90+E, il faut de même avoir la mise à jour vers l'OS 3.40.
•
Mises à jour Python vers l'OS 3.30 et 3.40
Tu peux aussi utiliser un émulateur pour tester le script sur ton ordinateur ! Les émulateurs de Casio sont gratuits pendant 90 jours.
•
Émulateur Graph 35+E II version 3.30 pour Windows
•
Émulateur Graph 90+E version 3.40 pour Windows (lien direct)
•
Émulateur Graph 90+E version 3.40 pour Mac (lien direct)
Pour transférer les scripts Python, branche ta calculatrice avec un câble USB à l'ordinateur et appuie sur F1 (Flash USB). Ta Graph 35+E II et ta Graph 90+E se présente comme une clé USB à l'ordinateur. Tu peux alors coller les fichiers dans le dossier principal puis éjecter la pseudo-clé USB. Ensuite, lance les scripts depuis l'application Python !
Pour les autres modèles, vois dans
l'article TI-Planet. Tu peux participer avec toutes les combinaisons calculatrice/Python suivantes !
• TI-83 Premium CE Edition Python / TI-84 Plus CE-T Python Edition
• Casio Graph 35+E II
• Casio Graph 90+E / fx-CG50
• HP Prime en mode CAS
• HP Prime avec appli Python intégrée (firmware instable, déconseillé)
• NumWorks (y compris Delta et Omega)
• NumWorks avec l'appli KhiCAS en mode Micropython (Delta uniquement)
• NumWorks avec l'appli KhiCAS en mode de compatibilité Python (Delta uniquement)
• TI-Nspire CX II
• TI-Nspire avec Ndless et Micropython
• TI-Nspire CX/CM avec Ndless et Micropython
• TI-Nspire CX avec Ndless et KhiCAS CX
Toutes les raisons de participer sont réunies ! Ne perds pas un instant et attrape ta calculatrice ou ton émulateur favori·e pour résoudre dès maintenant le
défi Python de Xuanwu !
D'autres annonces suivront pour les autres défis, et les résultats lorsque le défi sera terminé. Stay tuned et
à bientôt sur Planète Casio !
Article connexe sur TI-Planet : Concours de rentrée 2020 - défi Python de Xuanwu
Citer : Posté le 23/09/2020 19:55 | #
J'y participe !!! Les votes sont lancés !
Plus sérieusement, je le fait sous PC moi (La calto est bien trop lente), donc j'ai recrée un petit code Il ne nous montre pas le chemin, mais la consommation
Je pense que je vais créer un petit prog qui va me calculer automatiquement les orientations etc :P
Et surtout..
Bonne Chance !
Citer : Posté le 23/09/2020 19:59 | #
Magnifique ! Je l'attendais avec impatience étant donné qu'avant j'étais pas sur PC !
J'annonce malheureusement ma non-participation, mes compétences m'interdisent de participer et même si elle me le permettaient, cette année, j'ai pas de temps en trop mais je suivrai de près l'avancée de l'évènement.
Sur ce, bonne chance à tous !
Citer : Posté le 23/09/2020 20:00 | #
Ha ha pas surprenant, tout le monde a déjà commencé à le faire sur ordinateur. Il paraît qu'une version Tkinter traîne sur TI-Planet. La légende dit aussi que les concepteurs de l'excavatrice avaient leur propre version de debuggage. Si vous lisez bien les inscriptions sur le murs de la caverne, vous pourriez trouver des indices. Mais après il y a d'autres activités plus pressantes, je le reconnais.
Citer : Posté le 23/09/2020 20:07 | # | Fichier joint
Filoji vient de griller la politesse à tout le monde en déterminant la solution optimale au problème.
Citer : Posté le 23/09/2020 20:07 | #
Pardon, j'ai même pas compris ce que je suis censé savoir...
Citer : Posté le 23/09/2020 20:09 | #
Est-ce qu'il y a quelque chose dans l'annonce qui n'est pas clair ou que tu n'as pas compris ?
Citer : Posté le 23/09/2020 20:10 | #
Oui, ça :
Filoji vient de griller la politesse à tout le monde en déterminant la solution optimale au problème.
Citer : Posté le 23/09/2020 20:14 | #
C'est drôle comme blague (même involontaire), parce que c'est clairement autorisé de tourner à gauche et que ne pas le faire va te complexifier la tâche.
Du reste, si quelqu'un arrive à nommer l'algorithme utilisé pour la génération du labyrinthe, il y a un cookie en jeu ! Non que ce soit compliqué mais ça demande de désobfusquer un peu de code.
Citer : Posté le 23/09/2020 20:29 | #
Merci pour la rédaction et le formatage, toujours avec grand talent.
Ne dit-on pas que c'est l'emballage le plus important ?
Citer : Posté le 23/09/2020 20:30 | #
Si c'est le cas, j'ai peut être une chance pour participer
Citer : Posté le 23/09/2020 20:30 | #
Merci, encore que le crédit te revienne pour la majorité de cette mise en forme. Qui en effet pour un événement de ce genre est cruciale ! x3
Ajouté le 23/09/2020 à 21:18 :
Et voilà la bannière dans l'article et en haut des pages du site.
Citer : Posté le 23/09/2020 21:19 | #
Zut, pas d'indices cette fois :3
Citer : Posté le 23/09/2020 21:22 | #
Pour limiter la confusion sur le rôle de l'excavatrice, il faut préciser que les foreuses sont hors d'état de marche, vous ne pouvez donc pas passer à travers les murs. C'est un exercice de mouvement uniquement.
Citer : Posté le 23/09/2020 21:22 | #
D'accoooord, merci beaucoup pour cette précision !
Ça éclaircit grandement les choses
Citer : Posté le 23/09/2020 21:32 | # | Fichier joint
vous ne pouvez donc pas passer à travers les murs.
Citer : Posté le 23/09/2020 22:05 | #
Et tu fais ça sur la version originale ? :3
Citer : Posté le 23/09/2020 22:11 | #
nan, j'ai changé les couleurs pour un truc plus flashy, pourquoi ? :3c
Citer : Posté le 23/09/2020 22:33 | #
Tout va bien, modifier les couleurs n'est pas autorisé donc cette participation est invalide. Ouf.
Citer : Posté le 23/09/2020 22:33 | #
ce problème réglé si facilement... (les autres qui traversent les murs, c'est pareil ?)
Citer : Posté le 23/09/2020 23:04 | #
Bon, pour aider les gens quand même vu que je suis particulièrement sympa, je vous file un script pygame que j'ai fait pour simuler lce programme sur l'ordi.
EDIT : Etrangement, la consommation n'est pas la même sur calto que sur pc, vous pouvez au moins simuler sur ordi le chemin, c'est déjà ça
from math import sin, cos, asin, pi
from polycalc import *
import pygame
from pygame.locals import *
def ri(a,b):
global s
s = (s * 214013 + 2531011) % 4294967296
r = (s // 65536) & 0x7fff
return r % (b-a) + a
def mon_secret(v, b, n):
return v & ~(b * 2**n)
def mon_xor(a, b):
return a + b - (a & b)
def ufl(r):
global rl
i, s = r // 3, 10 * (r % 3)
rep = rl[i]//2**s & 1023
if rep != r:
rep = ufl(rep)
rl[i] = mon_secret(rl[i], 1023, s)
s = rep * 2**s
rl[i] = mon_xor(rl[i], s)
return rep
def ufm(r1, r2):
global rl
i, r1 = r1 // 3, 10 * (r1 % 3)
r2 *= 2**r1
rl[i] = mon_secret(rl[i], 1023, r1)
rl[i] = mon_xor(rl[i], r2)
def cout(x):
return len(str(round(abs(x)/1.,5)))
def a_gauche(a):
global state
state[5] += 5 + cout(a)
state[2] -= a
def a_droite(a):
a_gauche(-a)
def avancer(l):
global state
t = state[2]*2*asin(1)/pi
dx, dy = cos(t), sin(t)
state[5] += 8 + cout(l)
while(l > 0):
state[3:5] = state[0:2]
x, y = state[0] + dx/4, state[1] + dy/4
ix, iy = int(x) - (x < 0), int(y) - (y < 0)
drx, dry = ix - int(state[3]), iy - int(state[4])
vw = lambda y, x: wl[y] & 2**x
hw = lambda y, x: wl[y + laby_h] & 2**x
wx = laby_w - 2 - min(ix, ix - drx)
tx = drx and (ix < 0 or ix >= laby_w or vw(iy - dry, laby_w - 2 - min(ix, ix - drx)))
ty = dry and (iy < 0 or iy >= laby_h or hw(min(iy, iy - dry), laby_w - 1 - (ix - drx)))
t = dx <= 0 or int(x) < laby_w - 1 or int(y) < laby_h - 1
if t and tx or ty or (drx and dry and (t and tx or ty)) or (drx and dry and (t and vw(iy, laby_w - 2 - min(ix, ix - drx)) or hw(min(iy, iy - dry), laby_w - 1 - ix))):
state[5] += 15
return
l -= .25
state[6] += (state[6] < 200)
state[0:2] = (x, y)
draw_line(state[3] * zx, state[4] * zy, state[0] * zx, state[1] * zy, colors[4])
laby_w, laby_h = 20, 12
s = 0xdeadbeef
rl = [(3*i + 2)*1048576 + (3*i + 1)*1024 + 3*i for i in range(laby_w*laby_h + 2//3)]
wl = [(2**(laby_w + 1) - 1) // (1 + (k < laby_h)) for k in range(2*laby_h - 1)]
cl = len(rl)
while cl > 1 - (laby_w * laby_h)//100*10:
y = ri(0, 2*laby_h - 1)
x = ri(0, laby_w - (y < laby_h))
if wl[y] & 2**x:
if y < laby_h:
r1 = y*laby_w + x
r2 = r1 + 1
else:
r1 = (y - laby_h)*laby_w + x
r2 = r1 + laby_w
rl1, rl2 = ufl(r1), ufl(r2)
if rl1 != rl2 or cl <= 1:
ufm(rl1, rl2)
cl -= 1
wl[y] = mon_secret(wl[y], 1, x)
for r in range(len(rl)):
ufl(r)
#screen_w, screen_h, poly_set_pixel, poly_draw_line, poly_fill_rect, poly_clean_screen, poly_show_screen = get_infos()
ratio = 3
screen_w = 384*ratio
screen_h = 192*ratio
ds = 4
zint = 1 + (screen_w > 2*laby_w*ds)
ds += zint - 1
zx, zy = (screen_w - zint) / laby_w, (screen_h - zint) / laby_h
#get_infos, poly_set_pixel, rl, ufl, ufm = None, None, None, None, None
colors = ([0, 95, 0], [0, 0, 63], [0, 200, 0], [0, 0, 255], [255, 0, 0])
pygame.init()
pygame.mixer.quit()
pygame.display.set_caption('Concours')
fenetre = pygame.display.set_mode((screen_w,screen_h))
def draw_line(x1, y1, x2, y2, c):
pygame.draw.line(fenetre, (c),(x1, y1), (x2, y2))
pygame.display.update()
def clean_screen():
fenetre.fill([255,255,255])
def fill_rect_v(x, y, w, h, c):
pygame.draw.rect(fenetre, c, Rect(x, y, 3, 15*ratio))
def fill_rect_h(x, y, w, h, c):
pygame.draw.rect(fenetre, c, Rect(x, y, 15*ratio+10, 3))
def aller_selon(f, affiche):
global state
state = [0, .5, 0, 0, .5, 0, 0]
clean_screen()
for i in range(2):
fill_rect_v(0, i * laby_h * zy, laby_w * zx, zint, colors[1])
fill_rect_h(i * laby_w * zx, (not i) * zy, zint, (laby_h - 1) * zy, colors[0])
for y in range(2*laby_h - 1):
for z in range(laby_w - (y < laby_h)):
if wl[y] & 2**z:
x = laby_w - 1 - z
if y < laby_h:
fill_rect_v(x * zx, y * zy, zint, zy, colors[2])
else:
fill_rect_h(x * zx, (y - laby_h + 1) * zy, zx, zint, colors[3])
f()
boucle=False
while not boucle and affiche:
for event in pygame.event.get():
if event.type==QUIT:
boucle=True
pygame.display.update()
state[5] -= state[6] // 2
print('Consommation : ' + str(state[5]))
if state[0] >= laby_w:
print('------------ GG ! -----------')
print('info@tiplanet.org.')
return state[5]
En soit, rien de spécial dedans. Je ne sais pas si ça fait de moi un hors la loi, mais j'ai rajouté un paramètre à aller_selon() qui permet d'afficher ou non le dessin.
J'ai aussi fait un ratio qui correspond simplement à la taille de l'écran simulé. Mon calcul est foireux, mais globalement pour une taille d'écran de 3 c'est ok.
(Et de toute façon, vous pouvez pas dire le contraire)
MultipliCasio
RDM Calculs
Back Mirror
A Switch To The Top C