Page 1 of 4

Concours de l'Avent 2021 "l'énigme des 3 portes" : jour 30

Unread postPosted: 30 Dec 2021, 14:00
by Admin
Concours TI-Planet de l'Avent 2021
L'énigme des 3 portes : jour n°30
(index des publications)


Viens rassembler les indices et bouts de code Python chaque jour de l'Avent ; sois parmi les premiers à passer l'une des portes pour gagner de superbes cadeaux de Noël ! :favorite:

15063Je suis l'Omega, l'ultime indice du concours de l'Avent et puis te permettre de gagner une NumWorks. Me voici :
Code: Select all
from math import ceil

platform = ''
try: from sys import platform
except: pass

def nop(*argv): pass
show, wait = nop, nop
neg_fill_rect = False
has_color = True

try: # NumWorks, NumWorks + KhiCAS, TI-Nspire CX + KhiCAS
  import kandinsky
  fill_rect = kandinsky.fill_rect
  screen_w, screen_h = 320, 222
  neg_fill_rect = platform!='nspire' and platform!='numworks'
except:
  try: # TI
    import ti_draw
    try: # TI-Nspire CX II
      ti_draw.use_buffer()
      show = ti_draw.paint_buffer
    except: # TI-83PCE/84+CE Python
      wait = ti_draw.show_draw
    screen_w, screen_h = ti_draw.get_screen_dim()
    try: # check TI-83PCE/84+CE ti_draw 1.0 fill_rect bug
      ti_draw.fill_rect(0,0,1,1)
      def fill_rect(x, y, w, h, c):
        ti_draw.set_color(c[0], c[1], c[2])
        ti_draw.fill_rect(x, y, w, h)
    except: # workaround
      def fill_rect(x, y, w, h, c):
        ti_draw.set_color(c[0], c[1], c[2])
        ti_draw.fill_rect(x - 1, y - 1, w + 2, h + 2)
  except:
    try: # Casio Graph 90/35+E II, fx-9750/9860GIII, fx-CG50
      import casioplot
      casioplot.set_pixel(0, 0, (0, 0, 255))
      col = casioplot.get_pixel(0, 0)
      has_color = col[0] != col[2]
      screen_w, screen_h = has_color and (384, 192) or (128, 64)
      show = casioplot.show_screen
      def fill_rect(x, y, w, h, c):
        for dy in range(h):
          for dx in range(w):
            casioplot.set_pixel(x + dx, y + dy, c)
    except:
      try: # HP Prime
        import hpprime
        screen_w, screen_h = hpprime.grobw(0), hpprime.grobh(0)
        hpprime.dimgrob(1, screen_w, screen_h, 0)
        def col3_2_rgb(c, bits=(8,8,8), bgr=1):
          return c[2*bgr]//2**(8 - bits[0]) + c[1]//2**(8 - bits[1])*2**bits[0] + c[2*(not(bgr))]//2**(8-bits[2])*2**(bits[0] + bits[1])
        def fill_rect(x, y, w, h, c):
          hpprime.fillrect(1, x, y, w, h, col3_2_rgb(c), col3_2_rgb(c))
        def show():
          hpprime.strblit(0, 0, 0, screen_w, screen_h, 1)
        def wait():
          while hpprime.keyboard(): pass
          while not(hpprime.keyboard()): pass
      except:
        pass
if not neg_fill_rect:
  _fill_rect = fill_rect
  def fill_rect(x, y, w, h, c):
    if w < 0:
      x += w
      w = -w
    if h < 0:
      y += h
      h = -h
    _fill_rect(x, y, w, h, c)

def draw_image(rle, x0, y0, w, pal, zoomx=1, zoomy=1, itransp=-1):
  if not has_color:
    pal = list(pal)
    g_min, g_max = 255, 0
    for k in range(len(pal)):
      c = pal[k]
      g = 0.299*c[0] + 0.587*c[1] + 0.114*c[2]
      g_min = min(g_min, g)
      g_max = max(g_max, g)
      pal[k] = g
    for k in range(len(pal)):
      pal[k] = pal[k]<(g_min + g_max) / 2 and (0,0,0) or (255,255,255)
  i, x = 0, 0
  x0, y0 = int(x0), int(y0)
  nvals = len(pal)
  nbits = 0
  nvals -= 1
  while(nvals):
    nvals >>= 1
    nbits += 1
  maskval = (1 << nbits) - 1
  maskcnt = (0xFF >> nbits >> 1) << nbits
  while i<len(rle):
    v = rle[i]
    mv = v & maskval
    c = (v & maskcnt) >> nbits
    if (v & 0b10000000 or nbits == 8):
      i += 1
      c |= rle[i] << (7 - nbits + (nbits == 8))
    c = (c + 1)
    while c:
      cw = min(c, w - x)
      if mv != itransp:
        fill_rect(x0 + x*zoomx, y0, cw*zoomx, zoomy, pal[mv])
      c -= cw
      x = (x + cw) % w
      y0 += x == 0 and zoomy
    i += 1

