Условия последовательности ЭКГ


13

Вступление

Последовательность ЭКГ начинается с 1 и 2, затем правило состоит в том, что следующий член является наименьшим положительным целым числом, которого еще нет в последовательности, и общий множитель которого с последним членом больше 1 (они не взаимно просты).

Первые термины:

1, 2, 4, 6, 3, 9, 12, 8, 10, 5, 15, ...

Он называется ЭКГ, потому что график его терминов очень похож на ЭКГ.

Это последовательность A064413 в OEIS .

Вызов

Вы должны написать функцию, которая принимает целое число n в качестве входных данных и выводит, сколько из n первых членов последовательности больше, чем n .

Так как правило последовательности начинается с третьего члена, входное целое число должно быть больше или равно 3. Например, при заданном входном значении 10выход является 1тем, что 7-й член является12 значении и ни один из других первых десяти членов не превышает 10.

Контрольные примеры

3 -> 1

10 -> 1

100 -> 9

1000 -> 70

правила

  • Для целых чисел, меньших 3, функция может выводить 0 или код ошибки.
  • Никаких других особых правил, кроме: это код гольф, чем короче, тем лучше!

Можем ли мы использовать 0-индексирование, 1будучи 0-м членом последовательности и, следовательно, делая, например, 1510-й член, а не 5?
лохматый

@ Shaggy Я думаю, что это справедливо использовать как математический способ, но на самом деле это изменит результат тестовых случаев и даже саму запрошенную функцию. Таким образом, я думаю, что вам нельзя позволять это делать. Сожалею.
Дэвид

oeis.org/A064413/graph - OEIS может писать графики? Ухоженная.
Волшебный Осьминог Урна

Ответы:


7

Желе , 20 19 18 байт

S‘gṪ’ɗƇḟ¹Ṃṭ
1Ç¡>¹S

Это полная программа.

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

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

1Ç¡>¹S       Main link. Argument: n (integer)

1            Set the return value to 1.
 Ç¡          Call the helper link n times.
   >¹        Compare the elements of the result with n.
     S       Take the sum, counting elements larger than n.


S‘gṪ’ɗƇḟ¹Ṃṭ  Helper link. Argument: A (array or 1)

S            Take the sum of A.
 ‘           Increment; add 1.
     ɗƇ      Drei comb; keep only elements k of [1, ..., sum(A)+1] for which the
             three links to the left return a truthy value.
  g              Take the GCD of k and all elements of A.
   Ṫ             Tail; extract the last GCD.
    ’            Decrement the result, mapping 1 to 0.
       ḟ¹    Filterfalse; remove the elements that occur in A.
         Ṃ   Take the minimum.
          ṭ  Tack; append the minimum to A.

Обратите внимание, что сгенерированная последовательность [1,0,2,4,6,3,9,12,8,10,5,15,] . Поскольку вызов вспомогательной ссылки n раз генерирует последовательность длиной n+1 , значение 0 практически игнорируется.


6

Perl 6 , 66 63 59 58 байт

-4 байта благодаря Джо Кингу

{sum (1,2,{+(1...all *gcd@_[*-1]>1,*∉@_)}...*)[^$_]X>$_}

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

Слишком медленно на TIO для n = 1000.


@JoKing После того, как я понял, что first &f,1..*это можно переписать +(1...&f), твой переходный трюк все- таки помог.
nwellnhof

4

JavaScript (ES6), 107 106 105 байтов

f=(n,a=[2,1],k=3)=>a[n-1]?0:a.indexOf(k)+(C=(a,b)=>b?C(b,a%b):a>1)(k,a[0])?f(n,a,k+1):(k>n)+f(n,[k,...a])

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

Как?

C

C = (a, b) => b ? C(b, a % b) : a > 1

a[2,1]a[0]

k0

a.indexOf(k) + C(k, a[0])

a.indexOf(k) равно либо:

  • 1ka
  • 0К
  • i1

a.indexOf(k) + C(k, a[0])0kak1+true=0



4

Шелуха , 16 байт

#>¹↑¡§ḟȯ←⌋→`-Nḣ2

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

объяснение

