La séquence diagonale carrée binaire


20

La séquence binaire-carré-diagonale est construite comme suit:

  1. Prenez la séquence des nombres naturels positifs:
    1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, ...
  2. Convertissez chaque nombre en binaire:

    1, 10, 11, 100, 101, 110, 111, 1000, 1001, 1010, 1011, 1100, 1101, 1110, 1111, 10000, 10001, ...

  3. Les concaténer:

    11011100101110111100010011010101111001101111011111000010001 ...

  4. Commencez par n=1générer des carrés de plus en plus longs nqui sont remplis de gauche à droite, de haut en bas avec les éléments de la séquence ci-dessus:

    1
    dix
    1 1
    1 0 0 
    1 0 1
    1 1 0
    1 1 1 1
    0 0 0 1
    0 0 1 1 
    0 1 0 1
    0 1 1 1 1
    0 0 1 1 0
    1 1 1 1 0
    1 1 1 1 1
    0 0 0 0 1
    ...

  5. Prenez la diagonale (en haut à gauche en bas à droite) de chaque carré:

    1, 11, 100, 1011, 00111, ...

  6. Convertir en décimal (en ignorant les zéros non significatifs):

    1, 3, 4, 11, 7, ...

Tâche

Écrivez un programme ou une fonction qui génère la séquence de l'une des manières suivantes:

  • Renvoyez ou imprimez la séquence à l'infini.
  • En fonction de l'entrée i, renvoyez ou imprimez les premiers iéléments de la séquence.
  • En fonction de l'entrée i, renvoyer ou imprimer le ie élément de la séquence (soit 0 soit 1 indexé).

Veuillez indiquer dans votre réponse le format de sortie que vous choisissez.

C'est le , la réponse la plus courte dans chaque langue l'emporte.

Cas de test

Voici les 50 premiers éléments de la séquence:

1,3,4,11,7,29,56,141,343,853,321,3558,8176,3401,21845,17129,55518,134717,151988,998642,1478099,391518,7798320,8530050,21809025,61485963,66846232,54326455,221064493,256373253,547755170,4294967295,1875876391,2618012644,24710258456,6922045286,132952028155,217801183183,476428761596,51990767390,687373028085,1216614609441,7677215985062,15384530216172,22714614479340,15976997237789,0,256145539974868,532024704777005,601357273478135

Réponses:


10

Coque , 15 14 octets

zȯḋm←CtNCİ□ṁḋN

Essayez-le en ligne!

Imprime continuellement les résultats sous forme de liste infinie.

Explication

Je me demande s'il y a une meilleure façon d'obtenir tous les n ième élément d'une liste de diviser la liste en morceaux de longueur n et la récupération de la tête de chaque morceau.

      tN          Get a list of all natural numbers except 1. (A)

             N    Get a list of all natural numbers.
           ṁḋ     Convert each to its binary representation and join them 
                  all into a single list.
         İ□       Get a list of squares of all natural numbers.
        C         Cut the list of bits into chunks of corresponding sizes. (B)

zȯ                Zip (A) and (B) together with the following function.
     C            Split the bit list (from B) into chunks of the given length
                  (from A).
   m←             Get the head of each chunk. This is the diagonal of the
                  bit list arranged as a square.
  ḋ               Interpret the resulting bits as binary digits and return
                  the result.

Pour être clair, nous extrayons la diagonale d'un carré nxn en divisant sa forme linéaire en morceaux de longueur n + 1 et en récupérant le premier élément de chaque morceau:

[[1 , 0 , 1 , 0
  0],[1 , 0 , 1
  1 , 0],[1 , 0
  0 , 1 , 0],[1]]



4

05AB1E , 19 17 16 octets

°LbJsLn£θs>ô€нJC

°est remplacé par 3mdans les liens car il a °tendance à devenir très lent.

Essayez-le en ligne! ou comme suite de tests

Explication

°L                 # push the range [1 ... 10^input]
  bJ               # convert each to binary and join to string
    sLn            # push the range [1 ... input]^2
       £θ          # split the binary string into pieces of these sizes and take the last
         s>ô       # split this string into chunks of size (input+1)
            €н     # get the first digit in each chunk
              JC   # join to string and convert to int

Vous ne pouvez pas remplacer 3mpar n?
Erik the Outgolfer

@EriktheOutgolfer: Oui je peux, merci! J'étais presque sûr que cela ne fonctionnait pas, mais cela était peut-être dû à des défauts dans une solution antérieure. Même nombre d'octets °mais beaucoup plus rapide: P
Emigna

Les nombres de 1 à l'entrée ^ 2 ne sont pas suffisants . 1 pour entrer ^ 3 comme dans les réponses python semble être suffisant.
2017

@ovs: Ah oui, c'est pourquoi je ne l'ai pas utilisé auparavant. Cette fois, je n'ai vérifié que les deux premiers éléments. Je reviens à la solution précédente (heureusement au même nombre d'octets)
Emigna

3

Husk , 15 octets

Cela prend une approche quelque peu différente de la réponse de Martin

moḋz!NCNCṘNNṁḋN

Essayez-le en ligne!

