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 ...
Japanische Flagge /bzw. Kreis
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))))
Zuletzt geändert von EyDu am Samstag 16. Februar 2008, 17:26, insgesamt 2-mal geändert.
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
@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:
Ist sogar etwas kürzer (in Zeichen) als die letzte Version mit der "statischen" Liste.
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),[]))
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ß.
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ß.
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…
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.
Wobei die einfachste Lösung wohl noch kürzer sein dürfte
Jetzt habt ihr meinen Kampfgeist geweckt : Ich biete 126 Zeichen ...Jup, da komme ich auf 146 Zeichen
Nachtrag: Nochmal etwas nachgebessert, jetzt sind es 120 Zeichen.
-
- User
- Beiträge: 18
- Registriert: Freitag 11. Mai 2007, 15:57
- Wohnort: Berlin
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
eingeb zeigt er mir nur bunte punkte an!:(
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
Äpfelgrün sagt danke
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
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.pütone hat geschrieben:Nachtrag: Nochmal etwas nachgebessert, jetzt sind es 120 Zeichen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Ich würde es JFlag nennen, um auf den Java-Zug mit aufzuspringen. Irgendwie muss man das Ding doch auch vermarktenLeonidas hat geschrieben:Einfach einen Interpreter für die Japanische-Flaggen-Sprache, Japflag schreiben und diesen Interpreter auf leere Dateien (0 Byte) ausführen .
@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.
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.
Das beruhigt mich dann doch; als Python-Frischling wäre es auch verwunderlich gewesen, wenn mein "Gebot" nicht unterboten worden wäre.Bin auf 106 Zeichen runter, bei Einhaltung von max. 80 Zeichen pro Zeile!
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)
aber da bin ich mit meinem Latein (=Python) - momentan jedenfalls - am Ende.
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.
Mit Haskell bin ich auf 104 Zeichen gekommen. "List comprehensions" sind dort ein ganz kleines bisschen kompakter.
Also mindestens ein Zeichen Einsparung hätte ich noch anzubieten:
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.
Code: Alles auswählen
(divmod(x,60) for x in range(60*90))
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.