THCON 2021 – ZZT Post Challengem

Le week-end du 12-13 juin a eu lieu le CTF (Capture The Flag) de la Toulouse Hacking Convention. J’y étais en tant que participant à essayer de résoudre les challenges, et en tant que contributeur qui en a créé. Normalement, on n’est pas censé faire les deux. Chut, faut pas le dire.

Ma participation

Tout se passait à distance, dans nos chez-nous respectifs. Niveau ambiance et mise en situation, on est loin du NorthSec (qui met tout de même la barre assez haute, ce que je vous avais narré l’année dernière).

Les challenges de la THCON sont simplement listés sur un site, créé avec l’outil générique CTFd. Je ne me suis donc pas trop senti transporté dans un autre monde, mais je me suis quand même beaucoup amusé.

J’ai réussi trois challenges, dans trois catégories différentes : programmation, app-script, cryptographie. C’est peu, mais ça me suffit amplement. Je suis un peu déçu d’avoir passé plusieurs heures sur un challenge d’intro tout simple (one-time pad). Il fallait faire des XOR, alors que je tentais des additions/soustractions dans tous les sens. Duboulet !!

Ou-exclusif, le shérif de l’espace. J’ai déjà fait cette blague y’a 10 ans. Je m’en lasse pas.

Ma contribution

Ayant un ancien Collègue dans l’orga de la THCON, j’en ai profité pour lui proposer un challenge de mon crû. Après de longs et passionnants échanges ainsi que moults tests, nous nous sommes mis d’accord pour le splitter en deux, du fait de son volume qui s’est révélé assez conséquent.

Je vous propose ici la version non-splittée, que je préfère. Faut s’accrocher pour le vaincre, mais vous n’avez pas les contraintes de temps de la THCON.

Il s’agit d’un unique fichier à télécharger : THCON21.ZZT.

Voici la description, comportant des indices pour vous aider à trouver quoi faire avec :

TUR-ROX

A journey in Turing-approxi-complete video games.

« ZZT » ? What is that strange file extension ? It may be something old. If it’s old, there is a MUSEUM about it. Whatever it is, I suppose it has nothing to do with Catherine ZETA-Jones.

Comme je suis gentil, je vous pré-mâche le début. Il s’agit d’une map du jeu vidéo « ZZT ». Pour l’installer, vous devez suivre cette doc (L’outil « KevEdit » n’est pas indispensable).

Si vous voulez juste y jouer pour voir un peu à quoi ça ressemble, il y a une version en ligne dans le « Museum Of ZZT » : https://museumofzzt.com/file/c/THCON21.ZIP
Rien à installer ni à copier. Vous cliquez sur le lien puis vous cliquez sur « Play online » dans le menu en haut.

Le but de ce jeu est de trouver un « flag », c’est à dire un code secret, ayant le format THCon21{-------------}. Les tirets correspondent à des caractères alphanumériques.

C’est du hacking. Ça veut dire que si vous vous contentez de jouer, vous ne trouverez pas grand-chose. Il faut décortiquer le jeu, chercher comment il fonctionne, le bidouiller, ajouter des éléments de débuggage, extraire des informations, le passer à la moulinette, etc.

Bon triturage de cerveau !

Quite unrelated pic, screenshot d’un outil bien utile pour les CTFs.

Des signes d’intérêt de la part des THConistes

J’ai eu quelques bons retours sur le Discord de la THCon, aussi bien pendant la compétition que après. Apparemment, le format est assez original. Quelques personnes ont rédigé des write-ups (ça veut dire « des solutions »), et y ont inséré un avis très positif.

Mon ego est fortement flatté de voir que des gens se sont interessés à ma création, au point de rédiger des textes à ce sujet. Je suis tout gargarisé !

Voici les liens vers lesdits write-ups. ATTENTION, Ne cliquez pas dessus si vous voulez trouver le flag par vous-même. Ce sont des énormes spoilers !!!

Vous vous en doutez, le véritable but de cette contribution n’était pas le challenge en lui-même, mais la petite publicité pour Squarity embarquée dedans. Vous la trouverez facilement. A-t-elle eu un impact ? Aucun nouvel adepte n’est venu se rallier au Discord de Squarity. C’est pas grave.

Des signes de non-intérêt de la part des ZZTistes

Les personnes qui continuent d’utiliser ZZT pour créer des jeux et autres œuvres se retrouvent dans le « Museum », ainsi que sur (encore) un serveur Discord. Vous vous en doutez, le véritable but était de faire découvrir Squarity à cette communauté. Les deux moteurs de jeux diffèrent sur beaucoup de points, mais ont un but commun : favoriser la création vidéoludique amatrice.

Mais vous ne pouvez pas débarquer en gueulant : « Regardez mon projeeeeeet ! Il est gèèèniaaaâââl ! Venez vous féoder à ma cause ! Travaillez pour moi et faites-moi de la pub en échange de ma reconnaissance faciale éternelle gratuite ! ».

Lorsqu’on veut rallier à soi-même les membres d’une communauté existante, il vaut mieux commencer par se rallier soi-même à cette communauté.

Alors je préparais le terrain. Je m’étais inscrit sur le Discord de ZZT il y a de ça plusieurs mois. Je me suis présenté, j’ai lu plein de messages sans trop intervenir. Par certains aspects, ce Discord est un « safe space ». Certaines personnes font part de leur problèmes personnels et sont inconditionnellement soutenues par d’autres personnes. C’est cohérent avec le fait que les premiers créateurtrices de jeux ZZT étaient des ados pas toujours bien dans leur peau. The « children of the glow ». Mais un safe space, ça ne s’approche pas comme ça.

Cherchez vous-même d’où vient l’expression « children of the glow »

Pendant que je créais le challenge, je parlais un peu à tous ces gens, leur disais que je trouvais ZZT cool et chouettement nostalgique, et que je me sentais bien à coder mon truc. Je mettais des petits smileys. Je testais un mini-jeu et donnais un mini-avis. Lorsque je leur parlais de ma future création, un début d’intérêt semblait se manifester. La mythique Anna Anthropy m’adressa même un ou deux messages.

