courage.py

Created by andreanx

Created on October 03, 2018

2.52 KB

Script de participation au défi Courage du concours TI-Planète-Casio de rentrée 2018. La triforce du courage a été scindée en 8 fragments dispersés aux quatre coins du ciel d’Hyrule. Heureusement le dieu des tempêtes Cyclos te prête son nuage volant, le célèbre Kinto1. La légende raconte que rares sont les êtres vivants capables de le chevaucher, qu’il faut avoir le cœur parfaitement pur… Quoi qu’il en soit, avec seulement 3 flèches utilisables au lieu de 4, ça n’a à priori pas l’air évident. Réalise le meilleur score possible en collectant aussi rapidement que possible le maximum de fragments de la triforce, puis envoie la liste ‘kinto’ à info@tiplanet.org. Syntaxe : courage([liste]). La liste est vide si omise. Une fois les instructions de la liste épuisées, Kinto1 passe en contrôle manuel. Taper [1], [2] ou [3] suivi de [enter] pour le contrôler. Taper [0] suivi de [enter] pour quitter l’interface, puis [échap/esc] pour revenir à la console.


from math import *
from cmath import *
from kandinsky import *
w=65537
p=75
kinto=[]
def mrand(x):return (p*x)%w
def kline(x1,y1,x2,y2,c=0):
  d=abs(x2-x1)-abs(y2-y1)
  if d>0:
    for k in range(round(min(x1,x2)),round(max(x1,x2))+1):set_pixel(k,round([y1,y2][min(x1,x2)==x2]+(k-min(x1,x2))*(y2-y1)/(x2-x1)),c)
  elif d<0:
    for k in range(round(min(y1,y2)),round(max(y1,y2))+1):set_pixel(round([x1,x2][min(y1,y2)==y2]+(k-min(y1,y2))*(x2-x1)/(y2-y1)),k,c)
  else:
    set_pixel(round(x1),round(y1),c)
def krect(x,y,z,t,c=0):
  for k in range(round(y),round(t)+1):
    kline(x,k,z,k,c)
def kdisk(x,y,r,c=0,i=0):
  while i<pi/2:
    z=r*e**(1j*i)
    krect(x-z.real,y-z.imag,x+z.real,y+z.imag,c)
    i+=3/r
def courage(kinti=[]):
  global kinto
  zs=320+222j
  m=True
  n=9
  b=.085
  a=31
  s=0
  z0=zs/2
  f=min(zs.real/2-1,zs.imag/2-1)
  db=[0j]
  krect(0,0,zs.real-1,zs.imag-1,color(0,127,0))
  for i in range(z0.real%25-z0.real,z0.real,25):
    kline(z0.real+i,0,z0.real+i,zs.imag-1,0)
    kline(0,z0.imag+i,zs.real-1,z0.imag+i,0)
  for i in range(1,n):
    a=mrand(a)
    db.append((8*a/w-4)/3)
    a=mrand(a)
    db[i]+=1j*(2*a/w-1)
    kdisk((z0+f*db[i]).real,(z0-f*db[i]).imag,f*b,color(255,127,0))
    db[i]=abs(db[i])+1j*phase(db[i])*pi/phase(-1)
  k=4
  z=0j
  t=z
  v=0
  d=True
  while k>0 and n>db[0].imag:
    m=m and len(kinti)>len(kinto)
    if m:
      v=kinti[len(kinto)]
    else:
      v+=.01*((k==3)-(k==1))
    if d or m or k>=1 and k<=3:
      if not(d):
        kinto.append(v)
        t=z
        a=mrand(a)
        z+=v+1j*(.04+a/w)/(9*abs(z.real)+1)
        s-=500*abs(z.real*e**(1j*z.imag)-t.real*e**(1j*t.imag))
        for i in range(n):
          if i==0 and db[0].imag==n-1 and z.real*t.real<=0 or i>0 and pi>=db[i].imag and b>=abs(z.real*e**(1j*z.imag)-db[i].real*e**(1j*db[i].imag)):
            if i>0:
              kdisk((z0+f*db[i].real*e**(1j*db[i].imag)).real,(z0-f*db[i].real*e**(1j*db[i].imag)).imag,f*b/3,color(255,0,0))
              db[i]=db[i].real+1j*(2*pi+db[i].imag)
            db[0]=1j+1j*db[0].imag
            s+=500*(3-min(1,abs(z.real*e**(1j*z.imag)-db[i].real*e**(1j*db[i].imag)))-min(1,abs(z.real-db[i].real)))
      kline((z0+f*t.real*e**(1j*t.imag)).real,(z0-f*t.real*e**(1j*t.imag)).imag,(z0+f*z.real*e**(1j*z.imag)).real,(z0-f*z.real*e**(1j*z.imag)).imag,color(255,255,0))
      draw_string(str(s),0,207)
      d=False
    if not m:k=int(input())
  print("Bon score ? Envoie la liste\n'kinto' a info@tiplanet.org")
  print("Score: "+(8000<s<=9000)*"(8000 ijou da!)"+(s>9000)*"(it's over 9000!)")
  return s