Étant donné entier positif n > 2
. Nous le convertissons en un tableau comme suit:
- S'il est égal à
2
retourner un tableau vide - Sinon, créez un tableau de tous
n
les facteurs premiers triés par ordre croissant, puis chaque élément est remplacé par son index dans la séquence des nombres premiers et convertit finalement chaque élément en tableau.
Par exemple, permet de convertir un nombre 46
en tableau. Tout d’abord, convertissez-le en un tableau de ses facteurs premiers:
[2, 23]
Le nombre 23
est 9
th prime, alors remplacez-le 2
par un tableau vide et 23
par [9]
. Le tableau devient maintenant:
[[], [9]]
Les facteurs premiers 9
sont 3
et 3
, donc:
[[], [3, 3]]
Faites la même chose pour les deux 3
:
[[], [[2], [2]]]
Et enfin:
[[], [[[]], [[]]]]
Maintenant, pour l'encoder, nous remplaçons simplement chaque crochet ouvert par 1
et chaque crochet de fermeture 0
, puis supprimons tous les zéros 1
finals et en supprimons un de la fin. Ceci est notre nombre binaire. En utilisant l'exemple ci-dessus:
[ ] [ [ [ ] ] [ [ ] ] ]
| | | | | | | | | | | |
| | | | | | | | | | | |
V V V V V V V V V V V V
1 0 1 1 1 0 0 1 1 0 0 0
Maintenant, supprimez simplement les trois derniers zéros et le dernier 1
. Le nombre devient 10111001
ce qui est 185
en décimal. C'est la sortie attendue. Notez que dans un tableau, les crochets de conversion du tableau principal ne sont pas inclus.
Contribution
Nombre entier positif n
supérieur à 2
.
Sortie
Entier codé n
.
Règles et format IO
- Les règles standard s'appliquent.
- L'entrée peut être une chaîne ou un nombre (mais dans le cas d'une chaîne, il doit être en base 10).
- La sortie peut être une chaîne ou un nombre (mais dans le cas d'une chaîne, elle doit être en base 10).
- C'est code-golf , la réponse la plus courte en octets gagne!
Cas de test
Plus de cas de test sur demande.
3 ---> 1
4 ---> 2
5 ---> 3
6 ---> 5
7 ---> 6
8 ---> 10
9 ---> 25
10 ---> 11
10000 ---> 179189987
10001 ---> 944359
10002 ---> 183722
10003 ---> 216499
10004 ---> 2863321
10005 ---> 27030299
10006 ---> 93754
10007 ---> 223005
10008 ---> 1402478
2
car les soumissions ne sont pas nécessaires pour le gérer.Réponses:
Husk ,
3531302926252422201915 octets-7 octets grâce à @Zgarb!
Économisé 4 octets supplémentaires, indirectement, grâce à Zgarb
Essayez-le en ligne!
Explication
la source
φ
le point de fixation lambda!`:0:1
peut être`Jḋ2
.Jelly ,
22 2019 octets-1 grâce à Erik the Outgolfer (zéros de la queue des deux côtés
t
plutôt que de la droiteœr
)Un lien monadique prenant un entier supérieur à 2 et renvoyant un entier supérieur à 0 (2 renverrait également 0 conformément à la spécification d'origine).
Essayez-le en ligne!
Comment?
Ceci reproduit presque exactement la description donnée, juste avec quelques manipulations ordinales pour la création du tableau binaire ...
la source
Python 2 ,
212177 octetsEssayez-le en ligne!
L'absence de nombres premiers prime nuit vraiment au nombre d'octets, et le délai d'attente de TIO avec des nombres premiers plus grands est dépassé. Les utilisations xnor de » chèque de primalité.
Python 2 + gmpy2 , 175 octets
Essayez-le en ligne!
Cette version n’a pas de délai d’expiration pour les cas de test plus volumineux (c’est-à-dire 10000 - 10008).
la source
Mathematica,
125119 octetsUtilise une approche légèrement différente; convertit les indices premiers en
{1, index, 0}
et 2 en{1, 0}
.Essayez-le sur Wolfram Sandbox
Usage:
la source
Gelée , 35 octets
Essayez-le en ligne!
la source
J,
747366 octetsEssayez-le en ligne!
C’est un véritable gâchis qui a certainement besoin de jouer plus avant (par exemple, la suppression de la définition de fonction explicite). Je pense que la boxe que j’ai pratiquée est particulièrement importante, car je ne sais vraiment pas ce que je fais ici (c’est beaucoup d’essais et d’erreur). De plus, je suis quasiment sûr qu'il y a des éléments intégrés que j'oublie (par exemple, j'ai l'impression qu'il
_2,~_1,
a probablement un élément intégré).Explication (non golfée)
Préambule
Asseyez-vous bien car cela ne sera pas une explication brève. Ironiquement, un langage laconique a été associé à une personne verbeuse.
Je vais diviser cela en quelques fonctions
encode
code l'entier en utilisant _1 et _2 au lieu de [et]convert
convertit une liste de _1 et _2 en une liste de 1 et 0drop
supprime le dernier 1 et les derniers zérosdecode
convertit d'une liste binaire en un nombreJe vais passer en revue un exemple d'appel pour 46, qui est exprimé dans le format non-golfé est fait
Encoder
Il y a beaucoup à expliquer ici.
Notez que la définition de fonction explicite
3 : '[function]'
évalue la fonction comme si elle figurait dans la REPL avec le bon argument remplaçant chaque instance dey
(cela signifie que je peux éviter de devoir utiliser caps ([:
), atops (@
) et ats (@:
) au prix de quelques octets).Voici à quoi cela ressemble pour chaque itération successive sur l’entrée de 46
Cette fonction utilise adverse (
::
) pour imbriquer les valeurs entre "parenthèses" (les parenthèses utilisées ici sont -1 et -2). Fondamentalement, chaque fois que nous factorisons et convertissons en indices de nombre premier, _1 est ajouté au début et _2 est ajouté, qui agissent comme des crochets. Lorsque la fonction est appelée sur ces éléments, elle les renvoie tels quels, car uneq:
erreur est commise lors de la factorisation d’un nombre négatif. Il est également heureux deq:
ne pas commettre d'erreur en essayant de factoriser 1 et de renvoyer le tableau vide (comme vous le souhaitez).Convertir
Convert est beaucoup plus simple. Il supprime simplement toute la boxe, ainsi que le premier élément, puis convertit tout en 1 et 0 (simplement en ajoutant 2)
Laissez tomber
Cela inverse la liste, trouve le premier, puis supprime toutes les valeurs jusqu'à celle-ci, puis inverse à nouveau la liste.
Décoder
Decode est la fonction intégrée
#.
qui prend une liste de 1 et de 0 et la convertit en un nombre binaire.la source
Retina ,
244227225 octetsEssayez-le en ligne!
C'est une approche simple suivant l'algorithme démontré dans la question. La génération de l’indice principal est une complexité exponentielle, de sorte qu’elle expire pour des entrées plus importantes
Explication:
la source
Haskell ,
162160155 octetsEssayez-le en ligne!
Explication:
r=zip[1..][x|x<-[2..],all((>0).mod x)[2..x-1]]
définit une liste infinie de tuples de nombres premiers et leurs indices:[(1,2),(2,3),(3,5),(4,7),(5,11),(6,13), ...]
.La fonction
(%)
prend cette lister
et un nombren
et convertit ce nombre en représentation sous forme de tableau de facteurs inversé. Cela se fait en passant à traversr
jusqu'à ce que nous trouvions un nombre premier qui divisen
. Nous déterminons récursive alors la représentation de l'indice de ce premier et l' enferment dans0
et1
et PREPEND la représentationn
divisée par ce premier.Car
n=46
, ceci donne la liste à[0,0,0,1,1,0,0,1,1,1,0,1]
partir de laquelle les zéros (snd.span(<1)
) et next1
(tail
) sont supprimés. Ensuite , la liste est convertie en un nombre décimal en multipliant-élément par élément avec une liste des pouvoirs de deux et résumant la liste des résultats:sum.zipWith((*).(2^))[0..]
.la source
JavaScript, 289 octets
Les octets sont la somme du code JavaScript sans les sauts de ligne après les virgules (insérées uniquement pour améliorer le formatage et la lisibilité) (256 octets) et les caractères supplémentaires du commutateur de ligne de commande, requis lors de l'utilisation de Chrome (33 octets).
Et une version plus longue et plus lisible:
Quelques brèves explications:
f
est un algorithme de factorisation récursif purement fonctionnel.c
compte à quel endroitr
le nombre premierp
apparaît dans la séquence des nombres premiers et retourne[]
(sip=2
etr=1
) ou factorise et traite ultérieurement aur
moyen de la récursion.h
est une petite fonction d'assistance qui est malheureusement nécessaire car ellemap
appelle la fonction fournie avecnumberOfCurrentElement
les deuxième etwholeArray
troisième arguments, remplaçant ainsi les valeurs par défaut spécifiées dansc
si nous passons directement cette fonction (il m'a fallu un certain temps pour en arriver à ce piège; remplaçanth
par sa définition serait plus long de quelques octets).s
transforme le tableau généré en une chaîne. Nous utilisonsblank
au lieu de0
afin que nous puissions utilisertrim()
danso
.o
est la fonction à appeler avec la valeur d'entréei
qui renvoie la sortie. Il génère la représentation sous forme de chaîne binaire requise par la spécification et la convertit en un nombre (décimal).Éditer: Chrome doit être démarré avec
chrome --js-flags="--harmony-tailcalls"
pour activer l'optimisation de la récursion de la queue (voir https://v8project.blogspot.de/2016/04/es6-es7-and-beyond.html ). Cela nécessite également l'utilisation du mode strict.Le test suivant montre que le calcul est un peu lent pour certaines valeurs (la plus longue dure plus de six secondes pour
10007
sur mon ordinateur). Fait intéressant, sans optimisation de la récursion finale, le calcul est beaucoup plus rapide (environ le facteur 5) en l'absence de débordement de pile.la source
tinylisp , 209 octets
La dernière ligne est une fonction non nommée qui calcule le codage spécifié. Essayez-le en ligne!
Version pré-golf
Voici le code que j'avais avant de commencer à jouer au golf:
la source
05AB1E , 18 octets
Essayez-le en ligne!
Explication:
la source