Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.

Forum Casio - Autres questions


Index du Forum » Autres questions » [Python] Plus ou moins en deux lignes
Kikoodx Hors ligne Labélisateur Points: 2652 Défis: 11 Message

[Python] Plus ou moins en deux lignes

Posté le 02/01/2020 12:18

Salut ! Après une remarque de Mactul sur son serveur Discord, j'ai codé un plus ou moins en deux lignes.
Voici le code, je voulais savoir s'il est possible de le raccourcir en une ligne (je n'ai pas réussi à intégrer le while sur la même ligne que le reste).
Merci d'avance

from random import randint;r=randint(1,100);e=0
while e!=r:e=int(input("Enter your guess:\n> "));print("Congratz you found it!" if e==r else "-" if e > r else "+");print()


EDIT : Solution de Lephénixnoir en une ligne et 168 octets !
r=__import__("random").randint(1,100);f=lambda:(lambda e:(print(["+","Congratz you found it!","-"][(e>r)+(e>=r)]),e==r or f()))(int(input("Enter your guess:\n> ")));f()



1, 2 Suivante
Lephenixnoir En ligne Administrateur Points: 20113 Défis: 143 Message

Citer : Posté le 02/01/2020 12:36 | #


Yup, totalement possible. Il suffit de remplacer la boucle par des fonctions récursives.

from random import randint; r=randint(1,100); e=0; f=lambda: g(int(input("Enter your guess:\n> "))); g=lambda e: h(e, print("Congratz you found it!" if e==r else "-" if e>r else "+")); h=lambda e, none: f() if e!=r else 0; f()

Edit: Also comme on ne peut pas mettre de point-virgule dans une lambda comme ça j'ai juste fait une fonction différente par "étape" de la boucle et je les appelle les unes à la suite des autres.
Kikoodx Hors ligne Labélisateur Points: 2652 Défis: 11 Message

Citer : Posté le 02/01/2020 12:42 | #


Oh bien pensé
Je n'avais même pas pensé qu'il était possible d'utiliser les lambdas de cette façon.
Je devrais dormir, et pourtant me voilà.
Lephenixnoir En ligne Administrateur Points: 20113 Défis: 143 Message

Citer : Posté le 02/01/2020 12:42 | #


Programmation fonctionnelle FTW
Tituya Hors ligne Rédacteur Points: 1662 Défis: 16 Message

Citer : Posté le 02/01/2020 12:44 | #


Vraiment très bien pensé, lephe t'avais déjà planché sur le problème avant ou alors tu sorts ça de tête sans pression ?
Bretagne > Reste du globe
(Et de toute façon, vous pouvez pas dire l'inverse grâce à Bzh)



Lephenixnoir En ligne Administrateur Points: 20113 Défis: 143 Message

Citer : Posté le 02/01/2020 12:51 | #


Non je ne prémédite pas ce genre de programmes très spécifiques non plus

Tiens pendant que j'y suis j'ai golfé un peu le truc. 192 168 octets

r=__import__("random").randint(1,100);f=lambda:(lambda e:(print(["+","Congratz you found it!","-"][(e>r)+(e>=r)]),e==r or f()))(int(input("Enter your guess:\n> ")));f()
Massena Hors ligne Rédacteur Points: 1806 Défis: 11 Message

Citer : Posté le 02/01/2020 12:53 | #


C'est encore du python ça ?
En tout cas ça ressemble plus du tout à ce qu'on nous aprrend bien sagement x)
Lephenixnoir En ligne Administrateur Points: 20113 Défis: 143 Message

Citer : Posté le 02/01/2020 13:03 | #


Tu m'as donné d'autres idées Massena. Du coup j'ai mis à jour mon post avec plus court (168 octets au lieu de 192, soit plus court que l'original sur deux lignes). Maintenant je retourne bosser

Et du reste oui c'est encore de Python, mais comme tout langage on peut pousser le bouchon pour raccourcir le code x)
Hackcell Hors ligne Membre Points: 1386 Défis: 11 Message

Citer : Posté le 02/01/2020 13:38 | #


Lephenixnoir a écrit :
Et du reste oui c'est encore de Python, mais comme tout langage on peut pousser le bouchon pour raccourcir le code x)


Vietnamese war brainfuck javascript flasback
Shadow15510 Hors ligne Administrateur Points: 4817 Défis: 16 Message

Citer : Posté le 05/01/2020 14:06 | #


J'ai trouvé une solution en deux lignes, mais 160 octets :
r=__import__("random").randint(1,100);e=int()
while e!=r:e=int(input("Enter your guess:\n> "));print(["-\n", "+\n", "Congratz you found it!\n"][(e<=r)+(e==r)])

