Diskussion zum kleinen Test von IT-Teamplayer

Alles, was nicht direkt mit Python-Problemen zu tun hat. Dies ist auch der perfekte Platz für Jobangebote.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

2 Bytes länger, aber auch ganz nett:

Code: Alles auswählen

sum(set(range(0,666,3)+range(0,666,5)))
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

@numerix
Ja, daran hatte ich auch schon gedacht, aber leider ging es so nicht kleiner :cry:

Wie sieht denn die 36 Zeichen Lösung aus?
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Benutzeravatar
/me
User
Beiträge: 3558
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

numerix hat geschrieben:2 Bytes länger, aber auch ganz nett:

Code: Alles auswählen

sum(set(range(0,666,3)+range(0,666,5)))
Hey, das war meins. :-)

Code: Alles auswählen

sum(filter(lambda x: x%3*x%5==0,range(666)))
sum(i for i in range(666) if 0 in [i%3,i%5])
sum(set(range(0,666,3)+range(0,666,5)))
r=range;sum(set(r(0,666,3)+r(0,666,5)))
frabron
User
Beiträge: 306
Registriert: Dienstag 31. März 2009, 14:36

Nicht ganz so schön:

Code: Alles auswählen

sum(n for d in [3,5] for n in xrange(1,666) if n%d==0)
Benutzeravatar
/me
User
Beiträge: 3558
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

frabron hat geschrieben:Nicht ganz so schön:

Code: Alles auswählen

sum(n for d in [3,5] for n in xrange(1,666) if n%d==0)
Vor allem, da das Ergebnis nicht stimmt. Zahlen die ohne Rest durch 15 geteilt werden können werden zweimal addiert.
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Ich war gerade etwas konfus. Ich hatte statt `n%3*n%5` den Ansatz mit `n%5*n%3` und das hat nicht funktioniert.

Auf die schnelle gesagt, es funktioniert Ausnahmsweise bei 3 und 5, da bei %3 nur 1,2,3 herauskommen kann. Es bleibt beim Fall ausser 0 nur noch `1*x` und `2*x`. `1*x` ist trivial. Bei `2*x`wird an der letzten Position aus der 5 eine 0 und aus der 0 eine 5.


Edit: Python rechnet ((a%b)*c)%d und nicht (a%b)*(c%d)
* und % binden gleich stark
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
frabron
User
Beiträge: 306
Registriert: Dienstag 31. März 2009, 14:36

/me hat geschrieben: Vor allem, da das Ergebnis nicht stimmt. Zahlen die ohne Rest durch 15 geteilt werden können werden zweimal addiert.
Auch das noch :oops:
.robert
User
Beiträge: 274
Registriert: Mittwoch 25. April 2007, 17:59

Ich hatte

Code: Alles auswählen

sum(x for x in range(667)if not(x%5and x%3))
... auf das `x%5*x%3<1` hätte ich ja auch kommen können :?
frabron
User
Beiträge: 306
Registriert: Dienstag 31. März 2009, 14:36

Code: Alles auswählen

sum(set(range(0,666,3)+range(0,666,5)))
gefällt mir vom Verständnis her am besten ...
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

Meine Lösung:

Code: Alles auswählen

# 36 Zeichen
r=range(666);sum(set(r[::3]+r[::5]))
# 43 Zeichen
lambda r=range(666):sum(set(r[::3]+r[::5]))
Ich wage zu behaupten, das das sogar noch einigermaßen effizient ist :)
Bottle: Micro Web Framework + Development Blog
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Oh man, da hätte man echt auch noch drauf kommen können, die Lösung ist mein Favorite :D

Genug mit Python hier eine Befunge-Lösung :mrgreen:

Code: Alles auswählen

"o"6*>   v
v\%3::<-1<
>5%*#v_:0v
vg00  +p0<
>:  #v_$.@
Edit: Upps war ein kleiner Fehler drin ich habe wieder bis 666 gezählt, also geändert und gleich noch etwas kompakter geschrieben.
Zuletzt geändert von Xynon1 am Mittwoch 6. Juli 2011, 16:20, insgesamt 3-mal geändert.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Benutzeravatar
pillmuncher
User
Beiträge: 1490
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@.robert: noch kürzer wäre

Code: Alles auswählen

...0 in (x%3,x%5)...
In specifications, Murphy's Law supersedes Ohm's.
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

Meine Lösungen waren:

Code: Alles auswählen

# 39 Zeichen
sum(i for i in range(666) if i%3*i%5<1) 

# 44 Zeichen
r=range;sum(set(r(0,666,3))|set(r(0,666,5))) 

# 47 Zeichen, bzw. 28 ohne den Import
import numpy;a=numpy.r_[:666];sum(a[a%3*a%5<1]) 
BlackJack

Ah, auf das ``<1`` statt ``not`` bin ich nicht gekommen. ☹

Code: Alles auswählen

print sum(i*(not i%3*i%5)for i in range(666))
Ich hatte mich übrigens mit dem nennen des Ergebnisses aus genau dem Grund zurückgehalten: die 666 ist ja so gewählt, dass es einen Unterschied macht ob man die noch mit zählt oder nicht. Ich vermutete da Absicht dahinter um zu sehen wie Aufmerksam der Aufgabentext gelesen wird.

Hier ist der BASIC-Quelltext, den ich für die Poject Euler-Aufgabe geschrieben hatte:

