Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.
La shoutbox n'est pas chargée par défaut pour des raisons de performances. Cliquez pour charger.

Forum Casio - Autres questions


Index du Forum » Autres questions » [Python] Plus ou moins en deux lignes
Kikoodx Hors ligne Ancien labélisateur Points: 3011 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()



Shadow15510 Hors ligne Administrateur Points: 5496 Défis: 18 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

Lephenixnoir En ligne Administrateur Points: 24145 Défis: 170 Message

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


Bien joué ! Quoique note à part, si ton test de primalité est sur une seule ligne c'est probablement pas hyper efficace. xD
Mon graphe (24 Mars): (gint#27 ; (Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; ...) || (shoutbox v5 ; v5)
Shadow15510 Hors ligne Administrateur Points: 5496 Défis: 18 Message

Citer : Posté le 08/01/2020 19:32 | #


Je te garantit que mon test de primarité sur une seule ligne est parfaitement au point et qu'en plus on peut choisir d'avoir une phrase ou un booléen en sortie…
"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: 24145 Défis: 170 Message

Citer : Posté le 08/01/2020 21:13 | #


Oh je n'ai pas dit qu'il ne marchait pas ! :o

Simplement que les algorithmes rapides/puissants pour tester la primalité ne tiennent pas en une ligne. Contrairement par exemple à la factorielle ou de toute façon ne peut pas vraiment faire mieux que la méthode facile. Donc dire que la primalité tient en une ligne n'est pas une "aussi bonne nouvelle" que pour la factorielle.

Je chipote hein, c'était plus une blague qu'autre chose... peut-être un peu tordue... ^^"
Mon graphe (24 Mars): (gint#27 ; (Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; ...) || (shoutbox v5 ; v5)


Oskar130357 Invité

Citer : Posté le 09/01/2020 11:45 | #


Salut à vous, on peut encore gagner 3 symboles en remplaçant le « or » par un plus (et en inversant les deux termes)

r=__import__("random").randint(1,100);f=lambda:(lambda e:(print(["+","Congratz you found it!","-"][(e>r)+(e>=r)]),f()+e==r))(int(input("Enter your guess:\n> ")));f()
Lephenixnoir En ligne Administrateur Points: 24145 Défis: 170 Message

Citer : Posté le 09/01/2020 11:52 | #


Bien tenté, mais... hélas non. Le or ici ne sert pas à calculer les deux nombres mais à arrêter d'appeler f() quand e devient égal à r. Dans la version avec +, l'opérande de gauche f()+e est évaluée à chaque fois et du coup le jeu continue de demander des nombres à l'utilisateur même une fois que la valeur secrète a été trouvée.
Mon graphe (24 Mars): (gint#27 ; (Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; ...) || (shoutbox v5 ; v5)
Cakeisalie5 Hors ligne Ancien administrateur Points: 1896 Défis: 11 Message

Citer : Posté le 10/05/2021 23:00 | #


Trop bien, on m'a linké ce topic ! J'avais envie de faire un simili-one liner (j'avoue du coup j'ai fait en deux), ça donne ça :

n=__import__("random").randint(1,100)
while (lambda x:(lambda:print("non")or 1, lambda:(0,print("empxolaiucnsts"[(int(x)!=n)+(int(x)<n)::3])or 1)[int(x)!=n])[x.isnumeric()]())(input()):pass

Bon je l'ai pas fait en vrai code golf ni avec l'élégance de la récursivité de Lephé, mais ça reste sympathique j'imagine. Et puis je gère les entrées invalides avec .isnumeric() (malheureusement les try/catch sur une seule ligne...)

Merci @Kikoodx de m'avoir linké ça

Promotion ordinaire sur les inscriptions sur Planète Casio : en ce moment, c'est gratuit !

Mon blogBesoin d'utilitaires de transfert vers et depuis la calculatrice sous GNU/Linux ?
Lephenixnoir En ligne Administrateur Points: 24145 Défis: 170 Message

Citer : Posté le 10/05/2021 23:02 | #


Joli le trickz avec les textes entremêlés. x3
Mon graphe (24 Mars): (gint#27 ; (Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; ...) || (shoutbox v5 ; v5)
Cakeisalie5 Hors ligne Ancien administrateur Points: 1896 Défis: 11 Message

Citer : Posté le 10/05/2021 23:03 | #


Courtesy of @Julese50 et son "ftarlusee" enseigné sur les code golf de CodinGame

Promotion ordinaire sur les inscriptions sur Planète Casio : en ce moment, c'est gratuit !

Mon blogBesoin d'utilitaires de transfert vers et depuis la calculatrice sous GNU/Linux ?
Dark storm En ligne Labélisateur Points: 11631 Défis: 176 Message

Citer : Posté le 10/05/2021 23:12 | # | Fichier joint


Je dois avouer que j'ai eu un coup de chance monstrueux

>>> n=__import__("random").randint(1,100)
>>> while (lambda x:(lambda:print("non")or 1, lambda:(0,print("empxolaiucnsts"[(int(x)!=n)+(int(x)<n)::3])or 1)[int(x)!=n])[x.isnumeric()]())(input()):pass
...
50
plus
75
moins
60
exact
>>>

Un cas d'usage minimal avec tous les cas du premier coup. Je vous jure j'ai pas triché.


La preuve en images (oui, j'ai fail la première fois, il fallait deux retours pour valider la fonction)

Finir est souvent bien plus difficile que commencer. — Jack Beauregard

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 v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 89 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