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
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Ohne Statements:

Code: Alles auswählen

(lambda p=__import__('sys').stdout.write:(p('P3 90 60 1 '),[p('1 %i %i '
%(((30-x)**2+(45-y)**2>323,)*2))for x in range(60)for y in range(90)]))()
BlackJack

@HWK: a) Habe ich auch nachgeschlagen und b) war mir ebenfalls neu, oder zumindest entfallen, weil ich das nie gemacht habe. Das ist noch aus Kompatibilitätsgründen zu CP/M bzw. DOS 1.x möglich. Technisch wird bei COM-Programmen ein "0 Wort" vor dem Start auf den Stack gelegt und das sorgt dann bei einem RET dafür, dass zu einem entsprechendem INT 21h-Aufruf an Adresse CS:0000 gesprungen wird. Echt interessant wann Microsoft schon damit angefangen hat aus Kompatibiliätsgründen "interessante" Hacks zu implementieren. :-)
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Rebecca hat geschrieben:Jetzt will ich auch mal. Da ich gegen eure kurzen Loesungen eh nicht anstinken kann
Nee, nee, das glaube ich nicht. Wenn ich nichts durcheinander bringe, hast du in irgendeinem Thread geschrieben, dass du ein abgeschlossenes Mathestudium hast. Und wie ich deiner Website entnommen habe, hast du im Herbst sogar einen Python-Kurs abgehalten. Das reicht sicher für dieses Programm.
Man braucht kein Python-Guru zu sein, um das Programm einigermaßen kurz zu bekommen. Ich habe im Sommer 2007 überhaupt zum ersten Mal davon gehört, dass es eine Programmiersprache namens Python gibt und staune immer wieder über solche Kabinettstückchen wie die von BlackJack oder auch dieses hier von Trundle als Beitrag zum Japaner-Thread:

Code: Alles auswählen

(lambda p=__import__('sys').stdout.write:(p('P3 90 60 1 '),[p('1 %i %i '
%(((30-x)**2+(45-y)**2>323,)*2))for x in range(60)for y in range(90)]))()
Zwar ist das - verglichen mit den Dimensionen, in denen wir uns aktuell mit dem kürzesten Programm zur Lösung des Ausgangsproblems bewegen - ein richtig langer Quelltext, aber die Analyse eines solchen Kunstwerks hilft mir jedesmal, noch tiefer in die Feinheiten von Python einzudringen.

Ich habe mittlerweile sicher schon ein Dutzend (eher mehr) Fassungen für dieses kleine Problem entwickelt und eines hat mich dabei wirklich erstaunt: Mit wenigen Ausnahmen sind die Quelltexte dadurch kürzer geworden, dass ich sie EINFACHER gemacht habe. Keine tiefen Griffe in die Python-Trickkiste, bei denen Python-Anfänger wie ich nur mit den Ohren schlackern, sondern wirkliches Basiswissen. Meine anfänglichen "kürzesten Versionen" hatten noch List Comprehension und formatierte Ausgabe mit verdoppelten Tupeleinträgen usw. Musste alles weg, um es kurz zu bekommen.

BlackJack scheint es ähnlich ergangen zu sein, wenn er schreibt, dass er es für möglich hält, dass applegreen seine kürzeste Lösung verstehen und etwas aufarbeiten könnte, um sie seinem Lehrer anbieten zu können.

Noch ein Tipp für die, die noch einsteigen wollen: Die doppelte Schleife muss weg. Das geht, und dann wird es richtig kurz. Ich bin schon unter 90 Byte ...
BlackJack

Jup, mit *einer* Schleife bin ich jetzt auch bei 88 Zeichen. Ist allerdings etwas schwerer zu verstehen. Meine Variante davor hätte wirklich fast als Lösung für'n Unterricht getaugt.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Rebecca hat geschrieben:http://paste.pocoo.org/show/28784/
Da sieht man mal, dass ich kein Lisp-Guru bin. Statt die insert-Methode im if- und else-Zweig aufzurufen...

Code: Alles auswählen

(if (> (distance-sqr 30 45 i j) 324)
	  (insert "1 1 1 ")
	(insert "1 0 0 "))
...kann man das insert auch einfach "ausklammern":

Code: Alles auswählen

(insert (if (> (distance-sqr 30 45 i j) 324) "1 1 1 " "1 0 0 "))
Wobei man sowas in die Richtung ja mit den Conditional Expressions aus Python 2.5 auch machen kann.

pütone: Aber so kann ich die Japanische Flagge direkt in meinem Lieblingseditor erzeugen. :)

Ueberhaupt sollten wir sowas oefter machen: Kleinere Aufgaben posten und sehen, was so Kreatives dabei rauskommt.
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
BlackJack

Noch eine exotische Sprache bei der `if` ein Ergebnis hat (weil's 'ne Methode auf dem "Ur-Objekt" ist):

Code: Alles auswählen

#!/usr/bin/env io
Range
"P3 90 60 1 " print
(-30) to(29) foreach(i,
    (-45) to(44) foreach(j,
        if(i squared + j squared > 324, "1 1 1 ", "1 0 0 ") print
    )
)
Die Bedingung beim `if` liest sich irgendwie schön, finde ich. :-)
BlackJack