palettes = (
  (
    (247,176,36),(247,207,73),(231,89,0),(247,131,8),
  ),
)
images = (
  (
    b"\b\x05\n?\n\x05\x18\x05\n7\n\x05\x20\x05\n/\n\x05(\x05\n'\n\x050\x05\n\x1f\n\x058\x05\n\x17\n\x05@\x05\n\x0f\n\x05H\x05\n\a\n\x05P\x05\x16\x05X\x05\x0e\x05`\x05\x06\x05d\a\x06\a`\a\x02\x04\x02\aX\a\x02\x0c\x02\aP\a\x02\x04\a\x04\x02\aH\a\x02\x04"
    b"\x0f\x04\x02\a@\a\x02\x04\x17\x04\x02\a8\a\x02\x04\x1f\x04\x02\a0\a\x02\x04'\x04\x02\a(\a\x02\x04/\x04\x02\a\x20\a\x02\x047\x04\x02\a\x18\a\x02\x04?\x04\x02\a\x10\a\x02\x04G\x04\x02\a\b\a\x02\x04O\x04\x02\a\x00\a\x02\x04W\x04\x02\x0b\x02\x04_\x04"
    b"\x02\x03\x02\x04g\x04\x0eg\n\x01\n_\n\t\nW\n\x05\x00\x05\nO\n\x05\b\x05\nG\n\x05\x04"
  ),
)
for y in range(ceil(screen_h / 32)):
  for x in range(ceil(screen_w / 32)):
    draw_image(images[0], x*32, y*32, 32, palettes[0])
show()

palettes = (
  (
    (7,97,182),(55,139,223),(99,176,247),(141,216,247),
  ),
)
images = (
  (
    b"\x80\x01!\x14!\x18\x1e\x19\x1e\x19\x06\x17\x1a\x1f\x1a\x1f\x1a\x1f\x1a\x17\x06\x19\x1e\x19\x1e\x18!\x14!\x80\x01"
  ),
)
for x in range(ceil(screen_w / 16)):
  draw_image(images[0], x*16, screen_h-16, 16, palettes[0])
show()

palettes = (
  (
    (239,89,107),(247,207,81),(0,0,0),(182,26,36),(239,97,0),(0,0,0),
  ),
)
images = (
  (
    b"\xc0\x011\xc0\x01\x02)\xc0\x01\x03\x02!\xc0\x01\x0b\x02!\xc0\x01\x0b!\xc8\x011\xc0\x011\xb8\x01!\x021\x90\x01\x11\n\x03)\x02\x88\x01\t\n\x13!\x02\x03\x88\x01\n#\x19\x02\x0b\x88\x01+\x00\x19\x0b\x90\x01\x1b\x10!\x98\x01\x0b\x20!\xd0\x01\x02!\xc8\x01"
    b"\x03\n\x11\xc8\x01\x13\n\t\xc0\x01#\n\xe8\x01\x0b\xb8\x02\tX\x13p\t@+h\x19\x18Kh\x19[Pi#\x18C\x02Y\x02\x0b0K\x02I\x02\x03@S\x029\x02\x03(\xfb\x009\x03\x20\x1b\b3\x18I\x18\x13pI\b\x1b\x18\x03H!\n!\x1b\x18\x0bH\x11\n\x0b\n\x11\x13\x20\x03\x04@\t\n+\n"
    b"\t\x03\x20\x0b\x04@\nK\n(\x0b\x04@c(\x13\x04\x018[0\x0b\x0c\x01(c0\x13\x0c\t\x83\x010\x1b\x0c\ts@\x13\x141;H\x1b\x14)\x02+P\x1b\x1c!\x02\x1b`#\x1c\x19\x02\x0bp#\x1c\x05\x19\x80\x01+\x14\r!p+\x1c\r!h+\x1c\x15\x02!X+$\x15\x03\n\x11P+$\x1d\x13\n\t83,"
    b"\x1d#\n(;,%\x00+\x10K,-\x10\xfb\x00,5\x8b\x01,=\xfb\x004Ek<M[DUCT]#dm\xfc\x00\xfd\x00\x01d\x8d\x01\tL\x9d\x01\x04\t,\xb5\x01\x0c\t\x14\xc5\x01"
  ),
)
for x in range(ceil(screen_w / 64)):
  draw_image(images[0], x*64, 0, 32, palettes[0], 1, 1, 5)
  draw_image(images[0], (x+1)*64, 0, 32, palettes[0], -1, 1, 5)
show()

def draw_rect_z(x, y, w, h, c, z=1):
  for dy in (0, h - 1):
    fill_rect(x, y + dy*z, w*z, z, c)
  for dx in (0, w - 1):
    fill_rect(x + dx*z, y, z, h*z, c)

