Циклическая последовательность четных цифр с коэффициентами между


13

Рассмотрим следующую последовательность:

1, 0, 1, 2, 4, 1, 6, 8, 0, 1, 2, 4, 6, 8, 1, 0, 2, 4, 6, 8, 1, 0, 2, 4, 6, 8, 0, 1, ...

Четные цифры начинаются с 0 и группируются в серии увеличивающейся длины. Они располагаются циклически, что означает, что они сортируются в порядке возрастания до достижения 8 , а затем циклически возвращаются из 0 . 1 разделяет серии четных цифр и также запускает последовательность. Давайте представим, как формируется эта последовательность:

                 1, 0, 1, 2, 4, 1, 6, 8, 0, 1, 2, 4, 6, 8, 1, 0, 2, 4, 6, 8, 1,  ...

                    -     ----     -------     ----------     -------------
run length:         1      2          3            4                5            ...
position of 1:   X     X        X           X              X                 X   ...
even sequence:      0,    2, 4,    6, 8, 0,    2, 4, 6, 8,    0, 2, 4, 6, 8      ...

Приемлемые методы ввода и вывода:

  • Получите целое число N в качестве входных данных и выведите N- й член этой последовательности.

  • Получите целое число N в качестве входных данных и выведите первые N членов этой последовательности.

  • Печатайте последовательность бесконечно.

Вы можете выбрать 0 или 1-индексирование для первых двух методов.

Вы можете соревноваться на любом языке программирования , используя стандартные методы ввода и вывода . Стандартные лазейки запрещены. Это , поэтому выигрывает самый короткий код на каждом языке.


Эта проблема была помещена в песочницу .
г-н Xcoder

Ответы:


8

Haskell , 50 46 байтов

1#cycle[0,2..8]
n#r=1:take n r++(n+1)#drop n r

Попробуйте онлайн!

1#cycle[0,2..8] возвращает последовательность в виде бесконечного списка.

-4 байта благодаря Орджану Йохансену!


1
Вы можете сохранить четыре байта, указав первый аргумент из #числа. Попробуйте онлайн!
Эрджан Йохансен,

7

Желе , 10 байт

5ḶḤṁR€1pFḣ

Возвращает первые n элементов последовательности.

Попробуйте онлайн!

Как это устроено

5ḶḤṁR€1pFḣ  Main libk. Argument: n

5           Set the return value to 5.
 Ḷ          Unlength; yield [0, 1, 2, 3, 4].
  Ḥ         Unhalve; yield [0, 2, 4, 6, 8].
    R€      Range each; yield [[1], [1, 2], [1, 2, 3], ..., [1, ..., n]].
   ṁ        Mold; in the result to the left, replace [1] with [0], [1, 2] with
            [2, 4], [1, 2, 3] with [6, 8, 0], and so forth.
      1p    Take the Cartesian product of [1] and the result.
        F   Flatten the result.
         ḣ  Head; take the first n items of the result.

2
ಠ_ಠ Unhalve... Разве это не просто Double?
г-н Xcoder

4
Это просто мнемоника. Hэто сократить вдвое , так это unhalve . ÆAэто арккозин , так же ÆẠкак и арккозин .
Деннис

6

Шелуха , 12 11 10 байт

ṁ:1CN¢mDŀ5

Попробуйте онлайн!

Печатает последовательность бесконечно.

В качестве альтернативы:

J1CΘN¢mDŀ5

Попробуйте онлайн!

объяснение

        ŀ5   Start from [0, 1, 2, 3, 4]
      mD     Double each value to get [0, 2, 4, 6, 8]
     ¢       Repeat this list indefinitely, [0, 2, 4, 6, 8, 0, 2, ...]
   CN        Cut it into chunks of increasing lengths, 
             [[0], [2, 4], [6, 8, 0], ...]
ṁ:1          Prepend 1 to each sublist and concate the resulting lists.