Mon challenge contient des easter eggs qui durent paraître étrange aux THCONistes, et qui étaient spécialement destinés aux ZZTistes :

  • Un personnage qui raconte une histoire bizarre et totalement azimutée, le genre de propos que pourrait sortir un ado réfugié dans son petit monde. Je vous laisse le lire par vous-même, il est facile à trouver, dans le premier board.
  • Ce personnage dit aussi « Everything is familiar and everything is different ». Une phrase que l’on retrouve plusieurs fois dans le livre écrit par Anna Anthropy.
  • Le board principal contient le texte « Lawless Invisible », une référence à Kudzu, un jeu connu par bien des ZZTistes. Dans ce jeu vous rencontrez (ou pas) des personnes désignées comme « Unlawful Invisible ». L’expression est restée.
  • Le challenge contient un programme Puzzlescript permettant d’extraire un mini-jeu, dans lequel vous dirigez une tête blanche sur fond bleu, comme le « Char-1 » de ZZT, et vous devez récupérer des « Venus Symbol » rose.
Coïncidence ? Je crois pas…

À part le dernier, tous ces easter egg sont très accessibles. Il suffit de jouer au jeu. Même si vous ne résolvez pas le challenge et que vous ne comprenez rien à ce qu’il faut faire, vous tomberez dessus.

Deux jours après la THCON, je viens sur le Discord de ZZT et j’apporte mon petit jeu en cadeau. Une personne m’informe qu’un type est venu durant le week-end pour demander des indices sur le challenge. J’ai vu leur conversation, elle était tout à fait courtoise mais n’a duré que quelques messages.

Et c’est tout.

Alors voilà. Je ne m’attendais pas à un débarquement massif de ZZTistes sur mon Discord de Squarity, ni à ce que toutes ces personnes s’arrachent les cheveux sur le challenge pour tenter de le résoudre à tout prix, ni à ce que mon esprit créatif soit porté aux nues et que Tim Sweeney vienne en personne me remettre la Croix Nationale du Venus Symbol d’Honneur. Mais je m’attendais à avoir au moins une petite réaction de la part d’au moins une personne qui aurait testé le jeu juste 2 minutes.

Mon cadeau n’était pas suffisant. Tant pis. Je reviendrais plus tard si j’en ai d’autres. Pour l’instant, je laisse tomber la communauté ZZT et je me concentre sur Squarity. Il y a déjà quelques personnes qui me sont féodées (même si ça veut rien dire), je dois continuer de leur apporter régulièrement des nouveautés car je ne veux pas les décevoir.

Voilà un cadeau !

C’était quand même chouette de créer ce challenge

J’ai passé un certain temps à le réaliser, à galérer avec l’éditeur de niveau de ZZT et son ergonomie discutable des années 90, à dessiner les boards, à étudier le langage ZZT-OOP, à élaborer les énigmes, à écrire les scripts de chacun des petits objets programmables, à intégrer des gros tas de texte à l’aide de bouts de scripts python, etc.

Je me suis senti bien. Une fois de plus, ma nostalgie de création adolescente est revenue. Une nuit, il était 2 heures du matin, j’écrivais pour la 5ème fois la ligne de code « :lblMulti » , la musique de Worakls passait dans mon casque audio. C’est pas ce que j’écoute d’habitude, mais là ça collait avec ce retour en adolescence. J’étais bien. Libre. Je pouvais sentir les bulles de photons telluriques glisser le long de mes neurones.

Est-ce que c’est ma crise de la quarantaine ? Est-ce que ZZT est un retour aux sources pour moi ? Ce serait d’autant plus drôle que ce n’est pas une de mes sources. Je ne connaissais pas ZZT lorsque j’étais adolescent.

Je vais me remettre tranquillement à Squarity. Mais je proposerais également ce challenge au site root-me.org. Je ne sais pas du tout si ce sera accepté. Il y a des tas de raisons que ça ne le soit pas : la présence d’une pub pour un projet personnel, le fait que ce challenge ait déjà été utilisé, que des write-ups circulent, etc. On verra bien.

Si ça passe dans root-me, il est fort possible que je me lance dans un autre challenge du même type pour la prochaine THCON. Spoiler alert, ce sera peut-être avec cet outil.

Et puisqu’on parlait de Venus Symbol, voici Venus :

NorthSec 2020

Avec des collègues de ConcreteWorld.🌍 (la boîte où je bosse), on a participé au CTF du NorthSec, c’est une compétition avec des truck à hacker.

Normalement, il a lieu sur place, au Québec, mais cette année, avec cette histoire de virus, ils l’ont fait en ligne. Je ne vais rien dire de plus à propos du Covid, car je souhaite garder ce blog le plus possible éloigné de l’actualité, pour qu’il reste une sorte de lieu magique dans l’espace éthéré.

Le NorthSec, c’était bien cool ! On a eu 31 points au total, ce qui nous a classé 39ème sur 79. Certes, je n’ai personnellement fait gagner que 2 points, mais mes collègues m’aiment bien quand même. (Je ne suis pas encore assez entrainé à ce genre de compétition).

Je me suis gardé quelques challenges offline sous le coude, que j’essayerais de réussir à tête reposé.

L’environnement et le contexte de présentation des challenges était vraiment bien chiadé. Je vous explique.

Ambiance années 90

Tout se passe dans une université fictive intitulé « Severity High School ».

Les challenges sont disponibles sur le forum de cette université, un par sujet de forum. Même si parfois, certains sujets racontent des trucs qui n’ont rien à voir.

Le style graphique du forum, avec sa magnifique texture de brique en fond, est d’une mocheté assumée.

Qui dit challenge de hacking dit site web avec des vulnérabilités à exploiter. En général, ces sites n’ont aucune mise en forme. C’est une convention, et même une fierté. On se concentre sur le fonctionnement interne du site et les failles qui s’y trouvent. Il faut éviter d’être pollué par le rendu visuel.

