🚲 Tanguy Ortolo a écrit 12191 commentaires

  • [^] # Re: Moi, aujourd'hui, je modĂ©lise tout propre tout joli !

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

    Je découvre cached_property, merci !

  • # T means 10

    Posté par  (site web personnel) . En réponse au message Advent of Code 2023, day 7. Évalué à 4.

    Petite subtilité sémantique, les cartes disponibles sont 23456789TJQK, ce qui signifie :

    • deux
    • trois
    • quatre
    • …
    • neuf
    • dix (T pour ten, soit 10)
    • valet (J pour jack)
    • dame (Q pour queen)
    • roi (K pour king)

    La raison d'utiliser la lettre T pour le dix vient de la nécessité de l'écrire en un seul caractère. 10, ça fait deux caractères…

  • [^] # Re: DĂ©coupage d'intervalles en Python

    Posté par  (site web personnel) . En réponse au message Advent of Code 2023 : Day 5. Évalué à 3.

    Ah, d'accord, je comprends mieux.

  • [^] # Re: DĂ©coupage d'intervalles en Python

    Posté par  (site web personnel) . En réponse au message Advent of Code 2023 : Day 5. Évalué à 3.

    Au fait, je vous conseille de garder ce code quelque part. Ça a des chances de resservir. :-)

  • [^] # Re: DĂ©coupage d'intervalles en Python

    Posté par  (site web personnel) . En réponse au message Advent of Code 2023 : Day 5. Évalué à 3.

    Je ne comprends pas. On peut bien découper des intervalles à l'avance, si le découpage ne correspond pas exactement à aux intervalles définis pour les conversions, il va falloir redécouper non ?

    Je veux dire, on peut bien couper l'intervalle de graines 46 546+34 234 234 en 46 546+999 999, 1 046 546 + 999 999, … 34 046 546 + 234 235, mais ça ne va pas aider si on doit ensuite convertir les graines 25 561 123+3 123 458 en quelque chose d'autre. Sauf si j'ai vraiment une chance monstrueuse, les limites de cet intervalle à convertir ne correspondent pas du tout à celles des intervalles de graines prédécoupés.

    Donc on se retrouve de toute façon à faire de la découpe d'intervalles par intersection. Tant qu'à faire, autant le faire à partir des intervalles entiers, le prédécoupage n'a aucun intérêt. Qu'est-ce que j'ai loupé ?

  • # Maths

    Posté par  (site web personnel) . En réponse au message Advent of Code 2023, day 6. Évalué à 6. Dernière modification le 06 décembre 2023 à 11:06.

    Pour moi, à la lecture de l'énoncé, je n'y ai pas vu un problème d'algorithmique, mais de mathématiques. Une régate avec un temps de charge qui donne la vitesse pour dépasser la distance record en un temps limité, c'est une inéquation polynomiale de second degré.

    Un polynôme de second degré

    Soit T la durée de la course, D la distance record et t le temps de charge (notre variable). La vitesse atteinte est d'après l'énoncé égale au temps de charge. Sur la durée de la course, il ne reste plus que T - t pendant lequel le bateau parcourra v (T - t) = t(T - t).

    On charge Ă  battre le record, soit :

    Cela se normalise en :

    La partie gauche est un polynôme de second degré, en forme de cloche vers le haut. Ça tombe bien, si les données sont bien construites il devrait s'annuler en deux points, et être négatif entre les deux. Je sais très bien résoudre ça.

    RĂ©solution

    Le discriminant de ce polynĂ´me vaut :

    Comme je disais, si les données sont bien construites, ça devrait être strictement positif et donner les racines suivantes :

    En chargeant notre bateau pendant exactement t_1 ou t_2, on égale le record. Entre t_1 et t_2, on le dépasse.

    Retour à la réalité fiction

    Bon, c'est bien joli ça, on peut déterminer des temps minimum et maximum qui sont des réels, mais on nous demande un nombre de durées de charge possible, entières à la milliseconde près, pour dépasser strictement le record.

    Si le temps minimum, par exemple, n'est pas entier, c'est facile, il faut charger pendant une durée supérieur ou égale à son arrondi à l'entier supérieur. Mais les cas limites sont importants, qu'en est-il si le temps minimum est entier ? Il faut charger pendant une durée supérieure ou égale à l'entier suivant.

    En fait, la borne inférieure à considérer est l'entier inférieur au temps minimum, augmenté d'une unité. Mutatis mutandis pour le temps maximum.

    Les bornes incluses de notre intervalle de durées possibles seront donc :

    Quand au nombre d'options, c'est par conséquent la longueur de cet intervalle :

    Partie 1, partie 2

    Ce calcul s'applique aussi bien à la première qu'à la deuxième partie. Et c'est rapide, genre vraiment rapide puisque c'est simplement du calcul. Mieux encore, alors que pour la première partie il faut traiter trois ou quatre régates, pour la seconde il n'y en a plus qu'une seule, donc c'est trois ou quatre fois plus rapide. :-)

    En pratique, en Python 3 ça prend dans les 50 millisecondes pour la première comme pour la seconde partie, mais je soupçonne que ce soit essentiellement la compilation et le temps de chargement de la machine virtuelle Python.

  • # DĂ©coupage d'intervalles en Python

    Posté par  (site web personnel) . En réponse au message Advent of Code 2023 : Day 5. Évalué à 5.

    On arrive au genre d'exercice où la résolution simple de la première partie devient inapplicable à la seconde partie, parce qu'il lui faudrait plus de mémoire qu'il n'y en a sur Terre ou plus de temps que l'âge de l'univers. Là, on est plutôt dans le second cas, je dirais.

    Bref, ce n'est pas la première fois que je me retrouve à couper des intervalles en morceaux, alors c'est cadeau, voici du code pour faire ça. Je réutilise le type range qui correspond plutôt bien au concept.

    def intersects(range1: range, range2: range) -> bool:
        """Tell whether or not the two ranges have a part in common."""
        if range1.start >= range1.stop or range2.start >= range2.stop:
            raise ValueError("usupported empty range") 
        if range1.step != 1 or range2.step != 1:
            raise ValueError("unsupported stepped range")
        return range1.stop > range2.start and range2.stop > range1.start
    
    def intersect(range1: range, range2: range) \
            -> tuple[Optional[range], Sequence[range], Sequence[range]]:
        """Given two ranges, returns:
        1. the eventual intersection of both ranges;
        2. parts of the first range that are not part of the second one;
        3. parts of the second range that are not part of the first one.
        """
        if range1.start >= range1.stop or range2.start >= range2.stop:
            raise ValueError("usupported empty range") 
        if range1.step != 1 or range2.step != 1:
            raise ValueError("unsupported stepped range")
        if not intersects(range1, range2):
            # Disjoint ranges
            return None, (range1,), (range2,)
        diff1: list[range] = []
        if range1.start < range2.start:
            diff1.append(range(range1.start, range2.start))
        if range2.stop < range1.stop:
            diff1.append(range(range2.stop, range1.stop))
        diff2: list[range] = []
        if range2.start < range1.start:
            diff2.append(range(range2.start, range1.start))
        if range1.stop < range2.stop:
            diff2.append(range(range1.stop, range2.stop))
        return (range(max(range1.start, range2.start),
                      min(range1.stop, range2.stop)),
                diff1, diff2)
  • [^] # Re: lineage, dumbphone ou rien ;)

    Posté par  (site web personnel) . En réponse au message Un Samsung "sans pubs" : lineageos ou pas ?. Évalué à 5.

    fairphone affiche de très mauvais retours..

    Le Fairphone 2, oui. Mais ça commence à dater, comme info, quand même. Depuis, on en est au Fairphone 4, en fait.

  • [^] # Re: Commencer Ă  reprĂ©senter le problème pas trop bĂŞtement.

    Posté par  (site web personnel) . En réponse au message Advent of Code 2023 : Day 2. Évalué à 4.

    Tu n'utilises pas enum.Enum ? Je trouve ça bien pratique pour, eh bien, les cas comme les couleurs, là.

  • # En Python

    Posté par  (site web personnel) . En réponse au message Advent of Code 2023 : Day 4. Évalué à 4.

    #! /usr/bin/python3
    
    # Advent of Code 2023, day 4
    
    from __future__ import annotations
    
    from collections.abc import Iterable
    from typing import Self
    
    import re
    
    
    class Card:
        def __init__(self, id_: int, win_nums: Iterable[int], got_nums: Iterable[int]):
            self.id = id_
            self.win_nums = set(win_nums)
            self.got_nums = set(got_nums)
            self._matches: Optional[int] = None
    
        pattern = re.compile(r'^Card +(\d+): ([ \d]+) \| ([ \d]+)\n?$')
    
        @classmethod
        def import_line(cls, line: str) -> Self:
            if (m := cls.pattern.match(line)) is not None:
                return cls(int(m[1]), (int(word) for word in m[2].split()), (int(word) for word in m[3].split()))
            print(line)
            raise ValueError("invalid card description")
    
        @property
        def matches(self) -> int:
            if self._matches is None:
                self._matches = len(self.win_nums & self.got_nums)
            assert self._matches is not None
            return self._matches
    
        @staticmethod
        def _num_to_points(num: int) -> int:
            if num <= 0:
                return 0
            return 2 ** (num - 1)
    
        def points(self) -> int:
            return self._num_to_points(self.matches)
    
    
    def solve_both_parts(lines: aoc.Data) -> tuple[int, int]:
        """Solve puzzle parts 1 and 2: determine the sum of all card values and the total number of cards"""
        # Import
        cards: list[int, Card] = []
        for line in lines:
            card = Card.import_line(line)
            cards.append(card)
        # Part 1
        points = sum(card.points() for card in cards)
        # Part 2
        copies = [1 for card in cards]
        for i, card in enumerate(cards):
            for j in range(i + 1, i + 1 + card.matches):
                copies[j] += copies[i]
        return points, sum(copies)
  • # Advent of Code Charts

    Posté par  (site web personnel) . En réponse au journal Advent of code 2023. Évalué à 4.

    Pour les amateurs, il y a une extension Firefox qui permet d'afficher des courbes et des stats plus détaillées que ce qui est indiqué dans la page Web du leaderbord :
    https://addons.mozilla.org/fr/firefox/addon/advent-of-code-charts

  • [^] # Re: Elon

    Posté par  (site web personnel) . En réponse au journal SNCF/RATP et X (Twitter). Évalué à 8.

    Non, l'argent ne s'évapore pas, enfin si mais pas comme ça. Les deux seules choses qui détruisent de l'argent, c'est :

    • brĂ»ler des billets de banque ou fondre des pièces de monnaie ;
    • rembourser des emprunts bancaires.

    Acheter une boîte, puis que la cotation boursière de cette dernière chute, ça ne détruit pas d'argent. C'est comme acheter une maison, puis qu'un aéroport soit construit à côté et qu'elle perdre les trois quarts de sa valeur de revente.

    C'est tout simple, quand on achète un truc, on ne détruit pas d'argent, on en donne au vendeur en échange de ce qu'on achète. Et si ça perd de sa valeur, tant qu'on ne le revend pas, ça ne change rien. Mais vraiment rien, je veux dire : si j'achète une maison pour y habiter, le fait qu'elle perde la moitié de sa valeur ne change strictement rien : ça ne change pas la façon dont je rembourse mon emprunt, ça ne change pas mes charges, ça ne change pas mes impôts, ça ne change rien, vraiment rien. Et en particulier, ça ne détruit pas d'argent.

    La seule chose que ça change se produira le jour où je revendrai ce que j'ai acheté. J'en obtiendrai moins d'argent en échange. Mais ça ne détruira toujours pas d'argent.

    Donc, pour en revenir à M. Musk, à moins qu'il ne souhaite revendre Twitter, le fait que le cours de l'action ait dégringolé ne lui change rien. S'il comptait revendre un jour, en revanche, il doit avoir les boules, c'est sûr. S'il comptait empocher des dividendes, c'est plutôt mal barré aussi d'ailleurs, mais c'est un autre sujet, pas directement lié à la valeur de l'action.

  • # ram-pas-disque

    Posté par  (site web personnel) . En réponse au journal Un ramdisk pourquoi faire ?. Évalué à 5.

    Depuis quelque temps un ramdisk,

    Non.

    c’est-à-dire un système de fichier en RAM

    Oui.

    Plus précisément, un sous Linux, un tmpfs est un bien un système de fichiers en mémoire. En revanche, ce n'est pas un ramdisque, c'est à dire que ce n'est pas un morceau de mémoire réservé et présenté comme un périphérique bloc, sur lequel on viendrait mettre un système de fichiers. C'est un système de fichiers bien particulier, directement implémenté en mémoire.

  • [^] # Re: Smartphone reconditionnĂ©

    Posté par  (site web personnel) . En réponse au message Un photophone pas trop grand pour LineageOS : Pixel 6a, 7a, Galaxy S9, S10e ou bien ?. Évalué à 3.

    Au fait, c'est aussi le cas pour les Google Pixel. Vigilance.

  • [^] # Re: Smartphone reconditionnĂ©

    Posté par  (site web personnel) . En réponse au message Un photophone pas trop grand pour LineageOS : Pixel 6a, 7a, Galaxy S9, S10e ou bien ?. Évalué à 4.

    Attention, attention. Certains téléphones, notamment ceux de Samsung, existent en plusieurs versions, dont certaines spécifiques à des opérateurs et tout à fait verrouillées. En achetant un Samsung Galaxy S10 par exemple, il est tout à fait possible de se retrouver avec un appareil sur lequel LineageOS ne sera pas du tout installable.

    Les différentes versions d'un téléphone sont censées être identifiées par un nom technique, genre SM-G973x, mais pas mal de reconditionneurs indiquent n'importe quoi et on peut acheter un modèle donné alors que la description en indiquait un autre.

  • [^] # Re: Et pourtant elle marchait

    Posté par  (site web personnel) . En réponse au journal Et pourtant elle marche. Évalué à 4.

    Elle est partie au recyclage (même le scanner était bloqué) et moi à la concurrence (qui n'est pas mieux, mais autant faire tourner) pour le modèle le moins cher.

    Alors là, c'est vraiment dommage. Avec les modèles les moins chers, on a de grandes chances d'avoir le même genre de problème, et les acheter revient à encourager cela.

    À côté, il y a les imprimantes à réservoir d'encres. Toutes les grandes marques en font. Ça coûte plus cher à l'achat, mais ça vient avec une quantité d'encre qui, sous forme de cartouches, coûterait plus que le prix auquel on vient d'acheter l'imprimante et l'encre. Et c'est censé être conçu pour durer, donc, on peut l'espérer, sans ce genre de saloperie.

  • [^] # Re: Sosh Ă  31€

    Posté par  (site web personnel) . En réponse au message Quel FAI en 2023 ?. Évalué à 3.

    Ne pas fournir d'adresse IPv4 publique, ça peut se comprendre. Ne pas fournir d'adresse IPv6 publique en revanche, ça craint.

  • [^] # Re: Sosh Ă  31€

    Posté par  (site web personnel) . En réponse au message Quel FAI en 2023 ?. Évalué à 3.

    Tout Ă  fait ce genre de truc oui.

  • [^] # Re: abolitionniste

    Posté par  (site web personnel) . En réponse au journal Pornocriminalité : voici comment on finit par vouloir filtrer. Évalué à 4.

    Si tu pense que le fait que de présenter les femmes comme de la viande à consommer par les mecs n'est pas machiste, il y a un problème.

    Eh bien il n'y a pas de problème alors, parce que sur ce coup-là, je suis d'accord avec toi en fait.

    Mais ce n'était pas ce à quoi tu répondais.

  • [^] # Re: abolitionniste

    Posté par  (site web personnel) . En réponse au journal Pornocriminalité : voici comment on finit par vouloir filtrer. Évalué à 6.

    Abject, c'est une chose. Ce que je cherche vainement, c'est le machisme là-dedans. Le fait que la prostitution ou le travail d'actrice porno donne une certaine indépendance financière me semble juste être un constat, indépendamment des dégâts ou des bienfaits que ce genre de travail peut causer à soi-même et à autrui.

    Après, on peut causer sur ce que signifie une indépendance financière : indépendance de qui, déjà ? On est forcément dépendant de celui qui paie. Un chômeur est dépendant de son assureur social. Une prostituée qui travaille pour un proxénète est hautement dépendante de ce dernier. Une indépendante est dépendante… de ses clients, au minimum. Mais ces constats n'ont rien de machiste, que je sache.

    En fait je ne comprends toujours pas ce que le machisme vient faire à propos d'un constat qui relève de la finance personnelle.

  • [^] # Re: Puritanisme

    Posté par  (site web personnel) . En réponse au journal Pornocriminalité : voici comment on finit par vouloir filtrer. Évalué à 4.

    J'ai vu passer un cas dans les infos, d'une femme dont un ancien partenaire avait diffusé une vidéo sur PornHub (je crois) sans son consentement. En s'en apercevant, la première chose qu'elle a fait a été de le contacter lui, pour lui demander de l'enlever. Ce qu'il a fait. Si elle était passée par la voie judiciaire, ça aurait eu le même résultat, en beaucoup plus lent.

    Le problème, c'est que ladite vidéo avait entre-temps été copiée sur des tas de sites. Et visiblement, la victime n'a pas réussi à la faire retirer d'Internet, en gros…

  • [^] # Re: abolitionniste

    Posté par  (site web personnel) . En réponse au journal Pornocriminalité : voici comment on finit par vouloir filtrer. Évalué à 4.

    Tu ne vois pas le problème à supposer que le porno ou la prostitution serait une « opportunité pour assurer une indépendance financière » à certaine femmes ?

    Si si, je vois le problème. C'est pour ça que je précise que je ne suis pas d'accord avec des tas de choses dans le message auquel tu répondais.

    Mais remets déjà les choses dans l'ordre, l'argument en question était que le porno pouvait être une opportunité pour assurer une meilleure indépendance financière que la prostitution. Et là, ça ne me semble pas délirant. Je ne sais pas si c'est vraiment le cas, si une actrice porno est plus ou moins indépendante financièrement qu'une prostituée.

    Mais le fait de penser que c'est le cas ne me semble pas relever d'une pensée machiste. Ni le contraire d'ailleurs.

    Soyons logique. Admettons donc que penser que les actrices porno sont plus indépendante financièrement que les prostituées, relève du machisme. Dans ce cas, penser le contraire, c'est à dire que les prostituées sont plus indépendantes financièrement que les actrices porno, ce n'est pas machiste, du coup ?

  • [^] # Re: Sosh Ă  31€

    Posté par  (site web personnel) . En réponse au message Quel FAI en 2023 ?. Évalué à 5.

    Les forfaits 4G sont généralement plus limités et la stabilité de la connexion est un peu plus exposée aux conditions météo.

    Par ailleurs, en 4G les opérateurs ont tendance à faire beaucoup plus de trucs bizarres qui font penser à de l'inspection de trafic avec discrimination de certains flux par exemple.

  • [^] # Re: abolitionniste

    Posté par  (site web personnel) . En réponse au journal Pornocriminalité : voici comment on finit par vouloir filtrer. Évalué à 3.

    Là pour le coup, je n'arrive pas à voir ce qui relèverait du machisme. Des trucs avec lesquels je ne suis pas du tout d'accord, sans problème, mais du machisme, j'ai beau chercher, je ne vois pas.

  • [^] # Re: Pas d'inquiĂ©tude Ă  avoir

    Posté par  (site web personnel) . En réponse au message Arrêt des réseaux 2G/3G = obsolescence programmée des terminaux incompatibles VoLTE ?. Évalué à 3.

    Pour le coup, je ne pense pas que l'ARCOM permette une situation comme celle-lĂ .