"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

Kikoodx Hors ligne Labélisateur Points: 2652 Défis: 11 Message

Citer : Posté le 05/01/2020 14:13 | #


Shadow : e=int() est équivalent à e=0
Je devrais dormir, et pourtant me voilà.
Shadow15510 Hors ligne Administrateur Points: 4817 Défis: 16 Message

Citer : Posté le 05/01/2020 14:17 | #


Oui c'pas faux Du coup je suis à 156 octets…

Ajouté le 05/01/2020 à 14:24 :
Ah… Rectification, j'ai virer tous les espaces dans les listes, je suis à 154 octets avec ce code :
r=__import__("random").randint(1,100);e=0
while e!=r:e=int(input("Enter your guess:\n> "));print(["-\n","+\n","Congratz you found it!\n"][(e<=r)+(e==r)])

"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

Kikoodx Hors ligne Labélisateur Points: 2652 Défis: 11 Message

Citer : Posté le 05/01/2020 14:47 | #


Optimisation de la solution de Shadow vers 152 octets
r,e=__import__("random").randint(1,100),0
while e-r:e=int(input("Enter your guess:\n> "));print("\n"+("-","+","Congratz you found it!")[(e<=r)+(e==r)])

Je devrais dormir, et pourtant me voilà.
Shadow15510 Hors ligne Administrateur Points: 4817 Défis: 16 Message

Citer : Posté le 05/01/2020 14:48 | #


Bien joué
"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

Zezombye Hors ligne Rédacteur Points: 1727 Défis: 13 Message

Citer : Posté le 05/01/2020 15:23 | #


Sinon on peut virer les \n, print en rajoute automatiquement
Divers jeux : Puissance 4 - Chariot Wars - Sokoban
Ecrivez vos programmes basic sur PC avec BIDE
Kikoodx Hors ligne Labélisateur Points: 2652 Défis: 11 Message

Citer : Posté le 05/01/2020 15:29 | #


Zezombye a écrit :
Sinon on peut virer les \n, print en rajoute automatiquement

C'est pour le double saut à la ligne, lisibilité.
Jusqu'ici tous les programmes fonctionnent à l’identique de mon programme d'origine, qui faisait un saut à la ligne après chaque essai.
Je devrais dormir, et pourtant me voilà.
Shadow15510 Hors ligne Administrateur Points: 4817 Défis: 16 Message

Citer : Posté le 07/01/2020 18:38 | #


Je bloque sur un truc…
J'ai compris le coup de la liste avec les booléen ^^' mais j'ai pas compris comment faire un lambda récursif… et j'aimerai bien comprendre…
"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

Lephenixnoir En ligne Administrateur Points: 20113 Défis: 143 Message

Citer : Posté le 07/01/2020 18:43 | #


Les lambda sont récursifs tous seuls. Si tu écris lambda: g(), tu obtiens une fonction qui appelle g, peu importe ce que c'est.

Dans ce cas, si tu choisis que g est ce lambda avec g = lambda: g(), tu obtiens une fonction qui est la version récursive d'une boucle infinie.

Dans mon code c'est pareil. Ma fonction lambda appelle f, mais ne cherche pas à savoir ce que c'est avant que je ne l'exécute. Je peux donc créer la fonction sans qu'on me pose de questions, puis l'assigner à la variable f, et hop la boucle est formée.
Ityt Hors ligne Membre Points: 216 Défis: 0 Message

Citer : Posté le 07/01/2020 19:19 | #


Malin la technique de la fonction récursive, je garde ça dans un coin de ma tête (j'ai jamais fait de programmation fonctionnelle).
salut je m'appelle sacha et je viens du bourg-palette et voici mon meilleur ami pikachu
Lephenixnoir En ligne Administrateur Points: 20113 Défis: 143 Message

Citer : Posté le 07/01/2020 20:08 | #


Je ne peux que suggérer d'essayer la prog fonctionnelle de temps en temps, car cette façon de penser a bien des avantages !
Shadow15510 Hors ligne Administrateur Points: 4817 Défis: 16 Message

Citer : Posté le 08/01/2020 18:10 | #


Ok ! Merci ! Je connaissais pas du tout la prog récursive, mais depuis ce topic, j'ai fait une lib d'arithmétique avec des fonctions diverses, dont plusieurs sur une seule ligne : is_prime, fact… Ça m'a fait gagner presque 400 octets par rapport à mon code de base !!
"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

1, 2 Suivante

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v42 © créé par Neuronix et Muelsaco 2004 - 2021 | Il y a 69 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd