マージンが狭すぎる


30

1637年ごろ、ピエール・ド・フェルマーは算数のコピーの余白に次のように書いた。

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.

残念ながら、証拠を含めるにはマージンがまだ狭すぎます。今日は、任意の入力の証明を確認する簡単なプログラムを余白に書き込みます。

チャレンジ

パワーを与えられ、それをできるだけパワーに近い2つのパワーの2つのペアに分離する関数のプログラムが必要です。マージンに収まるように、これを行うプログラムをできるだけ小さくする必要があります。


入力

電力と電力番号:cx

制約:c > 2およびx > 2

入力は、プログラムの引数、関数の引数、またはユーザーからのものです。

出力

この正確な文字列:「a^x + b^x < c^x」とabc、及び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

ヘッダーに複数の数字を含める場合(たとえば、スコアが2つのファイルの合計であるか、インタープリターフラグペナルティーを個別にリストする場合)、実際のスコアがヘッダーの最後の数字であることを確認します。

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

言語名をリンクにして、リーダーボードスニペットに表示することもできます。

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


1
そうでなければa>=b>0、最初の例は無効になると思います。そして、なぜ<あなたがそれをしたいときに表示する必要があり<=ますか?
-flawr

@flawr修正:)
TheNumberOne

反対の順序で引数を取ることは問題ないでしょうか?最初にx、それからc
レトコラディ

@RetoKoradi確かに:)
TheNumberOne

回答:


9

Pyth、38バイト

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

次の形式で入力を受け取ります。

x
c

8

Matlab、169 153バイト

コメントの未解決の問題に応じて、スコアは+ -1になる可能性があります=)スコアは同じままです。これは、最高の(a,b)ペアに対するブルートフォース検索です。

かなりがっかり:最初にいくつかの「派手な」ものを試した後、2つの単純なネストされた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
ルイスメンドー

また、q=関数定義から削除できるようです
ルイスメンドー

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]

output


7

CJam、51 46 43バイト

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

この完全なプログラムは、パワーを読み取り、次にSTDINからベースを読み取ります。

CJamインタプリタでオンラインで試してください。


6

Matlab、141 140バイト

これは、結果を標準出力に表示する関数としてコーディングされています。

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

または、Octaveでオンラインで試してください

1バイトを削除してくれた@flawrに感謝します。


sprintf実際にはそうではないのに、とても複雑に思えたので、私はいつも避けました!そして、私はbsxfunもう一度忘れていたので、それは非常にエレガントなソリューションです。最後の引数のシングル/ダブルインデックス作成を悪用した方法が特に気に入っています=)(そこにスペースを削除することもできます!)
flawr

ありがとう!私は通常disp、コードゴルフ以外で使用します:-P
ルイスメンドー

あなたが使用している場合はfprintf代わりにsprintf、それは「ANS」を表示しません
ジョナス

@Jonasしかし、結果とプロンプト>>を同じ行に出力しますが、少し奇妙です
ルイスメンドー

を使用できます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で答えますが、その言語にはすでに2つの解決策があるので、別の言語を試してみようと思います:)

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

コードを実行する場合は、上部近くの編集リンクをクリックしてから、スペースで区切られた2つの整数で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=cb=1。明らかに、それは私たちを行の間違った側に置きc^x + 1 > c^xます。a線を越えるまで減少します。線の下にいるときb、反対方向に交差するまで増分します。がb満たされるまで繰り返しa、最適なソリューションを覚えてAB私たちが行くように。次に印刷します。

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)、及びmMlongまたはdoubleにそのまま、それぞれf()

テストプログラム

これは受け入れcx、コマンドライン引数として、結果を出力します。

#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

ゴルフをしていない:

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.