Explication:

              N   List of all natural numbers
            ṁḋ    Convert each to it's binary representation and flatten
         ṘNN      Repeat the list of natural numbers according the natural numbers:
                  [1,2,2,3,3,3,4,4,4,4,5,5,5,5,5...]
        C         Cut the list of bits into lists of lengths corresponding to the above
      CN          Cut that list into lists of lengths corresponding to the natural numbers
moḋz!N            For each in the list, get the diagonals and convert from binary.
m                   For each list in the list
   z!N              Zip it with natural numbers, indexing.
 oḋ                 Convert to binary

En action

ṁḋN : [1,1,0,1,1,1,0,0,1,0,1,1,1,0,1,1,1,1,0,0,0,1,0,0,1,1,0,1,0,1...]

ṘNN : [1,2,2,3,3,3,4,4,4,4,5,5,5,5,5,6,6,6,6,6,6,7,7,7,7,7,7,7,8,8...]

C : [[1],[1,0],[1,1],[1,0,0],[1,0,1],[1,1,0],[1,1,1,1],[0,0,0,1]...]

CN : [[[1]],[[1,0],[1,1]],[[1,0,0],[1,0,1],[1,1,0]]...]

m z!N : [[1],[1,1],[1,0,0],[1,0,1,1],[0,0,1,1,1],[0,1,1,1,0,1]...]

oḋ : [1,3,4,11,7,29,56,141,343,853,321,3558,8176,3401,21845...]


3

Java (OpenJDK 8) , 215 212 206 202 197 octets

i->{String b="",t;int s=0,x=++i,j;for(;--x>0;s+=x*x);while(b.length()<s)b+=i.toString(++x,2);for(j=1,s=0;j<i;System.out.println(i.valueOf(t,2)),s+=j*j++)for(t="",x=s;x<s+j*j;x+=j+1)t+=b.charAt(x);}

Essayez-le en ligne!




2

Gelée , 16 octets

RBFṁ
R²SÇṫ²C$m‘Ḅ

Essayez-le en ligne!

Explication

RBFṁ  Helper link. Input: integer k
R     Range, [1, 2, ..., k]
 B    Convert each to a list of its binary digits
  F   Flatten
   ṁ  Mold to length k

R²SÇṫ²C$m‘Ḅ  Main link. Input: integer n
R            Range, [1, 2, ..., n]
 ²           Square each
  S          Sum
   Ç         Call helper link on the sum of the first n squares
       $     Monadic chain
     ²         Square n
      C        Complement, 1-n^2
    ṫ        Tail, take the last n^2 elements
        m    Modular indexing, take each
         ‘   (n+1)th element
          Ḅ  Convert from list of binary digits to decimal

1

Mathematica, 96 octets

Sort le ie élément de la séquence (indexé 1)

Diagonal@Partition[TakeList[Flatten@IntegerDigits[Range[#^3],2],Range@#^2][[#]],#]~FromDigits~2&


Essayez-le en ligne!



1

Gelée , 18 octets

Approche complètement différente par rapport à la solution d' Erik .

Ḷ²S‘ɓ*3B€Fṫ
Çm‘ḣµḄ

Essayez-le en ligne!

Comment ça fonctionne

Ḷ²S'ɓ * 3 G € Fṫ - Lien d'assistance (monadique).

Ḷ - Plage réduite, génère [0, N).
 ² - Carré vectorisé (carré chacun).
  S - Somme.
   '- Incrément, pour tenir compte de l'indexation 1 de Jelly.
     ɓ - Démarre une chaîne dyadique distincte.
     * 3 - L'entrée à la puissance de 3.
       B € - Convertissez chacun en binaire.
         F - Aplatir.
          ṫ - Queue. Renvoie x [y - 1:] (indexé 1).

Çm'ḣµḄ - Lien principal (monadique).

Ç - Dernier lien en tant que monade.
 m '- Entrée modulaire + 1. Obtenez chaque "entrée + 1" ème élément de la liste.
   ḣ - Tête. Renvoyez ce qui précède avec des éléments à un index supérieur à l'entrée rognée.
    µḄ - Conversion de binaire en entier.

1 octet enregistré grâce à Jonathan Allan !


Enregistrez-en un à l'aide d'une chaîne dyadique pour supprimer ³:Ḷ²S‘ɓ*3B€Fṫ
Jonathan Allan

@JonathanAllan Bien sûr, merci! Je devrais vraiment apprendre cette astuce
M. Xcoder


0

Pyth ,  27  20 octets

i<%hQ>s.BS^Q3s^R2QQ2

Vérifiez les premiers cas de test.

Obtient le I ème terme de la séquence, 1 indexé.

Comment ça fonctionne?

i<%hQ>s.BS^Q3s^R2QQ2   - Full program. Q represents the input.

         S^Q3          - Generate the (inclusive) range [1, Q ^ 3].
       .B              - Convert each to binary.
      s                - Join into a single string.
     >                 - Trim all the elements at indexes smaller than:
               ^R2Q      - The elements of the range [0, Q) squared.
              s          - And summed.
  %hQ                  - Get each Q + 1 element of the list above.
 <                     - Trim all the elements at indexes higher than:
                   Q   - The input.
i                   2  - Convert from binary to integer.
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.