Seite 4 von 7

Verfasst: Samstag 16. Februar 2008, 13:52
von numerix
Interessant, was die Bildbetrachter so alles (nicht) können. Nach einer Umwandlung in png sah es dann auch bei mir aus wie eine japanische Flagge.

Aber nochmal zu deinem Flaggenerzeugungsprogramm:
Die wie von Zauberhand ausgewählten Zahlen in N sind ja in Wahrheit eine Schummelei. Die Werte hast du doch mit einem anderen Programm vorher ausgerechnet (schätze ich mal); oder Pi-Mal-Daumen geschätzt, damit es rund aussieht.

Da finde ich ein Programm mit ein bisschen Pythagoras, auch wenn es länger wird, dann aber doch ehrlicher.

Interessant wäre aber, was applegreens Lehrer dazu sagt, wenn er mit DEM Quelltext im Unterricht aufläuft ...

Verfasst: Samstag 16. Februar 2008, 15:10
von EyDu
Ist vielleicht ein wenig länger geworden als BlackJacks Lösung... ;-) :

Code: Alles auswählen

import math, operator

def primes(to):
    r = [] 
    for i in range(2, to+1): 
        for p in r: 
            if i % p == 0: 
                break 
        else: 
            r.append(i)
    return r

width, height = map(lambda x:reduce(operator.mul,x), map(lambda (x,y): [x]+y, zip(primes(3), [primes(5)]*2)))

print "P3 %d %d 1" % (width, height)
print " ".join("".join(["0","".join((" ",(sum(map(lambda (a,(x,y)):-((a&2)-1)*(x-y)**2, enumerate(zip((j,i,height*3/5/2),(width/2,height/2,0)))))<0 and "1" or "0")))*2])
                       for i in (int(math.log(576460752303423488>>i, 2)) for (i,x) in enumerate(str(height)*(height/2)))
                       for j in (int(math.log(1237940039285380274899124224>>i, 2)) for (i,x) in enumerate(str(width)*(width/2))))

Verfasst: Samstag 16. Februar 2008, 15:40
von lunar
Na toll, jetzt muss ich mir für die nächste Perl vs. Python Diskussion neue Argumente suchen, "Python ist besser lesbar als Perl" habt ihr ja gerade entkräftet ;)

Verfasst: Samstag 16. Februar 2008, 17:36
von BlackJack
@pütone: Ich denke nicht, dass das Schummelei ist wenn man einfach eine "dynamische" Version immer weiter optimiert, in dem man Berechnungen durch ihren Wert ersetzt. Wenn die Masse 90x60 vorgegeben sind, kann man halt einiges durch Konstanten ersetzen.

Aber wenn Du `N` lieber zur Laufzeit berechnet haben möchtest, bitteschön:

Code: Alles auswählen

import sys;w=sys.stdout.writelines;w('P3 90 60 1 ');N=[45-int((324-y*y)**.5)
for y in range(18)]+[45]*12;w('1 %d %d '%(x,x) for x in
sum(([1]*n+[0]*(45-n)*2+[1]*n for n in N[::-1]+N),[]))
Ist sogar etwas kürzer (in Zeichen) als die letzte Version mit der "statischen" Liste. :-)

Verfasst: Samstag 16. Februar 2008, 18:53
von numerix
Ja, so gefällt es mir besser - jetzt kommt der Satz des Pythagoras ja doch noch zu seinem Recht.

Auf jeden Fall ist es für mich als Python-Neuling ein hilfreiches Stück Quellcode und beeindruckend zu sehen, welch mächtige Datentypen/Konstrukte Python mitbringt und wie ein Python-Meister damit umzugehen weiß. :shock:

Verfasst: Samstag 16. Februar 2008, 19:19
von BlackJack
Naja, real würde ich das wesentlich lesbarer und umfangreicher schreiben. Das ist ja absichtlich auf Kürze getrimmt, was für so kleine "code golf"-Spielereien ganz nett ist, aber sonst… ;-)

Verfasst: Samstag 16. Februar 2008, 19:24
von EyDu
BlackJack hat geschrieben:Das ist ja absichtlich auf Kürze getrimmt, was für so kleine "code golf"-Spielereien ganz nett ist, aber sonst… ;-)
Wobei die einfachste Lösung wohl noch kürzer sein dürfte ;-)

Verfasst: Samstag 16. Februar 2008, 19:37
von BlackJack
Jup, da komme ich auf 146 Zeichen. Poste ich jetzt mal nicht, weil das wahrscheinlich sogar bei einem Lehrer als Lösung durchgeht, bzw. auch Anfänger das soweit "verlängern" könnten, das sie eine Lösung für die Hausaufgabe hätten. :-)

Verfasst: Samstag 16. Februar 2008, 21:34
von numerix
Wobei die einfachste Lösung wohl noch kürzer sein dürfte
Jup, da komme ich auf 146 Zeichen
Jetzt habt ihr meinen Kampfgeist geweckt :evil: : Ich biete 126 Zeichen ...

Nachtrag: Nochmal etwas nachgebessert, jetzt sind es 120 Zeichen.

