Japanische Flagge /bzw. Kreis

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.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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 ...
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
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 ;)
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. :-)
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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:
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… ;-)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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 ;-)
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. :-)
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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.
applegreen
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

Code: Alles auswählen

P3
# japan.ppm
90 60
255
eingeb zeigt er mir nur bunte punkte an!:(
Äpfelgrün sagt danke
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Du bist was ganz besonderes, Apfel!
Wirklich. Ganz besonders.

Ohne dir zu Nahe treten zu wollen, aber...kannst du überhaupt denken? :roll:
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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:
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Jan-Peer
User
Beiträge: 166
Registriert: Dienstag 2. Oktober 2007, 10:55

''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
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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
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.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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.
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.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

EyDu hat geschrieben:Wobei die einfachste Lösung wohl noch kürzer sein dürfte ;-)
Dazu:

Bild
Antworten