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]
).
Réponses:
Gelée , (17 octets + 18 octets) × longueur 6 = 210 points
Essayez-le en ligne! (ou avec des informations de débogage supplémentaires)
Ayant essayé de résoudre ce défi en visant la condition de victoire déclarée, j'ai pensé qu'il serait intéressant d'opter pour une hypothétique condition de victoire alternative: le code-golf étant donné une longueur maximale minimale possible pour la sortie.
Explication
Codage
La première étape du codage consiste à représenter l'entrée comme base 36 (
b36
). 36 6 = 2176782336> 2147483647, il y aura donc au plus 6 chiffres dans le résultat, chacun étant compris entre 0 et 35.Ensuite, nous transformons cela en une représentation qui contient 6 chiffres différents . Il existe plusieurs algorithmes possibles pour cela, mais celui utilisé ici est d'ajouter 1 au plus petit chiffre, 2 au deuxième plus petit, 3 au troisième plus petit, et ainsi de suite. Cela signifie que si deux chiffres étaient identiques, l'un d'eux sera arbitrairement considéré comme plus petit, et donc ils deviendront différents; et évidemment, cet algorithme ne peut pas faire en sorte que deux chiffres différents deviennent identiques. Afin de représenter cela dans Jelly, nous utilisons
Ụ
("trier les index par valeurs") pour obtenir une liste des index dans l'ordre trié;Ụ
à nouveau pour inverser cela, en mappant efficacement chaque élément de l'original à sa position dans l'ordre trié; etµ…+
pour ajouter l'original à la nouvelle liste. Le résultat est une représentation du numéro d'entrée sous la forme de six chiffres différents dans la plage 1–41 (minimum 0 + 1, maximum 35 + 6).Nous avons ensuite divisé cela en une autre forme: une liste triée de chiffres dans la plage 1–41, à côté d'un nombre de 1 à 720 qui représente laquelle des 720 permutations possibles les chiffres étaient. (Le
Œ¿
etṢ
extraire le numéro de permutation et trié respectivement.)Enfin, nous convertissons le nombre de 1 à 720 en base 3 (
b3
), l'inversons (U
) et encodons les six chiffres de base 3 et six 1-41 chiffres en les emballant chacun en un seul caractère ASCII à l'aide de divmod inverse (la valeur de le caractère mod 3 est le chiffre de base 3, la valeur divisée par 3 est le chiffre 1–41). La plage de résultats possible est (1 × 3) + 0 = 3 au minimum et (41 × 3) + 2 = 125 au maximum, correspondant à notre plage ASCII. L'empaquetage est effectué via×3
et+
, avec un complémentµ
pour vous assurer que chaque commande fonctionne sur le bon bit de données. (Il y a un peu d'astuce de golf ici, en ce sens que nous faisons la multiplication par 3 avant d' extraire la permutation; cela évite d'avoir à dépenser un octet sur un caractère de regroupement.)Soit dit en passant, la raison pour inverser le nombre de base 3 est qu'il peut avoir moins de chiffres que le nombre 1–41. (Il ne peut pas en avoir plus; le plus petit nombre pour lequel n !> 3 n est légèrement supérieur à 6.) Jelly insère efficacement des zéros de fin lors de l'addition de deux nombres de longueurs différentes, afin de les faire correspondre; les zéros à la fin affecteraient l'interprétation du nombre, mais pas les zéros à gauche, donc l'inverse est utilisé pour s'assurer que les zéros supplémentaires finissent quelque part qui ne gâchera pas notre réponse.
Décodage
La première étape du décodage consiste à extraire les deux nombres (le nombre de base 3 et le nombre 1–41). Nous pouvons obtenir leurs chiffres assez facilement avec division (
:3
) et modulo (%3
) respectivement, mais comment savoir dans quel ordre ils se trouvaient? Eh bien, le nombre 1–41 avait ses chiffres dans l'ordre trié, et les chiffres dans les positions correspondantes des deux nombres étaient stockés dans les mêmes caractères; ainsi, nous pouvons déterminer dans quel ordre les chiffres du nombre 1–41 ont été mélangés (en examinant leurs valeurs relatives) et savoir que les chiffres du numéro de base 3 doivent avoir été mélangés de la même manière. En fait, parce que les caractères de notre codage ASCII sont triés de la même manière que les chiffres du nombre 1–41 (ils étaient tous distincts et ils sont plus significatifs que les nombres de base 3),Ṣ
. Les deux extractions commencent donc parṢ
, suivies de%3
ou:3
selon le cas.Alors que les chiffres du numéro 1–41 sont toujours dans l'ordre trié, nous avons un moyen très pratique / laconique de revenir aux chiffres 0–35 de la base 36; il suffit de soustraire 1 du premier, 2 du second, 3 du troisième, etc. Dans Jelly, nous pouvons le faire avec
_J
("soustraire l'indice").Pendant ce temps, dans l'autre branche du décodage, nous inversons les chiffres du numéro de base 3 dans l'ordre (
U
), et le reconvertissons de la base 3 en un indice de permutation avecḅ3
.On peut alors combiner les deux branches avec
œ?Ç
;œ?
signifie "permuter étant donné cet indice de permutation", etÇ
signifie "le résultat de l'application de la ligne ci-dessus", c'est-à-dire c'est ce qui dit à Jelly d'exécuter les deux lignes séparément sur la même entrée.Ce que nous avons maintenant, ce sont les chiffres du nombre d'origine, en base 36 (en raison de
_J
) et dans l'ordre d'origine (en raison deœ?
), nous pouvons donc simplement faire unḅ36
pour revenir de la base 36 en un seul entier.Commentaire
Le TIO! le lien ci-dessus utilise 312699167 comme numéro à encoder. Ce nombre dans la base 36 est
[5, 6, 6, 8, 7, 35]
, et montre ainsi tous les aspects du codage: le 35 teste la limite de la plage 0–127 que nous avons; les 6s en double testent la résolution de chiffres identiques dans la base d'origine 36; et le fait que les chiffres sont presque (mais pas tout à fait) triés signifie que le nombre de permutation est très petit, ce qui lui donne beaucoup moins de chiffres que le nombre de base 36, et donc montre la nécessité de l'inverser avant de l'ajouter à l'original.Il est très pratique de savoir comment toutes les constantes s'emboîtent. 36 6 est juste assez haut pour s'adapter à 2 31 , 3 6 n'est que juste assez haut pour accueillir 6 !, et (36 + 6) × 3 est juste juste assez haut pour tenir dans les 128 possibilités que nous avons. (La dernière contrainte ici est la moins stricte, car nous pourrions utiliser l'indexation 0 plutôt que l'indexation 1 pour utiliser des caractères dans la plage 0-2. Pourtant, cela ne donnerait que suffisamment de place pour utiliser 37 comme base plutôt de 36.)
la source
Gelée , (
43 octets +65 octets) × longueur 8 =8064 pointsEssayez-le en ligne!
Gelée , (
21 octet +43 octets) × longueur 10 =6040 pointsEssayez-le en ligne!
Explication
Solution 1
Cela utilise un algorithme différent de la plupart des autres réponses. Nous commençons par encoder la valeur en hexadécimal (
b⁴
), comme avec les autres réponses, puis prenons une somme cumulée (Ä
). Chaque entrée donnera clairement une sortie différente (car ces deux opérations sont réversibles), et étant donné que le codage hexadécimal contiendra au plus 8 chiffres dont le maximum est 7 (pour le 8e dernier chiffre) et 15 (pour le dernier au 7e). derniers chiffres), le nombre maximum dans la liste de sortie sera 7+ (7 × 15) = 112, inférieur aux 127 requis par la question. De plus, la sortie sera nécessairement triée, ce qui nous permettra d'inverser le shuffle.Pour le décodeur, nous inversons d'abord le shuffle avec un sort (
Ṣ
); inverser ensuite la somme cumulée, en ajoutant un zéro (Ż
) et en prenant la différence de paires consécutives (I
); puis reconvertissez à partir de hexadécimal (ḅ⁴
).Solution 2
La question nous permet en fait de prendre l'entrée comme une liste de chiffres (probablement décimaux), afin que nous puissions "tricher" en supprimant simplement la conversion de base; le nombre maximum utilisé dans la sortie sera alors 2 + (9 × 9) = 83 (en fait 82 car 2999999999 est hors plage, donc la pire entrée possible est 1999999999). L'encodage résultant est assez terrible car les encodages pour ce problème disparaissent, mais il a l'avantage d'être très laconique à générer, ce qui l'emporte sur la verbosité de l'encodage.
Cette réponse ressemble tellement à de la triche que ce n'est pas ma principale solution à ce problème, mais il semble que cela vaille la peine d'être ajouté car elle est techniquement conforme aux règles et produit un meilleur score.
Commentaire
J'ai quelques algorithmes à l'esprit pour descendre en dessous de la longueur 8, mais il semble peu probable que vous puissiez implémenter un algorithme de longueur 7 en ≤9 octets (sans tricher) ou ≤5 octets (tricher), donc d'après le score dans la question, ce est probablement la meilleure façon de le faire. (Je pourrais peut-être essayer une solution pour le défi alternatif "minimiser la longueur de l'encodage" de toute façon, juste pour le plaisir.)
Contrairement à certaines des solutions, l'utilisation de 16 comme base ici n'est pas critique; il existe de nombreux autres nombres qui fonctionneraient pour une solution de longueur 8 (par exemple 18). J'ai choisi 16 pour la première solution simplement parce que Jelly a une façon de représenter cela sur 1 octet, et d'autres bases viables devraient utiliser plusieurs octets du programme. Bien sûr, la deuxième solution doit utiliser 10 comme base afin d'exploiter la faille.
Merci à @Dennis d'avoir signalé quelques nouvelles commandes Jelly qui ont rendu cet algorithme encore plus tordu à écrire.
la source
Ä
est l'abréviation de+\
,Ż
est l'abréviation de0;
.Langage de programmation Shakespeare , 10 * (264 + 494) =
8650 79107580Encodeur: 264 octets
Essayez-le en ligne!
Décodeur: 494
Essayez-le en ligne!
C'était une chose.
L'encodeur code chaque chiffre comme le chiffre plus l'index du chiffre multiplié par douze. Le décodeur stocke toutes les entrées dans la mémoire du Ford, puis effectue une boucle sur un compteur, émettant puis supprimant chaque chiffre inférieur au compteur * 12 + 10.
Explication:
Encodeur
Décodeur
la source
Python 2.7, 31 * (52 + 37) = 2759
Encodeur (
6952 octets):Décodeur (
4137 octets):Stocke tous les bits non nuls du nombre d'entrée sous forme de valeurs ascii. La valeur du caractère ascii stocke la position du bit défini. Par exemple, la valeur «a» signifierait que le 97e bit est défini.
Quelques améliorations, grâce à @ Delfad0r
Essayez-le en ligne!
la source
e =
et led =
au début - les fonctions anonymes conviennent parfaitement. Notez également que l'énoncé du problème indique clairement que l' encodeur peut renvoyer une liste d'entiers au lieu de caractères, afin que vous puissiez éviter la conversion entier-> caractère-> entier. De plus, vous pouvez utilisern&(1<<i)
au lieu den&(1<<i)>0
et enregistrer 2 octets. Enfin, la limite supérieure dei
(127) est beaucoup trop, 32 est suffisante et enregistre 1 octet.(52+37)*31=2759
le plus long lorsque les 31 bits sont définis.lambda n:[chr(i)*(n&1<<i>0)for i in range(32)]
à économiser 6 octets.Stax , score 8 × (10 + 9) = 152
Encodeur, 10 octets
Exécuter et déboguer
L'encodeur sort la chaîne dans un ordre croissant.
Décodeur, 9 octets
Exécuter et déboguer
la source
05AB1E , 8 longueur maximale * (8 + 7) octets = 120
Encodeur (8)
Essayez-le en ligne!
Décodeur (7)
Essayez-le en ligne!
Utilise la même technique que wastl et Jonathan .
la source
Python 3 , 8 * (45 + 38) = 664
Encodeur (45 octets):
Décodeur (38 octets):
Essayez-le en ligne!
la source
lambda l:sum(x%16<<x//16*4for x in l)
fonctionne très bien :)lambda n:[n>>4*i&15|i<<4for i in range(8)]
et 1 dans le décodeur:lambda l:sum(x%16<<x//16*4for x in l)
pour un score total de 632JavaScript (ES6), 8 * (40 + 32) = 576
Encodeur (40 octets)
Décodeur (32 octets)
Démo
Essayez-le en ligne!
Comment?
L'entrée est divisée en 8 blocs de 4 bits et chaque bloc est codé avec 1 parmi 16 caractères possibles. Le bit le plus significatif du dernier bloc n'est jamais défini.
la source
Gelée , (8 + 9) octets * 8 longueur maximale = 136
Encodeur (le pied de page formate la liste comme le ferait Python pour plus de clarté)
Décodeur
Il est théoriquement possible d'avoir une longueur maximale de six, cela peut-il être fait en 22 octets ou moins?
Comment?
7fffffff
[7,15,15,15,15,15,15,15]
[7,15,15,15,15,15,15,15] + [0,16,32,48,64,80,96,112] = [7,31,47,63,79,95,111,127]
Encodeur :
Décodeur :
la source
Langage de programmation Shakespeare , 31 * (472 +
383379344) =265052638125296Score précédent: 16909322 * (246 + 217) = 7829016086
C'est encore très élevé, mais c'est le plus bas auquel je puisse penser en ce moment.
Encodeur:
Essayez-le en ligne!
Décodeur:
Essayez-le en ligne!
Fondamentalement, si la chaîne contient un caractère avec le code ASCII (n + 1), le nième chiffre binaire est défini.
la source
Python 3, (208 octets + 200 octets) * 6 longueur = 2448
Essayez-le en ligne! (contient les deux, l'octet supplémentaire est la nouvelle ligne entre eux).
-4 octets (score -24) en utilisant la liste vide (qui a permis à plus de choses de commencer à 0)
Encodeur (208 octets)
Décodeur (200 octets)
Observations:
Le brassage peut être inversé sans perte pour les listes strictement non croissantes (c'est-à-dire triées).
Des listes numériques strictement non croissantes de même longueur peuvent être totalement ordonnées (comme elles le sont en Python).
Nous pouvons définir que les listes sont d'abord triées par longueur pour former un ordre total de toutes les listes triées.
Nous pouvons former une séquence indexable de ces listes si nous définissons que les seules valeurs valides dans une liste sont des entiers de
0
à127
inclusif (c'est-à-dire qu'il existe un nombre fini de listes valides de longueurL
).Stratégie:
Encodeur: Étant donné un nombre
N
, trouver laN
e liste valide strictement non croissante.Décodeur: étant donné une liste valide (mélangée), triez-la et retournez son index dans la séquence de listes valides.
Explication du code commun:
T=lambda n,d:n*T(n+1,d-1)//d if d>1else d and n or 1
Calculer le nombre
n
thd
-simplexPour
d=0
, toujours1
Pour
d=1
,n
(le nombre de points dans une ligne de points de longueurn
)d=2
n
d=3
n
Explication de l'encodeur:
def E(n,h=128):
d=l=0
,s=[]
n
est le numéro d'entrée,h
est la "valeur élevée" (c'est-à-dire le nombre le plus élevé autorisé + 1),d
est la longueur de la sortie,s
est la sortie,l
est la "valeur faible" (à partir de 0, expliqué plus loin)while n>=T(h,d):
,n-=T(h,d)
,d+=1
Il existe des listes de
T(h,d)
longueurs validesd
, et notre calcul est plus facile s'iln
s'agit d'un index relatif à la liste[0]*d
(à index0
) au lieu d'un index réel, donc décrémenter enn
conséquence. Cela ajuste égalementd
(la longueur) pour être correct pour le donnén
.for i in range(d):
Effectivement: "pour le
i+1
e numéro de la liste"C'est là que je vais vous expliquer
l
, la "faible valeur"Après qu'un numéro a été mis dans la liste, aucun nombre inférieur à celui qu'il peut être mis dans la liste (pour le garder trié), tout
l
comme le dernier numéro ajouté à la liste.while n>=T(h-l,d+~i):
,n-=T(h-l,d+~i)
,i+=1
Si
n
est trop grand pour être encodé avec unl
à ce "chiffre", ajustez enn
conséquence et incrémentezl
s+=[l]
Encode
n
avec unl
à ce "chiffre".Au début, nous avons des
h
options pour ce "chiffre" à mettre ensuite, mais une fois que nous avons mis un "chiffre" (qui est affecté àl
), nous sommes limités auxh-l
options pour le "chiffre" suivant.Au début, il y avait des
T(h,d)
listes valides, mais nous avons ajouté un "chiffre"l
, diminuant le nombre de "chiffres" restantsd-1
et le nombre de "chiffres" suivants validesh-l
, donc le nombre de listes valides après c'estT(h-l,d-1)
Explication du décodeur:
def D(s):
,s.sort()
,l=0
,d=len(s)
s
est la liste d'entrée (mélangée), doncs.sort()
elle;l
est la "valeur faible" (h
la "valeur élevée" est juste un128
s littéral dans le code pour économiser des octets),n
est le numéro de sortie,d
est la longueur.n=sum(T(128,D)for D in range(d))
Ajustez
n
le point dans la séquence de[0]*length
for i in s:
Pour chaque chiffre:
for j in range(l,i):
,n+=T(128-j,d-1)
Ajustez
n
le point dans la séquence de[...prevdigits, thisdigit, 0...]
l=i
: Définissez la "valeur faible" sur le chiffre le plus récentd-=1
: Décrémenter la longueur puisque nous avons utilisé un chiffrereturn n
: Aprèsn
avoir été ajusté pour tous les chiffres, c'est le bon numéro; rends le.Désolé si ce n'est pas clair, mais voici ma version originale de débogage non golfée Essayez-le en ligne! , qui n'utilise pas la liste vide, donc est 1 de tous les numéros utilisés dans cette version
la source
Ruby , (36 + 29 octets) * 8, score 520
Encoder:
Essayez-le en ligne!
Décoder:
Essayez-le en ligne!
Comment ça marche:
Le nombre est codé à l'aide de blocs de 4 bits et d'un index de 3 bits.
Le décodeur prend le tableau d'entrée et remet chaque quartet à sa place.
la source
Charbon de bois , score 10 * (10 + 15) = 250.
Utilise décimal; la solution précédente basée sur 16 a obtenu
328296264.Peut produire des caractères non imprimables. En particulier, le caractère 10 est difficile à saisir dans Charcoal.
Encodeur, 10 octets:
Essayez-le en ligne! Le lien est vers la version détaillée du code.
Décodeur, 15 octets:
Essayez-le en ligne! Le lien est vers la version détaillée du code.
La version utilisant une liste d'entiers obtient un score de
360296 (base 16; le nombre décimal donnerait 310):Encodeur, 19 octets:
Essayez-le en ligne! Le lien est vers la version détaillée du code.
Décodeur, 18 octets:
Essayez-le en ligne! Le lien est vers la version détaillée du code.
La version utilisant des caractères imprimables marque 360 (au lieu de
416384368 en base 16):Encodeur, 19 octets:
Essayez-le en ligne! Le lien est vers la version détaillée du code.
Décodeur, 17 octets:
Essayez-le en ligne! Le lien est vers la version détaillée du code.
la source
Brachylog , 17 + 18 octets * 8 longueur = 280
Encodeur:
Décodeur:
Un p peut être ajouté à la fin de l'encodeur sans effet. Le décodeur est exécuté en mettant le résultat (mélangé) en sortie et en obtenant le numéro d'origine dans l'entrée.
S'il y avait un prédicat de somme cumulée (correctement mis en œuvre), le score pourrait tomber à 20
Essayez-le en ligne!
la source
05AB1E , score: (2 + 2 octets ) * 11 longueur maximale = 44
Encodeur (2 octets ):
Essayez-le en ligne.
Décodeur (2 octets ):
Essayez-le en ligne.
L'entrée de l'encodeur et la sortie du décodeur sont une liste de chiffres.
Port de @ ais523 's 2nd Jelly answer .
Explication:
.¥
la source
Gol> <> , 8 * (14 + 13) = 216
Encodeur Essayez-le en ligne! , 14 octets:
Décodeur Essayez-le en ligne! , 13 octets:
Comme cela peut produire des caractères ascii non imprimables, jouant ainsi avec le décodeur, il existe maintenant une version utilisant des nombres dans la sortie / entrée:
Encodeur Essayez-le en ligne! , 14 octets:
Décodeur Essayez-le en ligne! , 13 octets:
Codage:
L'encodage fonctionne en divisant le nombre donné en morceaux de 8 x 4 bits. Ces morceaux sont ensuite décalés de 3 bits vers la droite et l'emplacement d'origine du morceau est ajouté à la fin sous la forme d'un nombre compris entre 0 et 7. Ainsi, l'encodage ressemble à ceci:
la source
Perl 6 , 10 * (10 + 12) =
340220Encodeur:
Décodeur:
Essayez-le en ligne!
La fonction d'encodeur zippe chaque chiffre avec l'index 0 du nombre. Ensuite, l'encodeur trie la liste des nombres et obtient le modulo par 10, c'est-à-dire le deuxième chiffre du nombre.
Le total est de 10, car c'est la longueur maximale de 2 31 -1.
la source
Haskell , 10 * (23 + 51) = 740
Voici un programme qui encode, mélange, décode et valide les valeurs: Essayez-le en ligne!
Encodeur, 23 octets
Essayez-le en ligne!
Décodeur, 51 octets
Essayez-le en ligne!
Explication
Puisque nous sommes autorisés à utiliser l'entrée comme chiffres décimaux, nous allons l'utiliser. L'encodeur mappe chaque chiffre qui se produit à
10*index + digit
, notez que tous lesdigit
s seront dedans[0..9]
afin que nous puissions inverser ce qui précède en utilisantdivMod
. Après avoir restauré les indices et les chiffres, il suffit de trier les indices et de s'en débarrasser.la source
Coque , 10 * (7 + 8) = 150
N
Encodeur, 7 octets
Essayez-le en ligne!
Décodeur, 8 octets
Essayez-le en ligne!
la source
APL (Dyalog Unicode) ,LE+ Lré= 36 ; A = 8 → 288
Essayez-le en ligne! (contient 5 octets supplémentaires pour les affectations et la nouvelle ligne).
Les usages
⎕IO←0
Comment:
la source
PHP, 8 * (44 + 53) = 776
encodeur, 44 octets:
affiche une liste d'entiers séparés par des espaces. Exécuter en tant que tuyau avec
-nR
.maximum 8 octets avec 4 bits de données (quartet inférieur) et 3 bits de poids (quartet supérieur).
Autrement dit:
mettez chaque chiffre hexadécimal dans un caractère propre et utilisez la moitié supérieure de l'octet pour stocker la position du chiffre.
Exemple:
1457893891
(0x56e5b203
) Va se transformer en0x03
,0x10
,0x22
,0x3b
,0x45
,0x5e
,0x66
,0x75
→
3 16 34 59 69 94 102 117
décodeur, 53 octets:
ou
ou
prendre des entiers à partir des arguments de la ligne de commande. Courez avec
-nr
.Essayez-les en ligne .
la source
Python 2 , 10 * (68 + 54) = 1220
Essayez-le en ligne!
EDIT: Merci à Jo King pour les pointeurs - je ne sais pas pourquoi je compensais par 32, rétrospectivement.
Encode la position et la valeur de chaque place en un seul caractère, en commençant par
[espace] (position 0, valeur 0)l'octet NUL 0x0.Décode par:
la source
32
décalage? Aussi,[-1]
pourrait être à la%10
place, au bon endroitC (gcc) , 10 * 112 = 1120
Essayez-le en ligne!
J'ai des variables globales, mais elles ne transmettent en fait aucune information entre deux fonctions. La déclaration de variable pour
c
est utilisée dans les deux fonctions, ce qui me fait gagner 2 octets de longueur de code.Une version qui utilise ASCII imprimable uniquement pour une pénalité de
35 octets est ici:Merci @ceilingcat pour 70 points d'améliorations.
la source