Doppi numeri primi di golf e la sequenza di Collatz


12

Questo è un nuovo tipo di sfida ispirata al problema del recupero del codice sorgente mutato .

Dovresti scrivere due programmi o funzioni entrambi nella stessa lingua. Il primo dovrebbe risolvere l'attività n. 1 e il secondo dovrebbe risolvere l'attività n. 2.

Il tuo punteggio sarà la somma del programma più lungo e la distanza di Levenshtein tra il codice sorgente dei due programmi. Il punteggio più basso è migliore, quindi dovresti provare a rendere simili le due soluzioni mantenendo brevi i programmi.

Compito n. 1

Ti viene dato un numero intero positivo Ne dovresti generare la sequenza Collatz di Nseparati da spazi o newline. Il separatore finale è consentito.

Il primo elemento della sequenza Collatz è N. Il resto degli elementi viene generato in base al loro successore ai1 :

ai={ai12 if ai1 is even3ai1+1 if ai1 is odd

Non appena la sequenza raggiunge 1non vengono generati nuovi elementi.

Input => Esempi di output:

6 => 6 3 10 5 16 8 4 2 1
8 => 8 4 2 1
1 => 1

Compito n. 2

Una coppia di numeri primi gemelli è una coppia di numeri interi positivi la cui differenza è 2 e sono entrambi numeri primi.

Ti viene dato un numero intero positivo Ne dovresti generare la coppia più piccola di numeri primi gemelli dove entrambi i numeri primi sono più grandi di NIl primo numero dovrebbe essere quello più piccolo e i due numeri primi dovrebbero essere separati da spazi o newline. Il separatore finale è consentito.

Input => Esempi di output:

6 => 11 13
42 => 59 61
1 => 3 5

Snippet per il calcolo del punteggio

(Modifica di quello nel problema Recupera il codice sorgente mutato .)

modificare

Nell'intestazione delle risposte usiamo il formato

[Language], [longer length] + [distance] = [final score].

Per esempio

Python 2, 60 + 32 = 92

Risposte:


3

Pyth, 18 + 13 = 31

Sequenza Collatz:

QWtQ=Q@,/Q2h*Q3QQ

Twin Primes:

=Qf!ttP*T+T2hQQ+Q2

Provalo qui.

Alcune idee grazie a FryAmTheEggman.


4

CJam, 24 + 17 = 41 42

Programma Collatz :

ri2*{:N2%N3*)N2/?__p(}g;

Programma Twin Primes :

ri_2+]{:)_{mp}/&_+((}gS*

Entrambi accettano input da STDIN e stampano lo spazio / i numeri separati da nuova riga su STDOUT

Provali online qui


3

CJam, 25 + 16 = 41

Programma Collatz:

l~2*{_2%{3*)}{2/}?_p_(}g;

Programma Twin Primes:

l~_2+]{:)_{mp}/&!_&}gS*

Provalo qui.

Ho appena giocato a golf entrambi per ora. Vedrò se riesco a ridurre il punteggio in qualche modo.


2

Pyth, 20 + 14 = 40 34

Collatz:

QWtQ=Q@,/Q2h*3QQQ

Prime coppie:

~Q1WttP*Q+Q2~Q1;Q+Q2

Entrambi sono programmi che prendono input da STDIN e producono i numeri su newline. Per il momento ho appena giocato a entrambe le risposte, usando la stessa primitiva loop. Questo potrebbe probabilmente essere migliorato un po '.

Modifica: aggiunta una migliore condizione di controllo rubata da @isaacg. Sembra che l'utilizzo del filtro sia ancora più breve rispetto all'utilizzo di un ciclo while per le coppie primi.

Provalo online qui.


Questo produce 3 5l' uscita 3 sulle coppie prime. Dovrebbe essere prodotto 5 7.
isaacg,

@isaacg Risolto il problema, costato 3 :(
FryAmTheEggman

2

05AB1E , 14 + 13 10 9 = 27 24 23

-4 punteggio grazie solo a ASCII

Sequenza di Collatz (14 byte):

[DÉi3*>ë2÷}Ð,#

Provalo online!

Twin primi (14 byte):

[DÅND>>Dp#}s,,

Provalo online!


Prime gemellate golfate (11 byte):

[ÅNDÌp#]DÌ»

Provalo online!


Il collegamento Collatz non è corretto
solo ASCII il

Grazie, risolto!
Wisław,

numeri primi , punteggio -3. probabilmente vale la pena mantenere la versione golfata nella risposta come nota a margine nel caso in cui ci sia un golf diverso e migliore (cosa fa esattamente la coppia, a proposito? come perché devo fare ,,, e perché funziona solo Ð,lì)
ASCII-only

-1 in più (modifica: non importa, il primo numero dovrebbe essere più piccolo. Punteggio 24 per ora
ASCII-only


1

Java 8, 118 + 84 = 202

Collatz:

n->{for(System.out.println(n);n>1;System.out.println(n=n%2<1?n/2:3*n+1));}

Gemelli:

n->{t:for(int p,z;;n++){for(z=n;z<n+3;z=z+2)for(p=2;p<z;p++)if(z%p<1)continue t;System.out.print(n+" "+(n+2));break;}}

menzioni Java 8 ..
Ottimizzatore

1

Mathematica, 53 + 29 = 82

Sequenza Collatz:

Print/@(NestWhileList[If[OddQ@#,3#+1,#/2]&,#,#>1&]);&

Programma Twin Primes:

Print/@(NestWhile[NextPrime,#,!PrimeQ[#+2]&]+{0,2});&

1

> <> , 116 + 86 = 202

Programma Collatz (46):

0i:0(?v$a*$'0'-+!
?v6,>:>~:nao:1=?;3*:2%
 >1+^

Programma Twin Primes (116):

0i:0(?v$a*$'0'-+!
v&2+1~<:-2
<v!?%&+1:&:v?=&:&:
 >&~0$2&2+v>&~143.
:&:1+&%?!v>:&:&=?v
0v?*r$0~&< .561~&<.1
:<;noan-2

Ahia. Entrambi i programmi iniziano con la stessa atoifunzione, ma in seguito i primi gemelli vanno in discesa. Lo stesso pezzo di codice viene ripetuto due volte per il controllo della primalità - potrebbe essere leggermente più breve per riutilizzare in qualche modo il pezzo, ma l'installazione per esso non salverebbe molti byte.

Potrebbe fare molto meglio gettando la metà posteriore dei numeri primi gemelli nei punti inutilizzati del programma Collatz, ma non sono sicuro che sia permesso.


3
"Golf, Golf it NAO!" - Noanold Golfzenegger. Detto questo, la domanda non sembra dire che aggiungere immondizia per ridurre la distanza di Levenshtein sia un tabù, quindi impazzirei;)
FryAmTheEggman

0

Distanza C ++ = 114 Lunghezza più lunga = 155 Punteggio = 269

Compito 1

void c(int N){while(N>1){cout<<N<<' ';N=(N%2==0)?N/2:N*3+1;}cout<<N;}

Compito 2

int p(int x){int z=0;for(int i=2;i<x;i++){if(x%i==0){z=1;break;}}return z;}
void c(int N){N=(N%2==0)?N+1:N+2;int M=N+2;while(p(N)+p(M)>0){N=M;M+=2;}cout<<N<<' '<<M;}

Compito 2 migliorato

int p(int N){int z=0;for(int i=2;i<N;i++){if(N%i==0){z=1;break;}}return z;}
void c(int N){N=(N%2==0)?N+1:N+2;while(p(N)+p(N+2)>0){N+=2;}cout<<N<<' '<<N+2;}

Penso che non hai nemmeno provato a ridurre il punteggio. Ad esempio, hai nomi di funzione diversi, nome di argomento diverso, tipo di ritorno diverso e cosa non aumenta la distanza.
Ottimizzatore

@Optimizer Non conosco un altro modo per testare i numeri primi? Altre lingue lo hanno incorporato.
bacchusbeale,

1
Non stavo nemmeno parlando di cambiare l'algo. Ad esempio, questo codice ha solo 102 distanze:int p(int x){int z=0;for(int i=2;1<x;i++){cout<<x<<' ';x=(x%2==0)?x/2:x*3+1;}cout<<x;return z;}
Ottimizzatore
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.