Gra w golfa w pary Podwójne liczby pierwsze i sekwencja Collatz

12

Jest to nowy rodzaj wyzwania inspirowanego problemem Odzyskaj zmutowany kod źródłowy .

Powinieneś napisać dwa programy lub funkcje w tym samym języku. Pierwszy powinien rozwiązać zadanie nr 1, a drugi rozwiązać zadanie nr 2.

Twój wynik będzie sumą dłuższego programu i odległości Levenshteina między kodem źródłowym dwóch programów. Niższy wynik jest lepszy, więc powinieneś spróbować uczynić oba rozwiązania podobnymi, jednocześnie utrzymując krótkie długości programów.

Zadanie 1

Dostaniesz dodatnia Ni zalecana wyprowadzania sekwencji Collatz z Noddzielonych spacjami lub linią. Separator końcowy jest dozwolony.

Pierwszym elementem sekwencji Collatz jest N. Reszta elementów jest generowana na podstawie ich następcy :ai1

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

Jak tylko sekwencja osiągnie, 1żadne nowe elementy nie zostaną wygenerowane.

Dane wejściowe => Przykłady wyników:

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

Zadanie nr 2

Para podwójnych liczb pierwszych jest parą liczb całkowitych dodatnich, których różnica wynosi 2 i oba są liczbami pierwszymi.

Otrzymujesz dodatnią liczbę całkowitą Ni powinieneś wypisać najmniejszą parę liczb pierwszych bliźniaczych, gdzie obie liczby pierwsze są większe niż NPierwsza liczba powinna być mniejsza, a dwie liczby pierwsze powinny być oddzielone spacjami lub znakiem nowej linii. Separator końcowy jest dozwolony.

Dane wejściowe => Przykłady wyników:

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

Snippet do obliczania wyniku

(Modyfikacja tego w problemie Odzyskaj zmutowany kod źródłowy .)

Edytować

W nagłówku odpowiedzi użyjmy formatu

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

Na przykład

Python 2, 60 + 32 = 92

randomra
źródło

Odpowiedzi:

3

Pyth, 18 + 13 = 31

Sekwencja Collatz:

QWtQ=Q@,/Q2h*Q3QQ

Twin Primes:

=Qf!ttP*T+T2hQQ+Q2

Wypróbuj tutaj.

Kilka pomysłów dzięki FryAmTheEggman.

isaacg
źródło
4

CJam, 24 + 17 = 41 42

Program Collatz :

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

Program podwójnych liczb pierwszych :

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

Oba pobierają dane wejściowe ze STDIN i drukują liczby oddzielone spacją / znakiem nowej linii do STDOUT

Wypróbuj je online tutaj

Optymalizator
źródło
3

CJam, 25 + 16 = 41

Program Collatz:

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

Program podwójnych liczb pierwszych:

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

Sprawdź to tutaj.

Na razie grałem w oboje w golfa. Zobaczę, czy mogę jakoś zmniejszyć wynik.

Martin Ender
źródło
2

Pyth, 20 + 14 = 40 34

Collatz:

QWtQ=Q@,/Q2h*3QQQ

Prime Pary:

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

Oba są programami, które pobierają dane wejściowe ze STDIN i wyświetlają liczby w znakach nowej linii. Właśnie grałem w obie odpowiedzi, używając na razie tego samego prymitywnego zapętlenia. Prawdopodobnie można to nieco poprawić.

Edycja: Dodano lepszą kontrolę stanu skradzioną z @isaacg. Wydaje się, że użycie filtru jest wciąż krótsze niż użycie pętli while dla par pierwszych.

Wypróbuj online tutaj.

FryAmTheEggman
źródło
Daje to wyjście 3 5dla wejścia 3 dla par pierwszych. Powinien wyjść 5 7.
isaacg
@isaacg Naprawiono, kosztowało 3 :(
FryAmTheEggman
2

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

Wynik -4 dzięki tylko ASCII

Sekwencja Collatz (14 bajtów):

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

Wypróbuj online!

Podwójne liczby pierwsze (14 bajtów):

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

Wypróbuj online!


Liczby pierwsze w golfa (11 bajtów):

[ÅNDÌp#]DÌ»

Wypróbuj online!

Wisław
źródło
Łącze Collatz jest niepoprawne
tylko
Dzięki, naprawiłem to!
Wisław
liczby pierwsze , wynik -3. prawdopodobnie warto zachować wersję z golfem w odpowiedzi na marginesie w przypadku, gdy istnieje inny, lepszy golf (co dokładnie robi para, a tak przy okazji, dlaczego muszę to robić ,,i dlaczego tylko Ð,tam działa)
tylko
-1 więcej (edytuj: nieważne, pierwsza liczba powinna być mniejsza. Na razie zdobądź 24 punkty
tylko ASCII
22?
Tylko ASCII
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));}

Bliźniacze liczby pierwsze:

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;}}
Ypnypn
źródło
wspomnieć o Javie 8 ..
Optymalizator
1

Mathematica, 53 + 29 = 82

Sekwencja Collatz:

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

Program podwójnych liczb pierwszych:

Print/@(NestWhile[NextPrime,#,!PrimeQ[#+2]&]+{0,2});&
alephalpha
źródło
1

> <> , 116 + 86 = 202

Program Collatz (46):

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

Program podwójnych liczb pierwszych (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

Auć. Oba programy zaczynają się od tej samej atoifunkcji, ale potem liczba pierwszych liczb podwójnych spada. Ten sam fragment kodu jest powtarzany dwukrotnie w celu sprawdzenia pierwotności - może być nieco krótszy, aby jakoś ponownie użyć fragmentu, ale konfiguracja nie zaoszczędziłaby wielu bajtów.

Mógłbym zrobić znacznie lepiej, wrzucając tylną połowę liczb pierwszych do niewykorzystanych miejsc programu Collatz, ale nie jestem pewien, czy jest to dozwolone.

Sp3000
źródło
3
„Golf to, golf to NAO!” - Noanold Golfzenegger. To powiedziawszy, pytanie nie wydaje się mówić, że dodawanie śmieci w celu zmniejszenia odległości Levenshtein to tabu, więc zwariowałbym;)
FryAmTheEggman
0

C ++ Odległość = 114 Dłuższa długość = 155 Punktacja = 269

Zadanie 1

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

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

Zadanie 2 poprawione

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;}
Bacchusbeale
źródło
Myślę, że nawet nie próbowałeś zmniejszyć wyniku. Na przykład, masz różne nazwy funkcji, różne nazwy argumentów, inny typ zwracanych danych i to, co nie zwiększa odległości.
Optymalizator
@Optimizer Nie znam innego sposobu testowania liczb pierwszych? Inne języki mają to wbudowane.
bacchusbeale
1
Nawet nie mówiłem o zmianie algo. Na przykład ten kod ma tylko 102 odległości: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;}
Optymalizator