Số dư quá hẹp


30

Vào khoảng năm 1637, Pierre de Fermat đã viết trong lề của bản sao Arithmetica của mình:

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.

Thật không may cho chúng tôi, lề vẫn còn quá hẹp để chứa bằng chứng. Hôm nay, chúng ta sẽ viết vào lề một chương trình đơn giản xác nhận bằng chứng cho các đầu vào tùy ý.

Các thách thức

Chúng tôi muốn một chương trình cho chức năng cung cấp một sức mạnh, tách nó thành hai cặp hai sức mạnh càng gần với sức mạnh càng tốt. Chúng tôi muốn chương trình thực hiện điều này càng nhỏ càng tốt để nó có thể phù hợp với lề.


Đầu vào

Sức mạnh và số sức mạnh : c,x

Các ràng buộc: c > 2x > 2

Đầu vào có thể thông qua các đối số chương trình, đối số chức năng hoặc từ người dùng.

Đầu ra

Chuỗi chính xác: " a^x + b^x < c^x" với a, b, c, và xthay thế bằng giá trị số nguyên nghĩa đen của họ. abphải được chọn sao cho a^x + b^x < c^xvà không có giá trị nào khác của ahoặc bsẽ làm cho nó gần hơn c^x. Cũng thế:a>=b>0

Đầu ra có thể thông qua giá trị trả về của hàm, thiết bị xuất chuẩn, lưu vào tệp hoặc hiển thị trên màn hình.


Ví dụ:

> 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

Do kỹ năng viết trung bình của Fermat, các ký tự không thể in được không được phép. Chương trình có số lượng nhân vật ít nhất sẽ thắng.


Bảng xếp hạng

Dưới đây là Stack Snippet để tạo cả bảng xếp hạng thông thường và tổng quan về người chiến thắng theo ngôn ngữ.

Để đảm bảo rằng câu trả lời của bạn hiển thị, vui lòng bắt đầu câu trả lời của bạn bằng một tiêu đề, sử dụng mẫu Markdown sau:

## Language Name, N characters

Ngoài ra, bạn có thể bắt đầu với:

## Language Name, N bytes

nơi Nlà kích thước của trình của bạn. Nếu bạn cải thiện điểm số của mình, bạn có thể giữ điểm số cũ trong tiêu đề, bằng cách đánh bại chúng thông qua. Ví dụ:

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

Nếu ở đó bạn muốn bao gồm nhiều số trong tiêu đề của mình (ví dụ: vì điểm của bạn là tổng của hai tệp hoặc bạn muốn liệt kê riêng các hình phạt cờ phiên dịch), hãy đảm bảo rằng điểm thực tế là số cuối cùng trong tiêu đề:

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

Bạn cũng có thể đặt tên ngôn ngữ thành liên kết sau đó sẽ hiển thị trong đoạn trích bảng xếp hạng:

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


1
Tôi nghĩ rằng nó nên a>=b>0hoặc ví dụ đầu tiên của bạn sẽ không hợp lệ. Và tại sao chúng ta phải hiển thị <khi bạn muốn nó được <=?
flawr

@flawr Đã sửa :)
TheNumberOne

Nó có ổn không khi lấy các đối số theo thứ tự ngược lại? Đầu tiên x, sau đó c?
Reto Koradi

@RetoKoradi Chắc chắn :)
TheNumberOne

Câu trả lời:


9

Bình thường, 38 byte

Ls^Rvzbjd.imj\^,dz+eoyNf<yTy]Q^UQ2Q"+<

Có đầu vào ở định dạng này:

x
c

8

Matlab, 169 153 byte

Điểm có thể là + -1 tùy thuộc vào các vấn đề chưa được giải quyết trong các bình luận =) Điểm vẫn giữ nguyên. Đây chỉ là một tìm kiếm bruteforce cho (a,b)cặp tốt nhất .

Khá đáng thất vọng: Lần đầu tiên tôi đã thử nghiệm một số thứ 'lạ mắt' và sau đó nhận ra hai vòng lặp đơn giản được lồng vào nhau là ngắn hơn ...

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)

Phiên bản cũ:

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])

Loại bỏ các khoảng trống trong m = 0? Tuy nhiên, điều đó sẽ không khiến bạn gần gũi với câu trả lời của tôi: -PP
Luis Mendo

Ngoài ra, có vẻ như bạn có thể xóa q=khỏi định nghĩa hàm
Luis Mendo

Tôi không thấy qbiến được sử dụng ở bất cứ đâu. Bạn có thể loại bỏ một vài byte bằng cách thực hiện function f(c,x)và loại bỏ dấu chấm phẩy.
rayryeng - Phục hồi Monica

8

Toán học, 79 95 80 byte

Điều này chỉ có thể phù hợp với lề.

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

