Aumento delle partizioni Goldbach


9

La congettura di Goldbach afferma che:

ogni numero pari che è maggiore di 2 è la somma di due numeri primi.

Considereremo una partizione di Goldbach di un numero n come una coppia di due numeri primi che si aggiungono a n . Siamo preoccupati che i numeri aumentino la partizione di Goldbach . Misuriamo la dimensione delle partizioni Goldbach di un numero in base alla dimensione del primo più piccolo in tutte le partizioni di quel numero. Un numero aumenta la partizione se questa dimensione è maggiore della dimensione di tutti i numeri pari più piccoli.

Compito

Dato un intero pari n> 2 , determinare se n sta aumentando la partizione di Goldbach e produrre due valori univoci, uno se lo è e uno se non lo è.

Questo è , quindi dovresti mirare a minimizzare il numero di byte nel tuo codice sorgente.

OEIS A025018



È una buona domanda, difficile da capire. L'ho modificato per semplificare la formulazione. Si prega di controllare, e se tutto è corretto applicare le modifiche.
Евгений Новиков,

1
@ ЕвгенийНовиков Ho trovato la tua modifica più confusa rispetto all'originale. L'ho rifiutato. Forse possiamo discutere un modo per renderlo più chiaro qui .
Ad Hoc Garf Hunter

Gli esempi elaborati sono ancora molto confusi: sembrano estrarre i numeri dal nulla e ciascuno dei confronti è espresso in modo diverso senza spiegare perché vengono utilizzati determinati numeri. Se conosci già la risposta, puoi capirla. . . cosa che ho fatto tornando al primo paragrafo, ignorando gli esempi fino a quando non è stato chiaro, quindi ho capito come sono stati costruiti gli esempi. Forse una qualche struttura tabulare sarebbe di aiuto, anche se 10 potrebbero essere di aiuto
Neil Slater,

@NeilSlater Grazie per il feedback. Ho rimosso del tutto gli esempi perché penso che stessero facendo più male che bene. Penso che la sfida sia chiara dalla spiegazione, e gli esempi complicano solo le cose. Se la spiegazione non fosse sufficiente, sarei più che felice di ampliare o chiarire ciò, tuttavia non credo che aggiungeremo gli esempi perché sembrano essere la fonte di maggiore confusione finora.
Ad Hoc Garf Hunter

Risposte:


5

Gelatina , 12 byte

ÆRðfạṂ
Ç€M⁼W

Provalo online!

Come funziona

Ç€M⁼W   Main link. Argument: n

Ç€      Map the helper link over [1, ..., n].
  M     Get all indices of the maximum.
    W   Wrap; yield [n].
   ⁼    Test the results to both sides for equality.


ÆRðfạṂ  Helper link. Argument: k

ÆR      Prime range; get all primes in R := [1, ..., k].
  ð     Begin a dyadic chain with arguments R and k.
    ạ   Absolute difference; yield k-p for each p in R.
   f    Filter; keep the q in R such that q = k-p for some p in R.
     Ṃ  Take the minimum.
        This yields 0 if the array is empty.

4

PHP , 154 byte

for(;$n++<$a=$argn;$i-1?:$p[]=$n)for($i=$n;--$i&&$n%$i;);foreach($p as$x)foreach($p as$y)if(!$r[$z=$x+$y]){$r[$z]=$x;$l[]=$z<$a?$x:0;};echo$r[$a]>max($l);

Provalo online!

allargato

for(;$n++<$a=$argn;$i-1?:$p[]=$n) # loop through all integers till input if is prime add to array 
  for($i=$n;--$i&&$n%$i;);
foreach($p as$x) #loop through prime array
  foreach($p as$y) #loop through prime array 
    if(!$r[$z=$x+$y]){
      $r[$z]=$x; # add only one time lower value for a sum of $x+$y 
      $l[]=$z<$a?$x:0;}; # add lower value if sum is lower then input
echo$r[$a]>max($l); # Output 1 if lower value for sum of input is greater then all lower values of all numbers under input

Provalo online! Controlla tutti i numeri fino a 1000


3

JavaScript (ES6), 135 byte

Utilizza una logica simile alla risposta PHP di Jörg .

(n,P=[...Array(n).keys()].filter(n=>(p=n=>n%--x?p(n):x==1)(x=n)))=>P.map(p=>P.map(q=>a[q+=p]=a[q]||(m=q<n&&p>m?p:m,p)),a=[m=0])&&a[n]>m

dimostrazione


2

Python 3: 156 151 142 138 136 128 byte

r=range
m=lambda n:min(x for x in r(2,n+1)if all(o%i for o in[x,n-x]for i in r(2,o)))
f=lambda n:m(n)>max(map(m,r(2,n,2)))or n<5

(grazie a OP)

(grazie a @Rod) (ancora) (e ancora)


@Olmman ti piace?
enedil,

@Rod poiché maxcon la chiave restituisce l'elemento con il valore massimo dopo aver applicato la chiave, ho dovuto aggiungere l'applicazione della funzione ma è comunque più breve.
enedil,

@Rod e non posso prendere i tuoi suggerimenti, rangedato che nè limitato all'interno lambda.
enedil,

@enedil In effetti, ma per il massimo, puoi usaremax(map(m,r[::2]))
Rod

1
Non è necessario nominare fe quindi è possibile salvare 2 byte rimuovendo il f=.
Ad Hoc Garf Hunter,

1

Python 3: 204 196 byte

Byte salvati grazie a: Olm Man

from itertools import*
m=lambda g:min([x for x in product([n for n in range(2,g)if all(n%i for i in range(2,n))],repeat=2)if sum(x)==g][0])
i=lambda g:1if all(m(g)>m(x)for x in range(4,g,2))else 0

Provalo online!


2
Alcuni suggerimenti, la maggior parte delle funzioni integrate come mine allpossono prendere i generatori come argomenti, questo significa che min([...])può essere abbreviato min(...)e lo stesso con tutti. Puoi anche sbarazzarti di alcuni spazi, in particolare lo spazio in import *e qualsiasi spazio dopo le parentesi graffe, vedo che ne hai uno dopo range(g)e uno prima [i for i in ..., nessuno dei due è necessario.
Ad Hoc Garf Hunter,

^ È fantastico, non lo sapevo
bendl

Inoltre puoi rendere il tuo primo controllo un po 'più breve cambiandolo in all(n%i for i in range(2,g)), ma devi passare range(g)a range(1,g)perché questo dà un falso positivo su 1.
Ad Hoc Garf Hunter
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.