Ketentuan urutan EKG

13

pengantar

Urutan EKG dimulai dengan 1 dan 2, maka aturannya adalah bahwa istilah berikutnya adalah bilangan bulat positif terkecil yang belum ada dalam urutan dan yang faktor umum dengan istilah terakhir lebih besar dari 1 (mereka bukan koprimes).

Istilah pertama adalah:

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

Ini disebut EKG karena grafik istilahnya sangat mirip dengan EKG.

Ini urutan A064413 di OEIS .

Tantangan

Anda harus menulis sebuah fungsi yang mengambil bilangan bulat n sebagai input dan output berapa banyak n istilah pertama dari urutan lebih besar dari n .

Ketika aturan urutan dimulai dengan term ketiga, integer input harus lebih besar atau sama dengan 3. Misalnya, input yang diberikan 10output 1karena istilah ke-7 adalah12 dan tidak ada satu pun dari sepuluh suku pertama lainnya melebihi 10.

Uji kasus

3 -> 1

10 -> 1

100 -> 9

1000 -> 70

Aturan

  • Untuk bilangan bulat yang lebih rendah dari 3, fungsi dapat menghasilkan 0 atau kode kesalahan.
  • Tidak ada aturan khusus lain kecuali: itu kode golf, semakin pendek semakin baik!
David
sumber
Bisakah kita menggunakan pengindeksan 0, dengan 1menjadi istilah ke-0 dari urutan dan karenanya membuat, misalnya, 15istilah ke-10, bukan 5?
Shaggy
@ Shaggy Saya pikir ini adil untuk menggunakan ini sebagai cara matematika, tetapi sebenarnya itu akan mengubah hasil uji kasus dan memang fungsi yang diminta itu sendiri. Jadi saya pikir Anda tidak boleh melakukannya. Maaf.
david
oeis.org/A064413/graph - OEIS dapat menulis grafik? Rapi.
Magic Octopus Urn

Jawaban:

7

Jelly , 20 19 18 byte

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

Ini adalah program lengkap.

Cobalah online!

Bagaimana itu bekerja

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.

Perhatikan bahwa urutan yang dihasilkan adalah [1,0,2,4,6,3,9,12,8,10,5,15,] . Karena memanggil tautan helper n kali menghasilkan urutan panjang n+1 , 0 praktis diabaikan.

Dennis
sumber
6

Perl 6 , 66 63 59 58 byte

-4 byte terima kasih kepada Jo King

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

Cobalah online!

Terlalu lambat pada TIO untuk n = 1000.

nwellnhof
sumber
@ JoKing Setelah saya menyadari bahwa first &f,1..*dapat ditulis ulang sebagai +(1...&f), trik persimpangan Anda membantu setelah semua.
nwellnhof
4

JavaScript (ES6), 107 106 105 byte

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])

Cobalah online!

Bagaimana?

Fungsi pembantu Cmengembalikan true jika dua bilangan bulat yang diberikan tidak coprime:

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

Array Sebuah diinisialisasi ke [2,1]dan memegang semua nilai yang ditemui sejauh ini dalam urutan terbalik. Karena itu, nilai terakhir selaluSebuah[0].

Untuk mengetahui apakah k qualifies as the next term of the sequence, we test whether the following expression is equal to 0:

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

a.indexOf(k) is equal to either:

  • 1 if k is not found in a
  • 0 if k is equal to the last value (in which case it's necessarily not coprime with it)
  • some i1 otherwise

Therefore, a.indexOf(k) + C(k, a[0]) is equal to 0 if and only if k is not found in a and k is not coprime with the last value (1+true=0).

Arnauld
sumber
4

Haskell, 89 82 bytes

Edit: -7 bytes thanks to @H.PWiz

f l=[n|n<-[3..],all(/=n)l,gcd(l!!0)n>1]!!0:l
g n=sum[1|x<-iterate f[2]!!(n-2),x>n]

Try it online!

nimi
sumber
82 bytes
H.PWiz
@H.PWiz: ah, that's clever. Thanks!
nimi
4

Husk, 16 bytes

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

Try it online!

Explanation

#>¹↑¡§ḟȯ←⌋→`-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
Zgarb
sumber
3

MATL, 29 bytes

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

Try it online!

Explanation:

	#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
Giuseppe
sumber
please can you explain why do you double the input (with GE:)?
david
2
@david I think empirically I noticed that a(n)2n but I don't have a proof, so I originally used a(n)n2, which timed out on the n=1000 test case, so I switched it back to test that, and left it in. I'm still not sure about either bound, but it seems to work, so I may try to come up with a proof. A while loop would be much messier in MATL so I was trying to avoid it.
Giuseppe
3

APL (Dyalog Unicode), 39 bytesSBCS

-2 bytes thanks to ngn, -1 byte by using proper conditional checking.

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

Try it online!

voidhawk
sumber
passes its own left argument to the operand function, so there's no need for . also, won't bind with the thing on the right as it starts with a function (), so there's no need for .
ngn
2

JavaScript, 93 91 87 bytes

Throws an overflow error for 0 or 1, outputs 0 for 2.

n=>(g=x=>n-i?g[++x]|(h=(y,z)=>z?h(z,y%z):y)(x,c)<2?g(x):(g[c=x]=++i,x>n)+g(2):0)(i=c=2)

Try it online

Shaggy
sumber
2

APL(NARS), chars 121, bytes 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
∇

test in less one minute here in running time:

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

Natural there is no check for type and for range...

RosLuP
sumber
1

Japt, 23 21 bytes

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

Try it

@_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
Shaggy
sumber
1

Python 3, 153 bytes

import math
def f(n):
 l=[1];c=0
 for _ in range(n-1):l+=[min(*range(2,n*4),key=lambda x:n*8if x in l or math.gcd(x,l[-1])<2else x)];c+=l[-1]>n
 return c

Try it online! (Warning: Takes ~30 seconds to evaluate)

Black Owl Kai
sumber