Faktörü paylaşan kullanılmayan en küçük sayı


11

Bu değirmen sorununun güzel bir sorusu. Ben bir sıra tanımlamak ve bir dizin verilen bir girdi çıktı için bazı kod golf.

  • Dizideki ilk öğe 2'dir.

  • Sekanstaki n nci madde, listede görünmeyen n (1'den farklı) ile en az bir faktörü paylaşan n ve 1 dışındaki en küçük pozitif tamsayıdır.

Test senaryoları

İşte dizideki ilk 25 öğe:

1  2
2  4
3  6
4  8
5  10
6  3
7  14
8  12
9  15
10 5
11 22
12 9
13 26
14 7
15 18
16 20
17 34
18 16
19 38
20 24
21 27
22 11
23 46
24 21
25 30

İlgili (bir tarafından ofset)

Yanıtlar:



3

Python 3 , 118 117 bayt

Cameron Aavik sayesinde -1 bayt !

import math
def f(n,i=3):
 if n<2:return 2
 while 1:
  if math.gcd(n,i)>1>(i in map(f,range(n)))<i!=n:return i
  i+=1

Çevrimiçi deneyin!

Kod oldukça verimsiz (önceki sonuçlarda olmayan bir değeri zorlar ve her yeni değerde önceki sonuçları tekrar hesaplar), bu yüzden düzgün çalışır, ancak çok sayıda çalıştırılmasını önermem.


2
Küçük ipucu: Bir satır def f(n,i=3):i=3
yazarak


2

Haskell , 60 59 bayt

DÜZENLE:

  • -1 byte: @xnor belirtildiğinden all(/=x)daha kısa x`notElem`.

f bir tamsayı alır ve bir tamsayı döndürür.

f n=[x|x<-[2..],gcd x n>1||n<2,all(/=x)$n:map f[1..n-1]]!!0

Çevrimiçi deneyin!

Bu çok üstel bir zamandır, bu yüzden TIO 21'den sonra zaman aşımına uğradı, yorumlanan GHCi'm şimdi durmadan önce 22'ye çıktı. Aşağıdaki 9 baytlık daha uzun bir sürüm, bir listeye kolayca ezberlenerek binlercesine girer:

f n=[x|x<-[2..],gcd x n>1||n<2,all(/=x)$n:take(n-1)l]!!0
l=f<$>[1..]

Çevrimiçi deneyin!

  • f nadayları oluşturmak için bir liste kavrayışı kullanır x, ilk geçişi alır !!0.
  • gcd x n>1bunu kontrol eder xve nortak faktörleri vardır.
  • ||n<2n==1faktör gerekliliğinden muaftır .
  • all(/=x)$n:map f[1..n-1]bir önceki veya sonraki dizi öğesi xolup olmadığını denetler n.

@WheatWizard Hm, muhtemelen bu durumda bir fark yok. Sadece varsayılan olarak bunu yapmak için kullanılır. Bu şekilde iyi sığacak şekilde tanımlanmış bir sabitliğe sahip birkaç alfanümerik fonksiyondan biridir.
Ørjan Johansen

1
all(/=x)$orada 1 kısadır
xnor

2

C # içinde GCD için yerleşik yok, bu yüzden ...

C # (.NET Çekirdek) , 197 196 194 bayt

n=>{if(n<2)return 2;var p=new int[n-1];int i=0,a,b;for(;i<n-1;)p[i]=f(++i);for(i=2;;i++)if(n!=i){for(a=n,b=i;a*b>0;)if(a>b)a%=b;else b%=a;if(b!=1&a!=1&!System.Array.Exists(p,e=>e==i))return i;}}

Çevrimiçi deneyin!

Bir kez daha, sırayla sayıları hesaplamak için bu kodu kullanmaktan kaçının n>30...

  • whileBir fordöngü için GCD döngüsünü değiştirerek -1 bayt .
  • Kevin Cruijssen'e -2 bayt teşekkürler! Güzel bir!

1
a>0&b>0için golf olabilira*b>0
Kevin Cruijssen

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.