De toutes façons, les hackers savent rarement designer un site. C’est un autre métier. Allez sur root-me.org et essayez les challenges de type « Web-server » et « Web-client », vous verrez.

Pour le NorthSec, c’est un autre choix qui a été fait. Le design des sites et du forum a été travaillé. Travaillé pour être comme dans les années 90.

C’est pas les premiers à faire ça, mais c’est toujours amusant. On pourrait aussi y voir une critique du système éducatif et du secteur public en général, qui a la réputation d’avoir systématiquement 10 trains de retard concernant internet et l’informatique. Pour eux, des designs de ce genre, ça ne les choquerait pas.

Y’avait pas ça au NorthSec, mais vous voyez l’idée.

Ambiance dystopie

Les messages fictifs échangés sur le forum donnent l’impression que les élèves et les professeurs font tous n’importe quoi et passent leur temps à se pourrir entre eux.

  • des données comportementales sont stockées sur eux, ainsi que des données personnelles complètement WTF (proba d’échec, index social, score consommateur, couleur des yeux, ton de la voix, humidité, …)
  • ces mêmes données révèlent que toute l’école est corrompue et que les notes sont proportionnelles aux donations effectuées par les parents,
  • les élèves se volent leurs devoirs entre eux et modifient les notes (pas forcément les leurs) sur les serveurs,
  • les professeurs développent eux-mêmes leurs applications de validation des examens, qui sont bien évidemment de véritables passoires,
  • les élèves, quand ils ne sont pas occupés à tricher, passent leur temps à organiser des « parties » et à se préparer pour « le prom » (le bal de fin d’année).

Ça donne une impression de micro-société totalement dystopique, c’est très étrange et très amusant.

Il y a deux ans, j’étais allé au CTF de la Toulouse Hacking Convention. Le contexte donne forcément l’impression d’être dans un autre monde durant une nuit : plein de geeks dans une pièce en train d’essayer de hacker des trucs. Mais les challenges y étaient présentés de manière brute, sans cohérence entre eux.

L’ambiance et la contextualisation des challenges du NorthSec (même si on n’est pas physiquement sur place) m’a transporté dans un autre monde pendant tout un week-end, et ça fait du bien. Et le fait que c’était un monde dystopique était encore plus rigolo.

C’est à ça que servent les vacances, les voyages, les festivals, jouer dans une pièce de théâtre, etc. : jouer à être quelqu’un d’autre durant une parenthèse de temps plus ou moins longue.

J’espère avoir l’occasion de participer à d’autres trucs comme ça. À la prochaine !

Je vous laisse avec Busty Dusty, une nana des années 90.

Rien pour ce mois-ci !

Amis feignassous, amies feignassottes, bonjour.

J’ai rien foutu pour le blog ce mois-ci. Donc pas d’article digne de ce nom. À part ce présent article pour dire que y’aura pas d’article.

Mais j’ai une excuse, j’ai réalisé une petite vidéo pour l’UTBM, la prestigieuse et grandiose école dans laquelle j’ai fait mes études.

Cette vidéo a été réalisé dans le cadre du montage « vidéo boulette », à l’occasion des 20 ans de l’UTBM. Plus de détail par ici : https://www.facebook.com/GalaAeUTBM/posts/2773072979403412

Je ne me suis pas contenté de faire une vidéo de moi qui chope une boulette de papier et qui la déplie. J’y ai intégré une jolie animation (codée en python, évidemment).

Le mois prochain, je ferais un article sur ce sujet, en y intégrant ladite vidéo, bien entendu. Et j’y ajouterais des explications sur les petits détails incorporés dedans.

Je n’en dis pas plus pour l’instant, car je réserve la primeur de cette vidéo pour la gala de l’UTBM.

Je ne serais pas présent à ce gala, c’est bien dommage et j’en suis désolé, mais c’est géographiquement un peu loin pour moi, et j’ai déjà du mal à trouver du temps pour faire les trucs que je dois faire.

Et si vous êtes de l’UTBM, n’hésitez pas à contribuer en faisant une vidéo de votre cru. Y’a juste que vous devrez faire ça à l’arrache, car y’a plus que aujourd’hui 31 octobre pour l’envoyer.

À le mois prochain tout le monde !

À défaut de montrer du texte sur une boulette de papier, Jade Parker montre son livre.

La cryogénisation du blog Sam et Max

Il y a quelques années de ça, un chien et un lapin se rencontrèrent.

− Bonjour monsieur le chien.

− Bonjour monsieur le lapin.

− …

− …

− …

− …

− …

− …

− Mais, que nous arrive-t-il ? Je sens comme un arc de tension sexuelle s’établir entre nous deux.

− Moi aussi. Cela va être difficile de le contrôler.

− Pourquoi ne pas céder à cet amour qui s’offre à nous ?

− Je n’ai rien contre les homosexuels, mais je n’en fais pas partie.

− Qui parle d’homosexualité ? Vous êtes un chien et je suis un lapin. Il ne s’agit rien de plus que de zoophilie.

− Comme vous avez raison. Faisons l’amour !

(Quelques mois plus tard…)

− Je suis enceint !

− Moi aussi !

− Quel bonheur ! Nous mettrons au monde toute une marmaillerie de petits chien-lapins !

(Encore quelques années plus tard…)

− Qu’allons nous faire de tous ces chien-lapins et autres lapin-chiens ?

− Il est impossible pour nous de nous occuper d’un aussi grand nombre d’enfants.

− Achetons un congélateur et cryogénisons-les.

− Sage décision. Malheureusement, les techniques de réveil après cryogénisation ne sont pas encore aboutie. Nous risquons de tuer ces pauvres petites créatures lorsque leurs futurs parents adoptifs voudront les réanimer.

