Je jouais avec quelques chiffres et j'ai trouvé une séquence qui, bien sûr, est sur OEIS. C'est A005823 : Nombres dont l'expansion ternaire ne contient pas de 1 . Ça va:
a (2n) = 3 * a (n) +2
a (2n + 1) = 3 * a (n + 1)
a (1) = 0
a = 0,2,6,8,18,20,24,26,54 ....
J'ai écrit un programme CJam qui génère le premier n de ces nombres en convertissant l'index en binaire, en remplaçant les 1 par 2 et en convertissant du ternaire en décimal.
J'ai également remarqué que n'importe quel nombre pair peut être obtenu en prenant la somme de deux nombres dans la séquence (parfois le nombre avec lui-même).
Le défi:
Étant donné n'importe quel nombre pair non négatif en entrée, sortez les indices de deux nombres dans la séquence qui les additionnent. (Notez que parfois plusieurs paires sont possibles.)
Les règles:
- Spécifiez si vous utilisez l'indexation 0 ou 1.
- Si vous effectuez une sortie sous forme de chaîne, placez un délimiteur entre les deux indices.
- Vous êtes autorisé à générer un nombre complexe.
- Si vous le souhaitez, vous pouvez générer chaque paire valide.
- Code Golf: la réponse la plus courte l'emporte
Cas de test
J'utilise l'indexation 0. Ici, je liste toutes les sorties possibles pour chaque entrée, mais vous n'avez besoin d'en sortir qu'une.
0: [0 0] 2: [1 0] 4: [1 1] 6: [2 0] 8: [2 1] [3 0] 10: [3 1] 12: [2 2] 14: [3 2] 16: [3 3] 18: [4 0] 30: [6 2] 32: [6 3] [7 2] 46: [7 5] 50: [7 6] 120: [10 10] 338: [19 18] 428: [30 23] [31 22] 712: [33 27] [35 25] [41 19] [43 17] [49 11] [51 9] [57 3] [59 1] 1016: [38 37] [39 36]Merci à @Luis Mendo pour l'aide sur les cas de test.
Connexes: Est-ce dans l'ensemble Cantor?
la source
Réponses:
Husk ,
211413 octets-7 octets, grâce à la réponse JS de @ Neil
-1 octet inspiré par la réponse Parradoc de betaveros
Utilise l'indexation 0
Essayez-le en ligne!
Explication
Solution précédente de 21 octets
La première fois que j'ai vu une utilisation pour
»
.Essayez-le en ligne!
Plus longtemps, comme je traitais avec porte
la source
JavaScript (ES6),
7571 octetsExplication: La division de l'entrée et des éléments de A005823 par 2 ne modifie pas le problème, mais elle rend la solution plus simple car les représentations ternaires n'utilisent désormais que des 0 et des 1 et par conséquent, il n'y a pas de prise en compte. Il enregistre également une étape lors de la conversion de l'élément vers son index (le ternaire de chaque élément est le double du binaire de son index). Exemples:
la source
Gelée ,
26, 22, 21 octetsEssayez-le en ligne!
Un octet sauvé grâce à @JonathanAllan!
Explication:
la source
Œc
. Et oui, DennisS=¥
m'a expliqué le problème .Python 2 , 51 octets
Essayez-le en ligne!
La tâche peut se faire comme ceci:
Nous pouvons faire la division en (3) en convertissant
0->0,1->1,2->1
pour une liste et0->0,1->0,2->1
pour l'autre. Autrement dit, en vérifiant que la valeur est supérieure à un seuil de 0 ou 1.Les deux valeurs peuvent être trouvées par des fonctions récursives respectives:
La fonction
f
combine les deux dans une liste de compréhension. Cela le rend inefficace en raison de la ramification exponentielle.Si des nombres complexes pouvaient être sortis, nous pourrions économiser 10 octets avec:
la source
J,
3532 octetsEssayez-le en ligne!
0 indexé et l'entrée est donnée monadiquement. Renvoie toutes les sommations possibles à la valeur (il traite
a b
etb a
comme différentes sommations possibles).La conversion d'une matrice booléenne en indices prend beaucoup de code ...
Je voudrais également supprimer la fourche à gauche pour ne pas avoir à utiliser autant de parenthèses et
@
-ats, mais je ne peux pas trouver un bon moyen de le faire (mon approche alternative ne sauvegarde aucun octet) ).Explication
À des fins d'explication et de dégoût, considérons les composants suivants de la fonction principale
valid_nums donne une matrice booléenne où les indices sont les indices des valeurs de séquence sommées. S'il y en a un à ces indices, cela signifie que les deux nombres totalisent la valeur d'entrée.
indices_of_ones est un idiome J pour donner les coordonnées de ceux d'une matrice booléenne de rang arbitraire
La fonction principale est composée simplement
valid_nums
indices_des_ones
,
-ravel fonctionne dans ce cas en joignant chaque ligne à la suivante.Nous pouvons voir que s'il s'agissait d'une matrice booléenne, les coordonnées de celles-ci peuvent être trouvées en interprétant les indices de la matrice défilée comme des nombres dans la base de la forme de cette matrice en utilisant autant de phrases prépositionnelles que possible pour aider à confondre le pauvre lecteur. .
la source
MATL ,
22211917 octetsLa sortie est basée sur 1. Le programme produit toutes les paires de solutions.Essayez-le en ligne! Ou vérifiez tous les cas de test .
Explication
la source
Pyth , 37 octets
0 indexé
Certainement pas joué au golf aussi bien qu'il pourrait l'être.
Essayez-le en ligne!
la source
hfqQ+@Jmi:.Bd\1\23QeT@JhTsmm,dkUQU
. Peut certainement êtrehfqQ+@Jmi:.Bd\1\23QeT@JhTsmm,dkUQ
Pyth , 29 octets
Celui-ci renvoie toutes les paires d'indices possibles.
Essayez-le ici.
Pyth , 30 octets
Essayez-le ici.
Cela renvoie les paires d'indices sous la forme
[LowerIndex, HigherIndex]
.Comment cela marche-t-il?
la source
Paradoc (v0.2.10), 11 octets (CP-1252)
Essayez-le en ligne!
Algorithmiquement, c'est tout à fait comme la réponse ES6 de Neil . À un niveau inférieur, également étonnamment similaire à la réponse Husk de H.PWiz . Je suis amusé que nous ayons pu utiliser les trois surcharges de
B
.Prend un entier sur la pile, laisse une liste de deux entiers sur la pile.
Explication:
la source
Python 3 ,
122120 octets-2 octets grâce à M. Xcoder!
0 indexé
Non golfé:
Essayez-le en ligne!
la source
Mathematica, 94 octets
1 indexé
la source
JavaScript,
120101 octetsEssayez-le en ligne!
0 indexé.
Il renvoie la paire d'indices où un indice est le plus petit possible (par exemple dans le cas où
428
il retourne22,31
).la source
Brain-Flak ,
220166 octets-54 octets en recherchant la fonction modulo sur le wiki, permettant certains changements structurels
Essayez-le en ligne!
0 indexé.
Explication
Comme beaucoup d'autres solutions, cela calcule l'expansion ternaire de
n/2
et la convertit en deux nombres binaires.Étape 1: divisez l'entrée par 2
Étape 2: calculer l'expansion ternaire
Étape 3: convertir en solution
la source
JavaScript (ES6), 70
72octets(Indexé 0, et apparemment presque la même solution que @Neil même si je n'avais pas vu sa réponse)
J'ai commencé par récupérer l'index à partir d'un nombre en utilisant l'inverse du processus: stringify avec base 3, remplacez chaque
2
par1
, analyser avec la base 2.Pour obtenir deux nombres, et cela pour chaque paire, nous n'avons que la moitié de l'entrée - mais maintenant, des
1
chiffres peuvent également apparaître. Nous le remplaçons donc par un0
dans l'un et un2
dans l'autre, ce qui ne change pas la somme des deux, avant l'étape de remplacement et d'analyse. Voici ce que j'ai trouvé (faire les deux remplacements,1
-> 0 ou 2 et2
->1
en une seule étape):Bien sûr, les deux cartes de remplacement (chaînes) ne diffèrent que dans un seul index, nous devrions donc être en mesure de raccourcir le littéral du tableau en remplaçant uniquement
1
et2
pard == 2 ? 1 : x
. Oud-1 || x
. Où-1
fait la même chose que les deux opérateurs unaires - mais ils ont l'air plus effrayants :-)Essayer d'éviter le littéral du tableau et les parenthèses autour
n/2
je suis également venu avecmais cela ne s'est pas avéré fructueux.
la source
["001","011"]
version (enfin mes noms de variables étaient différents).replace(/./g,d=>d>>1|x)
sauve 2 octets.d="0"
etx=1
- le chiffre devrait rester0
Pyth, 22 octets
Essayez-le en ligne: Démonstration
Explication:
la source