Для альтернативного решения:

     ¢mDŀ5   Again, get [0, 2, 4, 6, 8, 0, 2, ...].
  CΘN        This time we prepend a zero to the natural numbers, which
             prepends an empty list to the resulting chunks.
J1           Join all the sublists with 1.

Мы также могли бы это сделать ...ΘCN..., потому Θчто «добавляет элемент по умолчанию», который добавляет ноль для списков целых чисел и пустой список для списков списков.




2

APL, 25 байт

Возвращает n-й член.

1,(⌽n↑⌽(+/⍳n←⎕)⍴0,2×⍳4),1

объяснение

n←⎕     Prompts for screen input of integer
+/⍳      Creates a vector of integers of 1 to n and sums
⍴0,2×⍳4  Creates a vector by replicating 0 2 4 6 8 to the length of sum
⌽n↑⌽   Rotates the vector, selects first n elements and rotates result
        (selects last n elements}    
1,...,1 Concatenates 1s in front and behind result

2

APL (Dyalog Unicode) , 52 59 56 байт

rc k
r←~n0
:For j :In k
n+←j-1
r,←1,⍨jn0,2×⍳4
:End
rkr

Попробуйте онлайн!

Это tradfn ( трады itional х unctio п ) принимает один аргумент kи возвращают первые kэлементы последовательности.

Спасибо @GalenIvanov за указание на ошибку в функции. Спасибо @ Adám за 3 байта.

Как это устроено:

rc k              The function c takes the argument k and results in r
r n1 0            Initializing the variables r and n, and setting them to 1 and 0, respectively.
:For j :In k      For loop. k yields [1, 2, 3, ..., k], and j is the control variable.
n+←j-1             Accumulates j-1 into n, so it follows the progression (0, 1, 3, 6, 10, 15...)
r,←1,⍨jn0,2×⍳4   This line is explained below.
:End               Ends the loop
rkr              return the first k items of r.
                    actually reshapes the vector r to the shape of k;
                   since k is a scalar,  reshapes r to a vector with k items.
            2×⍳4   APL is 1-indexed by default, so this yields the vector 2 4 6 8
          0,       Prepend a 0 to it. We now have 0 2 4 6 8
        n         Rotate the vector n times to the left.
      j           Reshape it to have j items, which cycles the vector.
   1,⍨             Append a 1, then
r,←                Append everything to r.

Ниже приведены Dfn( д Прям ая ф unctio п ) и подразумеваемое функцию , которая также решить проблему, и любезно предоставленный @ AdaM.


Я заинтересован в объяснении молчаливого везриона. Благодарность!
Гален Иванов

@GalenIvanov Я добавлю один позже сегодня.
J. Sallé

Я заметил, что 3 функции дают неправильные ответы - подпоследовательности всегда начинаются с 0 после 1 - они должны продолжаться с последней четной цифры предыдущей подпоследовательности.
Гален Иванов

@GalenIvanov Ты прав. Я посмотрю, смогу ли я это исправить и добавлю объяснения сегодня.
J. Sallé

1

JavaScript (ES6), 62 54 52 байта

Возвращает N- й член последовательности, проиндексированный 0.

n=>(g=e=>n--?g(e+=k++<l?2:k=!++l):k<l?e%10:1)(k=l=0)

демонстрация


1

C (gcc), 84 байта

i;j;f(){for(i=1;;i++){printf("%d ",1);for(j=0;j<i;)printf("%d ",(2*j+++i*i-i)%10);}}

Попробуйте онлайн!

Функция ( f()), которая печатает последовательность бесконечно, разделенных пробелами.

i длина текущего четного прогона

j индекс в текущем четном прогоне