− J’ai une idée ! Il nous suffit de les cloner à plusieurs reprises et de cryogéniser ces clones dans plusieurs congélateurs. Nous pourrons ainsi tenter des réanimations au fur et à mesure que la technologie évoluera.

C’est ce qui fut fait.

Archi-archivisme

Le blog http://sametmax.com/ existe toujours, mais aucun nouvel article ne sera ajouté. Les commentaires ont été réouverts momentanément. Lorsqu’ils seront fermés, le blog ne changera plus.

Il n’y a aucune garantie future qu’il restera en ligne. C’est insupportable ces gens qui ne se sentent coupables de rien sous prétexte qu’ils mettent leur travail à disposition librement et gratuitement. Encore un coup des trotskistes.

Ces messieurs Sam et Max ont expliqué comment récupérer tout le contenu de leur blog. Je n’ai pas de moyen de lancer des commandes « wget » de chez moi (désolé, Windows, tout ça). Je pourrais le faire au Travail, mais ça me gêne de mobiliser du CPU, de la bande passante et de la place disque en quantité indéterminée pour quelque chose que je ne peux pas trop justifier.

Alors j’ai fait le gros bourrin avec l’utilitaire WinHTTrack. Ça a mouliné sa mère pendant des heures. Je ne suis pas sûr d’avoir tout récupéré. Certains articles semblent avoir échappé au moissonage, car leur titre est trop long (en particulier toute la partie sur la programmation orientée objet). Je les ai récupérés manuellement, en espérant que d’autres n’ont pas planté de la même manière.

Puis j’ai tout compressé et tout balancé dans dropbox. Vous pouvez télécharger un énorme fichier .zip avec tout dedans. C’est cadeau c’est bonheur.

Il y a aussi des autoblogs, vous permettant de consulter directement les articles sans vous embêter à tout télécharger en local. Mais ils ne sont pas forcément à jour, et ont le même niveau de non-garantie de continuité que le blog de Sam&Max lui-même.

Dropbox pourrait également décider de virer ma sauvegarde.

Internet n’est pas forcément durable.

Ni vos ordinateurs. Ni le réseau de distribution d’électricité. Ni vous-même. Tout fout le camp.

C’est pour ça que lorsqu’on tient à quelque chose, il faut en faire le plus de sauvegardes décentralisées possibles, dans le plus d’endroits différents. Ce dropbox est ma toute petite contribution à cela.

Le passage nostaltriste

Le blog de Sam&Max s’est offert à mon temps de cerveau, il y a quelques années de cela, par le biais de roro, un ami bizarre de l’internet. Je le salue au passage, s’il me lit encore.

J’y ai lu tous les articles paru depuis que je l’ai découvert. Je me suis promis de me faire une rétrospective générale des anciens non encore lus.

Certains de ces articles ont augmenté ma culture générale informatique et ma veille technologique.

L’un en particulier m’a directement fait économiser plusieurs heures de travail de mon vrai Travail. Il s’agissait de l’explication d’un concept générique : les itérateurs avec yield . Et en plus ça m’a même pas servi pour du python, mais du C#.

Je me suis fendu de quelques petits commentaires chez eux, plus ou moins pertinents, plus ou moins utiles.

Je leur ai proposé quelques articles, qu’ils ont gentiment accepté de publier. En voici la liste.

J’avais l’idée de deux autres sujets qui auraient pu être intéressants :

– comment créer un plug-in Sublime Text.

