Daniel Thoma: Logisch grübeln: Information Codieren

Beitrag lesen

Hallo Monty,

Den Tip mit dem 36er-Zahlensystem hast Du ja schon bekommen.
Der kürzest mögliche Code ist das aber noch nicht, da 1200 keine 36-Potenz ist. Die nächstgrößere wäre 1296, Du verschenkst also etwas Platz.

Optimalerweise geht man folgendermaßen vor:
Benötigte Stellen: s = aufrunden(#zahlen * log_36(1200));
Alle Zahlen z_i um eins erniedrigen (da Du keine 0 speichern willst)
Zahlen z_i so aufsummieren: S = summe von 0 bis i (z_i * 1200^i)
S ins 36er-System umrechnen und den Code vorn mit Nullen auf s Stellen auffüllen.

Decodieren:
Aus der Länge des Codes die größte, beim Speichern verwendete 36 Potenz bestimmen: #zahlen = abrunden(s / log_36(1200));
Berechnent der z_i:
for i from #zahlen - 1 to 0 do
  z_i = abrunden(s / 1200^i);
  s = s % 1200^i;
od;
Anschließend noch alle Zahlen wieder um eins erhöhen.
Für 600 Zahlen brauchst Du so nur 1188 statt 1200 Stellen.
Fragt sich natürlich, ob es das Wert ist ;-)

Grüße

Daniel