มาร์จิ้นแคบเกินไป


30

ประมาณปี 1637 ปิแอร์เดอแฟร์มาต์เขียนในขอบของสำเนา Arithmetica ของเขา:

It is impossible to separate a cube into two cubes, or a fourth power 
into two fourth powers, or in general, any power higher than the 
second, into two like powers. I have discovered a truly marvelous 
proof of this, which this margin is too narrow to contain.

น่าเสียดายสำหรับเราขอบยังแคบเกินไปที่จะมีการพิสูจน์ วันนี้เรากำลังจะเขียนโปรแกรมง่าย ๆ เพื่อยืนยันหลักฐานสำหรับอินพุตที่กำหนดเอง

ความท้าทาย

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


อินพุต

พลังงานและจำนวนพลังงาน: c,x

ข้อ จำกัด : c > 2และx > 2

อินพุตสามารถผ่านอาร์กิวเมนต์ของโปรแกรมอาร์กิวเมนต์ของฟังก์ชันหรือจากผู้ใช้

เอาท์พุต

นี้สตริงที่แน่นอน " a^x + b^x < c^x" กับa, b, cและxแทนที่ด้วยค่าจำนวนเต็มที่แท้จริงของพวกเขา aและbจะต้องเลือกเพื่อa^x + b^x < c^xไม่ให้มีค่าอื่นใดaหรือbจะทำให้ใกล้เคียงc^xขึ้น นอกจากนี้:a>=b>0

เอาต์พุตสามารถผ่านค่าส่งคืนฟังก์ชัน stdout บันทึกเป็นไฟล์หรือแสดงบนหน้าจอ


ตัวอย่าง:

> 3 3
2^3 + 2^3 < 3^3
> 4 3
3^3 + 3^3 < 4^3
> 5 3
4^3 + 3^3 < 5^3
> 6 3
5^3 + 4^3 < 6^3
> 7 3
6^3 + 5^3 < 7^3
> 8 3
7^3 + 5^3 < 8^3

เนื่องจากทักษะการเขียนเฉลี่ยของแฟร์มาต์จึงไม่อนุญาตให้ใช้อักขระที่ไม่สามารถพิมพ์ได้ โปรแกรมที่มีจำนวนอักขระน้อยที่สุดจะเป็นผู้ชนะ


ลีดเดอร์

นี่คือตัวอย่างข้อมูลเพื่อสร้างทั้งกระดานผู้นำปกติและภาพรวมของผู้ชนะตามภาษา

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

## Language Name, N characters

หรือคุณสามารถเริ่มต้นด้วย:

## Language Name, N bytes

ที่Nมีขนาดของส่งของคุณ หากคุณปรับปรุงคะแนนของคุณคุณสามารถเก็บคะแนนเก่าไว้ในพาดหัวโดยการตีพวกเขาผ่าน ตัวอย่างเช่น

## Ruby, <s>104</s> <s>101</s> 96 bytes

หากคุณต้องการรวมหลายตัวเลขไว้ในส่วนหัวของคุณ (เช่นเนื่องจากคะแนนของคุณคือผลรวมของสองไฟล์หรือคุณต้องการแสดงรายการการลงโทษการตั้งค่าสถานะของล่ามแยกต่างหาก) ตรวจสอบให้แน่ใจว่าคะแนนจริงเป็นตัวเลขสุดท้ายในส่วนหัว:

## Perl, 43 + 2 (-p flag) = 45 bytes

นอกจากนี้คุณยังสามารถตั้งชื่อภาษาให้เป็นลิงค์ซึ่งจะปรากฏในตัวอย่างกระดานแต้มนำ:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes


1
ฉันคิดว่ามันควรจะเป็นa>=b>0หรือตัวอย่างแรกของคุณจะไม่ถูกต้อง และทำไมเราต้องแสดง<เมื่อคุณต้องการให้เป็น<=?
ข้อบกพร่อง

@flawr แก้ไข :)
TheNumberOne

มันจะโอเคไหมที่จะโต้แย้งในลำดับที่ตรงกันข้าม? ครั้งแรกxแล้วc?
Reto Koradi

@RetoKoradi แน่นอน :)
TheNumberOne

คำตอบ:



8

Matlab, 169 153 ไบต์

คะแนนสามารถ + -1 ขึ้นอยู่กับปัญหาที่ยังไม่ได้แก้ไขในข้อคิดเห็น =)คะแนนยังคงเหมือนเดิม นี่เป็นเพียงการค้นหา Bruteforce ที่ดีที่สุดสำหรับ(a,b)ทั้งคู่