que se passe-t-il en interne quand on définit une variable en python ? (https ://nedbatchelder.com/text/names.html)

Je les écrirais peut-être ici, dans mon blog à moi. C’est dommage. L’audience y est beaucoup plus faible, je ne pourrais donc pas en retirer tout le flattage d’ego que j’aurais pu en espérer.

Ça me fait quand même un petit quelque chose de voir le blog de Sam&Max s’arrêter. Un peu le même effet que la fin du magazine 42, même si ce n’est pas du tout le même genre de création. Snif snif beuheu-beuheu ouin.

Finalement, peut-être que cette nouvelle m’apporte plus de réconfort égoïste que de tristesse. Tous ces « créateurs de contenus web », qui parviennent à obtenir plus « d’audience » et « d’attention » que moi, finissent par abandonner et passer à autre choses. Moi je suis toujours là, depuis plus de 10 ans, sur mon blog pourri avec à peine 30 visites non-uniques par jour, à publier un article par mois.

Je m’accrocherai autant que je le pourrais, comme un vieux chewing-gum dégueulasse à la chlorophylle oublié au fond d’une poche.

Sur ce, voici une dernière image de lapine pour conclure.

Jessica Rabbit !

aboard !! v1.1.0

Pouet !

Petit article rapide juste pour dire que j’ai démarré la création de aboard , une lib en python permettant de gérer des quadrillages 2D.

Ça peut servir comme helper pour des petits jeux genre démineur, soko-ban, etc. Et surtout c’est très utile dans le site codingame, pour des challenges, des clashes of code, des bots à programmer, …

J’y ai ajouté une version stand-alone, sous forme d’un gros fichier unique à copier-coller directement dans l’IDE de codingame.

Petit exemple très rapide :

from aboard import Board
board = Board(9, 6)
board[3, 2].data = 'Z'
for tile in board[2, :]: tile.data = '|'
for tile in board[3:, 1]: tile.data = '='
for tile in board[3:, 4:6]: tile.data = '#'
for tile in board.get_by_propagation((6, 3)):
    tile.data = '/'
print(board.render())

..|......
..|======
..|Z/////
..|//////
..|######
..|######

Voilà. Et vous avez la doc détaillée sur readthedocs.io.

Ça s’appelle aboard, car ça fait : « a board », ce qui signifie « un plateau » (de jeu de plateau). Et « aboard » signifie également « à l’abordage ». Lolilol, n’est-il pas ? La version actuelle est 1.1.0, car je voulais me donner un air classe. Il n’y a pas eu de précédentes versions, en vrai.

C’est une lib que je vais essayer de faire connaître, en résolvant des challenges et en codant des bots dans codingame. Et je compte également m’en servir pour mon prochain gros projet.

J’ai toujours un « prochain gros projet », qui change de temps en temps. Je ne sais pas jusqu’où j’irais dans sa réalisation. Déjà, si j’arrive à le démarrer, ce sera une jolie victoire. J’ai même pas encore fini de racler mes fonds de tiroir de vieux code, alors que ça fait plusieurs années que je suis sur ce pré-projet, de manière intermittente.

Ce « prochain gros projet » hypothétique sera fortement inspiré de PuzzleScript. Je vous en parlerai quand je l’aurais commencé. C’est à dire peut-être jamais. On verra.

Voici un quadrillage 2D, accompagné d’une surface 3D.

Oh, et dans une petite semaine, je reparticipe à la battle dev. J’espère pouvoir me placer à nouveau suffisamment haut dans le classement pour que mon nom apparaisse.

! teuoP

 

Eleet Codeurz !!

Dans mon article précédent, je me la suis pété parce que je suis un super blogueur.

Maintenant, je me la pète en tant que super-codeur.

CodinGame

J’ai récemment découvert le site Coding Game, qui me plait beaucoup. Le concept de coder un bot de jeu qui va s’opposer à d’autres bots est très amusant. Et j’avoue être devenu un petit peu dépendant aux Clash of Code. Ce sont des challenges d’un quart d’heure contre d’autres gens, dans lesquels il faut écrire un petit algo assez simple. Il y a trois modes de compétition : être le plus rapide, écrire le code le plus court possible, ou être le plus rapide mais en déduisant ce qu’il faut faire uniquement à partir des tests d’exemples.

On peut également proposer ses challenges et ses puzzles. Pour l’instant, j’ai contribué à la hauteur de deux Clashs, qui ont été acceptés. Et j’ai encore d’autres idées. Youwouwou.

Je suis à une position respectable dans le classement global. Quant au classement spécifique du Clash of Code, je me promène glorieusement parmi les 100 (voire les 50) premiers. Sur un total mondial de 100 000 personnes. Brag ! Brag !

47ème

Galvanisé par ces honneurs, et alors que je me prenais une dose de CommitStrip, je tombe sur un concours de code organisé par un machin quelconque. Je m’inscrit, participe, et après 2 heures de chauffage de neurones, j’obtiens la classieuse place de 47ème.

Vous pouvez voir les résultats ici (https:// www. blogdumoderateur.com/resultats-battledev-novembre-2018/).

Je trouve un peu étrange qu’il y ait plusieurs participants nommés « mon_pseudo_xxx ». Ça ressemble à quelqu’un qui a triché et qui s’est inscrit plusieurs fois pour avoir plusieurs cadeaux. Mais d’un autre côté, tricher de cette manière en utilisant des pseudos semblables serait particulièrement stupide. Bon, osef.

Il y avait des cadeaux pour les 45 premiers. Pas de bol pour moi. Mais je n’aurais pas su quoi en faire. Je veux pas aller à Las Vegas, et si je gagne une console de jeux, je vais encore me faire chronophager. 47ème, ça me va très bien.

Pas tout à fait un contest de code, mais un contest quand même.

Par contre, je me demande si y’aurait pas moyen de tricher un peu à leurs compétitions.

Lorsqu’on envoie son code, celui-ci est testé sur des données d’entrées, que l’on peut récupérer en écrivant dans la sortie (stderr).

Bien entendu, on n’a pas accès aux résultats attendus, afin d’éviter des solutions stupides codées en dur, du style :

data_in = input()
solutions = {
    "data_in_1": "solution_1",
    "data_in_2": "solution_2",
    "data_in_3": "solution_3",
    ...
}
print(solutions[data_in])

Les deux derniers exercices du concours peuvent être résolus avec une solution bourrine, codée rapidement mais nécessitant beaucoup de temps d’exécution. Le système ne l’accepte pas, car il y a une limite. Si le code proposé tourne pendant plus de quelques secondes sans renvoyer de solution, il est arrêté automatiquement.

Or donc, il doit être possible de coder à la porcasse la solution bourrine, de la faire tourner avec les données d’entrées sur son ordinateur à soi (ou sur un super-calculateur dopé à la testostérone), et de récupérer les solutions attendues. Il ne resterait plus qu’à soumettre une solution moche en dur contenant ces solutions, hop ni vu ni connu j’t’embrouille.

Je ne sais pas si ça marche, je n’ai pas eu l’occasion de tester. Pour l’avant-dernier exercice, j’avais trouvé la solution élégante. Pour le dernier, j’ai eu du mal, et le concours était déjà clôturé depuis une demi-heure lorsque j’ai trouvé la solution bourrine. Pas assez bon pour tricher !

Sur CodinGame, ce genre d’astuce idiote ne marche pas, car les Clash of Code ont deux types de tests :

1) Ceux montrés à l’utilisateur. On connait les données d’entrée et les données de sortie. Ils sont joués lorsqu’on envoie son code pour test, avant l’envoi final. Le résultat est clairement affiché.

2) Les valideurs. On ne connait ni les entrées ni les sorties. Ils sont joués uniquement lors de l’envoi final du code. Ce sont eux qui comptent. Ça permet d’éviter complètement les solutions codées en dur ou précalculées bourrinement.

Quand le Clash est bien construit, chaque valideur correspond à un test. C’est à dire qu’un code « honnête » qui échoue à un test devrait échouer au valideur correspondant. Un code « malhonnête » réussit tous les tests, mais échoue à tous les valideurs.

Dans la réalité, ce n’est pas toujours le cas. Pour certains Clash mal fichus, on peut se retrouver avec des codes honnêtes passant tous les tests mais échouant à un ou deux valideurs. En général ça énerve. C’est le jeu ma pauvre Lucette.

Il faut trouver l’algorithme permettant de trouver la solution pour pouvoir tricher et proposer un code fournissant directement la solution.

Prout !!