(2*j+++i*i-i)%10 дает правильное четное число с учетом i и j (и приращений j), эквивалентное ((j + Tr (i))% 5) * 2, где Tr (x) - это x-ое треугольное число (которое является числом четного числа, которые были напечатаны до текущего запуска;



1

Java 8, 96 байт

v->{for(int i=0,j=-2,k;;i++,System.out.println(1))for(k=0;k++<i;System.out.println(j%=10))j+=2;}

Печатает бесконечно каждый номер на новой строке.

Объяснение:

Попробуй это здесь.

v->{                               // Method with empty unused parameter and no return-type
  for(int i=0,                     //  Index integer, starting at 1
          j=-2,                    //  Even index integer, starting at -2
          k;                       //  Inner index integer
      ;                            //  Loop (1) indefinitely
                                   //    After every iteration:
       i++,                        //     Increase index `i` by 1
       System.out.println(1))      //     And print a 1
    for(k=0;                       //   Reset index `k` to 0
        k++<i;                     //   Inner loop (2) from 0 to `i`
                                   //     After every iteration:
       System.out.println(j%=10))  //      Set `j` to `j` modulo-10, and print it
      j+=2;                        //    Increase `j` by 2
                                   //   End of inner loop (2) (implicit / single-line body)
                                   //  End of loop (1) (implicit / single-line body)
}                                  // End of method

1

Пакетная, 85 байт

@set/an=%2+1,t=n*-~n/2
@if %t% lss %1 %0 %1 %n%
@cmd/cset/a(%1-n)%%5*2*!!(t-=%1)+!t

Выводит N-й член последовательности. Работает путем расчета следующего треугольного числа.



1

J , 46 42 40 байт

-6 байт благодаря Коул

{.({.[:;[:#:&.>2^i.);@(1,&.><;.1)10|2*i.

Выводит первые N членов этой последовательности.

Как это устроено:

10|[:+:i. - генерирует список длиной N 0 2 4 6 8 0 2 4 ... Он просто берет mod 10 удвоенных элементов списка целых чисел, начиная с 0.

[:;[:#:&.>2^i. - генерирует битовую маску для вырезания списка выше.

(1 означает начало): 1 1 0 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 ... Он находит 2 в степени последовательных неотрицательных целых чисел, преобразует их в двоичные, выравнивает list и занимает только первые N элементов, так что длина обоих списков одинакова.

;@(1,&.><;.1) - разбивает (режет) список четных цифр на подсписки в соответствии с картой единиц и нулей, добавляет подсписок к 1 и, наконец, выравнивает результирующий список

]{. - берет только первые N предметов, избавляясь от дополнительных чисел в списке за счет добавленных 1с.

Попробуйте онлайн!


1
42 байт: {.({.[:;[:#:&.>2^i.);@(1,&.><;.1)(10|2*i.). Изменения, которые я сделал, заключались в использовании крюков и рефакторинга правого зуба вилки, чтобы воспользоваться преимуществами работы вилок. Мне нравится 2^i.трюк. Я сейчас пытаюсь работать на левом зубце вилки.
Коул

@cole Спасибо, мне нужно научиться лучше использовать вилки. Видимо вилка 2 * я. лучше, чем закрытый крючок [: +: i.
Гален Иванов

1
Вы также можете бросить парены на правом зубце (10|2*i.)->10|2*i.
Коул




0

Протон , 55 байт

i=0 j=-2while1{for k:0..i print(j=(j+2)%10)print(1)i++}

Попробуйте онлайн!

Печатает последовательность бесконечно


ಠ_ಠ Что это, новый синтаксис? : p i=0 j=-2while1{...
Mr. Xcoder

@ Mr.Xcoder: P -2whileпохож на Python и while1потому, что я сделал идентификаторы, которые не могут быть ключевыми словами, за которыми следует число
HyperNeutrino




0

JavaScript, 45 байт

1 проиндексировано:

f=(x,t=0,p=0)=>p<x?f(x-1,t+1,p+t):x-p?x%5*2:1

0 проиндексировано:

g=(x,p=0)=>p<x?g(x-1,p?++t+p:t=1):x-p?x%5*2:1



Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.