ค่อนข้างน่าผิดหวัง: ฉันลองทดลองกับสิ่ง 'แฟนซี' ก่อนแล้วก็รู้ว่าซ้อนสองแบบง่าย ๆ สำหรับลูปสั้นกว่า ...

function f(c,x);
m=0;p=@(x)int2str(x);
X=['^' p(x)];
for b=1:c;for a=b:c;
n=a^x+b^x;
if n<c^x&n>m;m=n;s=[p(a) X ' + ' p(b) X ' < ' p(c) X];end;end;end;
disp(s)

เวอร์ชั่นเก่า:

function q=f(c,x);
[b,a]=meshgrid(1:c);
z=a.^x+b.^x;
k=find(z==max(z(z(:)<c^x & a(:)>=b(:))),1);
p=@(x)int2str(x);x=['^' p(x)];
disp([p(a(k)) x ' + ' p(b(k)) x ' < ' p(c) x])

ลบช่องว่างm = 0หรือไม่ แต่ถึงกระนั้นก็ไม่ได้ทำให้คุณใกล้คำตอบของฉัน: -PP
Luis Mendo

นอกจากนี้ดูเหมือนว่าคุณสามารถลบออกq=จากคำจำกัดความของฟังก์ชั่นได้
Luis Mendo

ฉันไม่เห็นqตัวแปรที่ใช้อยู่ทุกที่ คุณสามารถโกนหนวดสักสองสามไบต์ได้โดยการทำfunction f(c,x)และกำจัดเซมิโคลอนออกเช่นกัน
rayryeng - Reinstate Monica

8

Mathematica, 79 95 80 ไบต์

นี่อาจพอดีกับระยะขอบ

c_~f~x_:=Inactivate[a^x+b^x<c^x]/.Last@Solve[a^x+b^x<c^x&&a>=b>0,{a,b},Integers]

การทดสอบ

f[3, 3]
f[4, 3]
f[5, 3]
f[6, 3]
f[7, 3]
f[8, 3]

เอาท์พุต


7

CJam, 51 46 43 bytes

q~_2m*\f+{W$f#)\:+_@<*}$W='^@s+f+"+<".{S\S}

โปรแกรมเต็มรูปแบบนี้อ่านกำลังไฟจากนั้นฐานจาก STDIN

ลองใช้ออนไลน์ในล่าม CJam


6

Matlab, 141 140 ไบต์

นี่คือรหัสเป็นฟังก์ชั่นที่แสดงผลลัพธ์ใน stdout

function f(c,x)
b=(1:c).^x;d=bsxfun(@plus,b,b');d(d>c^x)=0;[~,r]=max(d(:));sprintf('%i^%i + %i^%i < %i^%i',[mod(r-1,c)+1 ceil(r/c) c;x x x])

ตัวอย่างการใช้:

>> f(8,3)
ans =
7^3 + 5^3 < 8^3

หรือลองออนไลน์คู่

ขอบคุณ @flawr สำหรับการลบหนึ่งไบต์


ฉันมักจะหลีกเลี่ยงsprintfเพราะมันดูซับซ้อนมากในขณะที่จริง ๆ แล้วมันไม่ใช่! และฉันลืมไปbsxfunอีกครั้งดังนั้นนั่นจึงเป็นทางออกที่สง่างามมาก ฉันชอบวิธีที่คุณใช้ทำดัชนีเดี่ยว / คู่ในอาร์กิวเมนต์สุดท้าย =) (คุณสามารถลบช่องว่างที่นั่นด้วย!)
ข้อบกพร่อง

ขอบคุณ! ฉันมักจะใช้dispด้วยเช่นกันยกเว้นใน Code Golf :-P
Luis Mendo

หากคุณใช้fprintfแทนsprintfจะไม่แสดง "ans"
Jonas

@Jonas แต่มันพิมพ์ผลแล้วพร้อมท์>>ในบรรทัดเดียวกันซึ่งเป็นบิตแปลก
หลุยส์ Mendo

คุณสามารถใช้งานfprintfได้ แต่คุณต้องใส่การคืนตลับหมึกด้วยตนเอง
rayryeng - Reinstate Monica

5

CJam, 53 51 ไบต์

l~:C\:X#:U;C2m*{Xf#:+_U<*}$W=~"^"X+:T" + "@T" < "CT

ลองออนไลน์

รูปแบบการป้อนข้อมูลคือx cซึ่งเป็นสิ่งที่ตรงกันข้ามของคำสั่งที่ใช้ในตัวอย่าง

คำอธิบาย:

l~    Read and interpret input.
:C    Store c in variable C.
\     Swap x to top.
:X    Store it in variable X.
#     Calculate c^x.
:U;   Store it in variable U as the upper limit, and pop it from stack.
C2m*  Generate all pairs of values less than c. These are candidates for a/b.
{     Start of mapping function for sort.
  X     Get value of x.
  f#    Apply power to calculate [a^x b^x] for a/b candidates.
  :+    Sum them to get a^x+b^x.
  _U<   Compare value to upper limit.
  *     Multiply value and comparison result to get 0 for values above limit.
}$    End of sort block.
W=    Last a/b pair in sorted list is the solution.
~     Unpack it.
"^"X+ Build "^x" string with value of x.
:T    Store it in variable T, will use it 2 more times in output.
" + " Constant part of output.
@     Rotate b to top of stack.
T     "^x" again.
" < " Constant part of output.
C     Value of c.
T     And "^x" one more time, to conclude the output.

5

R, 139 ตัวอักษร

function(c,x)with(expand.grid(a=1:c,b=1:c),{d=a^x+b^x-c^x
d[d>0]=-Inf
i=which.max(d)
sprintf("%i^%4$i + %i^%4$i < %i^%4$i",a[i],b[i],c,x)})

4

Python 2, 182 161 157 bytes

ฉันมักจะตอบคำถามใน MATLAB แต่เนื่องจากมีสองวิธีในภาษานั้นฉันคิดว่าฉันลองภาษาอื่น :)

