Autor |
Beitrag |
Flamefire
      
Beiträge: 1207
Erhaltene Danke: 31
Win 10
Delphi 2009 Pro, C++ (Visual Studio)
|
Verfasst: Fr 01.04.11 14:25
Im Serverprotokoll steht drin, "Gibt an, ob der eigenen Client am Zug ist (y - ja, n - nein) oder passen muss"
Ich habe allerdings nichts gefunden, wann ein Client "passen muss". Wann ist das der Fall?
Ich nehme auch an, dass man nur auf freie Felder ziehen kann, richtig? Wie siehts dann mit "Überspringen" von Steinen (eigene, fremde?) bei dem 2Feld-Zug aus? Anscheinend ist es erlaubt. Ist das richtig so?
|
|
Bergmann89
      
Beiträge: 1742
Erhaltene Danke: 72
Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
|
Verfasst: Fr 01.04.11 14:47
Hey,
überspringen geht. Zumindest hat er nich gemeckert, als meine KI das heut gemacht hat^^
MfG Bergmann
_________________ Ich weiß nicht viel, lern aber dafür umso schneller^^
|
|
Martok
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: Fr 01.04.11 14:58
Flamefire hat folgendes geschrieben : | Im Serverprotokoll steht drin, "Gibt an, ob der eigenen Client am Zug ist (y - ja, n - nein) oder passen muss"
Ich habe allerdings nichts gefunden, wann ein Client "passen muss". Wann ist das der Fall? |
Das ist z.B. Fall, wenn dich der Gegner mit einer Wand der Stärke 2 eingemauert hat und du hinter der Wand nix freies hast. Dann hast du ja keine Möglichkeit, irgendwo einen Stein hinzuziehen, ergo musst du passen. Je nachdem, ob der Gegner dir dann nochmal Platz macht, kann es durchaus sein dass du gar nicht mehr dran kommst.
Flamefire hat folgendes geschrieben : | Ich nehme auch an, dass man nur auf freie Felder ziehen kann, richtig? |
Korrekt.
Flamefire hat folgendes geschrieben : | Wie siehts dann mit "Überspringen" von Steinen (eigene, fremde?) bei dem 2Feld-Zug aus? Anscheinend ist es erlaubt. Ist das richtig so? |
Korrekt. Außerdem dürfen blockierte Felder übersprungen werden. Also alles, sozusagen. Hauptsache der Zug hat Weite 2.
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
Flamefire 
      
Beiträge: 1207
Erhaltene Danke: 31
Win 10
Delphi 2009 Pro, C++ (Visual Studio)
|
Verfasst: Do 07.04.11 16:06
Frage zur Zeitschranke pro Zug. Gesagt sind ja 10s aber einstellbar. In welchem Rahmen wird sich die Zeit denn bewegen? Brauch den Suchbaum ja nicht auf 50 Ebenen optimieren wenn eh nur 10-20s Zeit sind.
|
|
Martok
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: Do 07.04.11 16:24
Flamefire hat folgendes geschrieben : | Frage zur Zeitschranke pro Zug. Gesagt sind ja 10s aber einstellbar. In welchem Rahmen wird sich die Zeit denn bewegen? Brauch den Suchbaum ja nicht auf 50 Ebenen optimieren wenn eh nur 10-20s Zeit sind. |
So genau haben wir uns das noch nicht überlegt, aber es wird wohl definitiv <=30s bleiben. Die 10s zum Üben sind schon eine gute Hausnummer.
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
Horst_H
      