Après me l’être pété avec mon blog et mes talents de codeur, je vais maintenant me la péter avec mes prouts (ha ha ha !) (en fait non, j’ai pas l’intention de me la péter avec ça).

Depuis plusieurs années, dans toutes les entreprises dans lesquelles je travaille, je tente de faire des vœux de non-flatulence. Je ne les tiens jamais. Ni les vœux, ni les prouts.

Je suis heureux et fier de vous annoncer que j’affiche actuellement un uptime de non-flatulence boîtale de plusieurs semaines ! Ça a l’air stupide et puéril, dit comme ça, mais le caca, le pipi et les prouts sont pour moi des notions fondamentales constituant une base de mon existence. C’est important pour moi et je ne me pensais pas forcément capable de réussir cet exploit d’abstinence gazeuse. Je le dois à mes voisines d’open-space, qui sont (il faut bien le dire), des personnes un peu tatillonnes concernant les conventions de bienséance.

Malheureusement, cet exploit m’a fait découvrir une caractéristique inconnue de mon corps, qui me plonge dans d’incommensurables tourments.

Lorsque je me retiens, les gaz de prouts se répartissent dans mes tuyaux internes, dérèglant mon fonctionnement biologique et provoquant des bruits incongrus. Si c’était juste des gargouillis de ventre, ce ne serait pas gênant, voire plutôt rigolo. Mais c’est pas le cas. Mon corps saturé en pétogaz émet des sortes de « ♪♫ ppûûûûûûûû », qui semblent provenir du bas (c’est à dire des intestins proche de l’anus). Je fais des bruits de prouts sifflants alors que je ne proutte pas ! Et vu que ce ne sont pas des prouts, je ne peux pas les retenir !

J’ignore si les collègues autour de moi entendent ces bruits. J’ignore s’ils comprennent ce que c’est ou s’ils croient que ce sont des vrais prouts. Je n’ose rien dire. Je plonge dans la folie des conventions sociales. J’ai peur.

La solution toute simple aurait été d’aller aux toilettes à la moindre petite envie, afin d’éradiquer toute particule de gaz proutal qui aurait tenté de squatter mon corps. Sauf que ça ne fonctionne pas. Pour une raison que je ne m’explique pas, l’envie de prout s’évapore (ha ha) pendant que j’effectue le trajet depuis mon burlingue-open-space jusqu’aux toilettes.

C’est peut-être le fait de se lever et de marcher, qui fait bouger mes organes de sorte que les gazoprouts se réorganisent et se replient stratégiquement pour ne pas être éjecté au moment où je serais sur le trône. Je pousse je pousse et rien ne sort. Ou alors c’est peut-être le changement de température, qui modifie le taux de concentration des proutogazs et déclenche une reconfiguration de l’entropie. Mystère. Et dès que je reviens à mon burlingue, l’envie se ressent à nouveau.

Si quelqu’un a une solution pour ça, j’achète. Je suis prêt à tester n’importe quoi : des mouvements de yoga prouto-déclencheurs, des massages d’anus, une machine sonique temporelle qui annule rétroactivement tous les sons d’une zone donnée dans une période donnée, … Je prends tout.

Merci d’avance.

Vieille soirée du nouvel an chez Gloubiboulga

Les fonds de tiroir de mes anciens écrits continuent d’être raclé à en faire des copeaux, avec cet article provenant d’un résumé de soirée datant de plus de 10 ans. Pas de raison précise pour laquelle j’irais sortir ça maintenant plutôt que pas-maintenant.

Ça s’est passé dans la société Gloubiboulga, dont j’ai déjà pondu un article relatant un week-end à Barcelone.

Dans le but de rester cohérent avec mes récents récits corporate, quitte à être pas-cohérent avec le sus-mentionné récit corporate gloubiboulguien, les personnages seront précédés de leur titre de noblesse : « Collègue X », « Chef Y », etc. Alors qu’avant j’utilisais les titres neutres « Monsieur », « Madame ».

On n’est plus à ça près. Go !

Je téléphone à Chef Ion car je ne parviens pas à trouver le restaurant de rendez-vous. Celui-ci est dans la rue du Bourg L’Abbé. J’étais dans le passage du Bourg L’Abbé. J’ai jamais pu supporter ces connards qui donnent le même nom à plusieurs trucs d’une même ville.

Bourre l’abbé.

Pour rappel : à Gloubiloulga, j’officie en tant qu’ouvrier-codeur-prestataire missionné ad vitam eternam « en régie ». Par conséquent, je ne connais pratiquement pas mes collègues de boîte. Disons que le peu qu’ils connaissent de moi provient du fameux week-end sus-mentionné.

Tout le monde attend devant l’entrée du restau comme des gentils petits macarons. MégaChef Poulet est là. Un collègue quelconque que je ne connais pas m’aborde et me demande si je suis bien un gloubiboulguien. Je réponds par l’affirmative. Il s’excuse et m’explique que s’il a posé la question, c’est parce que juste avant, un autre collègue a fait une blague et lui a fait croire qu’une nana random qui passait par là faisait partie de la boîte. Ha ha ha. Ambiance complètement fofolle, dites donc.

Nous entrons et investissons la salle spécialement privatisée pour nous (j’adore ce novlanguisme).

Collègue Scofield, membre du CE et principal organisateur de la soirée, nous propose de nous asseoir.

« Asseyez-vous et buvaillons », nous suggère notre collègue.

Certes, il a le pouvoir (voire le devoir) de nous ordonner cela, dans le but de faire progresser la soirée le long de sa timeline. Mais quand même je trouve qu’il aurait pu y mettre un peu plus de tact, préparer le terrain psychologiquement, etc.

Vous l’avez deviné : gros stress général, plus personne n’ose bouger. Qui va s’asseoir où ? Comment être sûr de se retrouver à côté de personnes socialement compatibles et hiérarchiquement équivalentes ? Par quoi commencer ? La banquette ou les chaises ? La table rectangulaire ou la ronde ? En plus, il reste encore des gens dans le vestiaire, ce qui provoque un surcroît d’incertitude dans les variables du système.