def f(c,x):print max([('%d^%d + %d^%d < %d^%d'%(a,x,b,x,c,x),a**x+b**x) for b in range(1,c+1) for a in range(b,c+1) if a**x+b**x<c**x],key=lambda x:x[1])[0]

โค้ดที่ไม่ถูกฟอลล์พร้อมคำอธิบาย

def f(c,x): # Function declaration - takes in c and x as inputs

    # This generates a list of tuples where the first element is 
    # the a^x + b^x < c^x string and the second element is a^x + b^x
    # Only values that satisfy the theorem have their strings and their
    # corresponding values here
    # This is a brute force method for searching
    lst = [('%d^%d + %d^%d < %d^%d'%(a,x,b,x,c,x),a**x+b**x) for b in range(1,c+1) for a in range(b,c+1) if a**x+b**x<c**x]

    # Get the tuple that provides the largest a^x + b^x value
    i = max(lst, key=lambda x:x[1])

    # Print out the string for this corresponding tuple
    print(i[0])

ตัวอย่างรัน

ฉันใช้สิ่งนี้ใน IPython:

In [46]: f(3,3)
2^3 + 2^3 < 3^3

In [47]: f(4,3)
3^3 + 3^3 < 4^3

In [48]: f(5,3)
4^3 + 3^3 < 5^3

In [49]: f(6,3)
5^3 + 4^3 < 6^3

In [50]: f(7,3)
6^3 + 5^3 < 7^3

In [51]: f(8,3)
7^3 + 5^3 < 8^3

ลองออนไลน์!

http://ideone.com/tMjGdh

หากคุณต้องการเรียกใช้รหัสให้คลิกที่ลิงค์แก้ไขใกล้ด้านบนจากนั้นแก้ไขพารามิเตอร์ STDIN ด้วยจำนวนเต็มสองจำนวนคั่นด้วยช่องว่าง จำนวนเต็มแรกคือและเป็นคนต่อไปคือc xตอนนี้c=3และx=3และผลลัพธ์จะปรากฏขึ้น




2

C, 175 ไบต์

a,b,m,A,B,M;p(
a,x){return--x
?a*p(a,x):a;}f
(c,x){M=p(c,x)
;for(a=c,b=1;a
>=b;)(m=p(c,x)
-p(a,x)-p(b,x
))<0?--a:m<M?
(M=m,B=b++,A=
a):b++;printf
("%d^%d + %d"
"^%d < %d^%d",
A,x,B,x,c,x);}

เพื่อให้พอดีกับรหัสในระยะขอบฉันได้แทรกการขึ้นบรรทัดใหม่และแยกสตริงตัวอักษรด้านบน - รหัส golfed ที่จะนับ / รวบรวมคือ

a,b,m,A,B,M;p(a,x){return--x?a*p(a,x):a;}f(c,x){M=p(c,x);for(a=c,b=1;a>=b;)(m=p(c,x)-p(a,x)-p(b,x))<0?--a:m<M?(M=m,B=b++,A=a):b++;printf("%d^%d + %d^%d < %d^%d",A,x,B,x,c,x);}

