Pair-golfing twin primes และลำดับ Collatz


12

นี้เป็นชนิดใหม่ของความท้าทายแรงบันดาลใจจากการกู้คืนรหัสที่มากลายพันธุ์ปัญหา

คุณควรเขียนสองโปรแกรมหรือฟังก์ชั่นทั้งสองในภาษาเดียวกัน อันแรกควรแก้ไข Task # 1 และอันที่สองควรแก้ Task # 2

คะแนนของคุณจะเป็นผลรวมของโปรแกรมที่ยาวขึ้นและระยะทางของ Levenshteinระหว่างซอร์สโค้ดโปรแกรมทั้งสอง คะแนนที่ต่ำกว่าดีกว่าดังนั้นคุณควรพยายามทำให้ทั้งสองโซลูชันคล้ายกันในขณะที่รักษาความยาวของโปรแกรมไว้สั้น ๆ

ภารกิจ # 1

คุณได้รับจำนวนเต็มบวกNและคุณควรส่งออกลำดับ CollatzของNคั่นด้วยช่องว่างหรือขึ้นบรรทัดใหม่ อนุญาตให้ใช้ตัวคั่นต่อท้าย

องค์ประกอบแรกของลำดับ Collatz Nคือ ส่วนที่เหลือขององค์ประกอบที่จะถูกสร้างขึ้นอยู่กับทายาทของพวกเขาฉัน- 1 :ai1

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

ทันทีที่ลำดับถึง1องค์ประกอบใหม่จะไม่ถูกสร้างขึ้น

อินพุต => ตัวอย่างเอาต์พุต:

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

งาน # 2

คู่ของช่วงเวลาแฝดเป็นคู่ของจำนวนเต็มบวกที่มีความแตกต่างคือ 2 และพวกเขาทั้งสองช่วงเวลา

คุณจะได้รับจำนวนเต็มบวกNและคุณควรส่งออกช่วงเวลาคู่ที่เล็กที่สุดซึ่งทั้งสองช่วงมีขนาดใหญ่กว่าNจำนวนแรกควรเป็นจำนวนที่เล็กกว่าและช่วงที่สองควรแยกด้วยช่องว่างหรือขึ้นบรรทัดใหม่ อนุญาตให้ใช้ตัวคั่นต่อท้าย

อินพุต => ตัวอย่างเอาต์พุต:

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

ตัวอย่างสำหรับการคำนวณคะแนน

(การแก้ไขของหนึ่งในการกู้คืนปัญหารหัสที่กลายพันธุ์ )

แก้ไข

ในส่วนหัวของคำตอบลองใช้รูปแบบ

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

เช่น

Python 2, 60 + 32 = 92

คำตอบ:



4

CJam, 24 + 17 = 41 42

โปรแกรม Collatz :

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

โปรแกรมช่วงเวลาแฝด :

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

ทั้งสองรับอินพุตจาก STDIN และพื้นที่การพิมพ์ / หมายเลขบรรทัดใหม่ที่คั่นด้วย STDOUT

ลองออนไลน์ได้ที่นี่


3

CJam, 25 + 16 = 41

โปรแกรม Collatz:

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

โปรแกรมช่วงเวลาแฝด:

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

ทดสอบที่นี่

ฉันเพิ่งเล่นกอล์ฟทั้งสองตอนนี้ ฉันจะดูว่าฉันสามารถลดคะแนนอย่างใด


2

Pyth, 20 + 14 = 40 34

Collatz:

QWtQ=Q@,/Q2h*3QQQ

คู่ที่สำคัญ:

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

ทั้งคู่เป็นโปรแกรมที่รับอินพุตจาก STDIN และส่งออกตัวเลขบนบรรทัดใหม่ เพิ่งเล่นกอล์ฟทั้งสองคำตอบขณะที่ใช้การวนซ้ำแบบเดิมในตอนนี้ สิ่งนี้อาจปรับปรุงได้บ้าง

แก้ไข: เพิ่มการตรวจสอบสภาพที่ดีขึ้นที่ถูกขโมยจาก @isaacg ดูเหมือนว่าการใช้ตัวกรองจะยังสั้นกว่าการใช้ลูป while สำหรับคู่ที่สำคัญ

