Fefes WP contest

Alles, was nicht direkt mit Python-Problemen zu tun hat. Dies ist auch der perfekte Platz für Jobangebote.
Antworten
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Servus,

Für alle die Spaß am Vergleichen von Implementierungen haben: Fefe macht gerade einen Test. Ich habe da schon die wohl mit Abstand langsamste Implementation des Problemes eingeschickt, mal sehen ob die überhaupt die 350 MB schafft :)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ist das Dein Code?

Code: Alles auswählen

#!/usr/local/bin/python -S
import sys
from operator import itemgetter
from collections import defaultdict

def main():
    count = defaultdict(int)
    for line in sys.stdin:
        for word in line.split():
            count[word] += 1

    for e, v in sorted(count.items(), key=itemgetter(1), reverse=True):
        print e, " ", v

main()
Wäre ja schön, wenn der Fefe da den Autoren mit angegeben hätte :-)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Hyperion hat geschrieben:Ist das Dein Code?
Nein, ich habe keine Python-Lösung eingeschickt. Die war schon da, dann hatte ich keine Lust und um ehrlich zu sein war das mit Python auch etwas zu trivial 8) Ich warte ja noch, dass eine x86-Assembler-Lösung den C-Code überholt.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
OverNord
User
Beiträge: 72
Registriert: Donnerstag 24. Januar 2008, 11:59
Kontaktdaten:

Leonidas hat geschrieben:
Hyperion hat geschrieben:Ist das Dein Code?
Nein, ich habe keine Python-Lösung eingeschickt. Die war schon da, dann hatte ich keine Lust und um ehrlich zu sein war das mit Python auch etwas zu trivial 8) Ich warte ja noch, dass eine x86-Assembler-Lösung den C-Code überholt.
Könntest uns ja auch nicht so im dunklen tappen lassen und sagen, welche denn nun von dir ist. Ich persönlich tippe ja darauf, dass die Implementierung in Scheme von dir ist.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

OverNord hat geschrieben:Könntest uns ja auch nicht so im dunklen tappen lassen und sagen, welche denn nun von dir ist.
Von denen die online sind leider keine, zumindest bisher. Fefe hat die wohl nicht hinzugefügt. Meine Vermutung ist dass meine Implementation zu viel Speicher verbraucht hat. Bastle momentan an einer Lösung die die Datei inkrementell einliest und vielleicht auch auf Unicode verzichtet, was den Speicher schonen würde.
OverNord hat geschrieben:Ich persönlich tippe ja darauf, dass die Implementierung in Scheme von dir ist.
Ja, ich habe eine Scheme-Implementation eingeschickt :) Aber die die online ist, von Karsten Patzwaldt (ich habe mit ihm im IRC gesprochen) gefällt mir nicht so sehr, da sie eher imperativ ist. Meine Lösung ähnelt übrigens der Haskell-Version, wie ich später festgestellt habe - nehme ich mal für ein gutes Zeichen.

Meine Implementation, siehe dort die jeweils aktuellste Annotation. Da wird wohl in nächster Zeit etwas optimiert werden, vielleicht unterbiete ich karsten_ ja noch. Allerdings wundert mich ja doch warum Scheme generell so schlecht abschneidet.

P.S: Brainfuck und Io fehlen noch. Ebenso Self ;)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Hier meine Implementierung in D:

Code: Alles auswählen

import std.stdio, std.string;

int main()
{
    char[] buf;
    char[][] temp;
    int[char[]] result;
    while (readln(stdin, buf))
        foreach (word; split(buf))
            result[word.dup]++;
    foreach (word, cnt; result)
        temp ~= format("%6d: %s", cnt, word);
    foreach (line; temp.sort)
        writefln(line);
    return 0;
}
Bin damit aber leider zu spät gekommen.
MfG
HWK
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

HWK hat geschrieben:Bin damit aber leider zu spät gekommen.
Kannst du trotzdem noch einsenden. Wenn die Performance besser ist, dann sollte das angenommen werden.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

