Illisible , 1830 1796 1791 1771 1762 1745 1736 1727 1626 1606 1577 octets
La sortie est dans l'ordre alphabétique inverse ( z
à a
) mais selon vos règles, cela semble être autorisé.
« " « » « « « » « » « » » » « « « » » » « » » « » « « » « » « » « » « » » « » « » « »" « » « » » « « " » » « » « « » « » « » » « » « « « » « » « » « » « » » » « »" " « » « » « « « » « » « » » » « « " » » « « « » « « « » « » « » » » « « « » » » « » » » « » « » « » « " « » « » « » » " « »« « » » « » « " « » « » « « « » « » « » » » « « « » » » »" « » « « « » « » « » « » » » « » « » « » "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " « » « « » » « » « « » « » « »" » « » « » « » « " « » » " « » « » « » « » « « « » » »" « « » »« » « » « » « « » « » « » « « « » « « « » « » « » « » » » « » « » « » » » « » « » « » » « » "" « » « » « » « « « » « » « » « « « » » » « » » » « « « » » » « " « » « » « » »" « » « » « » « « « » » » « » « « » » « » « » « » « « « » « » « » « « « » » » « » » » « » « » « « « » » » « « « » » » »« « " » » « « « » » » « « « » » » « « « » » » « « « » » » « « « » » » « « « » » » « « « » » »" » « » « « » » « » « « » » « » « « » » « » « « » » « » « « » » « » « " « » « » « « « » « » « » » » »" « » « « » » « » « « « » « » « » « » » » « » « » « » « « » » « » « « » » « » « « « » « » » » « » " »« » « » « » « » « « « » « » « » « » » » « » « » « « « » » » « » « « » » « » « » « » "" « » « » « » « « » « « « » » » « « « » » » « « « » » » « « « » » » « « « » » » « « « » » » « « « » » »" « « » » « » « « » » « » « « » » « » « « » » « » « « » » « » « « » » « » « « » » « » « « » » « » « « » » « »"" « » « « » » « » « « » » « » « « » » « » « « » » « » « « » » « » « « » » « » « « » » « » " » « « " » » « « « » » » « « « » » » « « « » » » « « « » » » « « « » » » « « « » » » « « « » » »" » « » « « » » « » « « » » « » « « » » « » « « » » « » « « » » « » « « » » « » « « » » « » « « » » « » '"" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ". Que" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" br suffisamment l'en qu' plusieurs plusieurs plusieurs plusieurs-plusieurs-plusieurs plusieurs-plusieurs plusieurs plusieurs-plusieurs plusieurs plusieurs prog plusieurs plusieurs quí plusieurs Réc plusieurs plusieurs plusieurs plusieurs plusieurs qu dél l'en plusieurs bien dél l'en plusieurs bien déluré 'dél bien' '' '' '' '' "" '"" "" "" "" "" "." "" "." "" "." "" "" "" "" "". «'". «". Diverses différentes différentes plusieurs plusieurs différentes que plusieurs plusieurs ''. '' '' Mais pas que plusieurs plusieurs-plusieurs-plusieurs-plusieurs-plusieurs “'' '' '"' "" "" "mais pas trop non fourni mais pas encore '' ''". '"Mais pas"' "" "" "" mais pas “'". « » « « » » « » « « »" » « " « » « » « » » « « »" » « » « " « » « » « « « » « » « » « » » » « » » « » « « » « » « » « » » « » « « « » « » « » « « « » » » « » » » « » « « « » « » « » » » « » " « »« » « » « « » » « » « " « » « « « » « » « » » » « » « » « « « » » » »" « » « « « » « » « » « » » » « » « » « » « « » » « » " « » « « « » » » « « « » » » « « « » » » « « « » » » « « « » » »" « « » » « » « « » » « » « « » » « » « « » » « » « « » » « » « « » » « » « « » » « » « « » » « » « « » » « »"" « » « « » » « » « « » » « » « « » » « » « « » » « » « « » » « » « « » » « » « « » » « » " » « « " » » « " « » « » « « « » « » « » » » « » « » « » » " « » « « « » « » « » « » » » « » « » « » "" "" "" "" "" "" "" "" "" "" "" "" "" ""« » « « » « » « » « » » « » « » « » « » « « » « » « » « » » « » « » « » « » « « » « » « » « » » « » « » « » « » « « » « » « » « » » « » « » « » « « « » « « « » « » « » » » « » » » « " « » « » « » »" « » « « « » « » » » « » « » « « « » » » « » « « » » « » « » « » « « « » » » « » " « » « » « »« « »" » « » « " « » « » » « « » « » « » « « « » » »" » « » « " » « « » « » « »" » « » « » « »" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "."" "". "" "" "" "" "" "" "" "" "" "" "" "" "" "."" "". "" "" "" "" "" "" "" "" "" "" "" "" "" ".
Explication
Tout d'abord, pour avoir une idée de ce que peut illisible, voici son fonctionnement de base:
- Vous avez une bande infinie de cellules entières de taille arbitraire
- Vous n'avez pas de pointeur de mémoire comme dans Brainfuck; au lieu de cela, vous déréférencez les cellules en fonction de leur emplacement sur la bande. Cela signifie que vous pouvez «lire la valeur n ° 4» ou «lire la valeur n ° (lire la valeur n ° 4)» (double déréférence).
- Vous pouvez uniquement lire ou écrire des cellules de mémoire (pas directement incrémenter / décrémenter comme dans Brainfuck).
- Vous pouvez incrémenter / décrémenter des valeurs dans une expression. Ainsi, pour incrémenter une cellule de mémoire que vous avez à lire , incrément , écriture , ou en d' autres termes:
write(x, inc(read(x)))
.
- Il existe des boucles while et des conditions ternaires qui peuvent uniquement vérifier si elles sont nulles ou non.
Ce programme utilise la bande comme suit. Les noms de variables seront utilisés dans le pseudocode plus tard. En outre, cela documente la première version (qui était de 1830 octets); voir les modifications au bas de ce qui a changé depuis.
- Cellule 0: variable
q
- Cellule 1: les variables
a
, p
,ch
- Cellule 2: variables
hash
,v
- Cellule 3: variables
b
,r
- Cellule 4: variables
aa
,l
- Cellule 5: reste 0 pour marquer la "fin" de la chaîne de chiffres décimaux
- Cellules 6 à 95: stocke la chaîne de chiffres décimaux à l'envers
- Cellules 96-121: stocke le nombre de votes à déduire des utilisateurs
a
(96) à z
(121) (le code ASCII de la lettre moins un).
- Cellules 4657–7380: rappelez-vous combien de combinaisons électeur / votant ont été rencontrées combien de fois. Ces cellules n'ont que 4 valeurs possibles:
0
= pas encore vu, -1
= vu une fois, -2
= vu deux fois, -3
= vu un nombre quelconque de fois supérieur à 2.
L'algorithme procède essentiellement comme suit:
- Continuez à lire les paires de caractères
a
et b
. Calculez la valeur de hachage (a-2)*(a-1)+b-1
, qui est unique pour chaque combinaison de lettres a – z.
- Vérifiez la cellule de mémoire à cette valeur de hachage (
*hash
). Si c'est le cas -3
, l'utilisateur est déjà éligible pour le retrait du vote, donc incrémenté *(b-1)
. Sinon, décrémentez *hash
. S'il est maintenant -3
, l'utilisateur vient se droit à la suppression de vote après trois occurrences, si incrément *(b-1)
par 3
.
- Après cela, parcourez les caractères dans l’ordre inverse (
z
en a
) et indiquez ceux pour lesquels des votes doivent être déduits. Cela nécessite une division manuelle en nombre entier par 10 pour traduire le nombre en chiffres décimaux.
Avec tout cela clarifié, voici à quoi ressemble le programme en tant que pseudocode:
// 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: Je me suis rendu compte que je pouvais réutiliser la valeur de retour d'une boucle while à un endroit.
Éditer 2, 1796 → 1791: il s'avère que le programme est légèrement plus petit si, au lieu d'utiliser les cellules 6 à 95, je stocke les chiffres décimaux dans les cellules numérotées négatives (à partir de –1). En prime, le programme n'est plus limité à 10⁹⁰ voix!
Edit 3, 1791 → 1771: Au lieu d’affecter le résultat de *(ch = l + 95)
to v
, je l’assigne q
puis je déplace l’affectation v = q
dans la condition while, en portant le code à 1777 octets. Puis permutez l'emplacement de q
et v
sur la bande car il q
est maintenant 1 plus commun que v
.
Éditer 4, 1771 → 1762: Duh. Initialiser hash
à 1 au lieu de 0 est 9 octets plus court. Le code de hachage est maintenant 1 plus, ce qui n'a pas d'importance.
Edit 5, 1762 → 1745: Si j’initialise q
et r
à 1 au lieu de 0, je dois saupoudrer un peu -1
de place pour que tout soit correct, et tout semble s’annuler - sauf que la while v { --v; [...] }
boucle doit maintenant exécuter une itération de moins, ce que je peux faire en disant while --v { [...] }
, qui est 26 caractères plus court.
Edit 6, 1745 → 1736: Au lieu de { r = 1; ++q }
, nous pouvons écrire q = *((r = 1)+1)+1
. Cela repose sur le fait qu’il se q
trouve à la variable emplacement n ° 2. Si c'était dans l'emplacement 1, ce serait encore plus court, mais le programme tout entier serait plus long dans l'ensemble.
Edit 7, 1745 → 1727: Revered Edit 6 et à la place, a réalisé la sauvegarde en insérant la boucle la plus interne en boucle dans l’expression qui calcule le code de code ASCII, qui se termine également à 1736 octets ... mais a ensuite enregistré une instruction de décrémentation (9 octets). ) en changeant ((++r) - 11) ? r :
pour (r - 10) ? ++r :
.
Édition 8, 1727 → 1626: Retouche du calcul du hachage. Il utilise maintenant une boucle while de moins. Les emplacements des cellules sont maintenant à leurs codes ASCII réels (pas plus de 1). Remaniement des variables à différents emplacements sur la bande car elles se produisent maintenant à une fréquence différente.
Edit 9, 1626 → 1606: Inlining plus fou. Le corps de la première boucle while ressemble maintenant à ceci:
// 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)
}
et l'assignation de variable a maintenant presque complètement changé.
Modifier 10, 1606 → 1577: Je remarquai que a
et a2
sont tous les deux décrémenté à 0 pendant que les boucles, donc si je pouvais paire p
avec l'un de ceux -ci , mais pas avec ch
, je ne aurais pas besoin d'initialiser p
à 0
(qui coûte 29 octets). Il se trouve que je peux le faire en échangeant p
et r
. Les affectations de variable les plus récentes (et leur fréquence d'apparition dans le code) sont maintenant:
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
le cas de test.