여백이 너무 좁다


30

1637 년 경, Pierre de Fermat는 자신의 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 > 2x > 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

출력은 함수 반환 값, 표준 출력, 파일에 저장 또는 화면에 표시 될 수 있습니다.


예 :

> 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

Fermat의 평균적인 글쓰기 기술로 인해 인쇄 할 수없는 문자는 허용되지 않습니다. 문자 수가 가장 적은 프로그램이 승리합니다.


리더 보드

다음은 일반 리더 보드와 언어 별 수상자 개요를 생성하는 스택 스 니펫입니다.

답변이 표시되도록하려면 다음 마크 다운 템플릿을 사용하여 헤드 라인으로 답변을 시작하십시오.

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

@flawr Fixed :)
TheNumberOne

반대 순서로 인수를 취해도 괜찮습니까? 먼저 x, 다음 c?
Reto Koradi

@RetoKoradi Sure :)
TheNumberOne

답변:


9

Pyth, 38 바이트

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

이 형식으로 입력을받습니다.

x
c

8

Matlab, 169153 바이트

의견의 해결되지 않은 문제에 따라 점수는 + -1이 될 수 있습니다. =) 점수는 동일하게 유지됩니다. 이것은 최고의 (a,b)쌍을 위한 무차별 검색입니다 .

꽤 실망 스럽습니다. 처음에는 '팬시'재료로 실험을 시도한 다음 두 개의 간단한 중첩 for 루프가 훨씬 짧다는 것을 깨달았습니다 ...

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-복원 모니카

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 바이트

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

이 전체 프로그램은 STDIN에서 전원을 읽은 다음베이스를 읽습니다.

CJam 통역사 에서 온라인으로 사용해보십시오 .


6

Matlab, 141140 바이트

이것은 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

또는 옥타브에서 온라인으로 사용해보십시오 .

1 바이트를 제거 한 @flawr에게 감사드립니다.


sprintf실제로는 실제로는 아니지만 너무 복잡해 보였으므로 항상 피 했습니다! 그리고 나는 bsxfun다시 한 번 잊어 버렸 으므로 매우 우아한 해결책입니다. 특히 마지막 인수에서 단일 / 이중 인덱싱을 남용한 방식이 마음에
듭니다

감사! 나는 일반적으로 사용하는 disp코드 골프 - P를 제외하고도
루이스 Mendo

fprintf대신 sprintf
Jonas

@Jonas 그러나 결과와 프롬프트 >>를 같은 줄에 출력하는데 약간 이상합니다.
Luis Mendo

을 사용할 수 fprintf있지만 수동 캐리지 리턴을 삽입해야합니다.
rayryeng-복원 모니카

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

파이썬 2 182 161 157 바이트

나는 보통 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]

설명이 포함 된 ungolfed 코드

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

코드를 여백에 맞추려면 줄 바꿈을 삽입하고 문자열 리터럴을 위의 분할합니다. 카운팅 / 컴파일 할 골프 코드는

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소요 cx인수로, 그리고에 결과를 생성합니다 stdout.

설명

이것은로 정의 된 선을 지그재그로 반복하는 솔루션입니다 a^x + b^x = c^x. 우리는 시작 a=c하고 b=1. 분명히, 그것은 우리를 잘못된 길로 인도합니다 c^x + 1 > c^x. 왜냐하면 . 우리 a는 선을 넘을 때까지 감소 합니다. 우리가 선 아래에 있으면 b다른 방향으로 교차 할 때까지 증가 합니다. 반복 할 때까지 b만족 a에 최선의 해결책을 기억 A하고 B우리가 가서. 그런 다음 인쇄하십시오.

pC는 지수 연산자를 제공하지 않기 때문에 a^x(for x>0) 의 간단한 재귀 구현입니다 .

의사 코드에서 :

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^x범위 내에서 표현 가능해야합니다 int. 그 한계가 너무 제한적인 경우의 서명이 p하찮게에 수정할 수 long p(long,int)double p(double,int), 그리고 mMlongdouble에 대한 수정없이, 각각 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

하스켈, 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

언 골프 드 :

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

하스켈, 132128 바이트

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

펄 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.