Warum werden eigentlich die Semikolonse (;)) verwendet und keine Zeilenumbrüche? Wenn man von Newlines ausgeht, sind die auch nur ein Byte groß, aber der Code ist wesentlich lesbarer (wenngleich er sich natürlich in der Vertikalen über mehr Zeilen erstreckt).BlackJack hat geschrieben:Ist sogar etwas kürzer (in Zeichen) als die letzte Version mit der "statischen" Liste.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),[]))
Japanische Flagge /bzw. Kreis
Es ging hier nicht um lesbar, sondern ob Japaner das Ding als E-Mail-Signatur verwenden können.
("Newlines" zähle ich übrigens bei den Längenangaben immer mit)
("Newlines" zähle ich übrigens bei den Längenangaben immer mit)
Und weil es soviel Spaß macht:BlackJack hat geschrieben:@HWK: Stimmt, Danke! Das ``lea`` war auch unnötig komplex und beim "exit" habe ich ein ``mov eax, 1`` vergessen "kürzer" zu schreiben. Nun ist der Code-Teil auf 94 Bytes runter.
http://paste.pocoo.org/show/28484/
Zeile 32, 55 und 69 zu
Code: Alles auswählen
inc ebx
Code: Alles auswählen
inc eax
Code: Alles auswählen
mov edx,eax
inc edx
inc edx
Code: Alles auswählen
add eax,ecx
Mit push/pop auf das 32-Bitregister sind's nochmal zwei Byte weniger = 87 Bytes Code.
http://paste.pocoo.org/show/28606/
http://paste.pocoo.org/show/28606/
@BlackJack: Hier Dein Programm für 16-Bit-Windows angepasst: http://paste.pocoo.org/show/28610/. Es liefert mit Turbo-Assembler ein COM-File von insgesamt (!) 86 Byte. Ach, die gute alte Zeit.
Ich glaube nicht, dass der Apfel von dieser Art der Lösung profitieren könnte;meneliel hat geschrieben: irgendwann würden mich eure Lösungsideen dann ja auch mal interessieren
ich vermute, die gibt es aber erst, wenn apple ne Lösung gepostet hat, oder?
verstehen wird er sie nicht, und dem Lehrer kann er sie so auch nicht anbieten,
weil der ebenfalls sofort sieht, dass sie nicht vom Apfel sind.
Ich hatte aber darauf gehofft, dass der ein oder andere noch einsteigt in das Rennen um den kürzesten PYTHON(!)-Quelltext zum Ausgangsproblem.
Nach der vorübergehenden Faszination am Assembler-Quelltext, könnte man ja nochmal zu Python zurückkehren. Wenn ich nichts übersehen habe, dann steht man letztes Gebot noch (98 Bytes).
Interessanterweise musste ich am Ende auf List Comprehension verzichten, um die 100 Byte-Marke knacken zu können. Das 98-Byte-Programm kommt sogar ganz ohne Liste aus und verwendet nur einfache Datentypen und grundlegende Kontrollstrukturen - alles Dinge, die man in einem Tutorial auf den ersten Seiten findet.
Interessanter Tip das mit den LCs. Ich bin jetzt bei 97 Zeichen.
Und ich glaube schon, das applegreen mittlerweile von dieser Lösung profitieren könnte. Die ist jetzt so einfach, dass man sie durchaus etwas ausführlicher hinschreiben könnte und eine auch für Lehrer akzeptable Lösung hat.
Und ich glaube schon, das applegreen mittlerweile von dieser Lösung profitieren könnte. Die ist jetzt so einfach, dass man sie durchaus etwas ausführlicher hinschreiben könnte und eine auch für Lehrer akzeptable Lösung hat.
pütone hat geschrieben: ....
Ich glaube nicht, dass der Apfel von dieser Art der Lösung profitieren könnte;
verstehen wird er sie nicht, und dem Lehrer kann er sie so auch nicht anbieten,
weil der ebenfalls sofort sieht, dass sie nicht vom Apfel sind.
Ich hatte aber darauf gehofft, dass der ein oder andere noch einsteigt in das Rennen um den kürzesten PYTHON(!)-Quelltext zum Ausgangsproblem.
der Apfel vielleicht nicht ... ^^^ .. aber ...
Ich hatte auch schon überlegt, mir das jezt auch mal anzugucken, mir fehlt nur leider im Moment die Zeit dazu
Es ist schon erstaunlich, was möglich ist, wenn man über ein (in diesem Fall doch sehr überschaubares) Problem länger nachdenkt ...BlackJack hat geschrieben:Ich bin jetzt bei 97 Zeichen.
Jedesmal war ich mir sicher, dass weniger einfach nicht geht.
Und wieder lag ich damit falsch:
Mein neues Gebot: 95 Zeichen.
@HWK: Ich wollte mal den NASM zum "cross assemblen" ausprobieren und dabei ist mir aufgefallen, dass man a) BX nicht sichern muss weil int21/ah=9 nur AX und DX verändert und b) COM-Programme auch mit einem einfachen RET enden dürfen.
- Rebecca
- User
- Beiträge: 1662
- Registriert: Freitag 3. Februar 2006, 12:28
- Wohnort: DN, Heimat: HB
- Kontaktdaten:
Jetzt will ich auch mal. Da ich gegen eure kurzen Loesungen eh nicht anstinken kann, hab ich mich mal an was Ungewoehnlichem probiert: Elisp
http://paste.pocoo.org/show/28784/
Die Funktion create-jflag fuegt die ppm-Daten an Cursor-Position ein.
PS: Pocoo hat gar geinen Highlighter fuer Lisp!
http://paste.pocoo.org/show/28784/
Die Funktion create-jflag fuegt die ppm-Daten an Cursor-Position ein.
PS: Pocoo hat gar geinen Highlighter fuer Lisp!
Offizielles Python-Tutorial (Deutsche Version)
Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Pygments unterstützt Scheme seit langem (ich muss es ja wissen), und Common Lisp auch schon länger. Scheme ist im Auswahlmenü des Lodgeit, Common Lisp müsste man nachrüsten.Rebecca hat geschrieben:PS: Pocoo hat gar geinen Highlighter fuer Lisp!
Elisp gibt es tatsächlich nicht, aber wenn du willst, können wir da gerne mal schnell was dran ändern. Kenne mich nur mit Elisp nicht sonderlich aus.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
- Rebecca
- User
- Beiträge: 1662
- Registriert: Freitag 3. Februar 2006, 12:28
- Wohnort: DN, Heimat: HB
- Kontaktdaten:
An Scheme hatte ich gar nicht gedacht. Sieht doch gar nicht mal so schlecht aus: http://paste.pocoo.org/show/28798/. Das einzige, was mir auffaelt, ist bei
dort erkennt er die Parameterliste nicht als solche, sondern highlightet x1 als Funktionsnamen.
Ich habe ehrlich gesagt keine Ahnung, wo die Syntax-Unterschiede bei den ganzen Lisp-Dialekten liegen. Ich kann nur Elisp, und das auch nicht so sonderlich gut.
EDIT: Es gibt ja einfach keinen Unterschied zwischen Funktionsaufrufen und Listen. Der Scheme-Highligher highlightet anscheinend einfach das erste Listenelement als Funktionsnamen (zusaetzlich gibt's noch spezielle Funktionsnamen wie if und die Rechenoperationen). Emacs macht das nicht, da sind nur besondere Funktionsnahmen gehighlightet (in dem Codebeispiel nur defun, if, dotimes), ansonsten werden alle Listenelemente gleich behandelt. Der Funktionsname in einer defun wird in Emacs auch noch speziell hervorgehoben.
Code: Alles auswählen
(defun distance-sqr (x1 y1 x2 y2)
Ich habe ehrlich gesagt keine Ahnung, wo die Syntax-Unterschiede bei den ganzen Lisp-Dialekten liegen. Ich kann nur Elisp, und das auch nicht so sonderlich gut.
EDIT: Es gibt ja einfach keinen Unterschied zwischen Funktionsaufrufen und Listen. Der Scheme-Highligher highlightet anscheinend einfach das erste Listenelement als Funktionsnamen (zusaetzlich gibt's noch spezielle Funktionsnamen wie if und die Rechenoperationen). Emacs macht das nicht, da sind nur besondere Funktionsnahmen gehighlightet (in dem Codebeispiel nur defun, if, dotimes), ansonsten werden alle Listenelemente gleich behandelt. Der Funktionsname in einer defun wird in Emacs auch noch speziell hervorgehoben.
Zuletzt geändert von Rebecca am Dienstag 19. Februar 2008, 14:28, insgesamt 1-mal geändert.
Offizielles Python-Tutorial (Deutsche Version)
Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Bei a) war ich mir nicht sicher, b) war für mich neu. Aber so sind es 80 Bytes (http://paste.pocoo.org/show/28801/). Danke, BlackJack.BlackJack hat geschrieben:@HWK: Ich wollte mal den NASM zum "cross assemblen" ausprobieren und dabei ist mir aufgefallen, dass man a) BX nicht sichern muss weil int21/ah=9 nur AX und DX verändert und b) COM-Programme auch mit einem einfachen RET enden dürfen.
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)]))()
@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.
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.Rebecca hat geschrieben:Jetzt will ich auch mal. Da ich gegen eure kurzen Loesungen eh nicht anstinken kann
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)]))()
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 ...
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.
- Rebecca
- User
- Beiträge: 1662
- Registriert: Freitag 3. Februar 2006, 12:28
- Wohnort: DN, Heimat: HB
- Kontaktdaten:
Da sieht man mal, dass ich kein Lisp-Guru bin. Statt die insert-Methode im if- und else-Zweig aufzurufen...Rebecca hat geschrieben:http://paste.pocoo.org/show/28784/
Code: Alles auswählen
(if (> (distance-sqr 30 45 i j) 324)
(insert "1 1 1 ")
(insert "1 0 0 "))
Code: Alles auswählen
(insert (if (> (distance-sqr 30 45 i j) 324) "1 1 1 " "1 0 0 "))
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
Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei