Unleserlich , 1830 1796 1791 1771 1762 1745 1736 1727 1626 1606 1577 Bytes
Die Ausgabe erfolgt in umgekehrter alphabetischer Reihenfolge ( z
bis a
), jedoch nach Ihren Regeln, die als zulässig erscheinen.
"" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """ "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" '"" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """ "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """ "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """ "" "" "" "" "" "" "" "" "" "" "" "" "" """ "" "" "" "" "" "" "" "" "" "" "" "" "" "
Erläuterung
Um einen Eindruck davon zu bekommen, was Unreadable kann, ist hier die grundlegende Operation:
- Sie haben ein unendliches Band mit Ganzzahlzellen beliebiger Größe
- Sie haben keinen Speicherzeiger wie in Brainfuck. Stattdessen dereferenzieren Sie Zellen nach ihrer Position auf dem Band. Dies bedeutet, dass Sie den Wert 4 oder den Wert 4 lesen können (doppelte Dereferenzierung).
- Sie können nur Speicherzellen lesen oder schreiben (nicht wie in Brainfuck direkt inkrementieren / dekrementieren).
- Sie können Werte innerhalb eines Ausdrucks erhöhen / verringern. So eine Speicherzelle Sie müssen erhöhen lesen , Schritt , Schreib , oder anders ausgedrückt:
write(x, inc(read(x)))
.
- Es gibt while-Schleifen und ternäre Bedingungen, die nur auf Null im Vergleich zu Nicht-Null prüfen können.
Dieses Programm verwendet das Band wie folgt. Die Variablennamen werden später im Pseudocode verwendet. Auch dies dokumentiert die erste Version (die 1830 Bytes war); In den Änderungen am unteren Rand sehen Sie, was sich seitdem geändert hat.
- Zelle 0: variabel
q
- Zelle 1: Variablen
a
, p
,ch
- Zelle 2: Variablen
hash
,v
- Zelle 3: Variablen
b
,r
- Zelle 4: Variablen
aa
,l
- Zelle 5: Bleibt 0, um das „Ende“ der Dezimalstellenfolge zu markieren
- Zellen 6–95: Speichern Sie die Zeichenfolge der Dezimalstellen rückwärts
- Zellen 96–121: Speichern Sie die Anzahl der Stimmen, die von den Benutzern
a
(96) bis z
(121) abgezogen werden sollen ( der ASCII-Code des Buchstabens minus eins).
- Zellen 4657–7380: Denken Sie daran, welche Wähler / Wähler-Kombinationen wie oft aufgetreten sind. Diese Zellen haben nur 4 mögliche Werte:
0
= noch nicht gesehen, -1
= einmal gesehen, -2
= zweimal gesehen, -3
= beliebig oft mehr als 2 gesehen.
Der Algorithmus geht im Wesentlichen wie folgt vor:
- Lesen Sie weiter Zeichenpaare
a
und b
. Berechnen Sie den Hash-Wert (a-2)*(a-1)+b-1
, der für jede Buchstabenkombination von a – z eindeutig ist.
- Überprüfen Sie die Speicherzelle mit diesem Hash-Wert (
*hash
). Wenn dies -3
der Fall ist, ist der Benutzer bereits zum Entfernen von Stimmen berechtigt *(b-1)
. Ansonsten dekrementieren *hash
. Wenn dies jetzt -3
der Fall ist, kann der Benutzer nach drei Vorkommnissen nur noch Stimmen entfernen, also inkrementieren Sie *(b-1)
um 3
.
- Gehen Sie danach die Zeichen in umgekehrter Reihenfolge durch (
z
bis a
) und geben Sie die Zeichen aus, für die Stimmen abgezogen werden müssen. Dies erfordert eine manuelle Ganzzahldivision durch 10, um die Zahl in Dezimalstellen zu übersetzen.
Nach alledem sieht das Programm wie folgt aus:
// Read pairs of characters
while (a = read) + 1 {
b = read
// Calculate hash = (a-1)*(a-2)/2 + b-1
// This also sets a = b-1
hash = 0
while --a {
aa = a
while --aa {
++hash
}
}
while --b {
++a
++hash
}
// If this combination has just been seen for the third time,
// increment *a by 3; if more than third time, increment *a by 1
*a = (*hash + 3) ? ((--*hash) + 3 ? *a : (*a+3)) : (*a+1)
}
// Loop through the characters z to a
l = 27
while --l { // l loops from 26 to 1 (not 0)
(v = *(ch = l + 95)) ? { // 'a' is ASCII 97, but cell 96
print (ch+1) // print the votee
// Now we need to turn the number v into decimal.
// p points to where we are storing decimal digits.
p = 5
while v {
// Integer division by 10 (q=quotient, r=remainder)
r = (q = 0)
while v {
--v
(++r - 10) ? 1 : {
r = 0
++q
}
}
// Store digit ASCII character
*(++p) = r + 48 // 48 = '0'
v = q
}
// Now output all the digit ASCII characters in reverse order
while *p {
print *(--p + 1)
}
} : 1
}
Edit 1, 1830 → 1796: Es wurde erkannt, dass ich den Rückgabewert einer while-Schleife an einer Stelle wiederverwenden kann.
Edit 2, 1796 → 1791: Es stellt sich heraus, dass das Programm etwas kleiner ist, wenn ich anstelle der Zellen 6–95 die Dezimalstellen in den negativ nummerierten Zellen speichere (ab –1). Als zusätzlichen Bonus ist das Programm nicht mehr auf 10⁹⁰ Stimmen beschränkt!
Bearbeiten 3, 1791 → 1771: Statt das Ergebnis der Zuordnung *(ch = l + 95)
zu v
, ich jetzt weisen Sie ihn q
und dann die Zuordnung bewegen v = q
in die während Zustand, wobei der Code auf 1777 Bytes. Tauschen Sie dann die Position von q
und v
auf dem Band aus, da sie q
jetzt 1 häufiger ist als v
.
Edit 4, 1771 → 1762: Duh. Die Initialisierung hash
auf 1 anstelle von 0 ist 9 Byte kürzer. Der Hash-Code ist jetzt 1 mehr, was keine Rolle spielt.
Edit 5, 1762 → 1745: Wenn ich initialisiere q
und r
auf 1 anstatt auf 0, muss ich ein paar -1
s streuen , um es richtig zu machen, und alles scheint sich abzubrechen - mit der Ausnahme, dass die while v { --v; [...] }
Schleife jetzt eine Iteration weniger ausführen muss. was ich sagen kann while --v { [...] }
, was 26 Zeichen kürzer ist.
Edit 6, 1745 → 1736: Anstelle von { r = 1; ++q }
können wir schreiben q = *((r = 1)+1)+1
. Dies q
hängt von der Tatsache ab, dass sich die Variable in Steckplatz 2 befindet. Wenn es auf Position 1 wäre, wäre dies noch kürzer, aber dann wäre das gesamte Programm insgesamt länger.
Edit 7, 1745 → 1727: Edit 6 wurde rückgängig gemacht und stattdessen wurde das Speichern erreicht, indem die innerste while-Schleife in den Ausdruck eingefügt wurde, der den stelligen ASCII-Code berechnet, der ebenfalls bei 1736 Byte endet ... aber dann eine Dekrementierungsanweisung (9 Byte) gespeichert hat ) durch Ändern ((++r) - 11) ? r :
auf (r - 10) ? ++r :
.
Edit 8, 1727 → 1626: Die Hash-Berechnung wurde überarbeitet. Es wird jetzt eine while-Schleife weniger verwendet. Die Zellenpositionen haben jetzt ihre tatsächlichen ASCII-Codes (nicht mehr um 1 deaktiviert). Variablen an verschiedenen Stellen auf dem Band neu gemischt, da sie jetzt mit unterschiedlicher Häufigkeit auftreten.
Edit 9, 1626 → 1606: Verrückteres Inlining. Der Body der ersten while-Schleife sieht jetzt ungefähr so aus:
// b = next char
*(b = (hash = read)) = {
// hash = b + (a-1)*(a-2)/2
while (a2 = --a) {
while --a2 {
++hash
}
}
// If this combination has just been seen for the third time,
// increment *b by 3; if more than third time, increment *b by 1
(*hash + 3) ? ((--*hash) + 3 ? *b : (*b+3)) : (*b+1)
}
und die variablenzuordnung hat sich nun fast vollständig geändert.
Bearbeiten 10, 1606 → 1577: Ich beobachtete , dass a
und a2
beide erniedrige auf 0 in While - Schleifen, also wenn ich paaren könnte p
entweder mit denjenigen, aber nicht mit ch
, ich zu initialisieren würde nicht brauchen , p
um 0
(die 29 Byte Kosten). Es stellte sich heraus, dass ich das durch Tauschen p
und Tauschen tun kann r
. Die neuesten Variablenzuweisungen (und ihre Häufigkeit im Code) lauten jetzt:
0 = v (3) (total 3)
1 = hash (6), r (5), ch (2) (total 13)
2 = b (4), q (5) (total 9)
3 = a (3), p (5) (total 8)
4 = a2 (3), l (4) (total 7)
nanananananananabatman
Testfall.