Et là, est-ce que tu sais ce qu’il fait, lecteurtrice ? Nan mais est-ce que tu sais ce qu’il fait ? Il amorce le mouvement, et va se poser pil poil au milieu de la banquette ! L’air de rien, comme s’il avait fait ça toute sa vie !

L’heure n’est plus à la réflexion : mouvements désordonnés et anarchiques de tous les Gloubiboulguiens. Je me cacafouille complet et échoue sur une chaise, avec Chef Ion à ma droite et MégaChef Poulet à ma gauche. NOM TE TIEU TE PUTAIN TE PORTEL TE MERTE !!!

Gloubiboulguiens rush

Les entrées arrivent. Tartare de saumon. Après un temps supposé raisonnable, le serveur reprend lesdites entrées. Je manque de me faire piquer ma part que j’avais pas finie, mais je réagis au quart de tour et obtiens le droit de consommer ma dernière bouchée. Un jour, j’organiserai des concours de mangeage lentement.

Soirée sans thème spécifique, ou en tout cas, pas un qui aurait nécessité des danseuses de flamenco. Y’a juste le serveur qui se donne l’air d’être homosexuel jusqu’à l’œsophage, mais en vrai il fait semblant pour attirer les nanas. L’ambiance est chaude et cosy, avec des lumières tamisées et des petites bougies flammotant sur les tables. Colléguette Souricette râle parce qu’elle y voit que d’alle pour dépiauter ses gambas avec son p’tit couteau et sa p’tite fourchette.

Faut vraiment être un kamikaze social pour prendre des gambas dans un restau. Le truc impossible à bouffer. Même si par miracle tu y arrives, tu as les doigts qui puent. Et c’est pas un rince-doigts de 10 centimètres carré qui va régler le problème.

Ces gambas me semblent plus intéressantes.

J’ai deux règles personnelles dans les restau, et je suis admiratif (voir totalement effrayé) par les gens qui parviennent à passer outre.

Règle 1 : simplicité d’ingestion. Pas de machins à dépiauter, décortiquer, découper, éplucher, égoutter, râcler, déconstruire, désencoquiller, entortiller, désentortiller, casser, flamber, tremper, mâchonner indéfiniment, extraire, trier, analyser, dégraisser, rétro-ingéniériser. Quand je tombe sur ce genre de problème, je me tâche systématiquement partout. Je vis cela comme une agression provenant de l’humain ayant fait cette putain de bouffe : il a bâclé son boulot et se marre en s’imaginant comment je vais galérer. Ça fait plusieurs années que je milite pour soit mis en place un système de notation avec des petites icônes sur les menus, indiquant pour chaque plat si c’est simple ou compliqué à manger, et le type de complexité.

Règle 2 : simplicité de prononciation. Parce qu’il faut spécifier oralement ce qu’on souhaite manger, et que je ne veux pas me rendre ridicule en prononçant mal un truc. Les restaurants de bouffe étrangère doivent donc être rigoureusement pré-étudiés. Au fait, saviez-vous qu’une grande partie des noms de pizzas inscrits sur les cartes des restaurants italiens ne sont là que pour contribuer au thème et à la décoration du lieu ? Ils ne correspondent en réalité à aucune recette : Capricciosa, Quattro fromaggi, Prosciutto, Sfincione, … Oui oui, vous avez bien lu, un « S » suivi d’un « F ».

Je choisis une escalope avec du riz.

Colléguette Sarkozette n’est pas parmi nous ce soir, mais j’ai quand même droit à quelques conversations de droite :

« La France c’est un pays où plus personne veut bosser. Tiens, par exemple, quand j’étais en congé maternité, j’essayais de faire les courses à des horaires inhabituels, 10h ou 3h de l’après-midi. Eh bien y’a autant de monde que les soirs et les week-ends. On se demande ce qu’ils foutent tous ces gens. »

« Quand je suis en déplacement, quelle que soit l’heure à laquelle je prends ma voiture, y’a toujours plein de monde sur les routes. Mais ils font quoi, tous ? Ou alors c’est que des commerciaux, comme moi. »

Nous étions en 2008, et la loi interdisant de fumer dans les bars et restaurants sortait à peine de son œuf. Bien que non-fumeur, j’ai eu du mal à m’y faire. Laissez-moi vous narrer cela.

Tel une moule sur une coque de bateau, je m’accroche à une discussion, afin de m’en faire une bouée de sauvetage de contenance sociale. Je regarde intensément les gens, avec mon air « ça m’intéresse trop ce que vous vous racontez, c’est pour ça que je vous écoute sans rien dire ». Ils se trouve que les gens en question sont des fumeurs. Et qu’est-ce qu’ils font ces enculés de leur race, au lieu de s’en griller une tout en continuant de parler ? Ils se carapatent dehors !

Ça aurait fait super bizarre que je les suive, car j’étais pas vraiment intégré dans leur conversation. Tel une moule errante, j’essaye alors de m’incruster ailleurs. Mais toutes leurs variables conversationnelles des discussions voisines sont déjà allouées et initialisées. Les interlocuteurs n’utilisent plus que les références : « il », « elle », « eux », « nous », etc. À ce stade, quand tu fais semblant d’écouter et de tout comprendre, c’est pas crédible.

Je me vois donc finalement affublé du statut de « SDF social ».

Quelques minutes auparavant, Chef Ion s’était amusé à cramer des piques-olives en bois dans la petite bougie tablaire. Je me suis dit que je pourrais effectuer une action du même type. Sans faire exactement pareil, bien sûr, sinon ça se voit trop que tu tentes de combler un leak de contenance sociale par un simple copier-coller d’action.

