ใช้รหัสของคุณซ้ำ!


23

ในการท้าทายนี้เราพยายามที่จะแก้ปัญหาที่สำคัญสองอย่างพร้อมกัน พวกเขาเป็น:

  1. รับจำนวนเต็มaและb , บอกว่าa -1 เป็นจำนวนเฉพาะ
  2. รับจำนวนเต็มaและbส่งคืนnCr (a, b)

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

เกณฑ์การให้คะแนน

คะแนนคำตอบคือระยะทางของ Levenshtein ระหว่างสองโปรแกรม คะแนนต่ำกว่าดีกว่า ในกรณีที่เสมอกันคำตอบด้วยรหัสที่สั้นที่สุดของทั้งสองโปรแกรมจะชนะ คุณสามารถใช้สคริปต์นี้เพื่อคำนวณคะแนนการแก้ปัญหาของคุณ

กฎระเบียบ

  1. คุณต้องเขียนโปรแกรมสองโปรแกรมในภาษาเดียวกันกับที่แก้งานที่อธิบายไว้ข้างต้น คุณสามารถใช้วิธีการ I / O ใด ๆ ที่คุณต้องการ สำหรับภารกิจที่ 1 คุณสามารถส่งกลับค่าความจริง / เท็จหรือเลือกสองค่าเพื่อหมายถึงความจริงและเท็จและคืนค่าเหล่านั้นตามลำดับ เช่น. คุณสามารถเลือกได้ว่า"prime"หมายถึงจริงและ"not prime"หมายถึงเท็จ
  2. อัลกอริทึมที่คุณใช้จะต้องใช้งานได้กับอินพุตที่เป็นไปได้ทั้งหมด แต่ก็โอเคถ้ารหัสล้มเหลวสำหรับจำนวนมากเนื่องจากข้อ จำกัด ของประเภทหมายเลขที่ใช้ คุณสามารถสันนิษฐานได้ว่าอินพุตนั้นถูกต้อง
  3. ไม่มีส่วนย่อยของโปรแกรมที่จะต้องแก้ปัญหาคือ รหัสจะต้องไม่ทำงานหากมีการลบอักขระใด ๆ ออก ตัวอย่างเช่นรหัสต่อไปนี้ไม่ถูกต้องเนื่องจากเป็นไปได้ที่จะลบบล็อกอื่นที่ไม่ได้ใช้โดยไม่ทำให้โปรแกรมแตก:

    if (1) { /* change to 0 to get the second program*/
        ...
    } else {
        ...
    }
    
  4. ไม่อนุญาตช่องโหว่มาตรฐาน

กรณีทดสอบ

-1 เป็นสำคัญ?

a b
1 1 false
2 3 true
5 2 false
2 5 true
4 3 false
2 7 true

nCr

a b nCr(a,b)
1 1 1
5 2 10
4 3 4
10 7 120
12 5 792

1
นี้อาจจะมีประโยชน์ในการคำนวณระยะทาง Levenshtein
หลุยส์ Mendo

3
ความคิดนั้นดี แต่ฉันคิดว่าคุณยังคงได้รับการแก้ปัญหาด้วยระยะทาง 1 ของ Levenshtein ที่จัดการเพื่อป้องกันการดัดแปลงชิ้นส่วนที่ไม่ได้ใช้ไม่ทางใดก็ทางหนึ่งแล้วจึงส่งผลให้โครงสร้างที่คุณต้องการห้ามได้อย่างมีประสิทธิภาพ
Martin Ender

6
@ LuisMendo ปัญหาคือโซลูชันหลายอย่างนั้นช้ามาก คุณสามารถใช้สคริปต์ Mathics นี้แทน
Martin Ender

3
ฉันคิดว่าการวัดที่ดีกว่าน่าจะเป็นระยะทาง Levenshtein หารด้วยความยาวทั้งหมดของสองโปรแกรม
Greg Martin

1
@GregMartin นั่นจะไม่ส่งผลให้รหัสโบว์ลิ่งหรือไม่ เป็นไปได้ที่จะทำให้โปรแกรมมีขนาดใหญ่ขึ้นและยังคงอ้างว่าไม่มีรหัสที่ไม่จำเป็น
fergusq

คำตอบ:



7

PHP, ระยะทาง 29

a^b-1 พิมพ์ 0 สำหรับจริงและค่าจำนวนเต็มใด ๆ > 0 สำหรับเท็จ

[,$a,$b]=$argv;for($c=-$i=1;$i<=$d=$a**$b-1;$d%++$i?:$c++);echo$c;

nCr(a,b)