Beiträge: 1653
Erhaltene Danke: 243
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: Do 07.04.11 17:01
Hallo,
auch wenn ich die Regel nicht bestimme, halte ich 10 Sekunden nur als Obergrenze denkbar.
Es sind x freie Felder = 81 Felder - ( ? blockierte + 4 vorbelegte)= maximal 77.
Minimal sind die x freien Felder mit x Zügen zu belegen, wenn nie ein Zug der Weite 2 unternommen
wird.
770 Sekunden als zeitliches Limit für ein Spiel ist in einem Turnier nicht praktikabel.
Stell Dir vor es sind 20 Leute, jeder gegen jeden 2 Spiele (schwarz/weiß) sind schon 420 Spiele a 770 Sekunden ( warum sollte man seine Antwort vorher schicken, falls sich nicht etwas besseres findet ) sind 89 Stunden.
Wenn Du Dir replay ID 86 der OmaKi vs OmaKi anschaust:
Geblockt:
b2,b8,d5,e4,e6,f5,h2,h8
Gestartet
20110406 22 13 29
erster Zug um
20110406 22 13 30 ,a9,a8
letzter/ 69.ter Zug
20110406 22 14 31 ,h6,i5
Sind für 69 Züge 61 Sekunden.
Aber dort spielt eine KI gegen sich selbst, eine sich selbsterfüllende Prohezeihung der Züge, denn der Gegner (KI) macht genau die Züge die ich (KI), selbst auch gerechnet habe und die alten Daten stimmen.
ID 78: OmaKi ( Zieht nach 5 Sekunden ) vs Kha (<- zieht rasend schnell in selber Sekunde der ständig vorhandene Testgegner vom Forum? )
von 20110405 19 34 04,a9,a8 bis 20110405 19 39 23,i8,i9 102 Züge mit zweimal passen von schwarz hat 5 min gedauert.
Warum aber der vorletzte Zug von schwarz, wo praktisch nichts frei ist 1:23 Sekunden dauerte???
Gruß Horst
|
|
Thom
      
Beiträge: 70
Erhaltene Danke: 5
Delphi 10 Seattle Prof.
|
Verfasst: Do 07.04.11 18:51
Horst_H hat folgendes geschrieben : | Warum aber der vorletzte Zug von schwarz, wo praktisch nichts frei ist 1:23 Sekunden dauerte??? |
Ist das eine rhetorische Frage oder erwartest Du darauf eine ernsthafte Antwort?
Sind übrigens 81 Sekunden = 1:21 Minuten. 
|
|
Martok
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: Do 07.04.11 19:32
Vorweg: ich hab deinen Punkt nicht ganz verstanden, also wenn ich Quatsch antworte, nicht wundern
Horst_H hat folgendes geschrieben : | auch wenn ich die Regel nicht bestimme, halte ich 10 Sekunden nur als Obergrenze denkbar. |
Naja, wir werden sicher fürs eigentliche Turnier mit sehr kurzen Poll-Zeiten und/oder LP arbeiten, so dass das ginge. Ich wollte auch nur eine absolute Obergrenze geben.
Horst_H hat folgendes geschrieben : |
770 Sekunden als zeitliches Limit für ein Spiel ist in einem Turnier nicht praktikabel.
Stell Dir vor es sind 20 Leute, jeder gegen jeden 2 Spiele (schwarz/weiß) sind schon 420 Spiele a 770 Sekunden ( warum sollte man seine Antwort vorher schicken, falls sich nicht etwas besseres findet ) sind 89 Stunden. |
Och, naja. Man kann ja problemlos 10 Spiele gleichzeitig laufen lassen. De facto sogar alle, da jeder Client ja multi-game-Fähig sein muss. Nur genug CPU-Kerne müssen da sein, damit die Zeitbegrenzung irgendeinen praktischen Wert hat. Hast also Recht, es wird zu langsam so. Aber ob das jetzt 5s oder 15s oder irgendwas anderes werden, müssen wir halt dann erstmal grob peilen, wenn wir wissen wie viele Spiele denn gespielt werden müssen.
Horst_H hat folgendes geschrieben : | ID 78: OmaKi ( Zieht nach 5 Sekunden ) vs Kha (<- zieht rasend schnell in selber Sekunde der ständig vorhandene Testgegner vom Forum? ) |
Der denkt auch nix, wenn Kha nix geändert hat macht der zufällige Züge  Ich könnte ja meinen Versuchsclient noch online nehmen, aber nachher wundert ihr euch dass der Bot die ID MartokUIClient geerbt hat
Horst_H hat folgendes geschrieben : | Warum aber der vorletzte Zug von schwarz, wo praktisch nichts frei ist 1:23 SekundenMinuten dauerte??? |
Keine Ahnung, frag den der die KI programmiert hat 
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
Flamefire 
      