Parmi les déchets de mon assiette se trouvent des petites feufeuilles séchées de tomate-cerise (pourquoi y’avait-il ça avec mon dessert ? Mystère). C’est certainement brûlable. Je teste, effectivement, ça l’est. Mais trop, en fait. Surpris par une énorme flamme, je fais tout tomber dans la bougie. Rigolo, on se croit dans une mini-banlieue, avec une mini-poubelle illuminant la nuit. Mais maintenant ça sent le cramé, la bougie s’est éteinte, et des cendres de feuilles séchées et de feu ma contenance sociale s’éparpillent un peu partout.

À l’aide d’un dernier bout de pique-olive, Chef Ion transmet la flamme d’une autre bougie vers la mienne, la rallume, et m’achève ainsi d’un grand coup de condescendance.

Putain de loi anti-tabac de merde.

Collègue Poulet-Fils fait des aller-retours aux toilettes, car en plat principal, il a pris un début de gastro.

Voici ma blague de la soirée, qui a fait un bide alors que franchement j’en attendais un peu plus :

« Une gastro c’est un peu comme un buffer overflow. »

Mangeage du dessert. Puis les gens commencent à partir. On se retrouve à une demi-dizaine dans la salle de dancing du sous-sol, sans personne qui y dancing. Chef VisagePâle se prend une bière. Je m’apprête à faire de même, mais réalise qu’elle est à 9 euros. Voilà un dancing accompagné d’un fort sodomising.

On se regarde dans le blanc des vieux, sans se parler puisque la musique hurle du Mylène Farmer. Colléguette EncoreUnPeuVerte_2, fan de cette étrange chanteuse, va dancinguer toute seule.

On sort. Après quelques phrases de convenance, je dit au revoir et pars, dans une direction au hasard, car je ne voulais pas prendre le risque de montrer qu’il m’était nécessaire de réfléchir pour déterminer le chemin me permettant de rentrer chez moi.

Une rue plus tard, je m’aperçois que ce n’est pas la bonne direction. Je ne fais, bien entendu, pas demi-tour, pour ne pas me taper la honte nucléaire ultime en repassant devant les autres. Du coup je me tape une station de métro en plus. Pas grave.

C’était globalement une chouette soirée gloubiboulguienne.

À l’époque, j’avais envoyé ce résumé à des potes. Je me permet de retranscrire la réaction de l’un d’entre eux :

« C’est clair que tu as des raisons de quitter ta boite ! Une soirée d’entreprise où tu payes tes coups, ca existe ?? merte ! »

Le prochain article de blog sera à propos d’un mini-projet de code (ou pas). En espérant que vous apprécierez. Mais sinon osef.

Demake de Atomix fait avec PuzzleScript

Fans de mini-jeux de réflexion, bonjour.

atomix_water

Vous avez peut-être déjà découvert PuzzleScript (dans ce blog ou ailleurs). Voici ma première œuvre réalisée avec ce langage. Plus précisément, c’est la deuxième, mais la toute première était un cadeau pour une amie, et reste donc du domaine privé.

Concernant l’idée originale, je ne me suis pas foulé et j’ai repris le principe d’Atomix, un jeu où vous devez déplacer des atomes afin de reconstituer une molécule. La particularité, c’est que lorsqu’un atome est en mouvement, il continue jusqu’à être stoppé par un mur ou un autre atome. (Je suis sûr qu’en mécanique quantique, tout se passe exactement comme ça).

atomix-2

Concernant les niveaux du jeu, je ne me suis pas foulé non plus, et j’ai pompé ceux d’un certain draknek (http:// blog.draknek.org/post/93360531842/if-i-wanted-to-clone-atomix-this-is-where-id).

Ils sont intéressants et épurés de toute casse-couillerie inutile. Merci à lui.

Hyponitrous acid (mais vous le saviez sûrement déjà).

Hyponitrous acid (mais vous le saviez sûrement déjà).

Là où j’ai été obligé de me fouler, c’est pour implémenter le fonctionnement d’Atomix dans PuzzleScript. Le langage est assez souple et bien fichu, mais ne permet pas vraiment de décrire des comportements « globaux » prenant en considération une zone étendue de l’aire de jeu. J’ai donc eu recours à quelques bidouilles hasardeuses pour le processus vérifiant l’égalité entre la molécule-modèle et la disposition des atomes.

D’autres part, il n’y a pas de notion de variables. Pour tester « est-ce que l’atome dans le modèle est égal à l’atome dans l’aire de jeu ? », je n’ai pas trouvé de meilleure solution que de tout décrire verbeusement : « est-ce que l’atome du modèle est un hydrogène et celui de l’aire de jeu un hydrogène ? ou bien est-ce que l’atome du modèle est un carbone et celui de l’aire de jeu un carbone ? etc. ».

Il y a une petite documentation au début du script indiquant les contraintes à respecter pour créer les niveaux, ainsi que quelques commentaires ici et là. Ça mériterait d’être documenté plus en détail, ou pas.

puzlescript_code

Le sus-mentionné draknek a employé kp-atomix (https:// github.com/figlief/kp-atomix) pour publier les niveaux qu’il a créés, ce qui est une aubaine, car ils y sont décrits via un fichier json au format assez facile à comprendre.

Et quitte à me fouler pour coder, je me suis fendu d’un petit programme (en python, évidemment) convertissant les niveaux json de kp-atomix en niveaux de PuzzleScript. Ça aurait certainement pris moins de temps de les convertir à la main, mais ça aurait été tellement moins rigolo.

Ce programme a été honorablement documenté, car il est possible que certains de ses morceaux me resservent par la suite. Tout cela est évidemment dans un repository github, comme le veulent les conventions asociales à la mode en ce moment.

J’aime beaucoup PuzzleScript. Ça regroupe un grand nombre d’idées de mes rêves : des jeux de réflexion à foison, un moyen inhabituel de raconter des histoires, la création d’un langage dédié relativement souple et générique. Je vais voir si je peux faire quelque chose avec tout ça.

Comme vous le savez, les atomes sont liés ensemble par des liaisons de covalence. Voici donc une image de liaison, presque tout aussi idiosyncratique (même si je sais pas ce que ça veut dire).

double_dildo