ฟังก์ชั่นfใช้เวลาcและเป็นข้อโต้แย้งและผลิตผลบนxstdout

คำอธิบาย

a^x + b^x = c^xนี้เป็นทางออกที่ซ้ำที่คดเคี้ยวสายที่กำหนดโดย เราเริ่มต้นด้วยและa=c เห็นได้ชัดว่าทำให้เราอยู่ในด้านผิดของเส้นเพราะb=1 c^x + 1 > c^xเราลดน้อยลงaจนข้ามเส้น เมื่อเราอยู่ต่ำกว่าเส้นเราจะเพิ่มขึ้นbจนกว่าเราจะข้ามมันไปในทิศทางอื่น ทำซ้ำจนกว่าจะbพบการaจดจำทางออกที่ดีที่สุดในAและBขณะที่เราไป จากนั้นพิมพ์

pเป็นการใช้งานแบบเรียกซ้ำa^x(สำหรับx>0) อย่างง่ายเนื่องจาก C ไม่มีตัวดำเนินการสำหรับการยกกำลัง

ในรหัสปลอม:

a=c
b=1
M = c^x

while a >= b
do
   m = c^x - a^x - b^x
   if m < 0
      a -= 1
   else // (m > 0, by Fermat's Last Theorem)
      if m < M
         A,B,M = a,b,m
      b += 1
done
return A,B

ข้อ จำกัด

c^xintจะต้องเป็นแทนได้ในช่วงของ หากข้อ จำกัด ที่เป็นที่เข้มงวดเกินไปลายเซ็นของpสามารถแก้ไขนิด ๆ ไปlong p(long,int)หรือdouble p(double,int)และmและMไปlongหรือdoubleตามลำดับโดยไม่มีการดัดแปลงใด ๆ ที่จะf()ที่จะ

โปรแกรมทดสอบ

สิ่งนี้ยอมรับcและxเป็นอาร์กิวเมนต์บรรทัดคำสั่งและพิมพ์ผลลัพธ์

#include<stdio.h>
int main(int argc, char**argv) {
    if (argc <= 2) return 1;
    int c = atoi(argv[1]);
    int x = atoi(argv[2]);
    f(c,x);
    puts("");
    return 0;
}

1

Haskell, 120 ไบต์

ฉันคิดว่าฉันเล่นกอล์ฟให้มากที่สุด:

c%x=a&" + "++b&" < "++c&""where(_,a,b)=maximum[(a^x+b^x,a,b)|b<-[1..c],a<-[b..c],a^x+b^x<c^x];u&v=show u++"^"++show c++v

Ungolfed:

fn c x = format a " + " ++ format b " < " ++ format c ""
    where format :: Integer -> String -> String
          -- `format u v` converts `u`, appends an exponent string, and appends `v`
          format u v = show u ++ "^" ++ show c ++ v
          -- this defines the variables `a` and `b` above
          (_, a, b) = maximum [(a^x + b^x, a, b) | b <- [1..c], 
                                                   a <- [b..c],
                                                   a^x + b^x < c^x]

การใช้งาน:

Prelude> 30 % 11
"28^30 + 28^30 < 30^30"

0

Haskell, 132 128 ไบต์

x!y=x++show y
c#x=(\[_,a,b]->""!a++"^"!x++" + "!b++"^"!x++" < "!c++"^"!x)$maximum[[a^x+b^x,a,b]|a<-[0..c],b<-[0..a],a^x+b^x<c^x]

ตัวอย่างการใช้งานส่งกลับสตริง7 # 3"6^3 + 5^3 < 7^3"


0

Perl 5, 119 ไบต์

รูทีนย่อย:

{for$b(1..($z=$_[0])){for(1..$b){@c=("$b^$o + $_^$o < $z^$o",$d)if($d=$b**($o=$_[1])+$_**$o)<$z**$o and$d>$c[1]}}$c[0]}

ใช้เป็นเช่น:

print sub{...}->(8,3)

0

ทับทิมขนาด 125 ไบต์

ฟังก์ชั่นไม่ระบุชื่อ สร้างรายการaค่าใช้เพื่อสร้างa,bคู่จากนั้นค้นหาค่าสูงสุดสำหรับค่าที่ตรงกับเกณฑ์และส่งคืนสตริงจากที่นั่น

->c,x{r=[];(1..c).map{|a|r+=([a]*a).zip 1..a}
a,b=r.max_by{|a,b|z=a**x+b**x;z<c**x ?z:0}
"#{a}^#{x} + #{b}^#{x} < #{c}^#{x}"}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.