[,$a,$b]=$argv;for($c=$i=1;$i<=$a;$c*=$i**(1-($i<=$a-$b)-($i<=$b)),$i++);echo$c;

PHP, ระยะทาง 36

a^b-1 พิมพ์ 1 สำหรับไม่มีอะไรจริงสำหรับเท็จ

[,$a,$b]=$argv;for($c=-1,$i=1;$i<=$d=-1+$a**$b;)$d%++$i?:$c++;echo$c<1;

nCr(a,b)

[,$a,$b]=$argv;for($c=$d=$i=1;$i<=$a;$c*=$i++)$d*=$i**(($i<=$a-$b)+($i<=$b));echo$c/$d;

7

ทับทิมระยะทาง 1 ความยาวรวม 194

ตรวจสอบเฉพาะ:

->a,b{s='[(a**b-1).prime?,(1..b).inject(1){|m,i|(a+1-i)/i*m}][0]';require'math'<<s.size*2;eval s}

ลองออนไลน์!

nCr:

->a,b{s='[(a**b-1).prime?,(1..b).inject(1){|m,i|(a+1-i)/i*m}][1]';require'math'<<s.size*2;eval s}

ลองออนไลน์!

ตามที่คาดการณ์ไว้ในความคิดเห็นกระตุกบางคนมักจะต้องไปกับวิญญาณของปัญหา มันสนุกมากที่ได้หาวิธีแก้ไขมัน! นี่คือวิธีการทำงาน: เรามีวิธีแก้ไขปัญหาสองแบบแยก เราเรียกใช้ทั้งสองใส่ลงในอาร์เรย์จากนั้นเลือกองค์ประกอบที่ 0 หรืออันดับที่ 1 สำหรับระยะแก้ไข 1 ซึ่งปกติแล้วจะผิดกฎหมายเนื่องจากคุณสามารถลบทุกอย่างได้ แต่การคำนวณที่คุณต้องการและยังคงใช้งานได้ . อย่างไรก็ตามข้อมูลโค้ดแต่ละอันจะถูกเขียนขึ้นอยู่กับการโหลดของไลบรารีมาตรฐานเดียวกัน'mathn':

  • ครั้งแรกที่ใช้ในตัว prime?
  • อย่างที่สองต้องอาศัยmathnการเปลี่ยนแปลงวิธีการแบ่งงาน - ก่อนที่จะโหลดมัน3/4ประเมินในขณะที่หลังจากนั้นจะประเมินเศษ0 (3/4)เนื่องจากผลลัพธ์ระดับกลางของ(a+1-i)/iไม่ใช่จำนวนเต็มเสมอผลลัพธ์โดยรวมจึงไม่ถูกต้องหากไม่มีไลบรารี

ตอนนี้เราแค่ต้องทำการโหลดไลบรารี่ที่เกิดขึ้นกับโค้ดอื่น ๆ ที่ไม่ได้ทำการแก้ไข เราทำสิ่งนี้โดยการสร้างชื่อ mathn โดยใช้ความยาวอักขระของรหัสหลักที่เหลือ: การคำนวณแบบรวมมีความยาว 55 ซึ่งเพิ่มเป็นสองเท่าถึง 110 คือค่า ASCII ของ 'n' การต่อสิ่งนี้เข้ากับสตริง 'คณิตศาสตร์' จะให้ไลบรารีที่ต้องการ

ในฐานะโบนัสการแนะนำการพึ่งพาไลบรารียังทำให้โค้ดรันในเวลาที่เหมาะสม โดยเฉพาะอย่างยิ่งวิธีการที่ไร้เดียงสาของ nCr จะไม่สร้างผลลัพธ์กลางที่เป็นเศษส่วน



4

ซ้อนกัน , ระยะทาง 13

