Kleinste nicht verwendete Nummer, die einen Faktor teilt


11

Dies ist eine ziemlich einfache Frage. Ich werde eine Sequenz definieren und Sie spielen einen Code, um einen Eintrag mit einem Index auszugeben.

  • Der erste Punkt in der Sequenz ist 2.

  • Das n-te Element in der Sequenz ist die kleinste positive ganze Zahl außer n und 1, die mindestens einen Faktor mit n (außer 1) teilt, der noch nicht in der Liste enthalten ist.

Testfälle

Hier sind die ersten 25 Elemente in der Sequenz:

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

Verwandte (um eins versetzt) ​​OEIS

Antworten:



3

Python 3 , 118 117 Bytes

-1 Byte dank Cameron Aavik !

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

Probieren Sie es online aus!

Der Code ist ziemlich ineffizient (er erzwingt einen Wert, der in den vorherigen Ergebnissen nicht vorhanden ist, und berechnet die vorherigen Ergebnisse für jeden neuen Wert erneut), sodass er ordnungsgemäß funktioniert, ich würde jedoch nicht empfehlen, ihn mit großen Zahlen auszuführen.


2
Kleiner Tipp: Sie können eine neue Zeile speichern, indem Sie def f(n,i=3):sie erstellen und entferneni=3
Cameron Aavik


2

Haskell , 60 59 Bytes

BEARBEITEN:

  • -1 Byte: @xnor wies darauf hin, all(/=x)war kürzer als x`notElem`.

f Nimmt eine Ganzzahl und gibt eine Ganzzahl zurück.

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

Probieren Sie es online aus!

Dies ist eine sehr exponentielle Zeit, daher tritt bei TIO nach 21 eine Zeitüberschreitung auf, während mein interpretiertes GHCi auf 22 stieg, bevor ich es gerade stoppte. Die folgenden 9 Bytes längerer Versionen, die in einer Liste gespeichert werden, gehen leicht in die Tausende:

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

Probieren Sie es online aus!

  • f nverwendet ein Listenverständnis, um Kandidaten zu generieren x, wobei der erste bestanden wird !!0.
  • gcd x n>1prüft das xund nhat gemeinsame Faktoren.
  • ||n<2Ausnahmen n==1von der Faktoranforderung.
  • all(/=x)$n:map f[1..n-1]prüft, ob xes sich weder um nein vorhergehendes Sequenzelement handelt.

@ WheatWizard Hm, wahrscheinlich kein Unterschied in diesem Fall. Ich bin es nur gewohnt, es standardmäßig zu tun. Es ist eine der wenigen alphanumerischen Funktionen, für die eine Fixität definiert wurde, die auf diese Weise gut passt.
Ørjan Johansen

1
all(/=x)$ist dort 1 kürzer
xnor

2

Keine integrierte GCD in C #, also ...

C # (.NET Core) , 197 196 194 Bytes

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;}}

Probieren Sie es online aus!

Verwenden Sie diesen Code erneut nicht, um Zahlen in der Reihenfolge für n>30...

  • -1 Byte durch Ändern der GCD- whileSchleife für eine forSchleife.
  • -2 Bytes danke an Kevin Cruijssen! Schön!

1
a>0&b>0kann zua*b>0
Kevin Cruijssen

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.