2011-08-10 14 views
8

Mamy pytanie, które zadajemy w naszym biurze podczas wywiadów, które przedstawiają się w następujący sposób. W trosce o spójność ograniczam kontekst tego do pythona. Jestem pewien, że są inne odpowiedzi, ale naprawdę interesują mnie odpowiedzi na pythona.Interesujący wywiad "Witaj świecie"

Napisz mi funkcję o nazwie say że kiedy nazywa się tak:

>>> say('Hello')('World') 

drukuje tylko (nie zwrotów):

>>> say('Hello')('World') 
Hello World 
>>> 

Wsiedliśmy do meta dyskusji po wywiadzie dziś gdzie oświadczyłem, że zawsze mam nadzieję, że skarżący odpowie na następujące pytania.

def say(x): 
print "Hello World" 
return lambda a:None 

zdałem sobie sprawę, że istnieje możliwość skrócenia tego dodatkowo zastępując funkcję lambda z wbudowanym jakiegoś zwracającej None ale już wykopane i nie wydaje się znaleźć taki, który jest krótszy niż lambda a:None

Więc ogólnie pytanie o to ...

można myśleć o sposób, aby ten krótszy, podobnie jak w mniej ogólnej postaci (pomijając podziały wiersza). Wszelkie instrukcje importowania są liczone w liczbie znaków. (52) znaków

UPDATE

(39 znaków)

>>> def p(x): 
... print "Hello",x 
>>> say=lambda x:p 
>>> say("Hello")("World") 
Hello World 
>>> 

Python 3 Odpowiedź (48) znaków

>>> def say(x): 
... return lambda a:print("Hello World") 
>>> say("Hello")("World") 
Hello World 
>>> 
+1

Czy chcesz "powiedzieć", aby rzeczywiście używać jego argumentów? czy powinien zawsze po prostu "wydrukować" Hello World''? –

+2

Cały punkt postu uważa, że ​​byłoby zabawnie, gdyby nie użył swoich argumentów. – agf

+0

tak, jesteśmy w porządku z czymś, co zawsze drukuje '" Hello World "', ponieważ często kiedy wypowiadamy pytanie, nasz język pozostawia miejsce na to wyjście. –

Odpowiedz

13

Pythona 2.x odebraniem

Oczywista odpowiedź, że faktycznie nie liczyć, ponieważ zwraca łańcuch zamiast drukować go:

>>> say = lambda x: lambda y: x + " " + y 
>>> say('Hello')('World') 
'Hello World' 

Ten jest 45 znaków licząc nowe linie:

def p(x): 
print "Hello World" 
say=lambda x:p 

Metoda ta spada w dół do 41 znaków, ale wygląda to trochę dziwne, ponieważ wykorzystuje jeden argument, ale nie inne:

def p(x): 
print "Hello",x 
say=lambda x:p 

Python 3.x odpowiada

36 znaków:

>>> say=lambda x:lambda y:print(x+" "+y) 
>>> say('Hello')('World') 
Hello World 

38 znaków:

>>> say=lambda x:print(x,end=' ') or print 
>>> say('Hello')('World') 
Hello World 
+0

To zwraca argument, musi go wydrukować. Wyjaśnię moje pytanie. –

+0

Tak, to zasadniczo odpowiedź, z którą powinien się skontaktować każdy kompetentny programista. Chodzi mi o to, kto przy zdrowych zmysłach spróbowałby tego w poważnym wywiadzie dla pracy, którą naprawdę chciał? Prawdopodobnie zależy również od tonu wywiadu i mogę sobie wyobrazić, że wyrzuciłem pierwszą piosenkę tylko dla zabawy, zanim odpowiem poprawnie. – Voo

+0

@ F.J - Przepraszam, żebym dalej odpowiadał. Instrukcje importowania wydłużają twoją postać. Liczę 76. Ponownie wyjaśniłem moje pytanie. –

6
def say(x): 
    print x, 
    return say 
+0

zobacz edycję, którą zrobiłem powyżej. Twój nadal zwraca funkcję. Przepraszam, że jestem taki konkretny. –

+1

+1 sprytny to. – Voo

5

Przynajmniej w Pythonie 3, print jest funkcją, która zwraca None, więc można to zrobić:

def say(x): 
    return lambda a: print ('Hello World') 

lub (zapisywanie kilku dodatkowych znaków):

say=lambda x:lambda y:print("Hello World") 
+0

Oooh. Sneaky python 3 odpowiedź. Lubię to! –