importrefromcollectionsimportdequefromioimportStringIOfromtypingimportDict,List,Iterable,Iterator,MutableSequence,Sequencefromtyping_extensionsimportProtocolclassCrane(Protocol):defload(self,stacks:Sequence[MutableSequence[str]],labels:Iterable[str])->None:...defmove(self,orig:str,dest:str,n:int)->None:...deftop(self)->str:...classCrateMover:def__init__(self)->None:self.stacks={}# type: Dict[str, MutableSequence[str]]self.labels=[]# type: List[str]defload(self,stacks:Sequence[MutableSequence[str]],labels:Iterable[str])->None:forstack,labelinzip(stacks,labels):self.stacks[label]=stackforlabelinlabels:self.labels.append(label)deftop(self)->str:result=StringIO()forlabelinself.labels:result.write(self.stacks[label][-1])returnresult.getvalue()classCrateMover9000(CrateMover):def__init__(self,*args,**kwargs)->None:super().__init__()defmove(self,orig:str,dest:str,n:int)->None:orig_stack=self.stacks[orig]dest_stack=self.stacks[dest]for_inrange(n):dest_stack.append(orig_stack.pop())classCrateMover9001(CrateMover):def__init__(self,*args,**kwargs)->None:super().__init__()defmove(self,orig:str,dest:str,n:int)->None:orig_stack=self.stacks[orig]dest_stack=self.stacks[dest]temp_stack=deque()# type: deque[str]for_inrange(n):temp_stack.appendleft(orig_stack.pop())dest_stack.extend(temp_stack)defsolve(lines:Iterator[str],crane:Crane)->str:re_crates=re.compile(r'^\s*\[')stacks=[]# type: List[deque[str]]# First lines are crate stack descriptionsforlineinlines:ifre_crates.match(line):# This line describes stacked cratesfori,labelinenumerate(line[1:len(line):4]):ifi>=len(stacks):stacks.append(deque())stack=stacks[i]iflabel!=' ':stack.appendleft(label)else:# This line provides the labels of crate stacksbreak# Current line provides the labels of crate stackslabels=line[1:len(line):4]# We have enough data to load the crane with crate stackscrane.load(stacks,labels)# Next line is a blank ones=next(lines)# Next lines are crate moving instructionsre_instruction=re.compile(r'^move (\d+) from (.) to (.)$')forlineinlines:m=re_instruction.match(line)ifmisNone:raiseValueError("unrecognized input line")n=int(m.group(1))orig=m.group(2)dest=m.group(3)crane.move(orig,dest,n)returncrane.top()defpart1(data:Iterable[str])->str:crane=CrateMover9000()returnsolve(iter(data),crane)defpart2(data:Iterable[str])->str:crane=CrateMover9001()returnsolve(iter(data),crane)
fromtypingimportIterable,TupleimportaocclassInterval:"""An interval of integers"""def__init__(self,start:int,end:int):"""Create a new interval of integers, from start to end included"""self.start=startself.end=enddefincludes(self,other):"""Does this interval include the other one?"""returnself.start<=other.startandself.end>=other.enddefoverlaps(self,other):"""Does this interval overlap the other one?"""returnself.end>=other.startandself.start<=other.enddefimport_interval(s:str)->Interval:"""Import an interval from a string such as "2-4" """part1,part2=s.split('-')returnInterval(int(part1),int(part2))defimport_pairs(lines:Iterable[str])->Iterable[Tuple[Interval,Interval]]:"""Import a pair of intervals from a line such as "2-4,5-8\\n" """forlineinlines:part1,part2=line.rstrip().split(',')yieldimport_interval(part1),import_interval(part2)defsolve_both(lines:Iterable[str])->Tuple[int,int]:"""Solve both parts of today's puzzle"""inclusions=0overlaps=0fora1,a2inimport_pairs(lines):ifa1.includes(a2)ora2.includes(a1):inclusions+=1ifa1.overlaps(a2):overlaps+=1returninclusions,overlaps
#! /usr/bin/python3# Advent of Code 2022, day 2fromtypingimportIterable,Optional,TypeVar# '@' is not a valid item type, but it does no harm, and having it makes the# value of each item type equal to its index in this string. :-)letters="@abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"priorities={letter:valuefor(value,letter)inenumerate(letters)}classRucksack:def__init__(self,left:str,right:str):self.left=leftself.right=rightdefanomaly(self)->str:forletterinself.left:ifletterinself.right:returnletterraiseValueError("no anomaly in this rucksack")def__contains__(self,letter:str)->bool:returnletterinself.leftorletterinself.rightdefimport_sack(line):n=len(line)-1# do not count final '\n'left=line[0:n//2]right=line[n//2:n]returnRucksack(left,right)T=TypeVar('T')defgroup(iterable:Iterable[T],n:int)->Iterable[list[T]]:result=[]# type: list[T]foriteminiterable:result.append(item)iflen(result)>=n:yieldresultresult=[]yieldresultdefpart1(lines:Iterable[str])->int:total=0forlineinlines:sack=import_sack(line)total+=priorities[sack.anomaly()]returntotaldefpart2(lines:Iterable[str])->int:total=0forline_groupingroup(lines,3):sacks=[import_sack(line)forlineinline_group]forletterinletters:ifall(letterinsackforsackinsacks):total+=priorities[letter]breakreturntotal
fromtypingimportIterable,Tupledefsolve_both(lines:Iterable[str])->Tuple[int,int]:# Symbol -> value for part 1values1={'A':1,'B':2,'C':3,'X':1,'Y':2,'Z':3}# Symbol -> value for part 2values2={'A':1,'B':2,'C':3,'X':-1,'Y':0,'Z':1}score1=0# for part 1score2=0# for part 2forlineinlines:char1,char2=line.split()# Values for part 1value1_1,value1_2=values1[char1],values1[char2]outcome1=((value1_2-value1_1+1)%3)*3# Values for part 2value2_1,result2=values2[char1],values2[char2]value2_2=(value2_1+result2-1)%3+1outcome2=((result2+1)%3)*3# We are player 2!score1+=value1_2+outcome1score2+=value2_2+outcome2returnscore1,score2
importcollectionsimportitertoolsfromcollections.abcimportIterable,SequenceimportaocclassPack:"""An elf backpack, containing a list of food items"""def__init__(self,items:Sequence[int])->None:"""Create an elf backpack containing the providing items (an item is actually an amount of energy, in calories)"""self.items=itemsdeftotal(self)->int:"""Return the total energy corresponding to the items in a backpack"""returnsum(self.items)defimport_packs(lines:Iterable[str])->Iterable[Pack]:"""Read input lines and return an iterator, yielding one elf backpack at a time"""items=[]# type: list[int]forlineinlines:ifline=='\n':# A newline separates the description of one backpack from the next# one. Therefore, a pack has been entirely listed and can be# yielded.yieldPack(items)items=[]continueitems.append(int(line))# The last pack has been entirely listed and we have to yield it too.yieldPack(items)
defpart1(lines:Iterable[str])->int:"""Solve puzzle part 1: determine the backpack containing most energy, and return the amount of energy it contains"""packs=import_packs(lines)returnmax(pack.total()forpackinpacks)
defpart2(lines:Iterable[str])->int:"""Solve puzzle part 2: determine the three backpacks containing most energy, and return the amount of energy they contain"""packs=import_packs(lines)totals=(pack.total()forpackinpacks)# Sort the energy totals so the greatest are at the end, and sum the three# last onesreturnsum(sorted(totals)[-3:])
Java Web Start : si je me souviens bien, ce n'est pas vraiment du web dynamique, ça, juste un mode de distribution de logiciels jetables. Même impression qu'avec Java.
PlutĂ´t que de stocker une liste de tous les poissons avec leur compteur interne, l'astuce est de plutĂ´t stocker, pour chaque valeur possible de compteur interne (de 0 Ă 8), le nombre de poissons qui ont cette valeur-lĂ .
#! /usr/bin/python3fishes=[0]*9# for each value of their internal timer, the number of fishes with that valuewithopen("6.in")asf:forwordinf.read().rstrip().split(','):fishes[int(word)]+=1fordayinrange(256):new_fishes=[0]*9fori,ninenumerate(fishes):ifi==0:new_fishes[6]+=nnew_fishes[8]+=nelse:new_fishes[i-1]+=nfishes=new_fishesprint(sum(fishes))
# En Python
Posté par 🚲 Tanguy Ortolo (site web personnel) . En réponse au message Avent du Code, jour 5. Évalué à  3. Dernière modification le 05 décembre 2022 à 11:37.
Ce qui est assez casse-pied dans ce problème, c'est que les données d'entrées sont dans un ordre qui est optimisé pour la lecture par un lutin grutier ou en l'occurrence une lutine grutière.
Bref, voici le code :
# En Python
Posté par 🚲 Tanguy Ortolo (site web personnel) . En réponse au message Avent du Code, jour 4. Évalué à  4.
En Python, en utilisant une classe dédiée (je trouve que ça se lit mieux ainsi) :
[^] # Re: un bout de AWK
Posté par 🚲 Tanguy Ortolo (site web personnel) . En réponse au message Avent du Code, jour 4. Évalué à  5.
C'était en effet parfaitement taillé pour Awk !
# En Python, classieux
Posté par 🚲 Tanguy Ortolo (site web personnel) . En réponse au message Avent du Code, jour 3. Évalué à  3.
[^] # Re: Déjà dans la rubrique liens
Posté par 🚲 Tanguy Ortolo (site web personnel) . En réponse au journal Office 365 et Google Workspace en difficulté chez l'école républicaine. Évalué à  10. Dernière modification le 02 décembre 2022 à 15:33.
Oui : étudier sans informatique, sauf lorsqu'il s'agit d'apprendre la bureautique et l'informatique.
Sérieusement, les connaissances de compétences de base que l'école est censée transmettre n'ont pas changé depuis cinquante ans, c'est toujours lire, compter, calculer, réfléchir, puis pour aller plus loin, étudier des textes littéraires, résumer, raisonner, avec des bases en diverses sciences. Que des trucs qui se faisaient très bien sans informatique, et qui peuvent toujours très bien se faire sans informatique.
Je soupçonne même que ces trucs se feraient sans doute mieux sans informatique.
L'informatique est indispensable lorsqu'il s'agit d'apprendre la bureautique. Ça se fait sans problème sous Google ni Microsoft. L'informatique est, en revanche, secondaire lorsqu'il s'agit d'apprendre la programmation, c'est important à rappeler. L'algorithmique et toute ça théorique, ça se fait sans ordinateur, en tout cas sans coder, donc sans problème avec un tableau noir et du papier.
# En Python bref
Posté par 🚲 Tanguy Ortolo (site web personnel) . En réponse au message Avent du Code, jour 2. Évalué à  4.
Toujours en Python, mais aujourd'hui, point de modélisation objet, c'est du concis, plus en mode calcul :
[^] # Re: En Python classieux
Posté par 🚲 Tanguy Ortolo (site web personnel) . En réponse au message Avent du Code, jour 1. Évalué à  4.
(Oui, j'aime bien modéliser avec des classes, même quand ça n'a aucun intérêt pratique.)
# En Python classieux
Posté par 🚲 Tanguy Ortolo (site web personnel) . En réponse au message Avent du Code, jour 1. Évalué à  4. Dernière modification le 01 décembre 2022 à 14:10.
Du code commun aux deux parties, essentiellement pour modéliser et importer les données :
Première partie, on veut le total de l'énergie du sac qui en contient le plus :
Deuxième partie, on veut le total de l'énergie des trois sacs qui en contiennent le plus :
Je ne suis pas très satisfait par le fait de trier les totaux, j'aurais bien aimé faire ça en parcourant simplement les sacs, mais je n'ai pas trouvé de façon élégante de le faire.
# C'est parti !
Posté par 🚲 Tanguy Ortolo (site web personnel) . En réponse au journal Calendrier de l'Avent du code. Évalué à  5.
Et voilà , cette année, le Père Noël a été invité par ses lutins à participer à leur récolte annuel de fruits étoilés destinés à nourrir les rennes et leur apporter l'énergie magique nécessaire à la tournée de Noël.
We wish you a merry Christmas and a happy hacking!
# Flash
Posté par 🚲 Tanguy Ortolo (site web personnel) . En réponse au sondage La pire tentative de web dynamique fut.... Évalué à  10.
Flash, mais après avoir hésité. Mon avis :
[^] # Re: le futur nous réserve bien des surprises !
Posté par 🚲 Tanguy Ortolo (site web personnel) . En réponse au journal Quelques joyeusetés que nous réserve le futur…. Évalué à  6.
Même constat pour le côté vidéo et audio. Personnellement, je déteste ça, quand on me passe un enregistrement d'une conférence, je cherche tout de suite à savoir s'il n'y en a pas une transcription.
Mais en revanche, je maintiens que j'ai toujours l'impression de subvocaliser quand je lis. Comme quand je pense d'ailleurs.
[^] # Re: le futur nous réserve bien des surprises !
Posté par 🚲 Tanguy Ortolo (site web personnel) . En réponse au journal Quelques joyeusetés que nous réserve le futur…. Évalué à  4.
C'est très curieux, personnellement j'ai bien l'impression de prononcer dans ma tête, mais beaucoup plus vite que si je lisais à voix haute. D'ailleurs, j'ai une vitesse de lecture plutôt rapide, comparée à celle des gens avec qui j'ai pu comparer. Et ça me permet de lire des textes longs et complexes en les comprenant bien.
Mais à côté de ça, j'ai entendu parler de lecture rapide, une technique de lecture sans prononcer dans sa tête, qui serait bien plus rapide. J'ai essayé un peu, mais je n'ai pas accroché, sans doute pas assez pour bien me rendre compte. Pour le peu que j'ai fait, ça m'a justement donné l'impression de survoler un texte sans bien rentrer dedans, c'est très curieux.
[^] # Re: Ardoise magique
Posté par 🚲 Tanguy Ortolo (site web personnel) . En réponse au journal J'ai testé: une ardoise à cristaux liquides. Évalué à  3. Dernière modification le 29 novembre 2022 à 17:54.
Non rien.
# Ardoise magique
Posté par 🚲 Tanguy Ortolo (site web personnel) . En réponse au journal J'ai testé: une ardoise à cristaux liquides. Évalué à  8.
Je me demande s'il n'existe pas un truc plus low-tech qui répondrait au même besoin: l'ardoise magique. C'est un jouet pour enfants, mais la fonctionnalité a l'air d'être la même, non ?
[^] # Re: le futur nous réserve bien des surprises !
Posté par 🚲 Tanguy Ortolo (site web personnel) . En réponse au journal Quelques joyeusetés que nous réserve le futur…. Évalué à  7.
Ça l'est certainement, et c'est une bonne idée, c'est encore plus lisible sans souffrir d'une impression de redondance. Et c'est tout à ton honneur, parce que ça demande encore plus de temps pour écrire ainsi. Ça ne doit pas être évident pour que les phrases n'aient pas l'air trop impersonnelles ou mécaniques je pense.
[^] # Re: le futur nous réserve bien des surprises !
Posté par 🚲 Tanguy Ortolo (site web personnel) . En réponse au journal Quelques joyeusetés que nous réserve le futur…. Évalué à  10.
Il y a plusieurs formes d'écriture inclusive, tout de même. Notamment :
La première consiste, pour l'auteur ou l'autrice, à économiser du temps – et encore, il n'est même pas certain que cela en fasse gagner – en le faisant payer aux lectrices et lecteurs. Parce que, pour la plupart des gens, lire, c'est prononcer dans sa tête, tout de même, et un truc comme « heureu⋅x⋅ses », eh bien ce n'est pas prononçable, il faut d'abord faire une étape de développement ou d'élimination d'une des deux alternatives dans sa tête.
La seconde consiste à prendre le temps d'écrire quelque chose de lisible. Je trouve ça bien plus respectueux. Et tout aussi inclusif, pour ceux qui se poseraient la question : « heureuses et heureux », ça veut dire la même chose que, sauf que c'est grammaticalement et orthographiquement correct et que ça se lit directement sans aucune difficulté.
Je n'ai pas lu cette nouvelle, mais on parle de quelle forme d'écriture inclusive au juste ? La version optimisée pour l'auteur ou l'autrice ou celle optimisée pour la lecture ? Avec un soupçon de mots inventés peut-être ?
C'est un peu comme lorsqu'on appelle quelqu'un et qu'on tombe sur son répondeur, deux options possibles :
[^] # Re: Ada corse le tout
Posté par 🚲 Tanguy Ortolo (site web personnel) . En réponse au journal Calendrier de l'Avent du code. Évalué à  5.
C'est expliqué dans leur annonce, évidemment il faut montrer le code pour chaque casse-tête.
[^] # Re: Ada corse le tout
Posté par 🚲 Tanguy Ortolo (site web personnel) . En réponse au journal Calendrier de l'Avent du code. Évalué à  4.
Ça, c'est typique des problèmes avec une résolution intuitive pas optimale, et qui devient intenable pour la seconde partie.
PlutĂ´t que de stocker une liste de tous les poissons avec leur compteur interne, l'astuce est de plutĂ´t stocker, pour chaque valeur possible de compteur interne (de 0 Ă 8), le nombre de poissons qui ont cette valeur-lĂ .
# Seulement un décalage ?
Posté par 🚲 Tanguy Ortolo (site web personnel) . En réponse à la dépêche Nouveaux préfixes SI et avenir de la seconde intercalaire. Évalué à  6.
Si je comprends bien, la valeur d'une seconde UT1 est variable. Parfois plus courte que celle de la seconde UTC, parfois plus longue.
Avec une définition commune du jour (24 heures de 60 minutes de 60 secondes), ces deux temps se retrouvent normalement en décalage. Pour le moment, on a toujours géré des cas où UTC était en avance sur UT1, et on l'a recalé en lui ajoutant une seconde de temps en temps.
On parle donc d'une simple translation d'UTC. C'est bien si la durée de la seconde UT1 reste en moyenne assez proche d'une seconde UTC. Mais si, disons, la rotation de la Terre diminue pendant un moment, c'est plus qu'un simple décalage, qu'il faudrait, c'est une modification de la définition de la seconde.
En somme, au lieu d'ajouter ou de retirer une seconde de temps en temps, on parle d'ajouter ou de retirer un paquet de secondes à un moment donné, c'est ça ?
[^] # Re: l'Avent, qui commence au 1er décembre ?
Posté par 🚲 Tanguy Ortolo (site web personnel) . En réponse au journal Calendrier de l'Avent du code. Évalué à  4.
C'est vrai, ça commence ce dimanche. Seulement, comme la quasi-totalité des calendriers de l'Avent, celui-ci commence le 1er décembre, c'est dans doute plus facile ainsi pour son auteur.
Avec ou sans la virgule, la phrase reste ambiguë, elle peut se comprendre comme signifient que ce calendrier commence le 1er décembre, ce que j'ai bien sûr voulu dire. Et elle peut se lire comme vient dire que l'Avent commence le 1er, ce qui est faux.
[^] # Re: Masquer le root ?
Posté par 🚲 Tanguy Ortolo (site web personnel) . En réponse au journal FranceConnect+ et vous?. Évalué à  6. Dernière modification le 18 novembre 2022 à 17:18.
Sauf que les applis en question ont des fonctionnalités qui sont généralement un sous-ensemble de celles disponibles sur leur site Web, accessible sans restriction depuis n'importe quel navigateur.
Donc, pourquoi, pour fournir un service qu'ils fournissent très bien avec un simple site Web, mettent-ils des contrôles de sécurité supérieur lorsqu'ils s'agit d'un logiciel pour téléphone ?
[^] # Re: Masquer le root ?
Posté par 🚲 Tanguy Ortolo (site web personnel) . En réponse au journal FranceConnect+ et vous?. Évalué à  4. Dernière modification le 18 novembre 2022 à 16:49.
Ou l'utilisation d'un site web avec navigateur sous debogueur, disons ? Je mentionne un débogueur, parce que c'est justement un logiciel différent, qui a sans accès à la mémoire du navigateur justement.
[^] # Re: Masquer le root ?
Posté par 🚲 Tanguy Ortolo (site web personnel) . En réponse au journal FranceConnect+ et vous?. Évalué à  3.
Quelle différence par rapport à l'utilisation de deux sites Web sur un navigateur sur PC ?
[^] # Re: Masquer le root ?
Posté par 🚲 Tanguy Ortolo (site web personnel) . En réponse au journal FranceConnect+ et vous?. Évalué à  8.
Quelle différence par rapport à l'utilisation du site Web de ma banque depuis mon PC ?
Quelle différence par rapport à l'utilisation du site Web de ma banque depuis mon PC ?
[^] # Re: Masquer le root ?
Posté par 🚲 Tanguy Ortolo (site web personnel) . En réponse au journal FranceConnect+ et vous?. Évalué à  10.
Dans ce cas ça ne sert à rien. Un logiciel bien conçu ne devrait pas laisser sortir quoi que ce soit de compromettant, auquel l'utilisateur n'est pas déjà censé avoir accès, même en accédant à sa mémoire.
Ou, pour le dire autrement, un logiciel dont la sécurité dépend de la sécurité du terminal, c'est de la merde.
Sauf que téléphone rooté et téléphone dont je suis admin, c'est synonyme. Considérer un système rooté comme moins sûr, c'est considérer que le fait que j'en sois administrateur le rend moins sûr.
La seule chose qui est contournée en rootant, c'est le fait de ne pas être admin.