ลองออนไลน์ได้ที่นี่


เอาต์พุตนี้3 5สำหรับอินพุต 3 บนคู่ที่สำคัญ 5 7มันควรเอาท์พุท
isaacg

@isaacg แก้ไขแล้วมีค่าใช้จ่าย 3 :(
FryAmTheEggman

2

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

-4 คะแนนขอบคุณ ASCII-only

ลำดับ Collatz (14 ไบต์):

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

ลองออนไลน์!

ช่วงเวลาคู่ (14 ไบต์):

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

ลองออนไลน์!


ลูกกอล์ฟสองช่วง (11 ไบต์):

[ÅNDÌp#]DÌ»

ลองออนไลน์!


ลิงก์ Collatz ไม่ถูกต้อง
เฉพาะ ASCII เท่านั้น

ขอบคุณแก้ไข!
Wisław

ช่วงเวลา -3 คะแนน อาจคุ้มค่าที่จะรักษาเวอร์ชัน golfed ในคำตอบเป็น note ข้างในกรณีที่มีสนามกอล์ฟที่แตกต่างออกไปดีกว่า (คู่ทำอะไรกันแน่ btw? เช่นทำไมฉันต้องทำ,,และทำไมถึงÐ,ทำงานที่นั่นเท่านั้น)
ASCII-only

อีก -1 (แก้ไข: ไม่เป็นไรหมายเลขแรกควรเล็กกว่าคะแนน 24 สำหรับตอนนี้
ASCII เท่านั้นเท่านั้น



1

Mathematica, 53 + 29 = 82

ลำดับ Collatz:

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

โปรแกรมช่วงเวลาแฝด:

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

1

> <> , 116 + 86 = 202

โปรแกรม Collatz (46):

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

โปรแกรมช่วงเวลาแฝด (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

อุ๊ยตาย โปรแกรมทั้งสองเริ่มต้นด้วยatoiฟังก์ชั่นเดียวกันแต่หลังจากช่วงเวลาสองช่วงนั้นลงเขา ชิ้นส่วนรหัสเดียวกันซ้ำสองครั้งสำหรับการตรวจสอบเบื้องต้น - มันอาจจะสั้นกว่าเล็กน้อยเพื่อนำชิ้นส่วนนั้นมาใช้ซ้ำ แต่การตั้งค่าสำหรับมันจะไม่บันทึกไบต์จำนวนมาก

ทำได้ดีกว่านี้มากโดยการโยนครึ่งหลังของช่วงเวลาสองช่วงไปยังจุดที่ไม่ได้ใช้ในโปรแกรม Collatz แต่ฉันไม่แน่ใจว่าได้รับอนุญาตหรือไม่


3
"Golf it, Golf it NAO!" - Noanold Golfzenegger ที่กล่าวว่าคำถามดูเหมือนจะไม่พูดว่าการเพิ่มขยะเพื่อลดระยะทาง Levenshtein เป็นข้อห้ามดังนั้นฉันจะไปถั่ว;)
FryAmTheEggman

0

ระยะทาง C ++ = 114 ความยาวอีกต่อไป = 155 คะแนน = 269

ภารกิจที่ 1

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

ภารกิจที่ 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;}

ปรับปรุงงาน 2

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

ฉันคิดว่าคุณไม่ได้พยายามลดคะแนน ตัวอย่างเช่นคุณมีชื่อฟังก์ชั่นที่แตกต่างกันชื่ออาร์กิวเมนต์ที่แตกต่างกันประเภทผลตอบแทนที่แตกต่างกันและสิ่งที่ไม่เพิ่มระยะทางของคุณ
เครื่องมือเพิ่มประสิทธิภาพ

@Optimizer ฉันไม่รู้จักวิธีทดสอบ primes อีกวิธี ภาษาอื่นมีสิ่งนี้มาด้วย
bacchusbeale

1
ฉันไม่ได้พูดถึงการเปลี่ยนอัลโก ตัวอย่างเช่นรหัสนี้มีระยะทางเพียง 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;}
เครื่องมือเพิ่มประสิทธิภาพ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.