Buffon Nadelproblem

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
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.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Ich werfe mal 108 in den Raum:
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:

Code: Alles auswählen

print 2.*k/sum(1for _ in"."*k if r()+m.sin(m.pi*r())>1)
Diese Zeile ist genial :)
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. :-P

Edit2: Deine Lösung kann man auf 99 Zeichen drücken.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
Das Leben ist wie ein Tennisball.
bords0
User
Beiträge: 234
Registriert: Mittwoch 4. Juli 2007, 20:40

BlackJack hat geschrieben:Deine Lösung kann man auf 99 Zeichen drücken.
93 Zeichen meintest du wohl? ;-)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

98 Zeichen sind noch locker schaffbar, aber noch weitere fünf Zeichen zu finden scheint mir sehr kniffelig.
Das Leben ist wie ein Tennisball.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

EyDu hat geschrieben:98 Zeichen sind noch locker schaffbar, aber noch weitere fünf Zeichen zu finden scheint mir sehr kniffelig.
So knifflig sind die 93 Zeichen nicht - wenn man sich ein wenig von den gewohnten Programmierstrukturen löst ... :wink:
philistion
User
Beiträge: 108
Registriert: Sonntag 7. Februar 2010, 14:16

numerix hat geschrieben:...wenn man sich ein wenig von den gewohnten Programmierstrukturen löst ... :wink:
@numerix: Die da wären?

@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.
Benutzeravatar
HerrHagen
User
Beiträge: 430
Registriert: Freitag 6. Juni 2008, 19:07

eval ist dein Freund... (alte Code-Golfer Weisheit)...
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..
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):

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
Benutzeravatar
HerrHagen
User
Beiträge: 430
Registriert: Freitag 6. Juni 2008, 19:07

Wer beim Code-Golf versucht auch noch performanten Code zu schreiben ist selber Schuld...
Krze um jdn Prs!
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 :P

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 + 1

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 ;)
Benutzeravatar
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
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
BlackJack

Wieviel würdest Du denn dafür zahlen, dass Dir jemand *Deinen* Vortrag erarbeitet!? :twisted:
Benutzeravatar
DaMutz
User
Beiträge: 202
Registriert: Freitag 31. Oktober 2008, 17:25

jemand hat den Vortrag bereits gemacht: http://www.mathematik.uni-kassel.de/~sp ... eferat.doc
Antworten