Hah, ich bin auf 87 Zeichen bei der Python-Lösung runter. Und das mit einem Operator, von dem ich bis heute immer dachte, den brauche ich *nie*. :-)
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

*Sehen will* :D
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

*Sehen will*
Erst noch ein bisschen die Spannung erhöhen ... mal sehen, ob sich der Apfel nochmal meldet (wahrscheinlich hat er es inzwischen eh von einem Kumpel abgeschrieben und die Sache hat sich für ihn erledigt).

Damit es nicht langweilig wird hier eine meiner frühen "kürzesten Lösungen", mit LC, Doppelschleife und zu viel Mathematik - muss alles weg, damit es kurz wird!
Dafür kommt diese Variante mit einer Zeile und ganz ohne Semikolon, Komma und Gleichheitszeichen aus ...

Code: Alles auswählen

print"P3 90 60 1"," ".join(["1"+2*(" "+str(int((((x-45)**2+(y-30)**2)/324)**.1)))for y in range(60)for x in range(90)])

@BlackJack: Hat das vielleicht irgendwas mit "Prozent" zu tun ... ?

Tut mir leid, es sagen zu müssen, aber ich habe die 87 Zeichen schon unterschritten ...

Kleine Anmerkung zur Zählung: Ich zähle die Zeilenendezeichen bis auf das der letzten Zeile mit; die von mir ermittelte "Anzahl der Zeichen" entspricht dann der Dateilänge des Quelltextes in Byte.
BlackJack

@pütone: Nein nix mit Prozent, der Operator ist das unäre ``+``.

Ich glaube kürzer bekomme ich meins nicht mehr. Ausser mit einem komplett anderen Ansatz. Wollen wir Sonntag zur Deadline erklären und dann die Lösungen posten!?
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Nein nix mit Prozent, der Operator ist das unäre ``+``.
Ja, das habe ich bei mir auch drin ..
Wollen wir Sonntag zur Deadline erklären und dann die Lösungen posten!?
Gute Idee. Ich bin gespannt, insbesondere wo die paar wenigen Zeichen Unterschied sich verstecken, denn mir scheint, dass unsere beiden Lösungen sich mittlerweile kaum noch unterscheiden.

Schön wäre es, wenn sich bis dahin noch weitere "Kontrahenten" am "Ringen um die kürzeste Lösung" beteiligen würden.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Auch wenn's nicht die kürzeste Lösung ist: Ich hab 94 Bytes geschafft. Dabei habe ich auch unter Windows einen Zeilenumbruch als 1 Byte gewertet.
MfG
HWK

Edit: Jetzt sind es 93.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

ne Deadline ist fein - ich kann mich gedulden ;-). Ich werde mich sowieso nicht beteiligen können, weil ich gerade dabei bin etwas sehr viel Größeres zu refactorn ...

Aber daran...
pütone hat geschrieben:mal sehen, ob sich der Apfel nochmal meldet
... glaube ich ebenso wenig wie Du. ;-)
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Schlange und Apfel, hm? Rings a bell ... ;)
BlackJack

Also dann Leute, es ist Sonntag, High Noon. Zieht euren Colt, äh, Code. :-)

Code: Alles auswählen

print'P3 90 60 1'
for b in range(5400):a=+((b/90-30)**2+(b%90-45)**2>324);print'1',a,a
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Wie schon vermutet - die Unterschiede sind gering. Eigentlich gibt es gar keine (mehr).

Ich habe nur das unäre Plus anders verteilt (- 1 Zeichen) und die '1' nicht als Zeichen(kette) ausgegeben (- 1 Zeichen).

Here it is (84 Byte):

Code: Alles auswählen

print"P3 90 60 1"
for p in range(5400):c=(p%90-45)**2+(p/90-30)**2>324;print 1,+c,+c
War eine reizvolle Sache. Vielleicht bringt der Apfel wieder mal eine interessante Hausaufgabe mit ...
BlackJack

Als ich noch zwei Schleifen hatte, sah's noch so aus:

Code: Alles auswählen

print'P3 90 60 1'
for b in range(-30,30):
 for c in range(-45,45):a=(b*b+c*c>324)+0;print'1',a,a
Das ist die Lösung, wo ich meinte, dass es fast als "echte" Lösung durchgehen kann wenn man es nicht ganz so "gequetscht" hinschreibt und vielleicht ein oder zwei erklärende Kommentare hinzu fügt. Und die Umwandlung `bool` nach `int` sollte man vielleicht anders schreiben. :-)
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Und hier meine Variante:

Code: Alles auswählen

s='P3 90 60 1'
for i in range(5400):x=i%90-45;y=i/90-30;s+=' 1'+' %i'%(x*x+y*y>324)*2
print s
MfG
HWK
lunar

BlackJack hat geschrieben:Also dann Leute, es ist Sonntag, High Noon. Zieht euren Colt, äh, Code. :-)
Black Jack
Der Geek, der schnell programmiert als sein Schatten

Darf ich das so vermarkten?
meneliel
User
Beiträge: 256
Registriert: Montag 25. Juni 2007, 08:35
Kontaktdaten:

lunar hat geschrieben:
BlackJack hat geschrieben:Also dann Leute, es ist Sonntag, High Noon. Zieht euren Colt, äh, Code. :-)
Black Jack
Der Geek, der schnell programmiert als sein Schatten

Darf ich das so vermarkten?
und schöner :)
Antworten