Eine Lösung ist nur aufgrund des Unterschieds zwischen 1 Megabyte und 1 Million Byte möglich. Es gibt etwa 2 hoch 8093729,5 verschiedene Möglichkeiten, 1 Million 8-stellige Zahlen auszuwählen, wobei Duplikate erlaubt sind und die Reihenfolge keine Rolle spielt, so dass eine Maschine mit nur 1 Million Byte Arbeitsspeicher nicht genug Zustände hat, um alle Möglichkeiten darzustellen. Aber 1M (abzüglich 2k für TCP/IP) sind 1022*1024*8 = 8372224 Bits, also ist eine Lösung möglich.
Teil 1, erste Lösung
Dieser Ansatz braucht etwas mehr als 1M, ich werde ihn später so verfeinern, dass er in 1M passt.
Ich speichere eine kompakte sortierte Liste von Zahlen im Bereich 0 bis 99999999 als eine Folge von Unterlisten von 7-Bit-Zahlen. Die erste Teilliste enthält Zahlen von 0 bis 127, die zweite Teilliste enthält Zahlen von 128 bis 255, usw. 100000000/128 ist genau 781250, also werden 781250 solcher Teillisten benötigt.
Jede Teilliste besteht aus einem 2-Bit-Teillistenkopf, gefolgt von einem Teillistenkörper. Der Teillistenkörper nimmt 7 Bits pro Teillisteneintrag in Anspruch. Die Teillisten sind alle miteinander verkettet, und das Format macht es möglich zu erkennen, wo eine Teilliste endet und die nächste beginnt. Der Gesamtspeicherbedarf für eine vollständig gefüllte Liste beträgt 2*781250 + 7*1000000 = 8562500 Bits, also etwa 1,021 M-Byte.
Die 4 möglichen Werte für den Kopf der Teilliste sind:
00 Leere Teilliste, es folgt nichts.
01 Singleton, es gibt nur einen Eintrag in der Unterliste und die nächsten 7 Bits enthalten ihn.
10 Die Unterliste enthält mindestens 2 verschiedene Zahlen. Die Einträge werden in nicht-absteigender Reihenfolge gespeichert, mit der Ausnahme, dass der letzte Eintrag kleiner oder gleich dem ersten ist. Dadurch kann das Ende der Teilliste identifiziert werden. Zum Beispiel würden die Zahlen 2,4,6 als (4,6,2) gespeichert werden. Die Zahlen 2,2,3,4,4 würden als (2,3,4,4,2) gespeichert.
11 Die Unterliste enthält 2 oder mehr Wiederholungen einer einzigen Zahl. Die nächsten 7 Bits geben die Zahl an. Danach folgen null oder mehr 7-Bit-Einträge mit dem Wert 1, gefolgt von einem 7-Bit-Eintrag mit dem Wert 0. Die Länge des Unterlistenkörpers bestimmt die Anzahl der Wiederholungen. Zum Beispiel würden die Zahlen 12,12 als (12,0) gespeichert, die Zahlen 12,12,12 als (12,1,0), 12,12,12,12 als (12,1,1,0) und so weiter.
Ich beginne mit einer leeren Liste, lese eine Reihe von Zahlen ein und speichere sie als 32-Bit-Ganzzahlen, sortiere die neuen Zahlen an Ort und Stelle (wahrscheinlich mit Heapsort) und führe sie dann in einer neuen kompakten sortierten Liste zusammen. Das wiederhole ich so lange, bis keine Zahlen mehr zu lesen sind, dann gehe ich die kompakte Liste noch einmal durch, um die Ausgabe zu erzeugen.
Die folgende Zeile stellt den Speicher kurz vor dem Beginn der Listenzusammenführung dar. Die "O "s sind die Bereiche, die die sortierten 32-Bit-Ganzzahlen enthalten. Die "X "s sind die Bereiche, die die alte kompakte Liste enthalten. Die "="-Zeichen sind der Erweiterungsraum für die kompakte Liste, 7 Bits für jede ganze Zahl in den "O "s. Die "Z "s sind anderer zufälliger Overhead.
ZZZOOOOOOOOOOOOOOOOOOOOOOOOOO==========XXXXXXXXXXXXXXXXXXXXXXXXXX
Die Zusammenführungsroutine beginnt mit dem Lesen am äußersten linken "O" und am äußersten linken "X" und mit dem Schreiben am äußersten linken "=". Der Schreibzeiger holt den Lesezeiger für die kompakte Liste erst ein, wenn alle neuen ganzen Zahlen zusammengeführt sind, da beide Zeiger für jede Teilliste um 2 Bits und für jeden Eintrag in der alten kompakten Liste um 7 Bits vorrücken und für die 7-Bit-Einträge für die neuen Zahlen noch genügend Platz vorhanden ist.
Teil 2, die Unterbringung in 1M
Um die obige Lösung in 1M zu quetschen, muss ich
A
B
C
D
M
S
For example, 3 repetitions: "C{00NNNNN}{1NN0000}{0100000}", 4 repetitions: "C{00NNNNN}{1NN0000}{0100001}{0100000}", and so on.
T
I
W
W
T
1
B
ZZZ=====XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
S
ZZZXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX=======
S
ZZZ=======XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
I
T
ZZZ=====AAAAAABBCCCCDDDDDEEEFFFGGGGGGGGGGGHHIJJJJJJJJJJJJJJJJJJJJ
E
ZZZ=====AAAAAABBCCCCDDDDDEEEFFFGGGGGGGGGGGHHIJJJJJJJJJJJJJJJJJJJJ
ZZZAAAAAA=====BBCCCCDDDDDEEEFFFGGGGGGGGGGGHHIJJJJJJJJJJJJJJJJJJJJ
ZZZAAAAAABB=====CCCCDDDDDEEEFFFGGGGGGGGGGGHHIJJJJJJJJJJJJJJJJJJJJ
ZZZAAAAAABBCCC======DDDDDEEEFFFGGGGGGGGGGGHHIJJJJJJJJJJJJJJJJJJJJ
ZZZAAAAAABBCCCDDDDD======EEEFFFGGGGGGGGGGGHHIJJJJJJJJJJJJJJJJJJJJ
ZZZAAAAAABBCCCDDDDDEEE======FFFGGGGGGGGGGGHHIJJJJJJJJJJJJJJJJJJJJ
ZZZAAAAAABBCCCDDDDDEEEFFF======GGGGGGGGGGGHHIJJJJJJJJJJJJJJJJJJJJ
ZZZAAAAAABBCCCDDDDDEEEFFFGGGGGGGGGG=======HHIJJJJJJJJJJJJJJJJJJJJ
ZZZAAAAAABBCCCDDDDDEEEFFFGGGGGGGGGGHH=======IJJJJJJJJJJJJJJJJJJJJ
ZZZAAAAAABBCCCDDDDDEEEFFFGGGGGGGGGGHHI=======JJJJJJJJJJJJJJJJJJJJ
ZZZAAAAAABBCCCDDDDDEEEFFFGGGGGGGGGGHHIJJJJJJJJJJJJJJJJJJJJ=======
ZZZ=======AAAAAABBCCCDDDDDEEEFFFGGGGGGGGGGHHIJJJJJJJJJJJJJJJJJJJJ
T
T
P
W
W
S
h