A083569: Najmniejsze m nie występuje wcześniej, tak że m + n jest liczbą pierwszą

26

Zdefiniuj 1-indeksowaną sekwencję w następujący sposób:

  • A083569(1) = 1
  • A083569(n)gdzie njest liczbą całkowitą większą niż 1, jest najmniejszą liczbą całkowitą m, która nie występuje wcześniej, m+na więc liczbą pierwszą.

Twoim zadaniem jest przyjęcie ni powrót A083569(n).

 n  A083569(n)
 1  1
 2  3
 3  2
 4  7
 5  6
 6  5
 7  4
 8  9
 9  8
10 13
11 12
12 11
13 10
14 15
15 14
16 21
17 20
18 19
19 18
20 17

Więcej przypadków testowych można znaleźć tutaj . Oryginalną sekwencję OEIS można znaleźć tutaj .

To jest . Najkrótsza odpowiedź w bajtach wygrywa. Obowiązują standardowe luki .

Leaky Nun
źródło
@ Mr.Xcoder „Zdefiniuj sekwencję 1-indeksowaną w następujący sposób”
Leaky Nun

Odpowiedzi:

14

Haskell , 87 86 83 80 74 69 bajtów

Dzięki xnor za zasugerowanie zmian, które pozwoliły zaoszczędzić 3 bajty!

f n=[m|m<-[1..],all((>0).mod(n+m))[2..n+m-1],all((/=m).f)[1..n-1]]!!0

Wypróbuj online!

Jestem nowy w Haskell i Haskell w golfa, opinie są mile widziane!

Wyjaśnienie

Definiujemy funkcję f n. Definiujemy f njako pierwszy element !!0listy:

[m|m<-[1..],all((>0).mod(n+m))[2..n+m-1],all((/=m).f)[1..n-1]]

Podział, który jest:

[m|          # Numbers m
m<-[1..],    # From the integers greater than 0
all          # Forall x
(>0).mod(n+m)# n+m mod x is not zero
[2..n+m-1]   # from the integers from 2 to n+m-1
all          # Forall
((/=m).f)    # when f is applied the result is not m
[1..n-1]     # from the integers from 1 to n-1
Kreator pszenicy
źródło
3
Witamy w grze w golfa Haskell! [2,3..]Może być po prostu [2..], licząc do dnia 1 jest domyślnym. Jest wbudowany notElem.
xnor
@xnor Thanks! Skończyło się na tym, że znalazłem lepszy sposób na użycie, notElemale pierwsza wskazówka była pomocna i upewnię się, że trzymam drugą w tylnej kieszeni.
Wheat Wizard,
Wygląda na to, że twoja nowa wersja jest f 1błędna, powinna wynosić 1.
xnor
@ xnor Naprawiono, niestety kosztem 3 bajtów.
Wheat Wizard
6

Galaretka , 16 15 bajtów

Rɓ²R+⁸ÆPTḟḢṭµ/Ṫ

Zakłada się, że A083569 (n) ≤ n² (sekwencja wydaje się rosnąć liniowo).

Wypróbuj online!

Jak to działa

Rɓ²R+⁸ÆPTḟḢṭµ/Ṫ  Main link. Argument: n

R                Range; yield [1, ..., n].
 ɓ               Begin a dyadic chain with swapped arguments.
            µ/   Reduce the range by that chain.
                 If we call the chain f, this computes f(2,1), then f(3,f(2,1)),
                 then f(4,f(3,f(2,1)), etc.
                 The left argument is an integer k, the right one an array A.
  ²                Square; yield k².
   R               Range; yield [1, ..., k²].
    +⁸             Add k, yielding [1+k, ..., k²+k].
      ÆP           Test each sum for primality.
        T          Truth; get all indices of 1‘s. This finds all m in [1, ..., k²]
                   such that m+k is prime.
         ḟ         Filterfalse; remove all resulting elements that appear in A.
          Ḣ        Head; extract the first remaining result.
           ṭ       Tack; append the extracted integer to A.
                 This computes the first n elements of the sequence.
              Ṫ  Tail; extract the last, n-th element.
Dennis
źródło
4
Rzeczywiście, A083569(n)jest co najwyżej nth pierwsza większa niż nz definicji, co najwyżej 2nth pierwsza, która (bo n≥3) jest mniejsza niż 4n*log(n)według wyników Rossera-Schoenfelda.
Greg Martin
Chociaż @GregMartin to zweryfikował, nadal jest dość dzikim założeniem, że ...
Esolanging Fruit
4
@ Challenger5 Wolę „wykształcone zgadywanie”.
Dennis
6

Pyth - 18 17 15 bajtów

Dzięki @isaacg za uratowanie mi dwóch bajtów!

Wracając na tę stronę, po pewnym czasie zajętości, mam nadzieję, że jeszcze bardziej zagrasz w golfa.

esmaYf&-TYP_+Th

Wypróbuj online tutaj .

Maltysen
źródło
4
Witamy ponownie w PPCG!
Leaky Nun
@LeakyNun Thanks :)
Maltysen
1
-TYjest o jeden bajt krótszy niż !/YTi jest prawdziwy w tych samych przypadkach.
isaacg,
Możesz zapisać kolejny bajt, zmieniając +hdTna +Th.
isaacg,
@isaacg, oh, czy rzutuje pierwszy element na listę? To jest naprawdę świetne.
Maltysen
3

C # (.NET Core) , 169 bajtów

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

Wypróbuj online!

Zdecydowanie najbardziej nieefektywny sposób, aby obliczyć wyniki, więc proszę powstrzymać się od obliczenia f(n)dla n>=30z tym kodem. Pierwszym krokiem jest rekurencyjne obliczenie wartości od f(1)do, f(n-1)a następnie przejście do obliczenia f(n)przez wyszukanie pierwszego itakiego, który n+ijest liczbą pierwszą i inie znajduje się na poprzedniej liście wartości.

Charlie
źródło
3

Zestaw x86-64, 57 55 bajtów

Jestem nowym golfistą, więc komentarze / opinie są mile widziane.

Uwaga: jest to zoptymalizowane pod kątem długości kodu maszynowego, a nie długości źródłowej.

0: 89 f8 ff cf 74 32 97 89 fe 89 f1 ff c6 89 f0 99
1: f7 f1 85 d2 e0 f7 85 c9 75 ed 89 f9 ff c9 56 29
2: fe 56 57 51 89 fc e8 d3 ff ff ff 59 5f 5e 39 c6
3: e0 ef 96 5e 74 d1 c3

Definiuje funkcję, wykorzystując standardową konwencję (tj. Zwraca wartość w eax, pierwszy argument w edi, wszystkie rejestry są zapisywane jako dzwoniące oprócz ebx), który pobiera 32-bitową liczbę całkowitą bez znaku i zwraca najmniejszą wartość m itd.

Źródło:

    .globl a083569
    // edi = original, probably don't touch
    // esi = candidate prime, if it's not a repeat we return edi-this
a083569:
    mov %edi, %eax
    dec %edi
    jz end
    xchg %eax, %edi
    mov %edi, %esi
primecheck:
    mov %esi, %ecx
    inc %esi
primeloop:
    mov %esi, %eax
    cdq
    div %ecx
    test %edx, %edx
    loopnz primeloop
/* end */
    // if esi isn't prime, then ecx is now one or greater.
    test %ecx, %ecx
    jnz primecheck
    // esi is now our target prime: check if it's not already one
    mov %edi, %ecx
    dec %ecx
    push %rsi   /* we need a flag-safe way to restore this later */
    sub %edi, %esi
chkdup:
    push %rsi
    push %rdi
    push %rcx
    mov %ecx, %edi
    call a083569
    pop %rcx
    pop %rdi
    pop %rsi
    cmp %eax, %esi
    loopne chkdup
/* end loop - chkdup */
    xchg %esi, %eax
    pop %rsi
    je primecheck
/* end outer loop - primecheck */
end:
    ret

Wypróbuj online!

ObsequiousNewt
źródło
1

Clojure, 158 155 bajtów

#(loop[r[0 1]i 1](if(= i %)(last r)(recur(conj r(nth(for[j(range):when(=((set r)j)(seq(for[k(range 2(+ 1 i j)):when(=(mod(+ 1 i j)k)0)]j)))]j)0))(inc i))))

To może nadal mieć trochę tłuszczu, z czego nie jestem całkiem zadowolony, (+ 1 i j)ale był to najłatwiejszy sposób obsługi bazy n = 1i reszty. ((set r)j)zwraca, niljeśli jnie ma go w zestawie, a (seq ())na pustej liście zwraca również zero. Oblicza się n = 1000w ciągu 48 sekund.

Aktualizacja: usunięto nilz =kontroli, ponieważ kod działa poprawnie również bez niego.

NikoNyrh
źródło
1

Rubin , 62 + 8 = 70 bajtów

Używa -rprimeflagi.

f=->n,o=[]{o<<f[n-1,o]if n>1;Prime.find{|i|i>n&&o|[i-n]!=o}-n}

Wypróbuj online!

Wartość tuszu
źródło
1

Python, 194 170 110 bajtów

84 bajty zapisane przez Dziurawą Zakonnicę

2 bajty zapisane przez Mathmandan

def s(n):
 a=[s(j)for j in range(1,n)];i=1
 while(i in a)|any((i+n)%j<1for j in range(2,i+n)):i+=1
 return i

Definiuje funkcję s (n), która przyjmuje liczbę jako dane wejściowe i zwraca A083569 (n).

Wypróbuj online

Madison Silver
źródło
1
Możesz rozważyć dodanie tego linku TIO .
Leaky Nun
1
Możesz użyć p=lambda n:any(n%i<1for i in range(2,n))do sprawdzenia pierwotności.
Leaky Nun
1
110 bajtów
Leaky Nun
1
Możesz użyć bitowego lub, aby zapisać kilka bajtów:while(i in a)|any(...
mathmandan