def qr_mark(x, y, s, c, z=1):
  draw_rect_z(x, y, s, s, c, z)
  fill_rect(x + 2*z, y + 2*z, (s - 4)*z, (s - 4)*z, c)

palettes = (
  (
    (0,0,0),(247,172,107),(133,71,73),(157,114,18),(207,147,55),(247,247,247),
  ),
  (
    (0,0,0),(36,35,36),(198,0,18),(247,26,55),(157,0,0),(231,97,81),(239,147,90),(247,183,133),(55,114,167),(247,247,247),(72,155,207),(36,71,133),(166,80,0),(239,199,45),(223,131,45),
  ),
  (
    (0,0,0),(0,0,0),(255,183,45),(255,255,247),(255,216,141),
  ),
  (
    (0,0,0),(0,0,0),(27,58,157),(157,172,215),(247,251,247),
  ),
  (
    (0,0,0),(223,41,45),
  ),
)
images = (
  (
    b"\x80\x01a\x02\b\x01[\x02\b\x01\x03\x19\x0b\x19\x03\x02\b\x01\x03\x01\x0b\x01\x0b\x01\x0b\x01\x03\x02\b\x01\x03\x01\x0c\x01\x0b\x01\x0c\x01\x03\x02\b\x01\x03\x01\x0c\x01\x0b\x01\x0c\x01\x03\x02\b\x01\x03\x01\x0c\x01\x0b\x01\x0c\x01\x03\x02\b\x01\x03"
    b"\x01\x0c\x01\x0b\x01\x0c\x01\x03\x02\b\x01\x03\x01\x0c\x01\x0b\x01\x0c\x01\x03\x02\b\x01\x03\x19\x0b\x19\x03\x02\b\x01[\x02\b\x05Y\x02\b\x01\\\x02\b\x01\r\x03\x14\x01$\x02\b\x01\r\x02\x0c\x01\x0c\x01\x14\x02\b\x01\x03\n\x04\x01\x0c\x01\x1c\x02\b"
    b"\x01\x13\x04\x0b\x04#\x02\bj\b\x01[\x02\b\x01\x03\x19\x0b\x19\x03\x02\b\x01\x03\x01\x0b\x01\x0b\x01\x0b\x01\x03\x02\b\x01\x03\x01\x0c\x01\x0b\x01\x0c\x01\x03\x02\b\x01\x03\x01\x0c\x01\x0b\x01\x0c\x01\x03\x02\b\x01\x03\x01\x0c\x01\x0b\x01\x0c\x01"
    b"\x03\x02\b\x01\x03\x01\x0c\x01\x0b\x01\x0c\x01\x03\x02\b\x01\x03\x01\x0c\x01\x0b\x01\x0c\x01\x03\x02\b\x01\x03\x01\x0c\x01\x0b\x01\x0c\x01\x03\x02\b\x01\x03\x19\x0b\x19\x03\x02\b\x01[\x02\bj\x80\x01"
  ),
  (
    b"\xe0\n1\x90\x01\x11\x02#\x01\xf0\x00\x01\x04\"\x13\x01`\x01\x04\"Q0\x01$\x81\x01\x20\x01\x14\x11E\x11\x20A\x05\x16\x01\x06\x110\x01\x16\x11\x05\x16\x01\x06!\x20\x01\x16!\x056\x17\x01\x10\x01\x05\x06\x05\x01\x05\x06\x01\x15&\x01\x20\x01%\x061\x15!"
    b"\x20\x11\x15\x16A0\x11\b\x01E\x01@\x01\x04\x02\x01\bAP\x01\x12\x03!\x04\x03\x11\x00\x01\x10\x01\x04\x02\x03\x01&\x01\x04\x03\x11\x06\x01\x00\x01\x04\x02\x01\x05\x06\x17\x06\x01\x04\x02\x01\x05\x01\x00\x01\x14\x01\x15&A\x10\x11\x14\x01%\x01\t\x1a\t"
    b"\x01\x20!\x0b!\x19\x1a\t\x01\x20\x01+\x18\n\b*\b\x010\x01\x0b\x18\n\b\x0b8\x11\x10\x01\x0c\x01\x0b\x18\x0b\x01\x1b\b\x01\r\x0e\x01\x00\x01\x0c\x01+\x01\x00\x01\x0b\x01\r\x0e\x0c\x01\x00\x01\x0c\x0e!\x20\x01\x1e\x0c\x01\x20\x01\x0c\x1e\x0c\x01\x10"
    b"\x01\x1c\x01@A\x20\x11\x20"
  ),
  (
    b"\x80\x01i\x00\x01j\tj\t\x12\x03\x04\x1a\x04\x03\x12\t\x12\x0b\x04\x12\x04\x03\x12\t\x12\x13\x12\x04\x03\x12\t\x12\x03\x04\x0b\n\x04\x03\x12\t\x12\x03\x0c\x03\x04\x02\x04\x03\x12\t\x12\x03\x04\x02\x04\x03\x0c\x03\x12\t\x12\x03\x04\n\x0b\x04\x03\x12"
    b"\t\x12\x03\x04\x12\x13\x12\t\x12\x03\x04\x12\x04\x0b\x12\t\x12\x03\x04\x1a\x04\x03\x12\tj\tj\x01"
  ),
  (
    b"\x80\x01i\x00\x01j\t\n\x0b,\x0b\n\t\x02\x03T\x02\t\x02\\\x03\t\x03\x14\x03\"\x14\x03\t\x03\x14J\t\x03\x14J\t\x03\x14J\t\x03\x14*\x14\x03\t\x02\x14+\x14\x03\t\x02\x03T\x03\t\n\x03D\x03\x02\t\x1a3\x12\tj\x01"
  ),
  (
    b"\x06\a\x16\a\x02\x03\x0e\a\x16\t\x00\x01\x00\x05\b\t\x00\x01\x00\x05\b\a\x00\x03\x02\x03\x00\r\x02\x03\x00\a\x00\r\x00\x01\x00\t\x02\x0b\x00\x01\x00\t\x02\x0b\x00\x01\x00\t\x04\x03\x00\x03\x06\x05\x0e\x01\x04\x03\x12\t\x16\a\x16\x05\x1a\x05\x06"
  ),
)
for j in range(-1, 2, 2):
  for i in range(1, 3):
    x = screen_w//2 - j*(screen_w * i // 6)
    if i+j != 3:
      qr_mark(x - 7, screen_h - 15, 7, [(k + 2) % 3 == i + j and 255 or 0 for k in range(3)], 2)
      show()
      draw_image(images[2 + i + j], x - 8, screen_h - 64, 16, palettes[2 + i + j], itransp=0)
      show()
    draw_image(images[i+j == 3], x - 8, screen_h - 48, 16, palettes[i+j == 3], itransp= i+j!=3 and -1)
    show()