Also eine Io-Lösung hat er auf jeden Fall zugeschickt bekommen. :-)

Ist aber wahrscheinlich zu exotisch und zu langsam.

Code: Alles auswählen

#!/usr/bin/env io
histogram := Map clone
File standardInput foreachLine(line,
    line splitNoEmpties foreach(word,
        histogram atPut(word, histogram atIfAbsentPut(word, 0) + 1)
    )
)
words := histogram asList sortKey(pair, List with(-pair at(1), pair at(0))) sort
words foreach(pair, (pair at(0) .. " " .. pair at(1)) println)
OverNord
User
Beiträge: 72
Registriert: Donnerstag 24. Januar 2008, 11:59
Kontaktdaten:

Leonidas hat geschrieben:
OverNord hat geschrieben:Ich persönlich tippe ja darauf, dass die Implementierung in Scheme von dir ist.
Ja, ich habe eine Scheme-Implementation eingeschickt :) Aber die die online ist, von Karsten Patzwaldt (ich habe mit ihm im IRC gesprochen) gefällt mir nicht so sehr, da sie eher imperativ ist. Meine Lösung ähnelt übrigens der Haskell-Version, wie ich später festgestellt habe - nehme ich mal für ein gutes Zeichen.

Meine Implementation, siehe dort die jeweils aktuellste Annotation. Da wird wohl in nächster Zeit etwas optimiert werden, vielleicht unterbiete ich karsten_ ja noch. Allerdings wundert mich ja doch warum Scheme generell so schlecht abschneidet.

P.S: Brainfuck und Io fehlen noch. Ebenso Self ;)
Aber immerhin habe ich die richtige Sprache genannt, woher ich die nur wusste ...

PS: Brainfuck wäre auf jedenfall interessant, und Assembler fehlt auch noch.

PPS: "P.S" ist falsch, das wird ohne den Punkt geschrieben. :)
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Ich habe jetzt D 2.0 installiert. Das kompiliert meine erste Version, die unter D 1.0 lief, nicht. Hier eine neue Variante, die unter beiden Compilern läuft und ohne .dup auskommt:

Code: Alles auswählen

import std.stdio, std.string;

int main()
{
    string buf;
    string[] temp;
    int[string] result;
    while ((buf = readln()) != null)
        foreach (word; split(buf))
            result[word]++;
    foreach (word, cnt; result)
        temp ~= format("%6d: %s", cnt, word);
    foreach (line; temp.sort)
        writefln(line);
    return 0;
}
Die ist aber außer beim Sortieren schon sehr ähnlich zu der veröffentlichten.
MfG
HWK
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

OverNord hat geschrieben:PPS: "P.S" ist falsch, das wird ohne den Punkt geschrieben. :)
Ich habe da soger einen Punkt zu wenig. Persönlich ist mir DIN 5008 ziemlich egal. Wenn man ultra-korrekt sein will müsste es auch W.S.D.L. heißen oder X.M.L.-R.P.C. was aber wohl niemand macht, daher nehme ich mir auch die Freiheit P.S. mit Punkten zu schreiben.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
jonas
User
Beiträge: 156
Registriert: Dienstag 9. September 2008, 21:03

Hi,
heißt "Wörter splitten" an den Leerzeichen splitten oder wie?
MfG Jonas
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Es ist nicht definiert wie gesplittet werden soll. Daher ist es auch schwer zu vergleichen, weil einige mehr Wörter splitten als andere.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

Ach ja, in `Factor` habe ich es auch noch einmal geschrieben:

Code: Alles auswählen

#! /usr/bin/env factor
USING: assocs hashtables io kernel math namespaces
       present sequences sorting splitting ;
IN: word-count

42 <hashtable>
[ " \t\n\r" split harvest  [ over inc-at ] each ] each-line
>alist sort-values reverse  [ [ present ] map " " join print ] each
:-)
Antworten