Verfasst: Samstag 16. Februar 2008, 22:07
von applegreen
wenn ick dat programm von BlackJack bei python rein haue
und es als ein .ppm datei abspeicher dann zeigt er mir nix an!
auch als png zeigt er mir nix an!
und wenn ick über dat program noch

Code: Alles auswählen

P3
# japan.ppm
90 60
255
eingeb zeigt er mir nur bunte punkte an!:(

Verfasst: Samstag 16. Februar 2008, 22:14
von audax
Du bist was ganz besonderes, Apfel!
Wirklich. Ganz besonders.

Ohne dir zu Nahe treten zu wollen, aber...kannst du überhaupt denken? :roll:

Verfasst: Samstag 16. Februar 2008, 22:59
von numerix
Wie wäre es mit einem Wettbewerb, bei dem der Thread mit dem größten Unterhaltungswert prämiert wird.
Dann hätte ich für Feb. 2008 schon eine erfolgversprechende Nominierung für den "Thread Of The Month". :lol:

Verfasst: Samstag 16. Februar 2008, 23:06
von Leonidas
pütone hat geschrieben:Nachtrag: Nochmal etwas nachgebessert, jetzt sind es 120 Zeichen.
Also ich hätte eine Lösung anzubieten, die mit 0 Zeichen auskommt. Einfach einen Interpreter für die Japanische-Flaggen-Sprache, Japflag schreiben und diesen Interpreter auf leere Dateien (0 Byte) ausführen ;) Solche Programme können in beliebiger Anzahl mit dem Generatortool ``touch`` unter Unix schnell erstellt werden.

Verfasst: Samstag 16. Februar 2008, 23:11
von Jan-Peer
''donottouch'' ist sogar noch besser, weil man da zumindest ein paar extrem hilfreiche Fehlermeldungen erhält. :P

Ansonsten wäre es langsam mal Zeit für 'Codesnippets' oder besser noch ein sticky 'Offtopic' :D

Verfasst: Samstag 16. Februar 2008, 23:18
von EyDu
Leonidas hat geschrieben:Einfach einen Interpreter für die Japanische-Flaggen-Sprache, Japflag schreiben und diesen Interpreter auf leere Dateien (0 Byte) ausführen ;).
Ich würde es JFlag nennen, um auf den Java-Zug mit aufzuspringen. Irgendwie muss man das Ding doch auch vermarkten :P

Verfasst: Samstag 16. Februar 2008, 23:22
von BlackJack
@pütone: Bin auf 106 Zeichen runter, bei Einhaltung von max. 80 Zeichen pro Zeile!

Eigentlich könnte ich noch 4 Leerzeichen einsparen, aber dann wird's hässlich ─ in zwei Fällen versagt das Syntax-Highlighting im Editor. :-)

@applegreen: Du musst das Programm schon als Pythondatei abspeichern und dann *ausführen*. Das spuckt das PPM als Text aus, also musst Du die Ausgabe in eine Datei umleiten. Diese Datei kann man dann in einem Bildbetrachter anschauen. Oder auch nicht, weil es ja anscheinend nicht jedes Programm auf die Reihe bekommt PPMs mit einem Bit pro RGB-Komponente zu lesen. Was aber durchaus gültig ist.

Verfasst: Sonntag 17. Februar 2008, 00:31
von numerix
Bin auf 106 Zeichen runter, bei Einhaltung von max. 80 Zeichen pro Zeile!
Das beruhigt mich dann doch; als Python-Frischling wäre es auch verwunderlich gewesen, wenn mein "Gebot" nicht unterboten worden wäre.

Mittlerweile habe ich es immerhin auf 114 Zeichen geschafft. Leider steckt da immer noch ein

Code: Alles auswählen

for y in range(60)for x in range(90)
drin. Hier lassen sich vermutlich noch ein paar Zeichen einsparen,
aber da bin ich mit meinem Latein (=Python) - momentan jedenfalls - am Ende.

Verfasst: Sonntag 17. Februar 2008, 01:05
von BlackJack
An der Stelle habe ich nicht gespart, die ``range``\s habe ich auch (fast so) drin. Ich habe auch noch ein Leerzeichen vor jedem ``for``. Das sind die Stellen, die ich aus ästhetischen noch gelassen habe. :-)

Mit Haskell bin ich auf 104 Zeichen gekommen. "List comprehensions" sind dort ein ganz kleines bisschen kompakter.

Verfasst: Sonntag 17. Februar 2008, 01:19
von EyDu
Also mindestens ein Zeichen Einsparung hätte ich noch anzubieten:

Code: Alles auswählen

(divmod(x,60) for x in range(60*90))
Wenn man möchte kann man natürlich aus der 60*90 noch 5400 machen.

Edit: Ach Mist, ist natürlich doof, wenn man auf die Elemente der Tupel zugreifen muss, da diese ja nicht an einen Namen gebunden werden.

Verfasst: Sonntag 17. Februar 2008, 12:42
von Y0Gi
EyDu hat geschrieben:Wobei die einfachste Lösung wohl noch kürzer sein dürfte ;-)
Dazu:

Bild