Beiträge von Plantschkuh!

    Aber - funkt das Teil mit Laptop auch? da hab ich nichts gefunden, ich will mir sowohl PC als auch Laptop anschließen können.


    Ja, funktioniert mit einer ganz normalen Ethernetkarte. Aber: der Anschluß wird an die MAC-Adresse einer Netzwerkkarte gebunden, d.h. zwischen PC und Laptop umstecken is nich, zumindest nicht ohne weiteres. (Ich versteh deinen Post so, daß du das so willst.) Da muß dann ein Router dazwischen, was von Chello aus wieder nicht erlaubt ist, aber die finden das ja nicht raus.

    Zitat

    Es sieht für mich jetzt so aus als ob clock() nur die Clocks im aktuellen Prozess misst und nicht systemweit


    Zuallererst mißt clock() Prozessorzeit, nicht wall time. Und eben vielleicht nur Prozessorzeit als "user", also ohne Syscalls.

    Zitat

    Wie kann ich Zeitintervalle zuverlässig und plattformunabhängig messen?


    In ISO C++ gar nicht, du wirst eine Library brauchen. Nur aus Interesse, ist dein Grafikcode rein plattformunabhängig?

    Zitat

    (CLOCKS_PER_SEC ist dort 100, unter Windows ist es 1000; unter Linux sogar 1.000.000 - funktioniert aber wie gesagt nicht).


    Die Million ist auch nur Show, soweit ich das im Kopf hab zählt unter Linux die clock-Funktion eben in Tausenderschritten.

    Warum jedoch reicht es nicht im zu kompilierenden File einfach alles mittels Include einzubinden, wie man es etwa mit stdio.h macht?


    Das Header-File enthält nur Deklarationen der verwendeten Funktionen (und Makros, Typen etc.). Die Definitionen der Funktionen, also der wirkliche Code, sind in Libraries zu finden.

    Der Compiler (bzw. richtigerweise der Linker) weiß nicht, welcher Header zu welcher Library gehört, also muß man das explizit angeben. Die Standard-Library ist da eine Ausnahme, die wird automatisch immer eingebunden; die in stdio.h deklarierten Funktionen gehören da dazu. (Noch eine Ausnahme gibt es: Unter Unix ist es traditionell so, daß die Funktionen von math.h, obwohl auch zur Standard-Library gehörig, nicht automatisch gelinkt werden. Wenn man also math.h verwendet, ist normalerweise auch ein -lm auf der Kommandozeile für den Linker notwendig.)

    Assoziative Arrays würden sich in PHP anbieten, wobei ich aber nicht weiß wie gut oder schlecht da die Performance ist. Ich würde es einfach mal ausprobieren.


    Notfalls kann man sich auch assoziative Arrays mittels AVL-Bäumen oder sowas selber basteln. Jedenfalls ist so ziemlich jede Datenstruktur besser als ein unsortiertes Array von Strings mit Mehrfachvorkommen...

    Zitat

    Mit Hash-Werten wäre ich eher vorsichtig, weil die u. U. nicht eindeutig sind


    Trotzdem ein großer Schritt vorwärts, wenn man nur noch eine (normalerweise sehr kurze) Liste von Strings mit genau dem Hashwert betrachten muß.

    Auf Unixen gibts üblicherweise das Programm bc, das sowas kann; auf den Studservern ist es auch vorhanden.

    Was den Komfort betrifft, schaust du dir am besten an, ob es dir paßt.

    Zitat von For3st

    Hi leute hab gestern meinen Linksys WRT54G Wireless Router mit einer neuen Firmware aufgeppet


    Das Schlüsselwort ist "gestern". Ich bin vor einem halben Jahr einige Zeit mit DD-WRT gefahren, es war aber ziemlich instabil. Alle 24-48 Stunden ging mal nix, ich mußte den Router neu booten.
    Jetzt hab ich wieder die normale Linksys-Firmware und keinen Grund zur Klage. (Die angepriesenen Vorteile von DD-WRT habe ich nicht gebraucht.)

    Ich verwend den gcc 3.3, aber halt auf meinem iBook, da wird natürgemäß PowerPC-Code generiert. Variante 1:

    Variante 2:

    Sicher kein weltbewegender Unterschied, und ich wüßt nichtmal, ob zweiteres schneller ist. Schaut aber etwas besser aus.

    Ich hab keine Vergleichsplattform zur Verfügung und meine Assembly-Kenntnisse sind etwas eingerostet, aber: Wenn du willst, daß der Optimierer gute Leistungen bringt, pfusch ihm nicht ins Handwerk. Für folgenden Code:

    Code
    unsigned char quersumme32(unsigned int x) {
        return quersumme_8[(x>>24) & 0xff] + quersumme_8[(x>>16) & 0xff]
            + quersumme_8[(x>>8) & 0xff] + quersumme_8[x & 0xff];
    }


    spuckt mein gcc mit -O3 hübscheren, kürzeren Code aus als für deinen. Wieso? Weil die Semantik von dem, was du erreichen willst, viel klarer rüberkommt. Und die Semantik ist das, womit der Optimierer nunmal arbeitet; viele Optimierungen hauen (leider) nicht hin, wenn man die gewünschte Berechnung über mehrere Statements verteilt.

    Es ist mit Regexps nicht möglich, sowas wie "einer von diesen Buchstaben, und später genau der selbe nochmal" auszudrücken.

    Das beste, was man tun könnte, wären getrennte Regexps für jeden Buchstaben (d.h. "a kommt negiert und nicht negiert vor", "b kommt negiert und nicht negiert vor", ...), die dann mit | verbunden werden. Das ist aber natürlich nicht befriedigend; ich würde sagen, du brauchst ein mächtigeres Tool.

    Zitat von Swoncen

    Wozu brauch ich einen Fernseher, wenn ich unterwegs bin?

    Naheliegende Antwort: Um auch unterwegs das Fernsehprogramm konsumieren zu können, wenn einen das freut. Während der olympischen Spiele hab ich einen in der U6 gesehen, der sich auf seinem Handy die Herrenabfahrt gegeben hat, sie war ihm halt wichtig und er war gerade nicht zuhause. Wieso auch nicht?

    Zu den Fotos: Ich mache manchmal Schnappschüsse mit meiner Handykamera, aber die Qualität ist nicht besonders und ich bräuchte einen Windows-Rechner, um die Bilder irgendwohin transferieren zu können. Also würde ich die Kamera kaum vermissen, hab deswegen die erste Option angekreuzt.

    In der einen Datei kannst du deine Instanzen definieren:

    Code
    sudokuinstanz([[1,2,3,_,_,9,7,8,4], ...]).


    oder

    Code
    sudokuinstanz(1,2,3,_,_,9,7,8,4, ...).

    Und in der anderen Datei in deinem Sudoku-Prädikat diese sudokuinstanz als Ziel (am Anfang) einfügen.

    "integer" ist weder das selbe wie "int" noch "Integer", no?
    "integer" heißt "ganzzahlig", du hast also eine zu große ganze Zahl angegeben. Zu groß für irgendeinen der ganzzahligen Datentypen, die Java so kennt.

    Das Vorzeichenbit ist eines der acht Bits, üblicherweise das "erste".
    0 bis 127 werden meistens durch die Bitmuster 00000000 bis 01111111 dargestellt, -128 bis -1 durch 10000000 bis 11111111. Das sind, wie du schon richtig festgestellt hast, 128 + 128 = 256 Bitmuster.

    Zitat von Swoncen

    Oder ist alles gleich schnell?


    Ja. Subtraktionen sind auch nur Additionen (mit vorheriger Ermittlung des Komplements, aber das ist gratis), und Vergleiche mit > sind auch nur Subtraktionen. Du hast also bei jeder Variante die Kosten von zwei Additionen, und die sind wohl immer gleich schnell.

    Aber... bist du dir sicher, daß du diese Frage überhaupt stellen solltest? Wenn dein Programm zu langsam ist, optimiere richtig, statt an solchen winzigen Kleinigkeiten zu feilen. Oder verwende nicht Java... (das ist jetzt eine Annahme).
    Wenn es aber nicht zu langsam ist, dann ist Mikrooptimierung Zeitverschwendung.

    Zitat von Swoncen

    Wo isn da der Unterschied im Quelltext?


    Direkt vor deiner Nase :) Der eine verwendet 3.2, der andere "3.2". Das ist relevant, weil 3.2 schon als Gleitpunktzahl dargestellt wird und daher ungenau ist. Aus dem String "3.2" kann sich der Konstruktor allerdings ein genaue Darstellung ausschnapsen.

    Zitat

    Bigdecimal kann zwar eine genauere Darstellung liefern, aber nie 100%ig exakt sein


    Doch, kann es. Jede Zahl, die aus einem endlich langen Dezimalstring konstruiert wird, ist notwendigerweise rational; rationale Zahlen kannst du mit einem Paar aus einer ganzen und einer natürlichen Zahl exakt darstellen (natürlich ist für beliebige Genauigkeit beliebig viel Speicher nötig, aber in der "Praxis" wird der üblicherweise reichen). Weiters sind die rationalen Zahlen abgeschlossen gegenüber den Grundrechnungsarten. Solang du also nur +, -, *, / rechnest, werden deine Ergebnisse intern immer genau sein.
    Daß etwa 1/3 im Output nicht als endlicher Dezimalstring darstellbar ist, ist eine andere Geschichte.

    EDIT: Na gut, das obige stimmt so nicht für BigDecimal; es ist problemlos möglich, rationale Zahlen exakt darzustellen, allerdings macht BigDecimal was anderes.

    Zitat von klausi

    Plantschkuh muss ich jetzt respekt oder angst vor dir haben, weil du mir mit einer vollwertigen lösung binnen einer stunde aufwartest?:zwinker:


    Mir ist beides recht :) Naja, viel war echt nicht zu machen, der größte Teil des Codes stammt von dir. Ich hab nur ein paar Sachen umbenannt und die Vergleiche nach vorne gezogen.
    Außerdem hätte ich gerade total fleißig eine Präsentation ausarbeiten sollen, also hatte ich viel Zeit für sowas...

    Es ist in Prolog zwar relativ straight forward, sowas zu formulieren, aber wenn der Suchraum exponentiell ist, dann wird der Interpreter auch exponentiell lang suchen...
    Was extrem ineffizient ist, ist daß dein Programm (sehr oft) alle möglichen Kombinationen der Ziffern 1 bis 9 aufzählt und erst dann auf Ungleichheit testet. Besser ist sicher, zuerst mit dif/2 alle Constraints zuzusichern und erst dann die Variablen mit Werten zu belegen. dif/2 unterscheidet sich von =\= und anderen Ungleichheitsprädikaten darin, daß die Argumente noch nicht instanziiert sein müssen; wenn irgendwann später mal beide bekannt sind, wird erst verglichen. Damit schließt man schon während der Aufzählung möglichst früh ungünstige Konstellationen aus.

    Hier ist dein Code mit entsprechenden Modifikationen:

    Das ist mit deinem Testfall ziemlich schnell: 429,041 inferences, 0.34 CPU in 0.38 seconds (89% CPU, 1261885 Lips)
    Ob auch das Ergebnis stimmt, kann wer anderer überprüfen :)

    Hübscher wäre das ganze übrigens mit Listen, aber was soll's. Und auch mit Constraints, siehe 11.8 im SWI-Manual.

    Zitat von Kampi

    was mache ich falsch?


    Du rufst dir nicht das minimale Grundwissen in Erinnerung, das du in Grundzüge der Informatik über Numerik erworben hast.
    Die Kurzfassung: Computer können nicht rechnen, und wenn es um Subtraktion geht, sind die Ergebnisse ganz besonders phantasievoll frei erfunden.

    Ich bin kein C++-Philosoph, aber soweit ich das verstanden habe, verwendet man Exceptions in C++ wirklich nur für Ausnahmen. Anders als in Java, wo man "normale" Fehlerbehandlung über Exceptions macht, werden sie in C++ also echt nur für Sachen benutzt, die normalerweise nicht auftreten und also nicht erwartet werden.
    Daß ein User falsche Parameter angibt, ist zu erwarten, also nimmt man da ein normales if, keine Exception. Macht den Code sowohl kürzer als auch leichter verständlich.