Kiểm tra

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

đầu ra


7

CJam, 51 46 43 byte

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

Chương trình đầy đủ này đọc sức mạnh, sau đó là cơ sở từ STDIN.

Hãy thử trực tuyến trong trình thông dịch CJam .


6

Matlab, 141 140 byte

Điều này được mã hóa là chức năng hiển thị kết quả trong thiết bị xuất chuẩn.

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])

Ví dụ sử dụng:

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

Hoặc thử trực tuyến trong Octave .

Cảm ơn @flawr vì đã xóa một byte.


Tôi luôn tránh sprintfvì nó có vẻ phức tạp trong khi thực sự không phải vậy! Và tôi đã quên mất bsxfunmột lần nữa, vì vậy đó là một giải pháp rất thanh lịch. Tôi đặc biệt thích cách bạn lạm dụng lập chỉ mục đơn / đôi trong đối số cuối cùng =) (Bạn cũng có thể xóa một khoảng
trắng

Cảm ơn! Tôi cũng thường sử dụng disp, ngoại trừ trong Code Golf :-P
Luis Mendo

Nếu bạn sử dụng fprintfthay vì sprintf, nó sẽ không hiển thị "ans"
Jonas

@Jonas Nhưng nó in kết quả và sau đó là dấu nhắc >>trong cùng một dòng, điều này hơi lạ
Luis Mendo

Bạn có thể sử dụng fprintf, nhưng bạn phải chèn trả lại vận chuyển bằng tay.
rayryeng - Phục hồi Monica

5

CJam, 53 51 byte

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

Dùng thử trực tuyến

Định dạng đầu vào là x c , đảo ngược thứ tự được sử dụng trong các ví dụ.

Giải trình:

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 ký tự

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 byte

Tôi thường trả lời bằng MATLAB, nhưng vì đã có hai giải pháp trong ngôn ngữ đó, tôi sẽ thử dùng ngôn ngữ khác :)

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]

Mã không được giải thích

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])

Chạy ví dụ

Tôi đã chạy nó trong 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

Hãy thử trực tuyến!

http://ideone.com/tMjGdh

Nếu bạn muốn chạy mã, nhấp vào liên kết chỉnh sửa gần đầu, sau đó sửa đổi tham số STDIN với hai số nguyên cách nhau bởi một khoảng trắng. Số nguyên đầu tiên là cvà số tiếp theo là x. Ngay bây giờ, c=3x=3kết quả của nó hiện đang được hiển thị.




2

C, 175 byte

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

Để phù hợp với mã vào lề, tôi đã chèn các dòng mới và chia một chuỗi ký tự ở trên - mã được đánh dấu / biên dịch là

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

Hàm flấy cxlàm đối số, và tạo kết quả trên stdout.

Giải trình

Đây là một giải pháp lặp đi lặp lại ngoằn ngoèo theo dòng được xác định bởi a^x + b^x = c^x. Chúng tôi bắt đầu với a=cb=1. Rõ ràng, điều đó đặt chúng ta vào phía sai của dòng, bởi vì c^x + 1 > c^x. Chúng tôi giảm acho đến khi chúng tôi vượt qua dòng. Khi chúng tôi ở dưới dòng, chúng tôi tăng bcho đến khi chúng tôi vượt qua nó theo hướng khác. Lặp lại cho đến khi bgặp nhau a, ghi nhớ giải pháp tốt nhất trong ABkhi chúng ta đi. Sau đó in nó.

plà một triển khai đệ quy đơn giản của a^x(chox>0 ) vì C không cung cấp toán tử cho lũy thừa.

Trong mã giả:

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

Hạn chế

c^xphải được đại diện trong phạm vi int. Nếu giới hạn đó là quá hạn chế, chữ ký của pcó thể được sửa đổi để trivially long p(long,int)hay double p(double,int), và mMđến longhoặc doubletương ứng, mà không cần bất kỳ sửa đổi để f().

Chương trình kiểm tra

Điều này chấp nhận cxlàm đối số dòng lệnh, và in kết quả.

#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 byte

Tôi nghĩ rằng tôi đã chơi golf nhiều nhất có thể:

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

Ung dung:

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]

Sử dụng:

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

0

Haskell, 132 128 byte

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]

Ví dụ sử dụng: 7 # 3trả về chuỗi "6^3 + 5^3 < 7^3".


0

Perl 5, 119 byte

Một chương trình con:

{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]}

Sử dụng như:

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

0

Ruby, 125 byte

Chức năng ẩn danh. Xây dựng một danh sách các agiá trị, sử dụng nó để xây dựng a,bcác cặp, sau đó tìm max cho các giá trị phù hợp với tiêu chí và trả về một chuỗi từ đó.

->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}"}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.