[([@.!]$/{%y!x y-!*})fork!]
[^#-:([]1/$%{!n 1-!})fork!=]

ลองออนไลน์!อันแรกคำนวณ nCr ซึ่งเป็นอันดับที่สองโดยใช้ทฤษฎีบทของวิลสัน

(f g h) fork!pops เกิดNจากสแต็ก (เรียกใช้a0 ... aN) และใช้a0 ... aN f a0 ... aN h gและนำไปใช้

สำหรับโปรแกรมแรก:

[([@.!]$/{%y!x y-!*})fork!]
[(                  )fork!]  apply the fork of:
  [@.!]                      equiv. { x y : x ! } => `x!`
       $/                    divided by
         {%        }         two-arg function
           y!                y!
             x y-                 (x - y)!
                 *              *

และสำหรับวินาที:

[^#-:([]1/$%{!n 1-!})fork!=]  
[^                         ]  exponentiate  (a^b)
  #-                          decrement     (a^b-1)
    :                         duplicate     (a^b-1 a^b-1)
     (              )fork!    apply the fork to:
      []1/                    1-arg identity function
          $%                  modulus by
            {!     }          1-arg with `n`:
              n 1-             (n-1)
                  !                 !
                          =   check for equality


3

Mathematica ระยะทาง 10

ภารกิจที่ 1: PrimeQ[#2^#-1]&

ภารกิจที่ 2: Binomial[#2,#]&

b,aฟังก์ชั่นทั้งสองใช้ปัจจัยการผลิตในการสั่งซื้อ


3

Javascript ES7, ระยะทาง 14

ขอบคุณ @Conor O'Brien สำหรับการลดระยะห่าง 7

primality:

f=x=>y=>{t=x**y-1;s=1;for(i=2;i<t;i++){if(!t%i)s=i-i}return s}

ส่งคืน 1 ถ้านายกส่งคืน 0 ถ้าไม่ใช่เฉพาะ

การตรวจสอบ Prime ที่ไม่มีประสิทธิภาพอย่างไม่น่าเชื่อตรวจสอบ modulo ของตัวเลขทุกตัวที่เล็กกว่านั้นและมากกว่า 1 ...

nCr:

f=x=>y=>{t=x+1;s=1;for(i=1;i<t;i++){if(y<i)s*=i/(i-y)}return s}

คูณ 1 โดยแต่ละหมายเลขจาก y + 1 ถึง x และหารด้วยแต่ละหมายเลขจาก 1 ถึง xy (x! / y!) / (xy)!


การเปลี่ยนโปรแกรมที่สองเพื่อf=x=>y=>{t=x+1;s=1;for(i=1;i<t;i++){if(y<i)s*=i/(i-y)}return s}ให้ระยะทางแก้ไข 14 ลองออนไลน์!
Conor O'Brien

2

ระดับแปดเสียงระยะทาง17 16 15

nCr

a=input("");b=input("");f=@(x)factorial(x);printf("%d",f(a)/f(b)/f(a-b))

ลองออนไลน์!

isprime(a^b-1)

a=input("");b=input("");f=@(x)isprime(x);printf("%d",f(a^b-f(8-6)))

ลองออนไลน์!

ฉันไม่ค่อยคล่องแคล่วใน Octave ดังนั้นฉันไม่รู้ว่ามี builtin ในการคำนวณ nCr หรือไม่


1

MATLระยะทาง 4 ความยาว 6

บอกถ้าa^b-1เป็นนายก:

^qZq

ลองออนไลน์!

คำนวณnCr(a,b):

Xn

ลองออนไลน์!

มันทำงานอย่างไร

บอกถ้าa^b-1เป็นนายก:

^      % Power with implicit inputs
q      % Subtract 1
Zq     % Is prime? Implicit display

คำนวณnCr(a,b):

Xn     % nchoosek with implicit inputs. Implicit display


1

PHP, ระยะทาง 14

การเขียนโปรแกรมที่มีสองฟังก์ชั่นและการเรียกเพียงหนึ่งในนั้นจะนำไปสู่ระยะทาง 1 แต่มันจะอ่อนแอเกินไป

การทดสอบเฉพาะหน้า 100 ไบต์:

[,$a,$b]=$argv;function f($n){for($i=$n;--$i>0&&$n%$i;);return$i==1;}echo f($a**$b*-1)*(1|f($a-$b));

nCr, 98 ไบต์:

[,$a,$b]=$argv;function f($n){for($i=$n;--$i>0&&$n*=$i;);return$n*=1;}echo f($a)/(f($b)*f($a-$b));


0

JavaScript, คะแนน: 1, ความยาว: 144 142 126 117

function(a,b){s="a=Math.pow(a,b)-t;for(b=2;a%b++;);b>a1for(;b;)t=t*a--/b--";t=s.length-56;return eval(s.split(1)[0])}

ฟังก์ชั่น (A, B) {s = "A = Math.pow (A, B) -s.length + 79 สำหรับ (ข = 2; a b% ++;); b> a1for (t = s.length-79 ; b;) t = t * a - / b - "; return eval (s.split (1) [1])}

function A(a,b){a=Math.pow(a,b)-(B+0).length+63;for(b=2;a%b++;);return b>a;}
function B(a,b){for(t=(A+0).length-76;b;)t=t*a--/b--;return t;}
F=A

รูทีนย่อยทั้งสองใช้ความยาวของอีกฝ่ายในการคำนวณค่าคงที่ของตัวเองดังนั้นจึงไม่สามารถลบอักขระออกได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.