Pair-golfing Twin primes dan urutan Collatz


12

Ini adalah jenis tantangan baru yang terinspirasi oleh Memulihkan masalah kode sumber yang termutasi .

Anda harus menulis dua program atau fungsi, keduanya dalam bahasa yang sama. Yang pertama harus menyelesaikan Tugas # 1 dan yang kedua harus menyelesaikan Tugas # 2.

Skor Anda akan menjadi jumlah dari program yang lebih panjang dan jarak Levenshtein antara dua kode sumber program. Skor yang lebih rendah lebih baik sehingga Anda harus mencoba membuat dua solusi yang sama sambil menjaga panjang pendeknya program.

Tugas 1

Anda diberi bilangan bulat positif Ndan Anda harus output Collatz urutan dari Nyang dipisahkan oleh spasi atau baris baru. Pemisah trailing diperbolehkan.

Elemen pertama dari urutan Collatz adalah N. Sisa dari unsur-unsur yang dihasilkan berdasarkan penerus mereka ai1 :

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

Segera setelah urutan mencapai 1tidak ada elemen baru yang dihasilkan.

Input => Output contoh:

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

Tugas # 2

Sepasang prima kembar adalah sepasang bilangan bulat positif yang selisihnya 2 dan keduanya adalah bilangan prima.

Anda diberi bilangan bulat positif Ndan Anda harus menampilkan pasangan bilangan prima kembar terkecil di mana kedua bilangan prima lebih besar dari bilangan prima yang lebih Nkecil dan dua bilangan prima harus dipisahkan oleh spasi atau baris baru. Pemisah trailing diperbolehkan.

Input => Output contoh:

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

Cuplikan untuk menghitung skor

(Modifikasi yang ada di Pulihkan masalah kode sumber yang dimutasi .)

Edit

Di tajuk jawaban, mari gunakan format

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

Misalnya

Python 2, 60 + 32 = 92

Jawaban:


3

Pyth, 18 + 13 = 31

Urutan Collatz:

QWtQ=Q@,/Q2h*Q3QQ

Twin Primes:

=Qf!ttP*T+T2hQQ+Q2

Coba di sini.

Beberapa ide berkat FryAmTheEggman.


4

CJam, 24 + 17 = 41 42

Program Collatz :

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

Program primes kembar :

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

Keduanya mengambil input dari STDIN dan mencetak nomor yang dipisahkan spasi / baris baru ke STDOUT

Cobalah secara online di sini


3

CJam, 25 + 16 = 41

Program Collatz:

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

Program primes kembar:

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

Uji di sini.

Saya baru saja bermain golf untuk mereka berdua. Saya akan melihat apakah saya dapat mengurangi skor entah bagaimana.


2

Pyth, 20 + 14 = 40 34

Collatz:

QWtQ=Q@,/Q2h*3QQQ

Pasangan Utama:

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

Keduanya adalah program yang mengambil input dari STDIN dan menampilkan angka pada baris baru. Hanya memutarkan kedua jawaban sambil menggunakan primitif pengulangan yang sama untuk saat ini. Ini mungkin bisa diperbaiki sedikit.

Sunting: Menambahkan kondisi yang lebih baik memeriksa dicuri dari @isaacg. Sepertinya menggunakan filter masih lebih pendek daripada menggunakan loop sementara untuk pasangan prima.

Cobalah online di sini.


Ini menghasilkan 3 5input 3 pada pasangan prima. Seharusnya output 5 7.
isaacg

@isaacg Memperbaikinya, dihitung biayanya 3 :(
FryAmTheEggman

2

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

Skor -4 berkat ASCII saja

Urutan collatz (14 byte):

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

Cobalah online!

Bilangan prima kembar (14 byte):

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

Cobalah online!


Golfed Twin primes (11 bytes):

[ÅNDÌp#]DÌ»

Cobalah online!


Tautan Collatz salah
ASCII

Terima kasih, perbaiki!
Wisław

primes , skor -3. mungkin layak menyimpan versi golf dalam jawaban sebagai catatan jika ada golf berbeda, lebih baik (apa sebenarnya yang dilakukan pasangan, btw? seperti mengapa saya harus melakukan ,,, dan mengapa hanya Ð,bekerja di sana)
ASCII-only

-1 lebih banyak (sunting: tidak apa-apa, angka pertama harus lebih kecil. Skor 24 untuk saat ini
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));}

Bilangan prima kembar:

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

sebutkan Java 8 ..
Optimizer

1

Mathematica, 53 + 29 = 82

Urutan Collatz:

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

Program primes kembar:

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

1

> <> , 116 + 86 = 202

Program Collatz (46):

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

Program primes kembar (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

Aduh. Kedua program mulai dengan atoifungsi yang sama , tetapi setelah itu bilangan prima kembar menurun. Bagian kode yang sama diulang dua kali untuk pemeriksaan awal - mungkin sedikit lebih pendek untuk menggunakan kembali bagian tersebut, tetapi pengaturan untuknya tidak akan menghemat banyak byte.

Bisa melakukan jauh lebih baik dengan melemparkan setengah bagian belakang bilangan prima kembar ke tempat-tempat yang tidak terpakai dari program Collatz, tetapi saya tidak yakin apakah itu diizinkan.


3
"Golf itu, Golf itu NAO!" - Noanold Golfzenegger. Yang mengatakan, pertanyaannya sepertinya tidak mengatakan bahwa menambahkan sampah untuk mengurangi jarak Levenshtein adalah tabu, jadi saya akan menjadi gila;)
FryAmTheEggman

0

C ++ Jarak = 114 Panjang lagi = 155 Skor = 269

Tugas 1

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

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

Tugas 2 ditingkatkan

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

Saya pikir Anda bahkan tidak mencoba mengurangi skor. Misalnya, Anda memiliki nama fungsi yang berbeda, nama argumen berbeda, tipe pengembalian berbeda, dan apa yang tidak, yang menambah jarak Anda.
Pengoptimal

@ Pengoptimal Saya tidak tahu cara lain untuk menguji bilangan prima? Bahasa lain memiliki built in ini.
bacchusbeale

1
Saya bahkan tidak berbicara tentang mengubah algo. Misalnya, kode ini hanya memiliki jarak 102: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;}
Pengoptimal
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.