Allez-vous en! No-1's Here!

16

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?

geokavel
la source
Pouvons-nous produire un nombre complexe des deux valeurs? Pouvons-nous fournir deux fonctions, une donnant chaque valeur?
xnor
2
Pouvons-nous produire toutes les valeurs possibles, ou cela va-t-il au-delà du défi?
cole
@cole Ouais, ça va.
geokavel
Il semble que M. Sloane aime vraiment ses séquences de chiffres. "Il y a une séquence pour ça" (TM)
Pharap
1
Puisqu'il existe plusieurs solutions pour certaines entrées, il serait intéressant d'inclure toutes les solutions dans les cas de test. Ce programme affiche toutes les paires de solutions pour chaque cas de test, dans le même format que dans le texte du défi (basé sur 0, chaque paire triée de plus en plus)
Luis Mendo

Réponses:

10

Husk , 21 14 13 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

mḋTmMo±>ḋ2B3½

Essayez-le en ligne!

Explication

            ½    Half the input
          B3     Convert to Base 3
   m             Map over the list
    Mo±>ḋ2       Function such that: 0 -> [0,0], 1 -> [0,1], 2 -> [1,1]
        ḋ2       Binary 2, [1,0]
    M            For each in that list
     o±>         check if the argument is greater than it
  T              Transpose
mḋ               Convert each from binary

Solution précédente de 21 octets

La première fois que j'ai vu une utilisation pour ».

