Défi
Votre tâche consiste à coder un entier sous forme de chaîne de caractères ASCII , puis à le décoder avec succès après que ladite chaîne a été mélangée de manière aléatoire.
Vous écrirez deux programmes / fonctions , qui seront appelés Encodeur et Décodeur .
Encodeur
- Entrée: un entier dans la plage .
- Sortie: une chaîne de caractères ASCII (pas nécessairement imprimable).
Décodeur
- Entrée: une permutation aléatoire de la chaîne .
- Sortie: l'entier .
Notation
Soit la longueur maximale de sur toutes les valeurs possibles de . Si l' encodeur agit de manière non déterministe (ce qui est autorisé, voir ci-dessous), alors le sera la longueur maximale de qui peut se produire (éventuellement ).s n A s ∞
Soit la longueur du codeur en octets et la longueur du décodeur en octets.L D
Votre score est alors .
La victoire est attribuée à la soumission avec le score le plus bas .
Limite de temps
Il y a une limite de temps quelque peu arbitraire de 1 minute sur le temps d'exécution à la fois de l' encodeur et du décodeur pour un seul testcase (c'est-à-dire une seule valeur de ).
Le but est d'éviter les solutions qui trouvent que le codage force brute en énumérant toutes les séquences avec certaines propriétés. Si votre solution fait quelque chose de plus intelligent que cela, elle s'adaptera très probablement à la contrainte de temps et sera considérée comme valide. De même, s'il fonctionne sur TIO pour certaines valeurs de sélectionnées au hasard, il sera considéré comme valide. Sinon, je vais le tester sur ma machine, mais notez que si votre solution est pure force brute, elle échouera presque certainement.
Règles
- L' encodeur et le décodeur doivent être écrits dans la même langue .
- Le décodeur doit sortir le bon entier pour chaque permutation possible de la chaîne retournée par l' encodeur .
- L' encodeur et le décodeur ne sont en aucun cas autorisés à partager des informations (par exemple au moyen de variables globales ou de fichiers).
- La sortie de l' encodeur n'a pas besoin d' être déterministe (c'est-à-dire que la même entrée peut produire des chaînes de sortie différentes si l' encodeur est exécuté plusieurs fois), mais le décodeur doit toujours deviner le bon entier .n
- L' encodeur et le décodeur peuvent prendre et renvoyer l'entier de n'importe quelle manière appropriée (par exemple, si il convient que l'entrée soit , ou ).n = 14
14
"14"
[1,4]
- Le codeur peut délivrer en sortie la chaîne , soit par l' impression sur ou par le retour d' une chaîne, une liste / tableau de caractères ou une liste / tableau d'entiers dans l'intervalle [ 0 , 127 ] ; notez que le décodeur recevra en entrée une permutation de s telle que renvoyée par l' encodeur , il devrait donc accepter la chaîne s ' au même format que s .
stdout
- Les failles standard sont interdites.
- Si possible, expliquez comment fonctionne votre code et pourquoi le score que vous revendiquez est correct.
Exemple
Supposons que .
- L' encodeur reçoit
14
en entrée. Il peut sortir"qwerty"
.- Le décodeur reçoit une permutation de
"qwerty"
comme entrée, par exemple"tweyqr"
. Il doit sortir14
(dans n'importe quel format pratique).
L' encodeur aurait pu également être retourné [113,119,101,114,116,121]
, auquel cas le décodeur aurait reçu (par exemple) [116,119,101,121,113,114]
.
Notez que la chaîne renvoyée par l' encodeur peut également inclure des caractères ASCII non imprimables (mais toujours dans la plage [0x00, ..., 0x7F]
).