palettes = (
  (
    (0,0,0),(0,0,0),(190,232,247),(190,97,0),(231,139,18),(157,199,239),(247,247,247),(247,176,64),(149,54,0),(133,172,207),
  ),
)
images = (
  (
    b"Q\x061\x05\xc1\x02\x19\x01\t\x01\x16\x11\x02\x05\x01\t\x01\x19\x01\t\x01\x89\x01\x01\t\x11\x15\x01\x05\x01\x16\x11\x02\x05\x01\x05\x01\x15\x01\x05\x01\x85\x01\x01\x05\x11\x12!\x16\x11\x02\x05!\x12\x01\x05\xa1\x01\x05\x11\x12\x01\b\x01B\x05\x01\b\x01\x12"
    b"\x01\x05\x01\x88\x01\x01\x05\x11\x16\x01\x18Q\x18\x01\x16\x01\x05\x01\x88\x01\x01\x05\x11\x12\x01\b\x03h\x04\x01\x12\x01\x05\x01\x88\x01\x01\x05\x11\x16\x01\bc\x14\x01\x16\x01\x05\x01h\x03\b\x01\x05\x11\x16\x01\bS$\x01\x16\x01\x05\x01X\x13\b\x01\x05\x11"
    b"\x12\x01\bC$\x03\x01\x12\x01\x05\x01H#\b\x01\x05\x11\x16\x01\b3$\x13\x01\x16\x01\x05\x018#\x18\x01\x05\x11\x12\x01\x98\x01\x01\x12\x01\x05\x01\x88\x01\x01\x05\x11\x12\xb1\x01\x12\x01\x05\xa1\x01\x05\x11\x12\x01\x19\x05b\x01\x12\x01\x05\x01e\x19\x01\x05"
    b"\x11\x12\x01\x19\x05b\x01\x12\x01\x05\x01e\x19\x01\x05\x81\x04"
  ),
  (
    b"P\xb1\x02\x90\x01\x11\x12\x11\xf4\x00\x01\x12\x11%\x11`\x01\x16\x11\x04\xf7\x00\x01\x16\x01\x15!\x15\x01@\x01\x16\x01\x04\x87\x01\x01\x16\x01\x05\x11(\x11\x05\x010\x01\x16\x01\x04\x87\x01\x01\x16\x01\x05\x01H\x01\x05\x01\x20\x01\x16\x01\x03\x84\x01\x01"
    b"\x16\x01\x05\x01h\x01\x05\x01\x10\x01\x16\x01\x03\x84\x01\x01\x16\x01\x05\x01h\x01\x05\x01\x10\x01\x16\x01\x03\x84\x01\x01\x16\x01\x05\x01h\x01\x05\x01\x00\x01\x12\x01\b\x83\x01\x01\x12\x01\x05\x01h\x03\b\x01\x05\x11\x16\x01\b\x83\x01\x01\x16\x01\x05"
    b"\x01X\x13\b\x01\x05\x11\x16\x01\b\x83\x01\x01\x16\x01\x05\x01H#\b\x01\x05\x11\x12\x01\b\x83\x01\x01\x12\x01\x05\x018#\x18\x01\x05\x11\x16\x01\b\x03Q\b\x03\x01\x16\x01\x05\x01(#(\x01\x05\x11\x12\x01\b\x01&\x12\x05\x01\b\x01\x12\x01\x05\x01\x18#8\x01\x05"
    b"\x11\x12\x01\b\x01\x16\x11\x02\x05\x01\b\x01\x12\x01\x05\x01\b#(\x03\b\x01\x05\x11\x15\x01\b\x01\x061\x05\x01\b\x01\x15\x01\x05\x01\x88\x01\x01\x05\x01"
  ),
  (
    b"P\xc1\x02\x80\x01\x11\x12\x01\x03\x84\x01\x01\x12\x11%\x11P\x01\x16\x01\x14\x87\x01\x01\x16\x01\x15!\x15\x01@\x01\x16\x01\x04\x97\x01\x01\x16\x01\x05\x01(\x01\x05\x010\x01\x16\x01\x04\x97\x01\x01\x16\x01\x05\x01H\x01\x05\x01\x20\x01\x16\x01\x03\x94\x01"
    b"\x01\x16\x01\x05\x01H\x01\x05\x01\x20\x01\x12\x01\x03\x94\x01\x01\x12\x01\x05\x01H\x01\x05\x01\x20\xa1\x02\x05\x01X\x01\x05\x01\x20\x01\x89\x02\x11X\x01\x05\x010\x01\t\xe1\x01\t\x11H\x01\x05\x01@\x01\t\xe1\x01\t\x118\x01\x05\x01P\x01\t\xe1\x01\t\x11("
    b"\x01\x05\x01P\x91\x02\t\x11\x18\x01\x05\x01@\x01&\x12\x05\xc1\x01\t\x11\b\x01\x05\x01@\x01\x16\x11\x02\x05\xd1\x01\t!\x05\x01@\x01\x061\x05\xe1\x01\t\x11\x05\x01"
  ),
)
for i in range(2):
  draw_image(images[-i], screen_w//2-16, screen_h-32-16*i, 32, palettes[0], itransp=0)
show()

def qr_size(v):
  return 17 + 4*v

qr_ver = 3
qr_margin = 4
qr_size_code = qr_size(qr_ver)
qr_size_code_margin = qr_size_code + 2*qr_margin + 4
qr_zoom = max(1, min(screen_w // qr_size_code_margin, (screen_h - 128) // qr_size_code_margin))
qr_size_code_margin -= 4
qr_width = qr_size_code_margin * qr_zoom
x_qr = (screen_w - qr_width) // 2
y_qr = (screen_h - qr_width) // 2
for k in range(1, 3):
  draw_rect_z(x_qr - k*qr_zoom, y_qr - k*qr_zoom, qr_size_code_margin + 2*k, qr_size_code_margin + 2*k, k > 1 and (0, 0, 0) or (255, 255, 255), qr_zoom)
qr_margin *= qr_zoom
fill_rect(x_qr, y_qr, qr_width, qr_width, (0,64,64))

def qr_alignments(v):
  s = qr_size(v)
  positions = []
  n = v // 7 + 2
  first = 4
  positions.append(first)
  last = s - 5 - first
  step = last - ((first + last*(n - 2) + (n - 1)//2) // (n - 1) & -2)
  second = last - (n - 2) * step
  positions.extend(range(second, last + 1, step))
  return positions

def qr_frame(v, x, y, c, z=1):
  s = qr_size(v)
  l = (0, s - 7)
  for dy in l:
    for dx in l:
      if not dx or not dy:
        qr_mark(x + dx*z, y + dy*z, 7, c, z)
  for i in range(8, s-8, 2):
    fill_rect(x + i*z, y + 6*z, z, z, c)
    fill_rect(x + 6*z, y + i*z, z, z, c)
  l = qr_alignments(v)
  for dy in l:
    for dx in l:
      if not (dy < 8 and (dx < 8  or dx > s - 10) or dx < 8 and dy > s - 10):
        qr_mark(x + (dx - 0)*z, y + (dy - 0)*z, 5, c, z)

qr_frame(qr_ver, x_qr + qr_margin, y_qr + qr_margin, (255,255,255), qr_zoom)

palettes = (
  (
    (0,0,0),(255,255,255),
  ),
  (
    (0,0,0),(255,255,255),
  ),
  (
    (0,0,0),(0,0,255),
  ),
  (
    (0,0,0),(255,0,0),(255,0,255),
  ),
  (
    (0,0,0),(255,255,0),(0,255,0),(0,255,255),
  ),
)
images = (
  (
    b"\x1e\x01\x02\x03,\x05\x02\x012\x014\x014\x01\x00\x056\x01n\x030\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x20\a\x00\a\x04\x01\x1a\a\x02\x03\x02\x01\"\x01\x00\x01\x00\x05\x02\x01\x00\x01\x00\x01\x1c\x01\x00\x03\x0c\x03\x1e\x05\x02\x0b\x04\x01\x1c"
    b"\x01\n\x01\x00\x05&\x03\x00\x03\x00\x01\x02\x01$\x01\x00\x01\x02\x01\x00\x03\"\x01\x02\x0b\x00\x01\x00\x01\x1c\x03\x00\x01\x00\x01\x02\x03\x00\x01\"\x01\x00\x05\n\x01\x1c\x01\x00\x01\x00\x03\n\x05\x1c\x03\x0e\a\x1c\x01\x02\x03\b\x03$\x05\x0c\x032"
    b"\x05\x1c\x01\x00\x03\x00\x01\x06\x03\x20\x01\x00\a\x00\x0b\x1e\x03\x00\x01\x00\x01\x04\x03\x00\x01\x1e\x03\x00\x01\x02\x01\x00\a\x02"
  ),
  (
    b"\x16\x01\x00\x01*\x01\x04\x038\x01*\x01\x06\x01f\x01\n\x01n\x01\x1a\t\x02\x03\b\x01$\x01\x02\x01:\x01^\x01\x0c\x01(\x01<\x01\x00\x01\b\x01\"\x01\x0c\x01:\x01\x00\x01\x18\x01\x02\x01\x00\x01\x04\x01\x02\x01\x1e\x01\x14\x01\x1e\x016\x01\n\x018\x01"
    b"\x02\x01\x00\x01,\x03\x02\x016\x01.\x01\x06\x03*\x01\x06\x01,\x016\x016\x01\x00\x01\""
  ),
  (
    b"J\x018\x01\x00\x01\x02\x01*\x03\x04\x030\x03.\x01\x00\x01\x06\x01f\x012\x03\x00\x03\x00\x01\x18\x01\x0e\x03\x00\x03&\x01\x04\x01\x04\x01$\x01\x06\x01\x00\x03\"\x01\x02\x01\x02\x01\x04\x01,\x03\x04\x03\x1c\x01\x02\x01\x06\x01\x00\x01\x04\x01$\x01"
    b"\x06\x01\x04\x010\x03,\x01.\x05\x04\x01(\x05\x04\x01\x00\x01&\x01\x00\x03\n\x012\x01\x04\x010\x01\x00\x01\x02\x01(\x03\x02\x05*\x01\x02\x010\x01\x02\x01\x00\x01,\a\x00\x01,\x058\x01\x1e"
  ),
  (
    b"\x20\x01\x00\x01\x00\x01\x00\x01h\x01`\x01\b\x02T\x02\x04\x01`\x01\x0c\x01X\x02\x01\x00\x01\x00\x01\xcc\x01\x05\x0c\x05P\x02\x04\x02\x04\x02\x010\x05\x00\x01\x14\x01\x04\x014\t\x00\x01\x14\x05<\x05$\x02D\x02\x05\x04\x01\x04\x01\x00\x02\x01H\x01\x04"
    b"\x06L\x02\x18\x02\x01\x00\x01@\x01\x00\x01\x10\x01\b\x01<\x01\x04\t\x00\x01\x00\x05\x06\b\x014\x01l\x01\x18\x01L\x02\x04\x01\x14\x01H\x01\x02\x0c\x01\b\x01\\\x01\x04\x01\x00\x02\\\x01\b\x01\x00\x02P\x02\x10\x02`\x02l\x02`\x06p\x02\tX\x01\x04\x02<"
  ),
  (
    b"\x20\x01\x02\x01\x00\x01\x00\x01X\x02\b\x01X\x02\x03\x01\x0c\x02X\x02\x01\x04\x03\x02P\x01\x02\b\x01l\x01\xcc\x01\x05\x03\x02\b\x01\xc4\x01\a\x01\x03\x00\x014\t\x00\x01\x03\x00\x02\x00\x03L\x01\x02\x04\x02\x00\x02\x00\x03\x02x\x01D\x02\x01\x0c\x02\x00"
    b"\x02\x03L\x02\x0c\x01\x14\x02,\x01\x02\x01\x00\x02\b\x01\x02\x03\x00\x01\b\x02,\x01\x06\x01\x0c\x02\x00\x01H\x02\x04\x02\x04\x03\x04\x06\x04\x02D\x03\b\x02\x03X\x03\x01\x00\x02\x00\x02\x03\x02\x01P\x03\b\x01\b\x01\xe4\x01\x01l\x03\x00\x02h\x06X\x02t\x02"
    b"\x03X\x03\x04\x01`\x01\b\x028"
  ),
)

for k in range(len(images)):
  draw_image(images[k], x_qr + qr_margin, y_qr + qr_margin, qr_size_code, palettes[k], zoomx=qr_zoom, zoomy=qr_zoom, itransp=0)
show()
wait()

Lien : lots et ressources

Re: Concours de l'Avent 2021 "l'énigme des 3 portes" : jour

Unread postPosted: 30 Dec 2021, 14:08
by critor
Quelle rapidité, moins de 10 secondes par rapport à la publication à 14:08:08, y'en a qui ont clairement fabriqué des outils sur-mesure depuis hier. ;)
Image

D'ailleurs, ce serait sympa de les partager et éventuellement d'expliquer votre démarche. :)

Re: Concours de l'Avent 2021 "l'énigme des 3 portes" : jour

Unread postPosted: 30 Dec 2021, 14:15
by legmask
Lol ca marche tellement bien mon outils que ca fait crash wayland 1 fois sur 2, (d'ou les 4 min de hier....)

Bon en gros j'utilise PIL pour crée l'image du concours
Code: Select all
def _from_rgb(rgb):
    """translates an rgb tuple of int to a PIL friendly color code
    """
    return "#%02x%02x%02x" % tuple(rgb)

img = Image.new("RGB", (screen_w, screen_h))

# create  rectangleimage
img1 = ImageDraw.Draw(img)

def fill_rect(x, y, w, h, color):
    global img1
    x += 1
    y += 1
    img1.rectangle([(x, y), (x+w, y+h)], fill=_from_rgb(color))


Ensuite je change la palette pour changer les couleurs
Code: Select all
palettes = (
    (
        (255, 255, 255), (0, 0, 0),
    ),
    (
        (255, 255, 255), (0, 0, 0),
    ),

    (
        (0, 0, 0), (255, 255, 255),
    ),
    (
        (0, 0, 0), (255, 255, 255), (255, 255, 255),
    ),
    (
        (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0),
    ),
   
)


Pour finir sur la reconnaissance du qr code et de l'ouverture auto de la page web ...
Code: Select all
data = decode(img)
url = str(data[0].data, 'utf-8')
webbrowser.open(url)

print(url)
img.show()


CF : https://cdn.discordapp.com/attachments/ ... -00-33.mp4

Re: Concours de l'Avent 2021 "l'énigme des 3 portes" : jour

Unread postPosted: 30 Dec 2021, 14:29
by Hayleia
Perso j'ai juste ça comme code, à rajouter avant le premier try :P

Code: Select all
## CUSTOM CODE
#################################################
from PIL import Image, ImageDraw
from pyzbar.pyzbar import decode

# required
screen_w, screen_h = 320, 240

imagepath = 'image.png'
qrpath = 'qr.png'
im = Image.new('RGB', (screen_w, screen_h), 'black')
qrim = Image.new('RGB', (screen_w, screen_h), 'black')
draw = ImageDraw.Draw(im)
qrdraw = ImageDraw.Draw(qrim)

# required
def fill_rect(x,y,w,h,c):
   draw.rectangle([(x,y), (x+w-1,y+h-1)], fill=(c[0], c[1], c[2]))

   rgbindex = 1 # 2 for casio, 1 for numworks, 0 for ti
   c = (c[0], c[1], c[2]) # sometimes not a tuple
   if c == (255, 255, 255):
      c = (0, 0, 0)
   elif c == (0, 64, 64):
      c = (255, 255, 255)
   else:
      c = (255-c[rgbindex], 255-c[rgbindex], 255-c[rgbindex])
   qrdraw.rectangle([(x,y), (x+w-1,y+h-1)], fill=c)
# optional
def show():
   pass
# optional
def wait():
   global im, qrim
   im.save(imagepath, "PNG")
   qrim = qrim.crop(box=(123,83, 196, 156))
   qrim.save(qrpath, "PNG")
   print(decode(qrim)[0].data)
#################################################


Au moment de la porte Casio (où je ne savais pas qu'il allait y avoir des pixels bleus), j'avais quelque chose du même genre qui ouvrait une fenêtre pygame que je pouvais screenshotter et retoucher dans paint.net puis flasher avec mon téléphone.
Au moment de la porte TI, pareil parce que ça allait quand même relativement vite (quand paint.net était prêt avec un outil Fill qui remplit correctement) et je ne m'attendais pas à des pixels roses.
Au moment de la porte Numworks j'ai modifié ce code pour qu'il décode le qr automatiquement en ne tenant compte que des pixels pertinents. Et il y aura eu moyen de poll le flux rss et récupérer la page et le code et bref tout automatiser, sauf que tout ça c'est "long à faire et je sais déjà le faire (alors que manipulation d'image et lib de qrcode j'ai jamais utilisé) et j'ai déjà gagné quelque chose à la porte Casio donc j'ai aucune motivation à faire mieux que ce que j'ai actuellement" :P

Re: Concours de l'Avent 2021 "l'énigme des 3 portes" : jour

Unread postPosted: 30 Dec 2021, 15:10
by Pavel
J'ai remarqué que tous les messages du forum ont une numérotation continue. Il devrait donc être possible de préparer un script qui démarre peu avant 14h00 et essaie d'accéder toutes les secondes au message du forum avec le numéro du dernier message du forum plus un.

Ensuite, j'ai écrit un script qui télécharge le message en utilisant requests, extrait le code en utilisant BeautifulSoup, dessine tout et extrait la partie de l'image avec le code QR en utilisant PIL, convertit les couleurs des pixels en utilisant NumPy, décode le code QR en utilisant zbar et enfin télécharge la page secrète.

J'ai démarré ce script quelques secondes avant 14h00 avec la commande suivante et il a fait tout le travail:
Code: Select all
python3 script.py https://tiplanet.org/forum/viewtopic.php?p=265944

Voici le code Python du script:
Code: Select all
import sys
import time
import uuid
import zbar
import requests
import numpy as np

from bs4 import BeautifulSoup
from PIL import Image, ImageDraw

url = sys.argv[1]

# download code
while True:
  response = requests.get(url)
  soup = BeautifulSoup(response.content, "html.parser")
  part = soup.find(class_="python")
  if part: break
  time.sleep(1)

code = part.get_text(separator="\n").replace(u"\xa0", u" ")

print(code)

# prepare for drawing with PIL
screen_w, screen_h = 320, 222
screen = Image.new("RGB", (screen_w, screen_h))
draw = ImageDraw.Draw(screen)

def fill_rect(x, y, w, h, c):
  draw.rectangle([x, y, x + w - 1, y + h - 1], fill=tuple(c))

# run code
exec(code)

# extract QR code
x1 = x_qr + qr_margin
y1 = y_qr + qr_margin
x2 = x1 + qr_size_code * qr_zoom
y2 = y1 + qr_size_code * qr_zoom

crop = screen.crop((x1, y1, x2, y2))

# replace green with black and everything else with white
array = np.array(crop)
for row in array:
  for e in row:
    if e[1] == 255:
      e[:] = [0, 0, 0]
    else:
      e[:] = [255, 255, 255]
image = Image.fromarray(array).convert(mode="L")

# decode QR code
width, height = image.size
zimg = zbar.Image(width, height, "Y800", image.tobytes())
scanner = zbar.ImageScanner()
scanner.parse_config("enable")
result = scanner.scan(zimg)

# download secret page
id = uuid.uuid4().hex
if result != 0:
  for symbol in zimg:
    pass
  del(zimg)
  data = symbol.data
  print(data)
  response = requests.get(data)
  print(response.content)
  with open("qr-" + id + ".html", "w") as fp:
    fp.write(response.content.decode("utf-8"))

# save QR code
with open("qr-" + id + ".png", "wb") as fp:
  image.save(fp)

Re: Concours de l'Avent 2021 "l'énigme des 3 portes" : jour

Unread postPosted: 30 Dec 2021, 15:12
by critor
Merci beaucoup.

Et donc oui ? Tu as un code à nous communiquer pour aujourd'hui ? ;)

Re: Concours de l'Avent 2021 "l'énigme des 3 portes" : jour

Unread postPosted: 30 Dec 2021, 15:24
by Pavel
critor wrote:Et donc oui ? Tu as un code à nous communiquer pour aujourd'hui ? ;)


Oui, j'ai un code. Je viens de l'envoyer par e-mail.

Re: Concours de l'Avent 2021 "l'énigme des 3 portes" : jour

Unread postPosted: 30 Dec 2021, 15:28
by critor
Merci. Et c'était donc Pavel le mystérieux 2ème arrivé :
Image

Donc félicitations, c'est à toi de commencer à choisir : ;)
viewtopic.php?f=49&t=25332&p=265466#p265466

Re: Concours de l'Avent 2021 "l'énigme des 3 portes" : jour

Unread postPosted: 30 Dec 2021, 15:40
by critor
Félicitations à Amiga68000 qui vient d'arriver ! :bj:
Image

Re: Concours de l'Avent 2021 "l'énigme des 3 portes" : jour

Unread postPosted: 30 Dec 2021, 15:57
by Pavel
critor wrote:Donc félicitations, c'est à toi de commencer à choisir : ;)
viewtopic.php?f=49&t=25332&p=265466#p265466


Merci!

J'ai récemment eu quelques idées sur le déblocage des calculatrices NumWorks et j'aimerais essayer d'en débloquer une à l'aide de micro:bit. J'aimerais donc profiter de ce concours pour obtenir une calculatrice NumWorks pour tester mes idées.

Voici ce que je voudrais choisir:
  • calculatrice NumWorks N0110
  • sac NumWorks avec beaucoup de formules derrière la calculatrice et NumWorks en gros caractères (image)
  • pas de poster
  • autocollant TI-Planet sans VIP

Merci beaucoup encore une fois d'avoir organisé ce concours!