🚲 Tanguy Ortolo a écrit 12077 commentaires

  • [^] # Re: On s'en tape (mais c'est pertinent d'en parler).

    Posté par  (site web personnel) . En réponse au journal La France crée un fichier des personnes trans. Évalué à 1.

    Il me semble que ça ne se pratique pas sur des mineurs, déjà. En revanche, il y a des cas de prescription d'hormones, qui, autour de la puberté, ont facilement un effet sur toute une vie.

    Quand aux mutilations demandées par des personnes majeures, on peut penser que c'est leur problème, mais outre le consentement du patient, ça nécessite quand même, pour les médecins, un motif médical très sérieux. Encore heureux que ce ne soit pas fait à la légère ! Surtout que le résultat de ce genre d'opération nécessite une attention constante voire une médication à vie prise en charge en tant qu'affection longue durée : quand on en arrive là, il y a quand même des questions à se poser, pour un médecin dont l'intervention est cause d'une affection longue durée.

    J'ose espérer que les voies psychologiques sont systématiquement explorées avant d'en venir à de la chirurgie quand même.

  • [^] # Re: Scandaleux .... ou pas, moi, j'opte pour la 1ère option

    Posté par  (site web personnel) . En réponse au journal La France crée un fichier des personnes trans. Évalué à 8.

    La distinction entre la loi et la morale est d'autant plus importante que sans cela, il n'y aurait jamais la moindre raison pour défendre le moindre changement dans la loi.

  • [^] # Re: Pas tous libre

    Posté par  (site web personnel) . En réponse au journal snap : de pire en pire.. Évalué à 10.

    Il y a de plus en plus de logiciels qui disparaissent des dépôts de paquets deb d'Ubuntu, et qui sont remplacés par des Snaps. C'est le cas des navigateurs comme Firefox ou Chrome par exemple.

    Techniquement, c'est un chouïa plus pervers : on trouve toujours un paquet pour ces logiciels, mais ce paquet est en fait une coquille vide, qui dépend de Snap, et qui a pour effet de faire installer le logiciel correspondant sous forme de Snap.

    Bref, si on se limite aux logiciels vraiment disponibles sous forme de paquets deb, Ubuntu s'appauvrit progressivement.

  • [^] # Re: Ben oui mais en fait non

    Posté par  (site web personnel) . En réponse au journal Où il est question de données personnelles (bis). Évalué à 10.

    Du blanchiment de données collectées sans consentement alors ?

  • [^] # Re: Ça dĂ©pend de l'usage

    Posté par  (site web personnel) . En réponse au journal snap : de pire en pire.. Évalué à 4.

    Sous Android, il y a une distribution qui s'appelle Termux, qui utilise une version modifiée d'APT pour installer des trucs en tant qu'utilisateur.

  • [^] # Re: J'aimerais qu'on me considère en tant que tel

    Posté par  (site web personnel) . En réponse au journal snap : de pire en pire.. Évalué à 6.

    Avoir Ă  la fois des tomates et des pommes de terre avec la mĂŞme plante, Ă©videmment.

    Il y a un autre point commun entre les deux : un plant ne dure qu'une saison. Pour la tomate, c'est parce que c'est une plante annuelle : elle donne des fleurs, puis des fruits, puis finit par mourir. Pour la pomme de terre, c'est parce qu'on doit l'arracher pour récolter les tubercules.

    Donc quitte à avoir une plante qui ne fera qu'une saison, autant qu'elle donne à la fois les deux, non ?

  • # Ben oui mais en fait non

    Posté par  (site web personnel) . En réponse au journal Où il est question de données personnelles (bis). Évalué à 10. Dernière modification le 29 janvier 2024 à 13:54.

    Donc OK, je suis fautif, c'est de ma faute, j'aurai dû remplir ce formulaire moi-même, lire les petites lignes et les conditions générales, ne pas mettre la croix, etc.

    Ben non. Vu le texte que tu cites, La poste avait le droit de communiquer ta nouvelle adresse aux entreprises qui avaient déjà ton ancienne adresse. Or, si j'ai bien compris ton histoire, tu as été surpris d'être contacté par trois entreprises. Je suppose que tu ne les connaissais pas, sinon ça ne t'aurait pas surpris.

    Donc, ça ne laisse que deux possibilités :

    1. ils te connaissaient déjà avant ton changement d'adresse sans que tu le saches, auquel cas au départ, ils ont chopé des informations sur toi par un autre moyen et tu es en droit d'exiger qu'ils te l'expliquent ;
    2. ils ne te connaissaient pas avant ton changement d'adresse, auquel cas La Poste leur a fourgué tes coordonnées en parfaite illégalité.

    Soit dit en passant, ce service de communication de changement d'adresse par La Poste suisse m'intrigue au plus haut point. Je ne vois pas comment ça peut concrètement être mis en place sans recourir à des traitements plus que douteux. Je veux dire, comment La Poste saurait-elle quelles entreprises te connaissent déjà et devraient être mises au courant de ton changement d'adresse ? Le seul procédé que j'imagine consiste à tenir en permanence un registre complet de tout le courrier envoyé, en notant pour chaque pli l'expéditeur et le destinataire. Mais dans le genre traitement massif de données personnelles sans consentement, ça se pose là, quand même !

  • [^] # Re: Programmation fonctionnelle

    Posté par  (site web personnel) . En réponse au journal Is return the new goto ?. Évalué à 7.

    À noter que cela permet autre chose d'intéressant, si le concepteur du langage y a pensé : utiliser cette notion de valeur de retour au niveau, non pas seulement de la fonction, mais plus généralement du bloc de code. Vous savez, le bloc, une portion de code entre accolades par exemple. Dans les langages où c'est défini, ça sert entre autres pour la portée des variables, mais ça permet aussi de grouper des instructions et de définir les structures de contrôle comme travaillant sur des blocs.

    Bref, en clair, cette idée de valeur de retour peut permettre des trucs comme ça :

    n = 3
    printf("Il y a %d %s", n, if n <= 1 {
        "vélo"
    } else {
        "vélos"
    })
  • # Programmation fonctionnelle

    Posté par  (site web personnel) . En réponse au journal Is return the new goto ?. Évalué à 10.

    Autant que je sache, ça vient d'habitudes de langages de programmation fonctionnelle. J'ai en tête Caml par exemple. Si je me souviens bien, l'idée est qu'il n'est pas normal de faire quoi que ce soit qui retourne une valeur sans faire quelque chose de cette valeur : l'affecter à une variable par exemple.

    Du coup, dans la définition d'une fonction, on s'attend à ce qu'aucune ligne ne laisse de valeur implicitement jetée à la poubelle. Et il devient du coup plus ou moins naturel que, lorsqu'une ligne, une seule, la dernière, laisse une valeur, ce soit la valeur de retour de la fonction.

    On peut voir les choses autrement. Une fonction est comme l'objet du même type en mathématiques : quelque chose qui prend des valeurs et fournit une valeur. Or en maths, on écrit fort naturellement (ou pas) des choses comme : f: x ↦ x². Et certainement pas f: x ↦ return x².

  • [^] # Re: BroyĂ© du Poitou

    Posté par  (site web personnel) . En réponse à la dépêche Claire Mathieu et les algorithmes. Évalué à 7.

    Sans les ingrédients, j'ai bien peur que ce soit assez ambigu malheureusement.

  • # PĂ©rennitĂ© des formats

    Posté par  (site web personnel) . En réponse à la dépêche Archiver ses vidéos : retour d’expérience. Évalué à 8.

    la possibilité de lire des fichiers dans plusieurs années (je pense à des fichiers Publisher 2.0 que je ne suis plus parvenu à lire par la suite – et non : les versions ultérieures à Publisher 2.0 ne lisent pas ces fichiers.

    Ça, c'est un problème réservé aux utilisateurs de logiciels propriétaires. Ça peut éventuellement arriver avec du logiciel libre pour des usages de niche.

    Mais pour des trucs comme l'image, la vidéo et le son, dès que tu utilises des formats ouverts un minimum connus, tu peux être certain de pouvoir les relire… tant qu'on aura des ordinateurs et des logiciels.

    Avec des formats standardisés, tu as aussi une assez bonne garantie de pouvoir les relire plus tard.

  • [^] # Re: Pareil !

    Posté par  (site web personnel) . En réponse au journal Où il est question de données personnelles. Évalué à 4. Dernière modification le 16 janvier 2024 à 13:50.

    À noter que le fait qu'il y ait une plainte qui aboutisse ne changerait strictement rien pour la suite : chaque cas d'abus nécessite une plainte pour être sanctionné.

    Je veux dire, si je suis une entreprise prête à abuser des données personnelles de gens, je sais que je cours un risque en le faisant. Le fait qu'il y ait un précédent juridique ou non ne change rien au risque en question, puisque la loi est écrite d'une façon qui ne laisse aucune ambiguïté : ce que je fais est illégal et, en cas de procès, sera sans aucun doute considéré comme tel.

  • [^] # Re: Pareil !

    Posté par  (site web personnel) . En réponse au journal Où il est question de données personnelles. Évalué à 4.

    C'est à dire que les boîtes qui pratiquent ce genre d'abus n'en ont juste rien à torcher de la loi, comptant sur le fait que personne ne se plaindra. À ce compte-là, autant déconner à plein tube, pas la peine de se faire chier à respecter quoi que ce soit du RGPD en fait.

  • [^] # Re: Pareil !

    Posté par  (site web personnel) . En réponse au journal Où il est question de données personnelles. Évalué à 8.

    C'est la théorie, mais la pratique c'est que tant qu'il n'y a pas de plainte et de jugement qui explicite que le "consentement" recueilli n'est pas valable tout le monde s'en fiche. C'est ce que les ricains appellent le "court testing".

    Une défense d'une entreprise qui se prémunirait d'un consentement recueilli par case pré-cochée ne tiendrait pas une seconde devant un tribunal, tellement le RGPD est clair. Préambule, paragraphe 32 :

    Le consentement devrait être donné par un acte positif clair par lequel la personne concernée manifeste de façon libre, spécifique, éclairée et univoque son accord au traitement des données à caractère personnel la concernant, par exemple au moyen d'une déclaration écrite, y compris par voie électronique, ou d'une déclaration orale. Cela pourrait se faire notamment en cochant une case lors de la consultation d'un site internet, en optant pour certains paramètres techniques pour des services de la société de l'information ou au moyen d'une autre déclaration ou d'un autre comportement indiquant clairement dans ce contexte que la personne concernée accepte le traitement proposé de ses données à caractère personnel. Il ne saurait dès lors y avoir de consentement en cas de silence, de cases cochées par défaut ou d'inactivité.

    Ce n'est même pas une déduit du texte, c'est écrit dedans de façon on ne peut plus explicite. Le juge est parfois là pour essayer de deviner l'intention du législateur, mais là il n'y a aucune place pour une interprétation quelconque, c'est juste écrit noir sur blanc : il n'y a pas de consentement par cas pré-cochée. Fin de la discussion.

  • [^] # Re: Pareil !

    Posté par  (site web personnel) . En réponse au journal Où il est question de données personnelles. Évalué à 10.

    C'est moins craignos en effet, mais quand même illégal. Il s'agit d'un traitement de données personnelles effectué sans consentement.

    Ah, au fait, à propos de consentement, il y a un truc important à savoir. Pour qu'un traitement de données personnelles destiné à une prospection commerciale soit légal, il faut un consentement libre, spécifique, éclairé et univoque :

    • Libre : le fait de refuser un traitement qui n'est pas nĂ©cessaire ne doit pas avoir d'impact sur un service. Par exemple, si un site de vente exige que vous consentiez Ă  recevoir des messages de prospection pour que vous puissiez acheter des produit, eh bien ce consentement n'est pas libre et n'est donc pas valide.
    • SpĂ©cifique : lorsqu'il y a plusieurs traitements de donnĂ©es on doit pouvoir consentir de façon indĂ©pendante Ă  chacun d'entre eux.
    • ÉclairĂ© : le responsable du traitement doit ĂŞtre prĂ©cisĂ©, ainsi que le but du traitement, les donnĂ©es collectĂ©es, etc.
    • Univoque, le plus important : le consentement doit ĂŞtre donnĂ© par un acte positif univoque. Genre cocher une case. Le fait de ne pas dĂ©cocher une case prĂ©-cochĂ©e n'est, par dĂ©finition, pas un acte positif, par consĂ©quent : les cases prĂ©-cochĂ©es ne peuvent pas produire un consentement valide.

    Donc, en particulier, si vous avez comme moi pris l'habitude de ne jamais cocher les cases de consentement au partage de vos données personnelles, vous pouvez être sûr que tout traitement de vos données personnelles par une entreprise avec laquelle vous n'avez jamais été en rapport est illégal puisque vous n'y avez jamais explicitement consenti. Et si vous avez laissé une case pré-cochée, aucune importance, ces saloperies ne valent pas consentement.

  • # Pareil !

    Posté par  (site web personnel) . En réponse au journal Où il est question de données personnelles. Évalué à 10.

    C'est amusant, il m'est arrivé presque la même chose, en France, à peu près au même moment. Merci d'en avoir fait un journal d'ailleurs.

    Dans mon cas, c'était une lettre m'annonçant l'ouverture d'un genre de centre commercial multi-marques à Giverny. Un truc donc je n'ai strictement rien à cirer, c'est à une heure de bagnole de chez moi et j'ai mieux à faire de mon temps que de rouler pour aller passer une journée à faire des courses, merci.

    Bref, comme c'était du courrier adressé, je les ai aussitôt contactés par courrier électronique pour leur demander l'intégralité des données personnelles qu'ils avaient sur moi et d'où ils les sortaient. À noter que c'est tout ce que je leur demandais, en particulier, je ne leur ai à ce moment-là pas du tout demandé de supprimer quoi que ce soit.

    Réponse : ça vient d'un partenaire. Point. Pas plus de détail. Ils n'avaient manifestement pas compris ou pas voulu comprendre ma demande, donc je leur réponds en leur rappelant que je leur demande communication de ces données et que je veux savoir de quel partenaire il s'agit, avec adresse et numéro SIRET ou enregistrement au RCS, merci.

    Pas de réponse en quinze jours. Je décide de les dénoncer à la Cnil, et je les en informe au passage. Et là, ils répondent – mais trop tard, la Cnil est déjà au courant qu'ils déconnent – en m'expliquant qu'ils n'ont pas de données sur moi, qu'ils ont juste demandé à Mediapost de faire une campagne de publicité pour leur compte. C'est donc Mediapost qui a des données sur moi, et ils leur transmettent ma demande de suppression. Ma demande de suppression, quelle demande de suppression ‽ Je n'ai jamais rien demandé de tel moi !

    Bref. Pour info, c'est comme dans ton cas, parce que Mediapost c'est La Poste française. Qui évidemment ont moyen d'avoir des infos sur à peu près tout le monde. Et n'ont absolument pas le droit de les collecter ou pire, de les utiliser comme ça.

    Une autre chose que je remarque presque tout le temps, lorsqu'on écrit à une entreprise pour leur demander les données personnelles relatives à un envoi publicitaire, s'ils répondent, c'est presque tout le temps pour indiquer :

    • soit que c'est un partenaire, sans plus de prĂ©cision, ce qui ne rĂ©pond pas Ă  la demande ;
    • soit pour expliquer qu'ils ont bien pris en compte la demande de suppression, ce qui ne rĂ©pond pas non plus Ă  la demande.
  • [^] # Re: Fromagerie

    Posté par  (site web personnel) . En réponse au journal [ HS ] Fromage râpé pour accompagner les pâtes ou autre .... Évalué à 3.

    Et pour le prix au kilo d'un emmental français râpé, on peut se payer un truc nettement plus qualitatif. Peut-être pas du Comté, mais au moins un Truc de Savoie AOP.

  • [^] # Re: GĂ©omĂ©trie vectorielle et analytique

    Posté par  (site web personnel) . En réponse au message Advent of Code 2023, jour 24. Évalué à 3.

    Notes d'implémentation :

    • On fait pas mal de calculs sur des entiers qu'on finit Ă  un moment ou Ă  un autre par diviser. Le meilleur type de donnĂ©es pour cela, c'est Ă  mon avis une implĂ©mentation des rationnels. En Python, c'est fractions.Fraction.
    • On est dans de la gĂ©omĂ©trie, on fait des produits scalaires, des produits vectoriels, des additions, des soustractions, des multiplications par un scalaire… C'est parfait pour implĂ©menter une classe Vector et des opĂ©rateurs variĂ©s. En Python, on peut par exemple dĂ©finir des mĂ©thodes qui rĂ©utilisent les opĂ©rateurs standard de façon habituelle ou futĂ©e (vous allez comprendre…) :
      • __rmul__ pour le produit par un scalaire alpha * v ;
      • __xor__ pour le produit vectoriel v ^ w ;
      • __add__ et __sub__ pour l'addition et la soustraction vectorielles ;
      • __neg__ pour l'opposition ;
      • __floordiv__ pour le test de colinĂ©aritĂ© v // w ;
      • __bool__ pour le test de non-nullitĂ© (permet d'Ă©crire des trucs comme if vector).
    • Enfin, on va travailler avec des droites, des plans, lĂ  aussi c'est parfait pour faire de la belle modĂ©lisation avec des mĂ©thodes permettant d'utiliser des opĂ©rateurs comme //, ==, etc.
  • [^] # Re: GĂ©omĂ©trie vectorielle et analytique

    Posté par  (site web personnel) . En réponse au message Advent of Code 2023, jour 24. Évalué à 3.

    Pour déterminer la position de départ donc, la première idée consiste à chercher l'intersection de deux trajectoires corrigées. Une intersection de droites donc. Sauf que c'est assez moche à calculer, on peut faire plus élégant.

    Les trajectoires corrigées étant toutes sécantes au même point, celui qu'on recherche, en les prenant deux par deux on peut définir des plans. Il est temps d'ouvrir une petite parenthèse.

    Plan défini par deux droites

    Dans l'espace, deux droites peuvent définir un plan, à condition nécessaire et suffisante qu'elles soient soit parallèles mais non identiques, soit sécantes.

    Soient deux droites pertinentes selon cette condition et définies chacune par un point et par un vecteur (p0, v0) et (p1, v1). On cherche à caractériser leur plan commun, par un point et un vecteur normal.

    Si elles ne sont pas parallèles, leurs vecteurs directeurs v0 et v1 ne sont pas colinéaires. Leur produit vectoriel n = v0 ^ v1 est non nul et orthogonal aux deux droites et fait donc un très bon vecteur normal pour le plan cherché.

    Si elles sont parallèles leurs vecteurs directeurs sont certes colinéraires, mais p0 - p1 n'est pas colinéaire à ces derniers (sinon, vous pouvez vérifier, les droites seraient identiques). On peut donc choisir n = v0 ^ (p0 - p1) comme vecteur normal pour le plan cherché.

    Il nous reste à trouver un point sur le plan cherché : c'est trivial, il suffit de prendre par exemple p0 puisque ce plan contient par définition la première droite. Pour obtenir une équation de plan du type n ⋅ r = d, il suffit de prendre d = p0 ⋅ n.

    En fait, nous nous intéressons seulement au cas de droites sécantes, voici donc le calcul pour obtenir l'équation du plan dans ce cas spécifique :

    n = v0 ^ v1
    d = p0 â‹… n
    
    n â‹… r = d

    Retour au problème

    En prenant les trajectoires corrigées deux par deux, on peut définir un tas de plans contenant tous le point cherché. Or l'intersection de trois plans non parallèles est un point, qui sera forcément ce dernier ! Ouvrons une nouvelle parenthèse.

    Intersection de plans

    Allons-y pour l'intersection de trois plan non parallèles (p0, d0), (p1, d1) et (p2, d2).

    Le point d'intersection, que nous allons noter r, respecte les Ă©quation des trois plans :

    n0 â‹… r = d0
    n1 â‹… r = d1
    n2 â‹… r = d2

    L'astuce consiste ici Ă  choisir une base vectorielle alternative :

    u0 = n1 ^ n2
    u1 = n2 ^ n0
    u2 = n0 ^ n1

    En exprimant la position cherchée comme combinaison de ces trois vecteurs r = a0 u 0 + a1 u1 + a2 u2, l'équation du premier plan devient :

    n0 â‹… (a0 u0 + a1 u1 + a2 u2)         = d0
    a0 n0 â‹… u0 + a1 n0 â‹… u1 + a2 n0 â‹… u2 = d0
    a0 n0 â‹… u0 + a1 Ă— 0     + a2 Ă— 0     = d0
    a0 n0 â‹… (n1 ^ n2)                    = d0

    On peut reconnaître ici le produit mixte de nos trois vecteurs normaux, un scalaire que l'on va noter U = n0 ⋅ (n1 ^ n2). Les trois équations deviennent de la même façon :

    a0 U = d0
    a1 U = d1
    a2 U = d2

    Ce qui nous donne finalement ces fameux coefficients :

    a0 = d0 / U
    a1 = d1 / U
    a2 = d2 / U

    Qui nous donnent donc le vecteur position de l'intersection de nos trois plans. Pour rappel, voici les calculs à effectuer à partir des constantes définissant les trois plans :

    u0 = n1 ^ n2
    u1 = n2 ^ n0
    u2 = n0 ^ n1
    
    U = n0 â‹… (n1 ^ n2)
    
    a0 = d0 / U
    a1 = d1 / U
    a2 = d2 / U
    
    r = a0 u0 + a1 u1 + a2 u2

    Re-retour au problème

    En prenant trois trajectoires corrigées (p0, v0 - v), (p1, v1 - v) et (p2, v2 - v) , on sait désormais caractériser leurs plans communs deux à deux, soit trois plan. Et on sait également déterminer l'intersection de ces trois plan. Problème résolu !

  • # GĂ©omĂ©trie vectorielle et analytique

    Posté par  (site web personnel) . En réponse au message Advent of Code 2023, jour 24. Évalué à 3.

    Sommaire

    Bon, c'est un problème de géométrie.

    Je passe sur la première partie, trouver des intersections de ligne dans le plan c'est sans grand intérêt.

    La seconde partie est beaucoup, beaucoup plus intéressante. J'ai vainement cherché une solution élégante avant d'en trouver une sur Reddit. Je vous l'explique.

    À supposer que l'on trouve une position de départ p et une vitesse v qui permette de percuter tous les grêlons, en se plaçant dans le référentiel de notre projectile, ce sont tous les grêlons qui vont converger jusqu'à l'atteindre, chacun à son tour. Autrement dit, pour un grêlon (p0, v0), la droite (p0, v0 - v) passe par notre position de départ p. Et il en est de même pour les autres grêlons.

    Par conséquent, les trajectoires corrigées des trois premiers grêlons (p0, v0 -v), (p1, v1 -v) et (p2, v2 -v) se coupent deux à deux en p. Il est temps d'ouvrir une parenthèse sur les droites sécantes.

    Des droites sécantes

    Dans l'espace, contrairement au plan, des droites peuvent être identiques, parallèles, sécantes ou… rien de tout ça.

    Étant données deux droites caractérisées chacune par un point et un vecteur directeur l0 = (p0, v0) et l1 = (p1, v1), la première chose à vérifier est qu'elles ne sont ni identiques ni parallèles. Autrement dit, que leurs vecteurs directeurs ne sont pas colinéaires. Une façon de faire consiste à prendre leur produit vectoriel, qui ne doit pas être nul.

    Si ces droites ne sont pas parallèles, les droites vectorielles associées (O, v0) et (O, v1), définissent un plan vectoriel. Ce plan vectoriel peut être caractérisé par un vecteur normal facile à construire par le produit vectoriel des vecteurs directeurs de ces deux droites : n = v0 ^ v1.

    Le plan affine parallèle à ce plan vectoriel et incluant d0 a pour équation vectorielle r ⋅ n = p0 ⋅ n. Le plan affine incluant d1 a quant a lui pour équation vectorielle r ⋅ n = p1 ⋅ n.

    Ces plans sont identiques si et seulement si p0 ⋅ n = p1 ⋅ n. Autrement dit, en revenant à la définition de ce vecteur normal n, si (p0 - p1) ⋅ (v0 ^ v1) = 0. Si ces plans sont identiques, les droites sont coplanaire, et n'étant pas parallèles, elles sont donc sécantes. Réciproquement, si les droites sont coplanaires, les plans sont identiques.

    Retour au problème

    Puisque le problème a une solution, les trajectoires corrigées de deux grêlons (p0, v0 - v) et (p1, v1 - v) sont sécantes. Bon, ok, à condition qu'elles ne soient pas identiques : si c'était le cas on prendrait juste une autre grêlon, on en a plein à notre disposition. Mais vous pouvez vérifier sur vos données, ce cas ne se présente pas. Par conséquent :

    (p0 - p1) â‹… ((v0 - v) ^ (v1 - v))               = 0
    (p0 - p1) â‹… (v0 ^ v1 - v0 ^ v - v ^ v1 + v ^ v) = 0
    (p0 - p1) â‹… (v0 ^ v1 + v ^ v0 - v ^ v1 + 0)     = 0
    (p0 - p1) â‹… (v0 ^ v1 + v ^ (v0 - v1))           = 0

    En réorganisant un peu et en utilisant les propriété du produit mixte :

    (p0 - p1) â‹… ((v0 - v1) ^ v) = (p0 - p1) â‹… (v0 ^ v1)
    v â‹… ((p0 - p1) ^ (v0 - v1)) = (p0 - p1) â‹… (v0 ^ v1)

    Donnons un nom Ă  ces termes constants :

    A0 = (p0 - p1) ^ (v0 - v1)
    M0 = (p0 - p1) â‹… (v0 ^ v1)

    On a donc :

    v â‹… A0 = M0

    Plus de droites

    De la même façon, en utilisant une droite de plus, posons :

    A0 = (p0 - p1) ^ (v0 - v1)
    A0 = (p1 - p2) ^ (v1 - v2)
    A0 = (p2 - p0) ^ (v2 - v0)
    
    M0 = (p0 - p1) â‹… (v0 ^ v1)
    M0 = (p1 - p2) â‹… (v1 ^ v2)
    M0 = (p2 - p0) â‹… (v2 ^ v0)

    On a maintenant trois Ă©quations sur v :

    v â‹… A0 = M0
    v â‹… A1 = M1
    v â‹… A2 = M2

    Pour résoudre ça simplement, il y a une astuce. On va utiliser une base vectorielle ainsi définie, avec des vecteurs conçus que chacun d'entre eux soit orthogonal à deux vecteurs des équations précédentes :

    u0 = A1 ^ A2
    u1 = A2 ^ A0
    u2 = A0 ^ A1

    Et écrire la vitesse que nous cherchons sur cette base : v = a0 u0 + a1 u1 + a2 u2. Les équations précédentes deviennent désormais :

    v â‹… A0 = a0 (A1 ^ A2) â‹… A0 = M0
    v â‹… A1 = a1 (A2 ^ A0) â‹… A1 = M1
    v â‹… A2 = a2 (A0 ^ A1) â‹… A2 = M2

    On peut reconnaître ici le produit mixte de nos vecteurs A0 et compagnie, que l'on va nommer A* = A0 ⋅ (A1 ^ A2), ce qui donne :

    a0 A* = M0
    a1 A* = M1
    a2 A* = M2

    Et finalement nos coefficients :

    a0 = M0 / A*
    a1 = M1 / A*
    a2 = M2 / A*

    RĂ©capitulons

    Avec les trois premiers grĂŞlons, on calcule les vecteurs et scalaires constants suivants :

    A0 = (p0 - p1) ^ (v0 - v1)
    A0 = (p1 - p2) ^ (v1 - v2)
    A0 = (p2 - p0) ^ (v2 - v0)
    
    M0 = (p0 - p1) â‹… (v0 ^ v1)
    M0 = (p1 - p2) â‹… (v1 ^ v2)
    M0 = (p2 - p0) â‹… (v2 ^ v0)
    
    A* = A0 â‹… (A1 ^ A2)

    Puis les vecteurs suivants :

    u0 = A1 ^ A2
    u1 = A2 ^ A0
    u2 = A0 ^ A1

    Et enfin les coefficients suivants :

    a0 = M0 / A*
    a1 = M1 / A*
    a2 = M2 / A*

    La vitesse de notre projectile doit ĂŞtre :

    v = a0 u0 + a1 u1 + a2 u2

    Et la position alors ?

    La vitesse, c'est bien, mais c'est surtout la position de départ qu'on nous demande. On va dire que c'est facile à déduire désormais : c'est l'intersection des trajectoires corrigées des deux premiers grêlons. Par exemple, on peut en prendre d'autres si on veut.

    Sauf que non, ce n'est vraiment pas trivial à calculer, l'intersection de deux droites sécantes dans l'espace. Il y a encore une astuce, et celle-là est vraiment de moi. Je vous la donnerai plus tard, là je suis fatigué de raconter mes aventures mathématiques.

  • [^] # Re: J'ai aussi utilisĂ© le Z3 theorem prover.

    Posté par  (site web personnel) . En réponse au message Advent of Code 2023, jour 24. Évalué à 3.

    Un code de cette longueur, ça aurait valu la peine de le mettre ailleurs, là ça nous fait une page terriblement longue à parcourir.

  • # Fromagerie

    Posté par  (site web personnel) . En réponse au journal [ HS ] Fromage râpé pour accompagner les pâtes ou autre .... Évalué à 4.

    Et vous, quels fromages utilisez-vous pour vos pâtes, ou autres préparations, sous quel format et avec quel résultat, et pour quel impact sur les finances ?

    Du fromage acheté chez un producteur à l'occasion de vacances à la montagne. Ou du fromage acheté à la fromagerie de mon quartier. Ou au marché. Mais en aucun cas du fromage industriel pré-râpé.

    Bref, du fromage en morceau que je râpe moi-même… ou que je demande au fromager de râper et de mettre dans une gamelle qui m'appartient. De l'achat en vrac quoi.

  • # Pas d'exemple

    Posté par  (site web personnel) . En réponse au message Advent of Code 2023, jour 20. Évalué à 3.

    À noter que les exemples fournis en première partie ne s'appliquaient pas à la deuxième partie, et que cette dernière ne fournissait aucun exemple utilisable. J'ai trouvé ça vache.

  • [^] # Re: La solution la plus courte Ă  Ă©crire, la plus longue Ă  expliquer.

    Posté par  (site web personnel) . En réponse au message Advent of Code, jour 18. Évalué à 3.

    En pratique, j'ai honte un peu, j'ai fini de coder en voiture (au volant oui, oui),

    Non mais lĂ , faut savoir s'arrĂŞter quand mĂŞme. Ce serait dommage de mourir ou de tuer quelqu'un pour cause d'AoC.

  • [^] # Re: Optimisation insuffisante

    Posté par  (site web personnel) . En réponse au message Advent of Code, jour 19. Évalué à 3.

    Bon, j'ai eu mon résultat en un peu moins d'une heure avec PyPy. Mais ça reste moche à mes yeux. À l'occasion, je m'essaierai à optimiser encore ça avec un découpage plus astucieux.