EKG sekansının şartları


13

Giriş

EKG sekansı 1 ve 2 ile başlar, daha sonra kural, bir sonraki terimin, dizide henüz bulunmayan en küçük pozitif tamsayı olması ve son terim ile ortak faktörü 1'den büyük olmasıdır (bunlar kopya değildir).

İlk terimler:

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

Buna EKG denir, çünkü terimlerinin grafiği bir EKG'ye oldukça benzer.

Bu var OEIS içinde dizisi A064413 .

Meydan okuma

Eğer bir tamsayıdır alan bir fonksiyon yazmak zorunda n birçok kadar giriş ve çıkış olarak N dizinin ilk açısından daha büyüktür , n .

Sekansın kuralı üçüncü terim ile başladığında, girdi tamsayısının 3'e eşit veya daha büyük olması gerekir. Örneğin, girdi verildiğinde 10, çıkış 17. terimin olması 12ve diğer ilk on terimin hiçbirinin 10'u aşmamasıdır.

Test senaryoları

3 -> 1

10 -> 1

100 -> 9

1000 -> 70

kurallar

  • 3'ten küçük tamsayılar için, işlev 0 veya bir hata kodu verebilir.
  • Dışında başka özel kural yok: kod golf, daha kısa daha iyi!

1Sekansın 0. terimi olmak üzere 0 endeksleme kullanabilir ve bunun için örneğin 1510 terim yerine onu kullanabilir 5miyiz?
Shaggy

@Shaggy Ben bunu matematiksel bir yol olarak kullanmak adil olduğunu düşünüyorum, ama aslında test vakalarının sonucunu ve gerçekten de kendi içinde sorulan işlevi değiştirecektir. Bu yüzden bence buna izin verilmemeli. Üzgünüm.
david

oeis.org/A064413/graph - OEIS grafik yazabilir mi? Temiz.
Sihirli Ahtapot Urn

Yanıtlar:


7

Jöle , 20 19 18 bayt

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

Bu tam bir program.

Çevrimiçi deneyin!

Nasıl çalışır

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,]nn+10


6

Perl 6 , 66 63 59 58 bayt

Jo King sayesinde -4 bayt

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

Çevrimiçi deneyin!

N = 1000 için TIO'da çok yavaş.


@JoKing Bunun first &f,1..*yeniden yazılabileceğini fark ettikten sonra +(1...&f), kavşak hileniz sonuçta yardımcı oldu.
nwellnhof

4

JavaScript (ES6), 107 106 105 bayt

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

Çevrimiçi deneyin!

Nasıl?

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) şunlardan birine eşittir:

  • 1ka
  • 0k
  • i1

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



4

Kabuk , 16 bayt

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

Çevrimiçi deneyin!

açıklama

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

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

Çevrimiçi deneyin!

Açıklama:

	#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

lütfen girdiyi neden iki katına çıkardığınızı açıklar GE:mısınız?
david

2
a(n)2na(n)n2n=1000while

3

APL (Dyalog Unicode) , 39 bayt SBCS

Ngn sayesinde -2 bayt, uygun koşullu denetim kullanarak -1 bayt.

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

Çevrimiçi deneyin!


kendi sol argümanını işlenen fonksiyonuna geçirir, bu yüzden gerek yoktur . Ayrıca, bir işlev ( ) ile başladığı gibi sağdaki şeyle bağlanmaz , bu yüzden gerek yoktur .
ngn

2

JavaScript, 93 91 87 bayt

Taşma hata atar 0ya da 1, çıktılar 0için 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)

Çevrimiçi deneyin


2

APL (NARS), karakter 121, bayt 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
∇

çalışma süresinde burada bir dakikadan daha kısa sürede test edin:

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

Doğal tip ve menzil için kontrol yoktur ...


1

Japt, 23 21 bayt

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

Dene

@_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

1

Python 3 , 153 bayt

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

Çevrimiçi deneyin! (Uyarı: Değerlendirilmesi ~ 30 saniye sürer)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.