Défiez le problème 5 avec Python: lambda ... N'allez pas profondément dans le one-liner ...

Problème de défi 5 qu'un ingénieur logiciel devrait résoudre en 1 heure Dans les commentaires, podhmo m'a donné un one-liner. Merci beaucoup. (Voir Article original pour le produit réel.)

Je ne pouvais pas du tout comprendre le sens même si je le regardais, alors j'ai essayé de le briser et de lui donner une forme que je pourrais comprendre.

Un flux totalement flou depuis le début

(lambda f: (lambda x: x(x))(lambda y: f(lambda v: y(y)(v))))

Je peux sentir la sensation ronde et ronde, mais ... c'est un mystère. Si vous essayez google tel quel, cela semble être un combinateur Y. Il semble que vous puissiez se répéter en tant que fonction anonyme. Pardon. Je vais vous laisser passer maintenant. Parce que mes yeux se sont retournés.

Je lui ai donné un nom pour que je puisse le comprendre

C'est comme ça?

c=(lambda xs:
	[ [xs[0]] ] if len(xs) <= 1 else
    __import__("itertools").chain(
        [ [xs[0], ""] + y for y in c(xs[1:]) ],
        [ [xs[0], " + "] + y for y in c(xs[1:]) ],
        [ [xs[0], " - "] + y for y in c(xs[1:]) ]
    )
)

print( "\n".join(
            [   x for x in
                [   "".join(str(y) for y in z )
                        for z in c(range(1, 10 ) )
                ]
                if eval(x) == 100
            ]
       )
)

Cela signifie t-il? Je me suis demandé si je ferais cela au début, mais je ne savais pas quoi faire. J'ai beaucoup appris.

au fait...

Vous pouvez mettre une fonction récursive dans ~~ def, mais vous ne pouvez pas la mettre dans lambda ~~

Il semble ~~. ~~ C'est fait. Voir ci-dessous.

Celui ci-dessous définissant c dans q_5_1 avec def a bien fonctionné.

def q_5_1():
    def c(xs):
        return ([[xs[0]]] if len(xs) <= 1 else
                                  __import__("itertools").chain(
                                      [[xs[0], ""] + y for y in c(xs[1:])],
                                      [[xs[0], " + "] + y for y in c(xs[1:])],
                                      [[xs[0], " - "] + y for y in c(xs[1:])]
                                )
                )
    print("\n".join(
            [   x for x in
                [   "".join(str(y) for y in z )
                        for z in c(range(1, 10 ) )
                ]
                if eval(x) == 100
            ]
        )
    )

q_5_1()

Quand j'ai essayé de faire la même chose avec lambda, cela n'a pas fonctionné.

def pr(x):
    print x
    
q_5_2=(lambda:
    (lambda c=(lambda xs:
            [[xs[0]]] if len(xs) <= 1 else
            __import__("itertools").chain(
                [[xs[0], ""] + y for y in c(xs[1:])],
                [[xs[0], " + "] + y for y in c(xs[1:])],
                [[xs[0], " - "] + y for y in c(xs[1:])]
            )
        ):
            pr( "\n".join(
                    [   x for x in
                        [   "".join(str(y) for y in z )
                                for z in c(range(1, 10 ) )
                        ]
                        if eval(x) == 100
                    ]
                )
            )
    )()
)

q_5_2()

J'étais en colère contre "NameError: le nom global" c "n'est pas défini". Cela signifie-t-il que vous ne pouvez pas vous appeler en lambda parce que les arguments font référence à l'environnement extérieur ... Y a-t-il un combinateur Y ou quelque chose lié à ce domaine?

Cependant, diviser les choses compliquées en fonctions simples est un grand enseignement de Dieu. Donc, pour le moment, ce n'est peut-être pas un problème.

# coding: utf-8

do = box = lambda *x : x
switch = unbox = lambda x : x[-1]
otherwise = True

q_5_2=( lambda :
        ( lambda c = ( lambda xs :
          ( lambda f : f( f, xs ) )(lambda f, xs :
              switch(
                   len(xs) <= 1 and do( [[xs[0]]] ) 
                or otherwise    and do( __import__("itertools").chain(
                                       [[xs[0], ""] + y for y in f( f, xs[1:])],
                                       [[xs[0], " + "] + y for y in f( f, xs[1:])],
                                       [[xs[0], " - "] + y for y in f( f, xs[1:])]
                                       )
                                      )
             )
            )
          ):
            print( "\n".join(
                [ x for x in
                  [ "".join(str(y) for y in z )
                    for z in c(range(1, 10 ) )
                  ]
                  if eval(x) == 100
                ]
               )
            )
         )()
    )

q_5_2()

Plus concis:

python


# coding: utf-8

do = box = lambda *x : x
switch = unbox = lambda x : x[-1]
otherwise = True

q_5_2 = lambda : (
    lambda c = lambda xs , f = lambda f, xs :
                            switch(
                                len(xs) <= 1 and do( [[xs[0]]] ) 
                                or otherwise and do( __import__("itertools").chain(
                                        [[xs[0], ""] + y for y in f( f, xs[1:])],
                                        [[xs[0], " + "] + y for y in f( f, xs[1:])],
                                        [[xs[0], " - "] + y for y in f( f, xs[1:])]
                                    )
                                )
                            )
            
            : f( f, xs ) 
        :
        print( "\n".join(
                [ x for x in
                    [ "".join(str(y) for y in z )
                        for z in c(range(1, 10 ) )
                    ]
                        if eval(x) == 100
                ]
            )
        )
    )()
    

q_5_2()

Recommended Posts

Défiez le problème 5 avec Python: lambda ... N'allez pas profondément dans le one-liner ...
Défi problème 5 avec Python: lambda ... j'ai décidé de copier sans
Python avec Go
Défiez LOTO 6 avec Python sans discipline
Détection de visage avec Lambda (Python) + Rekognition
[Python] Tri Starlin à une ligne avec 50 caractères
Notifier HipChat avec AWS Lambda (Python)
[AWS] Utilisation de fichiers ini avec Lambda [Python]
INSÉRER dans MySQL avec Python [Pour les débutants]
Mettez des tampons de protocole dans sqlite avec python
Manipulation des données DynamoDB avec Lambda (Node et Python)
[AtCoder] Résoudre ABC1 ~ 100 Un problème avec Python
Question: l'intégration multiple par python ne fonctionne pas
Connectez-vous à s3 avec AWS Lambda Python
Essayez d'attribuer ou de changer avec Python: lambda