Meine Schleife ist kürzer. Ich habe eine ``for``-Schleife die für das "loopen" 14 Zeichen benötigt. Als Tipp: Es gibt eine syntaktisch recht kompakte Möglichkeit ein Objekt zu erstellen, das "iterable" ist und halt entsprechend lang.
Buffon Nadelproblem
-
BlackJack
@b.esser-wisser: Die ``import``-Zeile haben wir schonmal gemeinsam. 
Meine Schleife ist kürzer. Ich habe eine ``for``-Schleife die für das "loopen" 14 Zeichen benötigt. Als Tipp: Es gibt eine syntaktisch recht kompakte Möglichkeit ein Objekt zu erstellen, das "iterable" ist und halt entsprechend lang.
Meine Schleife ist kürzer. Ich habe eine ``for``-Schleife die für das "loopen" 14 Zeichen benötigt. Als Tipp: Es gibt eine syntaktisch recht kompakte Möglichkeit ein Objekt zu erstellen, das "iterable" ist und halt entsprechend lang.
Ich werfe mal 108 in den Raum:
Edit: 106
Edit: 105
Edit: 106
Edit: 105
Code: Alles auswählen
import random,math as m;r=random.random
k=input()
print 2.*k/sum(1for _ in"."*k if r()+m.sin(m.pi*r())>1)Das Leben ist wie ein Tennisball.
-
philistion
- User
- Beiträge: 108
- Registriert: Sonntag 7. Februar 2010, 14:16
@EyDu:
Diese Zeile ist genial 
Code: Alles auswählen
print 2.*k/sum(1for _ in"."*k if r()+m.sin(m.pi*r())>1)-
BlackJack
@EyDu: Trifft aber zumindest meine Problembeschreibung nicht mehr was das umsetzen des Pascal-Programms war. *Explizit* mit `x` und `y` und Test auf beide Enden der Nadel. Das hatte ich nämlich absichtlich hingeschrieben damit diese Vereinfachung rausfällt.
Edit: Und Deine Zeile mit dem ``print`` geht bestimmt noch 4 Zeichen kürzer.
Edit2: Deine Lösung kann man auf 99 Zeichen drücken.
Edit: Und Deine Zeile mit dem ``print`` geht bestimmt noch 4 Zeichen kürzer.
Edit2: Deine Lösung kann man auf 99 Zeichen drücken.
Das ich noch locker vier Zeichen einsparen kann ist mir vorhin auch noch aufgefallen, aber das Sofa war zu gemütlich 
Die genaue Beschreibung hatte ich mir vorhin gar nicht durchgelesen, vielleicht versuche ich mich daran noch. Aber eine alternative Lösung in unter 100 Zeichen ist auch schon etwas.
Die genaue Beschreibung hatte ich mir vorhin gar nicht durchgelesen, vielleicht versuche ich mich daran noch. Aber eine alternative Lösung in unter 100 Zeichen ist auch schon etwas.
Das Leben ist wie ein Tennisball.
So knifflig sind die 93 Zeichen nicht - wenn man sich ein wenig von den gewohnten Programmierstrukturen löst ...EyDu hat geschrieben:98 Zeichen sind noch locker schaffbar, aber noch weitere fünf Zeichen zu finden scheint mir sehr kniffelig.
-
philistion
- User
- Beiträge: 108
- Registriert: Sonntag 7. Februar 2010, 14:16
@numerix: Die da wären?numerix hat geschrieben:...wenn man sich ein wenig von den gewohnten Programmierstrukturen löst ...
@BlackJack:
Mich würde außerdem die Lösung mit 180 Zeichen, in der Form wie du es angegeben hast, interessieren. Ich komme einfach nicht unter 200.
Edit: Meint ihr, es ist möglich eine Konstruktion wie die folgende, zum Laufen zu bringen? Das würde das Kriterium erfüllen, ich finde aber im Moment keine Lösung das x und y jeweils die gleiche r()-Zahl enthalten und b sowie c berechnet werden.
Code: Alles auswählen
...
o=lambda a,b:any((a>=1>b,a<0,b>=1,b<0)
s = sum(o(y+b,y-b)+o(x+c,x-c) for _ in "."*t)
...
Zuletzt geändert von philistion am Dienstag 8. Juni 2010, 09:04, insgesamt 1-mal geändert.
-
philistion
- User
- Beiträge: 108
- Registriert: Sonntag 7. Februar 2010, 14:16
Daran hab ich auch schon gedacht, um mehrere lambdas in weniger Platz reinzupacken.
Werd wohl noch ein bisschen rumexperimentieren müssen..
Werd wohl noch ein bisschen rumexperimentieren müssen..
-
BlackJack
Was mich von `eval`/`exec` Abstand nehmen liess war die Tatsache, das meine Lösung soviel Speicher gefressen hat, dass man keine 10000000 eingeben konnte. Den Prozess musste ich abschiessen. Ich wollte keine Lösung die nur theoretisch funktioniert. 
Hier ist meine "lange" Version (179 Zeichen):
Hier ist meine "lange" Version (179 Zeichen):
Code: Alles auswählen
import math as m,random;r=random.random
g=lambda x,b:(x-b>=1)-(x-b<0)!=(x+b>=1)-(x+b<0);t=input();s=0
for _ in'x'*t:a=m.pi*r();s+=g(r(),m.sin(a)/2)+g(r(),m.cos(a)/2)
print 4.*t/s-
BlackJack
@HerrHagen: Es ging dabei nicht um "performant", sondern um lauffähig. Wenn ich das Ding nicht gestoppt hätte als die Swap-Partition zu 80% belegt war, hätte das Betriebssystem die Notbremse gezogen. Ich wollte halt etwas früher wieder ein benutzbares System haben.
-
bloody1337
- User
- Beiträge: 9
- Registriert: Samstag 5. Juni 2010, 14:11
oha..^^
hier hat sich ja ganz schön was entwickelt.
eine frage habe ich trotzdem noch
und zwar,was diese zeilen geometrisch! bedeuten:
a= ist der winkel der nadel oder?
was ist b und c? wie kann man die sachverhalte in einer skizze darstellen?
das wäre meine wirklich letzte frage,wäre echt super,wenn ihr mir auch dabei helfen würdet!
danke und schönen feierabend
hier hat sich ja ganz schön was entwickelt.
eine frage habe ich trotzdem noch
und zwar,was diese zeilen geometrisch! bedeuten:
Code: Alles auswählen
a = math.pi * random.random()
b = math.cos(a) / 2.0
c = math.sin(a) / 2.0
if intp(y - b) != intp(y + b):
s = s + 1
if intp(x - c) != intp(x + c):
s = s + 1a= ist der winkel der nadel oder?
was ist b und c? wie kann man die sachverhalte in einer skizze darstellen?
das wäre meine wirklich letzte frage,wäre echt super,wenn ihr mir auch dabei helfen würdet!
danke und schönen feierabend
- b.esser-wisser
- User
- Beiträge: 272
- Registriert: Freitag 20. Februar 2009, 14:21
- Wohnort: Bundeshauptstadt B.
b und c sind die 'Länge' der Nadel auf der y- bzw. x-Achse, x+-c/2, y+-b/2 sind dann die Koordinaten der Nadelenden - sind doch ganz normale geometrische Funktionen (Tip: aufmalen).
hth, Jörg
hth, Jörg
Wir haben schon 10% vom 21. Jahrhundert hinter uns!
-
bloody1337
- User
- Beiträge: 9
- Registriert: Samstag 5. Juni 2010, 14:11
oh man.. ich durchschau es einfach nicht,was mit der länge der nadeln b und c gemeint ist.
und dann,wenn man von y (dem mittelpunkt der nadel bzgl. y-achse) minus b - also die länge der nadel von der x-achse?! abzieht , wie kommt man da auf die koordinaten eines nadelendes? geht man da nicht einfach nach unten oder links o.ä. und kommt auf einen ganz anderen punkt,der gar nciht zur nadel gehört. die länge müsste ja eig. da nicht auf den achsen liegen,sondern mit dem winkel der nadel.!??!!
ich bin echt am verzweifeln
wenn das jemand skizzenhaft mir aufmalen könnte, wäre das super!
gruß
bloody
und dann,wenn man von y (dem mittelpunkt der nadel bzgl. y-achse) minus b - also die länge der nadel von der x-achse?! abzieht , wie kommt man da auf die koordinaten eines nadelendes? geht man da nicht einfach nach unten oder links o.ä. und kommt auf einen ganz anderen punkt,der gar nciht zur nadel gehört. die länge müsste ja eig. da nicht auf den achsen liegen,sondern mit dem winkel der nadel.!??!!
ich bin echt am verzweifeln
gruß
bloody
-
BlackJack
Wieviel würdest Du denn dafür zahlen, dass Dir jemand *Deinen* Vortrag erarbeitet!? 
jemand hat den Vortrag bereits gemacht: http://www.mathematik.uni-kassel.de/~sp ... eferat.doc
