Numero minimo inutilizzato che condivide un fattore


11

Questa è una bella serie di domande sul mulino. Definirò una sequenza e tu golf un po 'di codice per produrre una voce dato un indice.

  • Il primo elemento nella sequenza è 2.

  • L'ennesimo elemento nella sequenza è il numero intero positivo più piccolo diverso da n e 1 che condivide almeno un fattore con n (diverso da 1) che non è già apparso nell'elenco.

Casi test

Ecco i primi 25 elementi nella sequenza:

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

OEIS correlato (offset di uno)

Risposte:



3

Python 3 , 118 117 byte

-1 byte grazie a 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

Provalo online!

Il codice è piuttosto inefficiente (forza bruta un valore che non esiste nei risultati precedenti e calcola nuovamente i risultati precedenti su ogni nuovo valore), quindi funziona correttamente ma non consiglierei di eseguirlo su grandi numeri.


2
Piccolo consiglio: puoi salvare una nuova riga facendola def f(n,i=3):e rimuovendo la i=3linea
Cameron Aavik,


2

Haskell , 60 59 byte

MODIFICARE:

  • -1 byte: @xnor ha sottolineato che all(/=x)era più breve di x`notElem`.

f accetta un numero intero e restituisce un numero intero.

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

Provalo online!

Questo è un momento molto esponenziale, quindi TIO scade dopo le 21, mentre il mio GHCi interpretato è salito a 22 prima di fermarlo proprio ora. La seguente versione di 9 byte più lunga che memorizza in un elenco sale facilmente a migliaia:

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

Provalo online!

  • f nusa una comprensione di lista per generare candidati x, prendendo il primo passaggio con !!0.
  • gcd x n>1controlla quello xe nhanno fattori comuni.
  • ||n<2esente n==1dal requisito del fattore.
  • all(/=x)$n:map f[1..n-1]controlla che xnon sia nné un elemento di sequenza precedente né precedente.

@WheatWizard Hm, probabilmente nessuna differenza in questo caso. Abituato a farlo di default. È una delle poche funzioni alfanumeriche che ha una fissità definita per adattarsi bene in quel modo.
Ørjan Johansen,

1
all(/=x)$è 1 più corto lì
xnor

2

Nessun built-in per GCD in C #, quindi ...

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

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

Provalo online!

Ancora una volta, astenersi dall'utilizzare questo codice per calcolare i numeri nella sequenza per n>30...

  • -1 byte modificando il whileloop GCD per un forloop.
  • -2 byte grazie a Kevin Cruijssen! Ben fatto!

1
a>0&b>0può essere giocato a golfa*b>0
Kevin Cruijssen il

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.