Sur Ba Programming Challenge
A rekurziótól begolyózom
#!/usr/bin/python
import cgi
import cgitb
cgitb.enable()
form = cgi.FieldStorage()
def get_int_param(name, default):
val = form.getvalue(name)
if (val is None):
return default
return int(val)
def draw_circle(cx, cy, r):
return '<circle cx="%f" cy="%f" r="%f" style="fill: none; stroke: #000000; " stroke-width="%d" />' % (cx, cy, r, 1)
def draw_circle_fractal(cx, cy, r, depth):
result = draw_circle(cx, cy, r);
if (depth > 0):
r2 = r * 0.464101615
r3 = r2 * 0.5773502690
result = result + draw_circle_fractal(cx, cy - r + r2, r2, depth - 1)
result = result + draw_circle_fractal(cx - r2, cy + r3, r2, depth - 1)
result = result + draw_circle_fractal(cx + r2, cy + r3, r2, depth - 1)
return result
print """Content-type: image/svg+xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 600 600"
version="1.1"
height="600"
width="600">
<g>%s</g>
</svg>
""" % draw_circle_fractal(300, 300, 300, get_int_param("depth", 4));
http://apocalypse.rulez.org/~upi/surba/circles.py?depth=2 [source]
http://apocalypse.rulez.org/~upi/surba/circles.py?depth=6 [source]
(Lehetőleg 6 feletti mélységben NE, mert megdöglik a számítógép!)
Hát húha. Itt egy csomó minden történt, ami eddig nem történt. Én meg nem szeretem, ha a dolgok másmilyenek! Lássuk, mi minden újdonsággal szolgál a mai csoda!
Függvények: Eddig csak a Python saját beépített függvényeit használtuk fel, mint pl az int
, valamint a könyvárból előcsemegézett függvényeket, mint a cgi.FieldStorage
. Eljött most az ideje, hogy sajátokat is csináljunk. Például, a get_int_param
azt a bravúrt oldja meg nekünk, hogy beolvas és rögtön egész számmá alakít egy paramétert nekünk, ha pedig hiányozna (None
az értéke), akkor egy alapértelmezett számot ad vissza helyette.
Ráadásul a függvények más függvényeket is meg tudnak hívni, például a draw_circle_fractal
meghívja a draw_circle
nevűt. Ha egy függvény pedig önmagát hívja meg, akkor azt rekurzív függvénynek hívjuk, és rettegünk tőle, hogy nehogy végtelen ciklust eredményezzen.
String formattálás: Eddig stringeket csak a +
operátorral rakosgattunk össze. Van egy kényelmesebb módszer is: a formattálás, ami a stringet követő %
operátorral működik. Fedezzük fel ennek a rejtelmeit!
Feladatok
- Mi a szent szar a 0.464101615 és 0.5773502690? Ezek hogyan jöttek ki az UPinak?
- Legyen paraméterezhető a körök vonalvastagsága, alapértelmezetten legyen 1.
- A páros mélységben található köröket töltsük ki kék, a páratlanokat zöld színnel.
- Ne három kör legyen egyben, hanem négy.
- Bónusz feladat: Ne is, inkább öt!
- Bónuszabb feladat: Rajzoljuk ki a Koch-görbét.
- Legbónuszabb feladat: Rajzoljuk ki a Sárkány-görbét.
SAdam 2017.VI.30 01:18
Kis lefekvés előtti agytorna, de ha jól sejtem, akkor 1 = r2 + r2/cos(30) az egyik, és tan(30) a másik...
Válaszkérdés: kérek egy egysoros (igazából egyszavas) bizonyítást a következő két állításra: depth = 1 esetben 3 "beírt" kör van, az egymást érintő körök érintési pontjaiba az érintőket behúzva kapunk három egyenest. Ezek
(1) egy pontban metszik egymást, mégpedig
(2) az eredeti (nagy) kör középpontjában.
Miért?
(Persze lehet, hogy másnak triviális lesz az egyszavas válasz, nekem így hajnalban kellett rajta gondolkodnom egy kicsit.)
UPi 2017.VI.30 16:32
(Válaszképp erre)
Ha egyszavas választ kell adnom, akkor a "csak".
Ha két szó is megengedett, akkor "Szimmetria okokból". (És ez tényleg.)