Beiträge: 1207
Erhaltene Danke: 31
Win 10
Delphi 2009 Pro, C++ (Visual Studio)
|
Verfasst: Fr 08.04.11 22:27
Ok noch 2 Fragen:
Da ihr die Spiele ja gleichzeitig laufen lassen wollt, wie sieht es da mit Multithreading aus?
Einerseits brauche ich schonmal je Spiel 2 Threads (einen der rechnet, einen der die Zeit überwacht und den andren beendet), was man zwar auf 1 Masterthread und je Spiel 1 Rechenthread reduzieren könnte, aber eben immer noch mehrere Threads bleiben. Andrerseits könnte man auch die Berechnung parallelisieren. Also >=2 Threads verwenden, was zwar extrem aufwändig ist, aber doch recht effektiv sein kann.
Nächste Frage zu den vorberechneten Daten: Sind Strukturinformationen erlaubt? Ich hätte da z.B. verschiedene Tabellen, die zum Finden umliegender Felder und zum Zählen verwendet werden, die doch etwas Rechenaufwand sparen. Ist das noch erlaubt?
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: Fr 08.04.11 23:09
Ich denke, es ging dabei alleine um Eröffnungs- und Endspieltabellen. Wie soll eine KI ohne Strukturinformationen denn aussehen?
lg,
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
|
|
Martok
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: Sa 09.04.11 13:21
Flamefire hat folgendes geschrieben : | Ok noch 2 Fragen:
Da ihr die Spiele ja gleichzeitig laufen lassen wollt, wie sieht es da mit Multithreading aus?
Einerseits brauche ich schonmal je Spiel 2 Threads (einen der rechnet, einen der die Zeit überwacht und den andren beendet), was man zwar auf 1 Masterthread und je Spiel 1 Rechenthread reduzieren könnte, aber eben immer noch mehrere Threads bleiben. Andrerseits könnte man auch die Berechnung parallelisieren. Also >=2 Threads verwenden, was zwar extrem aufwändig ist, aber doch recht effektiv sein kann. |
Ui, du denkst auf jedenfall komplizierter als ich. Auf sowas bin ich gar nicht gekommen, sieht man ja auch im Musterclient  Genau genommen hatte ich, als ich vom gleichzeitig spielen schrieb noch nicht mal dran gedacht dass ja nicht mal dieser Multithreading kann. Ups. Naja, im Zweifelsfall starten wir halt mehrere Instanzen
Grundsätzlich aber würde ich sagen überlassen wir das euch. Es wäre aber zweckmäßig, in diesem Fall irgenden Dokument zu haben, aus dem hervorgeht wie viele Kerne der Client voll nutzt, so dass wir dann entsprechend verteilen/planen können.
Flamefire hat folgendes geschrieben : | Nächste Frage zu den vorberechneten Daten: Sind Strukturinformationen erlaubt? Ich hätte da z.B. verschiedene Tabellen, die zum Finden umliegender Felder und zum Zählen verwendet werden, die doch etwas Rechenaufwand sparen. Ist das noch erlaubt? |
Ich sehe da wie Hidden keinen Grund, warum das nicht erlaubt sein sollte. Sowas fällt für mich unter "normale Optimierungen". Ein Array of (-1,-1;-1,0;-1,+1 etc tut sicher keinem weh. Wenn du was anderes meintest, "bitte spezifizieren sie ihre Anfrage" 
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
Flamefire 
      
Beiträge: 1207
Erhaltene Danke: 31
Win 10
Delphi 2009 Pro, C++ (Visual Studio)
|
Verfasst: Sa 09.04.11 14:08
Ja Problem ist halt die Zeitbeschränkung. Ich finde keine andere Variante, als die Berechnung in nem Thread laufen zu lassen und mittels Timer o.ä. den Thread am Ende zu killen. Das sogar noch so weit, dass ich nen Thread starte, der den thread killt. Wenn man sich nur auf 1 Spiel konzentrieren muss (Man kann ja trotzdem z.b. Mehrere Prozesse nehmen, wenn kerne verfügbar sind) wäre das einfacher. Dann könnte man in den Regeln z.b. festlegen, dass nur 2 Threads je Prozess verwendet werden dürfen (oder von mir aus 3, aber die Optimierung auf Multi-Threaded Berechnung ist so zeitaufwendig, dass nicht mehr alle eine Chance haben, die wollen.)
Macht auch die Chancen gleicher. Weil jmd der das wirklich auf 8 Threads optimiert hat, hat eben größere Chancen, als jmd der nur 1 Benutzt. schonmal wegen 8 facher Rechenzeit.
Jep von solchen Rede ich. Habe inzwischen ne Unit, die mir ne inklude Datei erzeugt, in der das Zeug dann drin ist xD
Und warum eiegentlich 9x9 Felder? Das passt doch in keinen Int64 Wert 
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: Sa 09.04.11 14:37
Flamefire hat folgendes geschrieben : | Und warum eigentlich 9x9 Felder? Das passt doch in keinen Int64 Wert  |
Wie ist x denn Definiert: A(A(*,*),A(*,*))?  Also 9*9=81 << MaxuInt64 - oder spezifizieren Sie die Anfrage
Zur Parallelisierung würde ich sagen, wir sparen uns allen eine ganze Menge Arbeit und schließen es aus. Hat denn schon jemand etwas implementiert oder plante das überhaupt jemand?
Vielleicht könnte man mit virtuellen Maschinen zwei gleichartige Rechner zur Verfügung stellen, aber wenn die auf der selben Hardware laufen bin ich da auch etwas skeptisch ob nicht die die mehr benötigt ein kleines bisschen mehr Recourcen bekommt? Zweimal die selbe Hardware zur Verfügung stellen, können wir vom Team wohl kaum verlangen, oder?
lg,
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
Zuletzt bearbeitet von Hidden am Sa 09.04.11 14:40, insgesamt 1-mal bearbeitet
|
|
jaenicke
      
Beiträge: 19306
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 09.04.11 14:39
Ich habe jetzt auch mal angefangen. Und da ist mir beim Konzept auch eine Frage zu Multithreading gekommen:
Testweise habe ich gerade mal ein wenig herumgespielt. Ganz wichtig: Dürfen Threads weiterrechnen während der andere Client dran ist? Es geht hier darum, dass ich im Hintergrund Tabellen aufbauen würde, die später dann verwendet werden können.
Und dann noch: Gibt es eine Arbeitsspeicherbeschränkung (von den systembedingten Einschränkungen abgesehen meine ich)? (Aber ich glaube so viel wird es ohnehin nicht, ich rechne so mit 300 MiB oder so...  )
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: Sa 09.04.11 14:47
jaenicke hat folgendes geschrieben : | Testweise habe ich gerade mal ein wenig herumgespielt. Ganz wichtig: Dürfen Threads weiterrechnen während der andere Client dran ist? Es geht hier darum, dass ich im Hintergrund Tabellen aufbauen würde, die später dann verwendet werden können. |
Pondern hielt ich jetzt für selbstverständlich erlaubt. Interessant es auszuschließen, wäre natürlich im Bezug auf das letzte Thema: Wenn keine zwei gleichzeitig rechnen, wäre es wahrscheinlich kein Problem alles auf einer Maschine laufen zu lassen ohne dass Ressourcen streitig werden
jaenicke hat folgendes geschrieben : | Und das zweite: Gibt es eine Arbeitsspeicherbeschränkung (von den systembedingten Einschränkungen abgesehen meine ich)? |
Interessante Frage, ich bin für eine in der Größenordnung einer einzelnen Delphi-Anwendung: Sonst bringt der Aufwand des Splits schon wieder Vorteile?
(Und ja, ich kenne einen immensen Vorteil durch viel Speicher. Wenn ich den aber ausspreche, grillt mich BenBE am Spieß. Das möchte ich nicht. Ich mag keine Spieße  )
lg,
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
|
|
jaenicke
      
Beiträge: 19306
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 09.04.11 15:09
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: Sa 09.04.11 15:13
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
|
|
Thom
      
Beiträge: 70
Erhaltene Danke: 5
Delphi 10 Seattle Prof.
|
Verfasst: Sa 09.04.11 16:17
- Darf ich 81 Threads benutzen?
- Darf ich 3TB Daten auf die Festplatte schreiben?
- Darf ich auf eine externe Serverfarm zugreifen?
- Darf ich...?
He, Du weißt doch..? Na kar, Du doch auch, oder? Aber na klar doch - aber nur, wenn Du auch - oder?
Wenn ich den Thread hier lese, verliere ich irgendwie die Lust am Knobeln.
Ich bekomme den Eindruck, daß die - was auch immer (ich möchte höflich bleiben) - durch pure Rechenpower ersetzt werden soll.
Deshalb bin ich für ganz restriktive Bedingungen:
- Keine Schreibrechte für die Festplatte.
- Stark begrenzter Prozess-Speicher.
- Kein oder nur stark begrenzter Einsatz von (zusätzlichen) Threads.
- Keine Veränderung der Thread-Priorität (auf solche Ideen kommt bestimmt jemand!).
- Kein Eindringen in fremde Prozesse (traue ich auch einige Leuten zu).
- Lesbarer (!!!) und kommentierter Quelltext und dessen Veröffentlichung (zumindest der drei erstplazierten) nach dem Finale.
Nur leider läuft das alles darauf hinaus, 10 Seiten kleingedruckte AGB's zu verfassen. Das hat irgendwie nichts mehr mit sportlicher Fährnis zu tun und liegt bestimmt nicht im Sinn der geistigen Väter dieses Wettbewerbs.
Hätte nicht gedacht, daß ein derartiges kleines Spiel bei einigen Leuten die Hackerinstinkte aktiviert.
P.S.:
Wir können doch gleich alle 5846006549323611672814739330865132078623730171904 möglichen Konstellationen berechnen und den jeweils optimalsten Spielzug darauf... 
Für diesen Beitrag haben gedankt: Hidden
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: Sa 09.04.11 16:35
Thom hat folgendes geschrieben : | - Lesbarer (!!!) und kommentierter Quelltext und dessen Veröffentlichung (zumindest der drei erstplazierten) nach dem Finale.
|
Die Idee finde ich schonmal klasse.  Aber weil mich der Quelltext interessiert, nicht weil ich jemandem hier oder dem Team nicht traue wenn sie den Quelltext überfliegen
Thom hat folgendes geschrieben : | Hätte nicht gedacht, daß ein derartiges kleines Spiel bei einigen Leuten die Hackerinstinkte aktiviert.  |
Hmm, wenn du meinen letzten Post mit meinst: Da geht es um ein Verfahren aus der Informatik, das Redundanz aus einem Algorithmus entfernt aber bei zu wenig Speicher zu beliebig schlechten Fehlbewertungen führt.
Edit: Über Workarounds zur fehlenden Parallelisierung unter Delphi oder ähnlichen Software-Spielereien, um an mehr Hardware zu kommen, denke ich ähnlich: Das ist nicht unbedingt der Sinn, oder?
lg,
Edit2 -
Thom hat folgendes geschrieben : | P.S.: Wir können doch gleich alle 5846006549323611672814739330865132078623730171904 möglichen Konstellationen berechnen und den jeweils optimalsten Spielzug darauf...  |
Ist die Zahl belastbar? Dein 4^81 sollte wirklich eine obere Grenze sein, aber einige Stellungen sollten nicht vorkommen können(z.B. die Startfelder komplett eingemauert, aber noch andere Felder besetzt  )
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
|
|
Thom
      
Beiträge: 70
Erhaltene Danke: 5
Delphi 10 Seattle Prof.
|
Verfasst: Sa 09.04.11 17:33
Hidden hat folgendes geschrieben : | Aber weil mich der Quelltext interessiert, nicht weil ich jemandem hier oder dem Team nicht traue wenn sie den Quelltext überfliegen |
Nein - dem Team will ich natürlich absolut nichts unterstellen. Aber ich weiß, wie anstrengend es ist, irgendwelche längeren Quelltexte zu lesen, die nicht von einem selbst stammen. Und insofern tun sie mir eher Leid, weil sie vielleicht gar nicht geahnt haben, wie viel Arbeit sie sich machen...
Und wer sich keinen fragwürdigen Vorteil verschaffen will, kann seinen Quelltext auch leserlich gestalten und mit Kommentaren versehen.
In C ist ist ohne Probleme möglich, etwas zu programmieren, was man selbst nach einiger Zeit nicht mehr lesen kann. Klappt zwar auch in Delphi - aber da ist es nicht ganz so einfach.
Oder alles in eine Zeile zu verpacken und sämtliche Formatierungen zu entfernen. Das wäre dann immer noch compilierbarer Quelltext laut Spielbedingung.
Hidden hat folgendes geschrieben : | Hmm, wenn du meinen letzten Post mit meinst... |
Auch Nein - damit war niemand spezielles gemeint. War eher so aus dem Gefühl heraus, das sich meiner beim Lesen des Threads bemächtigte...
Hidden hat folgendes geschrieben : | Ist die Zahl belastbar? Dein 4^81 sollte wirklich eine obere Grenze sein, aber einige Stellungen sollten nicht vorkommen können(z.B. die Startfelder komplett eingemauert, aber noch andere Felder besetzt ) |
Belastbar?
Meinst Du das im Sinne von realistisch, nachprüfbar?
Na klar: Das wäre die mathematische Höchstgrenze. Aber selbst dann, wenn wir ein paar Millionen unmöglicher/unwahrscheinlicher Möglichkeiten abziehen, bleibt es irgendwie noch eine beeindruckende Zahl... 
|
|
|