#>¹↑¡§ḟȯ←⌋→`-Nḣ2  Implicit input, say n=10
              ḣ2  Range to 2: [1,2]
    ¡             Construct an infinite list, adding new elements using this function:
                   Argument is list of numbers found so far, say L=[1,2,4]
             N     Natural numbers: [1,2,3,4,5,6,7...
           `-      Remove elements of L: K=[3,5,6,7...
      ḟ            Find first element of K that satisfies this:
                    Argument is a number in K, say 6
     §    →         Last element of L: 4
         ⌋          GCD: 2
       ȯ←           Decrement: 1
                    Implicitly: is it nonzero? Yes, so 6 is good.
                  Result is the EKG sequence: [1,2,4,6,3,9,12...
   ↑              Take the first n elements: [1,2,4,6,3,9,12,8,10,5]
#                 Count the number of those
 >¹               that are larger than n: 1

3

MATL , 29 байт

qq:2:w"GE:yX-y0)yZdqg)1)h]G>z

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

Объяснение:

	#implicit input, n, say 10
qq:	#push 1:8
2:	#push [1 2]. Stack: {[1 .. 8], [1 2]}
w	#swap top two elements on stack
"	#begin for loop (do the following n-2 times):
 GE:	#push 1...20. Stack: {[1 2], [1..20]}
 y	#copy from below. Stack:{[1 2], [1..20], [1 2]}
 X-	#set difference. Stack: {[1 2], [3..20]}
 y0)	#copy last element from below. Stack:{[1 2], [3..20], 2}
 yZd	#copy from below and elementwise GCD. Stack:{[1 2], [3..20],[1,2,etc.]}
 qg)	#select those with gcd greater than 1. Stack:{[1 2], [4,6,etc.]}
 1)	#take first. Stack:{[1 2], 4}
 h	#horizontally concatenate. Stack:{[1 2 4]}
 ]	#end of for loop
G>z	#count those greater than input
	#implicit output of result

пожалуйста, вы можете объяснить, почему вы удваиваете ввод (с GE:)?
Дэвид

2
@ Давид Я думаю, что опытным путем я заметил, что a(N)2N но у меня нет доказательств, поэтому я изначально использовал a(N)N2тайм-аут на Nзнак равно1000контрольный пример, поэтому я переключил его обратно, чтобы проверить это, и оставил его внутри. Я все еще не уверен ни в одном из этих ограничений, но, похоже, это работает, поэтому я могу попытаться найти доказательство. В whileMATL цикл был бы намного сложнее, поэтому я пытался избежать этого.
Джузеппе

3

APL (Dyalog Unicode) , 39 байтов SBCS

-2 байта благодаря ngn, -1 байт с помощью надлежащей условной проверки.

{+/⍵<⍵⍴3{(1=⍺∨⊃⌽⍵)∨⍺∊⍵:⍵∇⍨⍺+1⋄⍵,⍺}⍣⍵⍳2}

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


передает свой собственный левый аргумент в функцию операнда, поэтому в этом нет необходимости . также не будет связываться с вещью справа, так как она начинается с функции ( ), так что в этом нет необходимости .
нгн


2

APL (NARS), символы 121, байты 242

∇r←a w;i;j;v
r←w⋄→0×⍳w≤2⋄i←2⋄r←⍳2⋄v←1,1,(2×w)⍴0
j←¯1+v⍳0
j+←1⋄→3×⍳1=j⊃v⋄→3×⍳∼1<j∨i⊃r⋄r←r,j⋄i+←1⋄v[j]←1⋄→2×⍳w>i
r←+/w<r
∇

тест за одну минуту здесь во время выполнения:

  a¨3 10 100 1000 2000
1 1 9 70 128 

Естественно, нет проверки для типа и диапазона ...


1

Japt, 23 21 байт

@_jX ªAøZ}f}gA=ì)Aè>U

Попытайся

@_jX ªAøZ}f}gA=ì)Aè>U
                          :Implicit input of integer U
             A            :10
               ì          :Digit array
              =           :Reassign to A
@          }g             :While the length of A < U+1, take the last element as X,
                          :pass it through the following function & push the result to A
 _       }f               :  Find the first integer Z >= 0 that returns falsey
  jX                      :    Is Z co-prime with X?
     ª                    :    OR
      AøZ                 :    Does A contain Z?
                )         :End loop
                 Aè>U     :Count the elements in A that are greater than U

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