Code: Alles auswählen

   10 REM -----------------------------
   20 REM PROJECT EULER (PROJECTEULER.NET)
   30 REM
   40 REM PROBLEM 1: FIND THE SUM OF ALL
   50 REM THE MULTIPLES OF 3 OR 5 BELOW
   60 REM 1000.
   70 REM
   80 REM -----------------------------
   90 REM SETUP SOME VALUES FOR (ALMOST)
  100 REM ALL THREE ALGORITHMS.
  110 A=3:B=5:C=999:AB=A*B
  120 REM -----------------------------
  130 REM ASK USER WHICH ALGORITHM TO
  140 REM USE, AND CALL AND TIME THE
  150 REM CHOSEN ALGORITHM.
  160 REM
  170 POKE 53280,14:POKE 53281,14
  180 PRINT "{BLU}{CLR}{RVS ON}PROJECT EULER - PROBLEM 1{RVS OFF}{DOWN}"
  190 PRINT "FIND THE SUM OF ALL THE MULTIPLES OF 3"
  200 PRINT "OR 5 BELOW 1000.{DOWN}"
  210 PRINT "{LGRN}1{BLU}) NAIVE"
  220 PRINT "{LGRN}2{BLU}) BETTER"
  230 PRINT "{LGRN}3{BLU}) CLOSED FORMULA"
  240 INPUT "{DOWN}CHOOSE ALGORITHM ({LGRN}1{BLU}-{LGRN}3{BLU})";I
  250 PRINT "{DOWN}CALCULATING...{UP}"
  260 REM N IS SET TO 0 BEFORE THE CALL AND
  270 REM THE SUBROUTINE MUST RETURN THE
  280 REM RESULT IN N.
  290 TI$="000000":N=0:ON I GOSUB 380,490,630
  300 PRINT "RESULT ={LGRN}";N;"{BLU}(";RIGHT$(TI$,2);" SECONDS)":END
  310 REM -----------------------------
  320 REM THE NAIVE SOLUTION.  TESTS
  330 REM EVERY NUMBER FROM 1 TO C IF
  340 REM IT IS DIVISABLE BY A OR B AND
  350 REM SUMS THEM UP.  TAKES ABOUT
  360 REM 21 SECONDS.
  370 REM
  380 FOR I=1 TO C:IF INT(I/A)*A=I OR INT(I/B)*B=I THEN N=N+I
  390 NEXT:RETURN
  400 REM -----------------------------
  410 REM BETTER ALGORITHM, BUT RUNTIME
  420 REM STILL DEPENDS ON THE VALUE OF
  430 REM C.  SUMS UP ALL MULTIPLES OF A
  440 REM AND B AND THEN SUBRACTS ALL
  450 REM THE NUMBERS THAT ARE DIVISABLE
  460 REM BY A *AND* B.  TAKES ABOUT
  470 REM 2 SECONDS.
  480 REM
  490 FOR I=0 TO C STEP A:N=N+I:NEXT
  500 FOR I=0 TO C STEP B:N=N+I:NEXT
  510 FOR I=0 TO C STEP AB:N=N-I:NEXT
  520 RETURN
  530 REM -----------------------------
  540 REM SAME IDEA AS LAST SOLUTION BUT
  550 REM INSTEAD OF LOOPING THROUGH THE
  560 REM MULTIPLES IT USES GAUSS' CLOSED
  570 REM FORMULA TO CALCULATE THE SUMS.
  580 REM TAKES LESS THAN A SECOND.
  590 REM
  600 REM G(X)=X*(FLOOR(C/X)**2+FLOOR(C/X))
  610 REM F=(G(A)+G(B)-G(A*B))/2
  620 REM
  630 T=INT(C/A):D=A*(T*T+T)
  640 T=INT(C/B):E=B*(T*T+T)
  650 T=INT(C/AB):F=AB*(T*T+T)
  660 N=(D+E-F)/2:RETURN
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

BlackJack hat geschrieben:Ich hatte mich übrigens mit dem nennen des Ergebnisses aus genau dem Grund zurückgehalten: die 666 ist ja so gewählt, dass es einen Unterschied macht ob man die noch mit zählt oder nicht. Ich vermutete da Absicht dahinter um zu sehen wie Aufmerksam der Aufgabentext gelesen wird.
Das mag ich nicht glauben. Wer die Eignung eines Bewerbers, der seine Python-Fähigkeiten unter Beweis stellen soll, mit einer solchen Aufgabe meint ermitteln zu können, dem traue ich eine solche Spitzfindigkeit nicht zu.
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Wie sieht denn eure generic-Funktion aus?

Edit: Besonders die %3*%5 Variante interessiert mich.
Zuletzt geändert von jbs am Mittwoch 6. Juli 2011, 19:23, insgesamt 1-mal geändert.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Code: Alles auswählen

sum(num for num in range(666) if any(not num % x for x in [3, 5]))
BlackJack

@numerix: Einen Aufgabentext genau zu erfassen halte ich nicht für eine Spitzfindigkeit. Wenn man das bei einer Bewerbung, wo man einen möglichst guten Eindruck hinterlassen will, schon nicht macht, wie mag das dann später bei der Umsetzung von Spezifikationen oder beim Implementieren von Standards aussehen.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

"Spitzfindigkeit" war von mir auch nicht negativ gemeint. "Scharfsinn" ist vielleicht eher das, was ich meinte.
Und da ich den bei der Grundauswahl der Aufgabe nicht erkenne, vermute ich ihn eben auch nicht im Detail.
Benutzeravatar
snafu
User
Beiträge: 6754
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ich hatte die Modulo-Variante gewählt. Auf Slicing (eigentlich ja das naheliegendste) kam ich gar nicht erst. Und statt der Multiplikation hatte ich `(i%3 and i%5)<0` verwendet. Und halt ne LC. Defnulls Lösung finde ich am Besten.
Antworten