Seite 1 von 2

Verfasst: Mittwoch 3. September 2008, 19:47
von EyDu
audax hat geschrieben:sorum isses ;)
Ah ja, da habe ich wohl das not übersehen :roll: Und jetzt weiss ich auch wieder, warum ich immer ein if/then/else benutze und es nicht mit "or" nachbaue :)

Verfasst: Mittwoch 3. September 2008, 19:47
von lunar
BlackJack hat geschrieben:@lunar: Es "kracht" ja gar nicht, das Original läuft halt einfach nur *ewig* ohne dabei nennenswert Speicherzuwachs zu zeigen. Ich denke es ist die `nodups()` mit der Quadratischen Laufzeit. Die Schleife innerhalb von `new.__contains__()` in Zeile 20 schaut sich bei 'sample4.txt' insgesamt schlappe ~199 *Milliarden* Elemente an.
Ich habe nur zitiert, was im Linux Magazin stand.
Meine Lösung liefert nach 10 Sekunden dass hier
Kann man sich die irgendwo ansehen?
Im Text kommt '[958378]' vor, aber es gibt keine Fussnote mit der Nummer. Hat jetzt mein Programm versagt, weil es darauf prüft, oder ist das ein Fehler in den Eingabedaten?
Nimmt man die existierenden Implementierungen als Referenz, dann hat dein Programm versagt. Die ignorieren solche nicht-existenten Fußnoten.

Ach ja, nur so nebenbei: Bei sowas ruft das LinMag üblicherweise Leser dazu auf, eigene Vorschläge einzusenden. Das ist diesmal nicht anders, wer sich berufen fühlt, kann seine Lösung an redaktion@linux-magazin.de schicken. Die drei kreativsten Lösung werden mit einem "Fachbuch" prämiert (allerdings natürlich nicht Python exklusiv). Selbst wenn man das nicht unbedingt gewinnt, so besteht ja noch die Möglichkeit, der Welt zu zeigen, dass man die Sache auch anständig implementieren kann, da das Linux Magazin auch Leserbriefe abdruckt.

Verfasst: Mittwoch 3. September 2008, 20:15
von BlackJack
@audax: Dein Skript macht's genau falsch herum: Du nummerierst die Referenzen im Text fortlaufend von 1 an und die Fussnoten sind nicht numerisch aufsteigend. Das sollen sie aber soweit ich das verstanden habe, und die anderen implementiert haben, auf jeden Fall sein. Macht auch mehr Sinn wenn man beim Lesen den Text zu einer Referenz sucht.

@lunar: Meine Lösung kann man noch nirgends sehen. Ich trau mich nicht. :-)

Verfasst: Mittwoch 3. September 2008, 20:16
von audax
ich hätte gerne ne Referenzlösungsdatei zum diffen.

Alle machen was anderes Oo

Verfasst: Mittwoch 3. September 2008, 20:22
von BlackJack
@audax: Also die Perl und die Python-Lösung machen hier das gleiche: http://paste.pocoo.org/show/84300/

Und das macht auch wesentlich mehr Sinn als Deine Lösung. Wenn man 100te Fussnoten hat und Du die Referenzen durch nummerierst, anstatt die Fussnoten zu sortieren, ist dem Leser überhaupt nicht geholfen.

Verfasst: Mittwoch 3. September 2008, 20:25
von audax
BlackJack hat geschrieben:@audax: Dein Skript macht's genau falsch herum: Du nummerierst die Referenzen im Text fortlaufend von 1 an und die Fussnoten sind nicht numerisch aufsteigend. Das sollen sie aber soweit ich das verstanden habe, und die anderen implementiert haben, auf jeden Fall sein. Macht auch mehr Sinn wenn man beim Lesen den Text zu einer Referenz sucht.
hm...k, hatte mich schon gewundert :/
Dann werd ich es wohl mal umschreiben....

€dit:
Nochmal zum Mitschrieben für blöde:
Ich nummeriere die Fußnoten durch und ersetzt dann im Text die alte Referenz mit der neuen?

Verfasst: Mittwoch 3. September 2008, 22:02
von audax
http://paste.pocoo.org/show/84310

So, nun isses aber richtig :D
habs noch ein bischen aufgeräumt, die eine Funktion wurde mir etwas zu groß :)

Verfasst: Mittwoch 3. September 2008, 22:22
von BlackJack
Grundfunktion sieht okay aus, aber ``-a`` nicht. Da sollten dann die Referenzen im Text fortlaufend durchnummeriert sein und die Fussnoten dazu passend sortiert. Eben das Ergebnis was man eigentlich haben möchte.

