Binarna kwadratowa sekwencja diagonalna


20

Sekwencja binarna-kwadrat-diagonalna jest skonstruowana w następujący sposób:

  1. Weź sekwencję dodatnich liczb naturalnych:
    1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, ...
  2. Konwertuj każdą liczbę na binarną:

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

  3. Połącz je:

    11011100101110111100010011010101111001101111011111000010001 ...

  4. Zaczynając od n=1, generuj kwadraty o rosnącej długości boku, nktóre są wypełnione od lewej do prawej, od góry do dołu elementami powyższej sekwencji:

    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
    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. Weź przekątną (od lewej górnej do prawej dolnej) każdego kwadratu:

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

  6. Konwertuj na dziesiętne (ignorując początkowe zera):

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

Zadanie

Napisz program lub funkcję, która generuje sekwencję na jeden z następujących sposobów:

  • Zwróć lub wydrukuj sekwencję bez końca.
  • Biorąc pod uwagę dane wejściowe i, zwróć lub wydrukuj pierwsze ielementy sekwencji.
  • Biorąc pod uwagę dane wejściowe i, zwróć lub wydrukuj ielement th sekwencji (0 lub 1 indeksowany).

Podaj w odpowiedzi, jaki format wyjściowy wybierzesz.

To jest , wygrywa najkrótsza odpowiedź w każdym języku.

Przypadki testowe

Oto pierwsze 50 elementów sekwencji:

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

Odpowiedzi:


10

Łuska , 15 14 bajtów

zȯḋm←CtNCİ□ṁḋN

Wypróbuj online!

Ciągle drukuje wyniki jako nieskończoną listę.

Wyjaśnienie

Zastanawiam się, czy jest lepszy sposób na pobranie co n- tego elementu z listy niż podzielenie listy na kawałki o długości n i pobranie nagłówka każdego fragmentu.

      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.

Żeby było jasne, wyodrębniamy przekątną kwadratu nxn , dzieląc jego formę liniową na fragmenty o długości n + 1 i wyszukując pierwszy element każdego fragmentu:

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



4

05AB1E , 19 17 16 bajtów

°LbJsLn£θs>ô€нJC

°jest zastępowany przez 3mw linkach, ponieważ °zwykle robi się bardzo wolny.

Wypróbuj online! lub jako pakiet testowy

Wyjaśnienie

°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

Nie można zastąpić 3mz n?
Erik the Outgolfer

@EriktheOutgolfer: Tak, mogę, dzięki! Byłem całkiem pewien, że to nie zadziałało, ale mogło to być spowodowane załamaniami we wcześniejszym rozwiązaniu. Te same bajty liczą się, °ale znacznie szybciej: P
Emigna

Liczby od 1 do ^ 2 są niewystarczające . 1 do wpisania ^ 3 jak w pythonie odpowiedzi wydają się wystarczające.
ovs

@ovs: Ach tak, dlatego nie używałem go wcześniej. Tym razem sprawdziłem tylko kilka pierwszych elementów. Wrócę do poprzedniego rozwiązania (na szczęście przy tej samej liczbie bajtów)
Emigna,

3

Łuska , 15 bajtów

To zajmuje nieco inne podejście do odpowiedzi Martina

moḋz!NCNCṘNNṁḋN

Wypróbuj online!

Wyjaśnienie:

              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

W akcji

ṁḋ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 bajtów

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);}

Wypróbuj online!




2

Galaretka , 16 bajtów

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

Wypróbuj online!

Wyjaśnienie

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 bajtów

Wyjścia z ity element sekwencji (1 indeksowane)

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


Wypróbuj online!



1

Galaretka , 18 lat bajtów

Zupełnie inne podejście w porównaniu do rozwiązania Erika .

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

Wypróbuj online!

Jak to działa

Ḷ²S'ɓ * 3B € Fṫ - Łącznik pomocniczy (monadyczny).

Ḷ - Obniżony zakres, generuje [0, N).
 ² - kwadrat wektorowy (każdy kwadrat).
  S - Suma.
   „- Przyrost uwzględniający 1-indeksowanie galaretki.
     ɓ - Rozpoczyna osobny łańcuch dyadyczny.
     * 3 - Wejście do potęgi 3.
       B € - Konwertuj każdy na binarny.
         F - Spłaszcz.
          ṫ - Ogon. Zwraca x [y - 1:] (1-indeksowany).

Çm'ḣµḄ - Główny link (monadyczny).

Ç - Ostatni link jako monada.
 m '- Wejście modułowe + 1. Zdobądź każde „wejście + 1” element listy.
   ḣ - Głowa. Zwróć powyższe z elementami o indeksie wyższym niż przycięte dane wejściowe.
    µḄ - Konwertuj z binarnej na całkowitą.

Oszczędność 1 bajtu dzięki Jonathanowi Allanowi !


Uratuj jednego za pomocą łańcucha dyadycznego, aby usunąć ³:Ḷ²S‘ɓ*3B€Fṫ
Jonathan Allan

@JonathanAllan Oczywiście, dziękuję! Naprawdę powinienem nauczyć się tej sztuczki
Mr. Xcoder,


0

Pyth ,  27  20 bajtów

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

Sprawdź kilka pierwszych przypadków testowych.

Pobiera I termin sekwencji, 1 indeksowany.

Jak to działa?

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.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.