Ce jour signe le retour des singes !
Mais comme on ne parle pas le singe, on demande aux éléphants cavernicoles de nous traduire.
Mais oui, mais oui, apparemment les vapeurs soufrés du Volcan ne se sont pas dissipées dans notre cerveau.
Bref, les singes se renvoient des nombres, les additionnent, les multiplient, les divisent, et les soustraient, tombant toujours miraculeusement sur des entiers après les divisions, quel talent.
Objectif premier, quand on n'a pas encore compris la gravité de la situation : piger le chiffre que va dire le singe root !
Objectif second, quand on a compris notre initiale bévue : Savoir quoi dire sachant que le singe humn est du genre homo sapiens, et est… bah nous. Bref, savoir quoi dire pour que root reçoive deux nombres identiques !
C'est assez simple, mais il faut réfléchir, la force brute c'est tomber sur un nombre du genre 3 678 125 408 017 pour le second exercice, on ne fait pas de force brute avec ça, aussi optimisé soit le code.
Et donc on passe des heures à résoudre leur énigme à-la-con pour que les singes nous indiquent un raccourcis qui nous fera gagner dix minutes, voire perdre trois jours.
C'est le jeu :)
- Yth.
# Pas de force brute, mais soyons bourrins, oh oui, bourrins !
Posté par Yth (Mastodon) . Évalué à 2.
Pour l'exo 1 je fais du re.findall, str.replace, re.sub, et un gros eval dès que j'ai root.
Youpi, bourrin :)
Pour le 2, bah non.
On remplace
root: truc * much
parroot: truc - much
, ethumn: ????
parhumn: X
À la fin on a une grosse opération bourrée de parenthèses, avec au fond du fond
(X)
, il faut résoudrece truc = 0
.Donc on remonte en inversant les opérations, chaque parenthèse est
(nombre opération (trucs...))
ou((trucs...) opération nombre)
, des gros if tout moches, et à la fin le résultat.Sans finesse ça va assez vite : une demi seconde.
Zéro modélisation, à peine de la réflexion, zéro optimisations sauf l'eval ajouté dans l'iteration1 quand on peut réduire à un nombre, basta.
[^] # Re: Pas de force brute, mais soyons bourrins, oh oui, bourrins !
Posté par alkino . Évalué à 2.
C'est considéré comme de la triche si j'ai sorti
sympy.simplify
?[^] # Re: Pas de force brute, mais soyons bourrins, oh oui, bourrins !
Posté par Yth (Mastodon) . Évalué à 2.
Nope, si j'avais connu sympy je l'aurais utilisé.
Jadis j'avais un truc qui faisait ça sur ma HP48GX !
Je savais qu'un truc du genre existait en Python, mais j'ai jugé que le chercher et apprendre à l'utiliser serait plus long que de bourriner :)
[^] # Re: Pas de force brute, mais soyons bourrins, oh oui, bourrins !
Posté par alkino . Évalué à 2.
C'est assez simple et puissant.
Le
simplify()
fait uneval()
puis réduit l'équation.Le
solve()
résoudn1 - n2 == 0
sur la variablex
.[^] # Re: Pas de force brute, mais soyons bourrins, oh oui, bourrins !
Posté par Yth (Mastodon) . Évalué à 2. Dernière modification le 21 décembre 2022 à 10:51.
Donc je vire mon iteration2 puis :
Et voilà !
Finalement c'était facile à utiliser :D
[^] # Re: Pas de force brute, mais soyons bourrins, oh oui, bourrins !
Posté par Eric P. . Évalué à 1.
Personnellement j'ai fait un Tree et j'ai utilise de la recursion pour les deux parties.
1ere partie: node::calculate() renvoie child1.calculate() plus/moins/fois/divise par child2.calculate()
2e partie: node::findUnknown(expectedResult)-> Unknown
D'abord je fait un calculate() de chaque child pour savoir qui a une valeur et qui a l'unknown.
Imaginons que child1 a la valeur et node.operation est *, ma fonction retourne findUnknown(expectedResult / child1.val)
Imaginons que child1 a la valeur et node.operation est +, ma fonction retourne findUnknown(expectedResult - child1.val)
Etc.
Je fais findUnknown recursivement a partir du root et ca me donne la bonne reponse.
Excusez l'absence d'accents dans mes commentaires, j'habite en Australie et n'ai pas de clavier francais sous la main.
# Python, fait maison
Posté par 🚲 Tanguy Ortolo (site web personnel) . Évalué à 4.
Bon, fait maison, c'est à dire sans eval ni bibliothèque externe. On construit un arbre, pour la première partie on calcule récursivement la valeur du singe racine. Pour la deuxième partie, on force la valeur du singe racine, ce qui force récursivement la valeur des singes en-dessous, jusqu'à forcer la valeur de l'humain.
# python rebelle
Posté par steph1978 . Évalué à 3. Dernière modification le 21 décembre 2022 à 21:15.
On voulait me faire faire un AST et évaluer le bazar. Bah je voulais pas.
Du coup j'ai fait une boucle infinie jusqu'à tout évaluer.
Ça m'a permis de faire la partie 1 en quelques minutes.
Bon je l'ai un peu payé sur la partie 2, j'ai dû bidouiller. La vizu m'a permis de voir qu'il n'y a pas de lien entre les deux branches partant de root. Donc pas de réutilisation d'un résultat dans les deux sous arbres. Donc l'inconnu n'est impliqué que dans une seule équation. J'ai donc hardcodé a valeur du sous arbre de droite dans la racine du sous arbre de gauche, là où se situe "humn".
Chaque partie s'évalue en 0.30s et 10Mo de RAM.
part 1
part 2
# Aujourd'hui, on fait dans le sale.
Posté par syj . Évalué à 2. Dernière modification le 21 décembre 2022 à 23:56.
J'ai mis grosso modo 1h15.
Pour faire l'éval, j'ai utilisé un parser JEXL. Le problème est qu'il travaille en double & qu'il m'a fallut passer en BigDecimal pour éviter les pertes de précisions du au double.
Résultat, j'ai été obligé de transformer les expression pour utiliser des BigDecimal.
çà m'a permit de trouver rapidement la première étoile.
La deuxième étoile.
J'ai déjà commencé par réduire l'arbre d'évaluation, en gros tout ce qui ne dépend pas de humn.
Puis, j'ai rapidement vu que la fonction décroissé. J'aurai pu tenter une recherche dichotomique dans l'espace d'entier.
Mais j'étais trop fatigué pour coder un truc intelligent.
Résultat, j'ai monté une boucle qui permet de suivre l'évolution, j'ai joué manuellement sur les paramétres pour trouver la valeur
C'est tellement sale que je partage mon code pour une fois :-p
# Question naïve aux lutins du Père Noël qui font l'Avent du code
Posté par Ysabeau 🧶 (site web personnel, Mastodon) . Évalué à 4. Dernière modification le 22 décembre 2022 à 12:13.
Bravo pour votre persévérance ! Je suis assez admirative.
Vous l'aurez compris, je ne comprends absolument rien aux codes que vous produisez. Mais, j’aimerais bien savoir comment on peut en voir les résultats ?
Je me demande si ça ne mériterait pas, en fin de course, un document-texte-article final qui raconterait l'histoire, les embûches et les astuces ou leçons que vous en avez tiré pour vos codes. Sans forcément avoir le code d'ailleurs, ce serait plus la méthode et son histoire qui serait mise en valeur (et ça, en plus, je peux comprendre).
« Tak ne veut pas quʼon pense à lui, il veut quʼon pense », Terry Pratchett, Déraillé.
[^] # Re: Question naïve aux lutins du Père Noël qui font l'Avent du code
Posté par Yth (Mastodon) . Évalué à 2.
Parfois, les résultats, c'est juste un nombre débile sans autre intérêt que de valider qu'on a un algo qui fonctionne.
Par contre dans certains exercices il y a des visualisations sympas, comme les écoulements de sables, ou la géode en OpenSCAD.
[^] # Re: Question naïve aux lutins du Père Noël qui font l'Avent du code
Posté par Eric P. . Évalué à 1.
Quelqu'un a quand meme fait une modelisation 3D de tous les problemes:
https://www.youtube.com/playlist?list=PLkVWdOnWoL8PbyxdR6_Qq46s8T4nMYlol
Ca peut etre sympa a regarder en lisant les enonces sur Advent of Code.
Je n'ose imagine le temps que cette personne a passe pour d'abord resoudre le probleme, et ensuite faire toute la modelisation 3D.
Excusez l'absence d'accents dans mes commentaires, j'habite en Australie et n'ai pas de clavier francais sous la main.
[^] # Re: Question naïve aux lutins du Père Noël qui font l'Avent du code
Posté par Yth (Mastodon) . Évalué à 3.
Et pis j'vais mieux répondre, genre moins à côté de la plaque :)
Les seules stats réelles sont pour chacun combien de temps s'est écoulé entre la publication de l'exercice (6h du matin heure de Chaville), et l'heure où on a soumit une réponse valable, et numéro combien on est arrivé pour donner cette solution.
Ce qui a le sens qu'on veut bien lui donner, par exemple mon premier jour c'est ça :
On voit surtout la minute et trente secondes entre les deux exercices, mais les quasi 17h avant la première réponse, bah, c'est un peu le temps que je me rappelle qu'il y avait ce truc qui allait me bouffer un temps de dingue durant 25 jours !!
À côté on a ça :
5h c'est largement plus que ma moyenne, mais 2267è à finir l'exo2 c'est largement mieux que ma moyenne, donc j'ai été performant sur un exo difficile.
En comparaison hier, j'ai pataugé sur l'exercice 2 :
Autant dire que ça sert assez peu ces stats.
Par contre il y a les stats générales ici :
https://adventofcode.com/2022/stats
On y voit que le nombre de participants diminue beaucoup au fil du temps.
Et par exemple l'exercice du 22 a été fatal à plein de gens sur l'exercice 2 : c'est la plus grosse proportion de gens n'ayant fait que l'exercice 1 et abandonné le 2 !
D'ailleurs, ici, ceux qui ont validé le deux on fait ce qu'on appelle tricher pour y arriver.
Tricher c'est faire un code qui va fonctionner avec notre propre jeu de donnée, mais pas forcément avec celles du voisin. En l'occurrence avec une analyse statique et plastique des données (papier, ciseau, colle), pour rajouter des informations et permettre à notre code de sortir le résultat sans complètement « comprendre » le problème.
C'est le seul exercice où j'ai « triché », mais il y en a eu au moins un autre où j'ai un peu triché pour sortir le résultat avant de trouver comment être complètement générique, cf discussion sur le Jour du Tetris, le 17, et la tour à mille milliards de blocs.
Ma dernière version du programme peut te donner la réponse pour n'importe quel nombre de bloc, quelles que soient les données en entrée. Avec les miennes il suffit de calculer 5170 blocs, et quatre opérations (une soustraction, un modulo, une multiplication, et une addition), je te dis quelle est la taille de la tour pour X blocs.
Là c'est beau et pas triché :)
Après les discussions ici ont eu l'intérêt de donner des idées de programmation en général :
J'avoue que sur la fin, ça tient plus de la persévérance, voire de l'entêtement, que du pur plaisir.
Et demain et après-demain ça va être coton, surtout dimanche, je n'ai aucune idée de si je vais pouvoir les faire dimanche les exercices !
En tout cas pas si c'est trop long à coder…
Mais sinon oui, je pense qu'on pourra rechercher quelques morceaux choisis, des jolies représentations, et peut-être faire une dépêche à 14 mains, sur le ressenti, le pourquoi on le fait, et ce que ça apporte d'en discuter ici sur les forums de LunxFR, etc.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.