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.
(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.
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...
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