mḋT»o%2+ȯ?´eḋε%3`-0B3

Essayez-le en ligne!

Plus longtemps, comme je traitais avec porte

H.PWiz
la source
8

JavaScript (ES6), 75 71 octets

f=
n=>[1,0].map(i=>parseInt((n/2).toString(3).replace(/./g,c=>+c+i>>1),2))
<input type=number min=0 step=2 oninput=o.textContent=this.value%2?``:f(this.value)><pre id=o>

Explication: 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:

                 A005823
                  halved
            n in  values A005823
   n n/2  base 3  base 3 indices
   0   0       0   0   0   0   0  
   2   1       1   1   0   1   0
   4   2       2   1   1   1   1
   6   3      10  10   0   2   0
   8   4      11  11   0   3   0
  10   5      12  11   1   3   1
  12   6      20  10  10   2   2
  14   7      21  11  10   3   2
  16   8      22  11  11   3   3
  18   9     100 100   0   4   0
  30  15     120 110  10   6   2
  32  16     121 111  10   7   2
  46  23     212 111 101   7   5
  50  25     221 111 110   7   6
Neil
la source
6

Gelée , 26, 22 , 21 octets

ḶBḤḅ3
ÇŒcS=¥Ðf⁸ḢiЀÇT

Essayez-le en ligne!

Un octet sauvé grâce à @JonathanAllan!

Explication:

                # Helper link: A005823 to *N* terms
Ḷ               # Lowered range(N)
 B              # Converted to binary
  Ḥ             # Double each digit
   ḅ3           # Converted from base 3 to decimal
                # Main link
Ç               # Last link
 Œc             # All combinations of 2 items (with replacement)
      Ðf        # Remove every combination where this isn't true:
   S=¥          #   The sum of the two items is equal to N
        ⁸Ḣ      # Take the first combination left
          i     # Index of
           Ѐ   # Each element of the combination
             Ç  # In the sequence
              T # Return the truthy indices
DJMcMayhem
la source
1
@JonathanAllan Oh, c'est bon à savoir Œc. Et oui, Dennis S=¥m'a expliqué le problème .
DJMcMayhem
Il semble que vous ayez besoin d'ajouter la gestion des cas de bord pour zéro :(
Jonathan Allan
On dirait que c'est basé sur 1; peut-être vaudrait-il la peine de l'indiquer dans la réponse
Luis Mendo
20 octets
dylnan
3

Python 2 , 51 octets

f=lambda n:[n and(n/2%3>r)+2*f(n/3)[r]for r in 0,1]

Essayez-le en ligne!

La tâche peut se faire comme ceci:

  1. Réduire de moitié l'entrée
  2. Convertir en liste ternaire
  3. Divisez cela en deux listes binaires qui y résument élément par élément
  4. Convertissez ces listes de binaires

Nous pouvons faire la division en (3) en convertissant 0->0,1->1,2->1pour une liste et 0->0,1->0,2->1pour 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:

p=lambda n:n and(n/2%3>0)+2*p(n/3)
q=lambda n:n and(n/2%3>1)+2*q(n/3)

La fonction fcombine 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:

f=lambda n:n and(n%6>1)+n%6/4*1j+2*f(n/3)
xnor
la source
Je suppose que les nombres complexes sont corrects.
geokavel
3

J, 35 32 octets

($#:I.@,)@(=[:+/~3#.+:@#:@i.@>:)

Essayez-le en ligne!

0 indexé et l'entrée est donnée monadiquement. Renvoie toutes les sommations possibles à la valeur (il traite a bet b acomme 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      =. = [: +/~ 3 #. +:@#:@i.@>:
indices_of_ones =. $ #: I.@,

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

indices_of_ones@valid_nums

valid_nums

= [: +/~ 3 #. +:@#:@i.@>:  Input is n
                 #:@i.@>:  Binary numbers in range [0,n]
              +:           Doubled
         3 #.              Interpreted as ternary
     +/~                   Addition table with self (sum all possible pairs)
=                          Equate to n

indices_des_ones

$ #: I.@,
        ,  Ravel matrix into a single list
     I.    Find the indices of ones in that list
  #:       Convert to the base given by
$          The shape of the matrix

,-ravel fonctionne dans ce cas en joignant chaque ligne à la suivante.

   i.3 3
0 1 2
3 4 5
6 7 8
   , i.3 3
0 1 2 3 4 5 6 7 8

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. .

cole
la source
1
vos sorties redondantes sont ok.
geokavel
3

MATL , 22 21 19 17 octets

tQ:qBEI_ZA&+=R&fh

La 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

t      % Implicit input: n. Duplicate
Q:q    % Range [0 1 ... n]
B      % Convert to binary. Gives a matrix where each row corresponds to a number
E      % Multiply each entry by 2
I_ZA   % Convert each row from ternary to a number
&+     % Matrix of all pair-wise additions
=      % Does each entry equal n?
R      % Upper triangular matrix
&f     % Push row and column indices of nonzero entries
h      % Concatenate horizontally. Implicit didsplay
Luis Mendo
la source
OP a déclaré que la production de toutes les solutions était OK dans les commentaires
H.PWiz
@ H.PWiz Merci! Je n'avais pas vu ça
Luis Mendo
2

Pyth , 37 octets

0 indexé

Certainement pas joué au golf aussi bien qu'il pourrait l'être.

KUQJmi:.Bd\1\23KhfqQ+@JeT@JhTsmm,dkKK

Essayez-le en ligne!

Cowabunghole
la source
1
34 Octets hfqQ+@Jmi:.Bd\1\23QeT@JhTsmm,dkUQU. Peut certainement être
joué au golf
1
33 octets:hfqQ+@Jmi:.Bd\1\23QeT@JhTsmm,dkUQ
M. Xcoder
2

Pyth , 29 octets

Celui-ci renvoie toutes les paires d'indices possibles.

fqQ+@Kmi:.Bd\1\[email protected]

Essayez-le ici.

Pyth , 30 octets

hfqQ+@Kmi:.Bd\1\[email protected]

Essayez-le ici.

Cela renvoie les paires d'indices sous la forme [LowerIndex, HigherIndex].


Comment cela marche-t-il?

hfqQ+@Kmi:.Bd\1\[email protected]   Full Program. Q means input throughout the whole explanation.

       m          Q               Map over the range [0, Q) with a variable d.
          .Bd                     Convert to binary.
         :   \1\2                 Replace 1 with 2.
        i        3                Convert it from base 3 to integer.
      K                           Assign the mapped range to a variable K.
                         .cUQ2    All possible two-element combinations of the range [0...Q).
    +@             hT@KeT         Sum of the integers on positions in K of the two-element
                                  combination.
 fqQ                              Filter those that equal the input.
h                                 Optional: Head. Take the first element.
                                  Print the result, implicitly. 
M. Xcoder
la source
2

Paradoc (v0.2.10), 11 octets (CP-1252)

½3B2>_B™2Bv

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:

½           .. Halve input
 3B         .. Convert to ternary
   2        .. 2, which will get implicitly coerced to [0,1]
    >_      .. Greater than, as a block
      B     .. "Bimap": take the block and map it over the Cartesian
            .. product of the last two lists to get a matrix
       ™    .. Transpose
        2Bv .. Convert each row from binary
betaveros
la source
1

Python 3 , 122 120 octets

-2 octets grâce à M. Xcoder!

0 indexé

def f(a):r=range(a);s=[int(bin(x)[2:].replace(*'12'),3)for x in r];return[(i,j)for i in r for j in r if s[i]+s[j]==a][0]

Non golfé:

def f(a):
    r=range(a)
    s=[int(bin(x)[2:].replace(*'12'),3)for x in r]
    return[(i,j)for i in r for j in r if s[i]+s[j]==a][0]

Essayez-le en ligne!

Cowabunghole
la source
1
J'espère que ça ne te dérange pas. J'ai ajouté un lien TiO.
M. Xcoder
1

Mathematica, 94 octets

(w=#;Position[s,#]&/@#&@@(k=Select)[Tuples[s=k[Range@w,DigitCount[#,3,1]==0&],{2}],Tr@#==w&])& 


1 indexé

J42161217
la source
1

JavaScript, 120 101 octets

n=>[(A=[...Array(n+1)].map(Z=(a,b=a)=>b&&3*Z(b/2|0)+b%2*2))[F='findIndex'](a=>z=~A[F](b=>a+b==n)),~z]

Essayez-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ù 428il retourne 22,31).


la source
1

Brain-Flak , 220 166 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

({()<({}[()()])>}{})

 {              }     until number becomes zero:
     ({}[()()])       subtract two
( ()<          > {})  push number of iterations

Étape 2: calculer l'expansion ternaire

{({}(<>))<>(()()())({()<(({})){({}[()])<>}{}>}{}<><([{}()]{})>[()])}

 ({}(<>))<>         {   (({})){({}[()])<>}{} }{}<> ([{}()]{})         modulo (from wiki)
           (()()())                                                   use 3 as base
                     ()<                    >                         evaluate as 1 every time the 3 rolls over
                   (                              <          >[()])   push number of rollovers (function is now division with remainder)
{                                                                  }  repeat until quotient is zero, leaving all remainders on stack

Étape 3: convertir en solution

([]){{}<>(({}){})<>(({}){}{()<({}[()]){<>({}())<>(<{}>)}>}{})([][()])}({}{}<>)

([]){{}                                                      ([][()])}           repeat while stack height > 1:
                                                                                 (loop happens once when initial stack height is 1, but that's fine)
       <>(({}){})                                                                double smaller output number
                 <>(({}){}                                  )                    double larger output number
                          {                              }{}                     if digit in ternary expansion is nonzero:
                           ()<                          >                        add 1 to larger output number
                              ({}[()]){                }                         if digit is 2:
                                       <>({}())<>(<{}>)                          add 1 to smaller output number
Nitrodon
la source
0

JavaScript (ES6), 70 72 octets

n=>[6,4].map(x=>parseInt((n/2).toString(3).replace(/./g,d=>x>>d&1),2)) // thanks @Neil
n=>[0,1].map(x=>parseInt((n/2).toString(3).replace(/1|2/g,d=>~-d||x),2))

(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 2par1 , 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 1chiffres peuvent également apparaître. Nous le remplaçons donc par un 0dans l'un et un 2dans 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 et 2-> 1en une seule étape):

n=>["001","011"].map(x=>parseInt((n/2).toString(3).replace(/./g,d=>x[d]),2))

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 1et2 par d == 2 ? 1 : x. Ou d-1 || x. Où -1fait 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 avec

n=>Array.from(parseInt,(h=n/2,i)=>parseInt(h.toString(3).replace(/1|2/g,d=>~-d||i),2))

mais cela ne s'est pas avéré fructueux.

Bergi
la source
J'ai aussi commencé avec la ["001","011"]version (enfin mes noms de variables étaient différents)
Neil
Je pense que .replace(/./g,d=>d>>1|x)sauve 2 octets.
Neil
@Neil Malheureusement, cela ne fonctionne pas d="0"et x=1- le chiffre devrait rester0
Bergi
Ouais, je viens de résoudre ça après avoir essayé quelques cas de test supplémentaires. (Et j'ai depuis proposé une autre variante, mais cela va dans ma réponse, je le crains.)
Neil
1
Oh très gentil, et je pensais que j'étais intelligent pour battre votre version précédente ...
Neil
0

Pyth, 22 octets

J.m}1jb3hQxLJhfqsTQ^J2

Essayez-le en ligne: Démonstration

Explication:

J.m}1jb3hQxLJhfqsTQ^J2
        hQ                input + 1 
 .m                       find all values of [0, 1, 2, ..., input], where
     jb3                     value converted to base 3
   }1                        check if it contains the digit 1
                          this boolean ^ is false
J                         store this list in variable J

                   ^J2    every pair of J
              f           filter for pairs with
                sT           sum of pair
               q             equal
                  Q          the input
             h            take the first of these pairs
          xLJ             and find the corresponding indices of J
Jakube
la source