Verfasst: Mittwoch 3. September 2008, 22:57
von audax
aber -a tut genau das gleiche wie das "offizielle"-python Skript :(

Also im Text[1] fortlaufend[2] nummeriert[3] und die

[1] Fußnoten dazu
[2] passend
[3] sortiert?

*alles umschmeiß*


Irgendwie bin ich heute zu doof dafür :D

Verfasst: Mittwoch 3. September 2008, 23:20
von BlackJack
Also dieses Skript tut das nicht: http://paste.pocoo.org/show/84310/

Code: Alles auswählen

bj@s8n:~$ python audax.py -a test.txt
A great brown fox [1] jumped of a pile of lorem ipsum [2], [4]. He met
with a silver penguin, browsing the Linux Kernel Mailinglist [5]. They
debated other the question whether to start a C-program with "main
(int argc, char **argv)" or with "main (int argc, char *argv[])".
Square brackets annoyed them [3].

@footnote:
@footnotes:

[1] Al Fabetus: "On characters and animals", 1888, self published.
[2] Lorem Ipsum, <a href="http://en.wikipedia.org/wiki/Lorem_ipsum">Web Link</a>
[4] B. Fox: "More on Blind Text".
[5] Linux Kernel Maintainers: LKML
[3] Annoying Link.
Die Reihenfolge der *Texte* der Fussnoten stimmt, aber die Numerierung stimmt weder im Text, noch in den Fussnoten. Beim "offiziellen" Python-Skript sind die Nummern sowohl im Text als auch in den Fussnoten fortlaufend.

Verfasst: Mittwoch 3. September 2008, 23:37
von audax
% python footnotes.py --test -a
A great brown fox [1] jumped of a pile of lorem ipsum [2],
[3]. He met with a silver penguin, browsing the Linux Kernel
Mailinglist [4]. They debated whether to start a C-program with
"main (int argc, char **argv)" or with "main (int argc, char *argv[])".
Square brackets annoyed them [5]. Multiple references exist [2].


[1] Al Fabetus: "On characters and animals", 1888, self published.
[2] Lorem Ipsum, <a href="http://link.org/Lorem_Ipsum">Web
Link</a>
[3] B. Fox: "More on Blind Text".
[4] Linux Kernel Maintainers: LKML
[5] Annoying Link.
Ich hoffe doch, nun hab ich es ;)
Wenn man einmal was völlig dämliches im Kopf hat..gnargh.

Und Morgen kommt noch ein kleines Stück Redundanz raus.

http://paste.pocoo.org/show/84315

Verfasst: Donnerstag 4. September 2008, 12:05
von helduel
Moin allerseits,

hab mich auch mal dran versucht - from scratch :-).

http://paste.pocoo.org/show/84336/

Braucht bei mir für die 54MB-Datei ca. 16 Sekunden. Einen (mir bekannten) Bug hat es noch: Nicht existierende Fußnoten im Text bekommen ebenfalls eine neue Nummer.

Gruß,
Manuel

Verfasst: Donnerstag 4. September 2008, 12:19
von audax
Und hast trotzdem den gleichen Ansatz wie ich, Hello World (in C++) und SidBurn (Perl) :D

Zur Rerefenz: Braucht bei mir 19s

Verfasst: Donnerstag 4. September 2008, 12:38
von helduel
audax hat geschrieben:Und hast trotzdem den gleichen Ansatz wie ich, Hello World (in C++) und SidBurn (Perl) :D

Zur Rerefenz: Braucht bei mir 19s
Ich hab mir deinen Code ehrlich gesagt noch gar nicht genau angeschaut. Aber er ist bei mir 4 Sekunden schneller :? . Die Rache kommt nicht ;-) .

Gruß,
Manuel

Verfasst: Donnerstag 4. September 2008, 14:21
von BlackJack
Mein (unkommetierter) Versuch: http://paste.pocoo.org/show/84357/

Verfasst: Freitag 5. September 2008, 12:09
von audax
Schön sauberen Lösung!
Die Performance ist auch erstaunlich ok. (20s bei mir)
Ist auf jedenfall ne pythonische Vorzeigelösung. :)

Verfasst: Sonntag 7. September 2008, 12:45
von BlackJack
Und ein Update: http://paste.pocoo.org/show/84647/

• Docstrings hinzugefügt.
• Die Zeichenkette für den Fussnotentrenner ist in die `Document`-Klasse gewandert und könnte jetzt als Argument übergeben werden.
• Fehler in `Footnotes.reorder()` behoben: Die Methode kam nicht mit Referenzen zurecht, zu denen es keine Fussnote gibt.
• `Document.__init__()` und `Document.parse()` nehmen Flags für die Überfüfung von Referenzen ohne Fussnote und Fussnoten ohne Referenz entgegen.

Ich habe es auch mal mit anderen Python-Implementierungen ausprobiert: IronPython auf Mono braucht Unmengen an Speicher und 1 Minute, 50 Sekunden. Aktuelle Jython Beta steigt mit einem `MemoryError` aus.

Verfasst: Sonntag 9. November 2008, 14:32
von BlackJack
Die haben jetzt die Einsendungen vom gemeinen Volk gesichtet und ausprobiert. Die Quelltexte können hier bestaunt werden: ftp://linux-magazin.de/pub/listings/mag ... /sprachen/

Sind einige Python-Lösungen dabei. Meins ist als `045.py` enthalten und liegt von der Geschwindigkeit her im Mittelfeld unter allen Lösungen.