Kenar Boşluğu Çok Dar


30

1637 yılında Pierre de Fermat Arithmetica kopyasını yazdı:

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.

Maalesef, bizim için marj kanıtı içeremeyecek kadar dar. Bugün, marjlara keyfi girdiler için kanıtı doğrulayan basit bir program yazacağız.

Meydan okuma

Bir güç veren fonksiyon için bir program istiyoruz, onu mümkün olan en yakın güç olan iki güç iki çiftine ayırıyoruz. Bunu yapan programın mümkün olduğu kadar küçük olmasını istiyoruz, böylece sınırlara sığabiliyoruz.


Giriş

Güç ve güç numarası: c,x

Kısıtlamalar: c > 2vex > 2

Giriş, program argümanları, fonksiyon argümanları veya kullanıcıdan olabilir.

Çıktı

Bu tam dize: " a^x + b^x < c^x" ile a, b, c, ve xonların edebi tamsayı değerlerle değiştirilir. ave böyle seçilmeli a^x + b^x < c^xve başka hiçbir değere yaklaşılmamalı aveya byaklaşmamalıdır c^x. Ayrıca:a>=b>0

Çıktı, işlev dönüş değeri, stdout, bir dosyaya kaydedilmiş veya ekranda görüntülenebilir.


Örnekler:

> 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'ın ortalama yazma becerileri nedeniyle, yazdırılamayan karakterlere izin verilmez. En az karakter içeren program kazanır.


Liderler

Burada hem düzenli bir lider tablosu hem de kazananların dile göre genel bir bakış oluşturması için bir Stack Snippet'i var.

Cevabınızın göründüğünden emin olmak için, lütfen aşağıdaki Markdown şablonunu kullanarak cevabınızı bir başlık ile başlatın:

## Language Name, N characters

Alternatif olarak, ile başlayabilirsiniz:

## Language Name, N bytes

Gönderinizin Nbüyüklüğü nerede ? Puanınızı artırmak varsa, olabilir onları içinden vurarak, başlığa eski hesapları tutmak. Örneğin:

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

Başlığınıza birden fazla sayı eklemek istiyorsanız (örneğin, puanınız iki dosyanın toplamı olduğundan veya tercüman bayrağı cezalarını ayrı ayrı listelemek istediğiniz için), gerçek puanın başlıktaki son sayı olduğundan emin olun :

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

Dil adını, daha sonra büyük afiş snippet'inde görünecek bir bağlantı da yapabilirsiniz:

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


1
Bence öyle olmalı a>=b>0yoksa ilk örneğiniz geçersiz olur. Ve neden <olmasını istediğin zaman neden göstermek zorundayız <=?
kusur

@flawr Fixed :)
TheNumberOne

Argümanları ters sırada almak uygun olur mu? İlk önce xo zaman c?
Reto Koradi

@RetoKoradi Sure :)
TheNumberOne

Yanıtlar:


9

Pyth, 38 bayt

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

Bu formatta girdi alır:

x
c

8

Matlab, 169 153 bayt

Yorumlardaki çözülmemiş problemlere bağlı olarak puan + -1 olabilir =) Puan aynı kalır. Bu sadece en iyi (a,b)çift için bir kaba aramadır .

Oldukça hayal kırıklığı: İlk önce bazı 'fantezi' şeyleri denemeyi denedim ve sonra döngüler için yuvalanmış iki basit yolun çok daha kısa olduğunu farkettim ...

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)

Eski versiyon:

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

Boşlukları kaldırılsın m = 0mı? Yine de, bu benim cevabımı yaklaştırmayacak: -PP
Luis Mendo

Ayrıca, q=fonksiyon tanımlamasından kurtulabileceğiniz anlaşılıyor
Luis Mendo

Bir qyerde kullanılan değişkeni göremiyorum . function f(c,x)Yarı-kolonu da yaparak ve kaldırarak birkaç byte'ı tıraş edebilirsiniz .
rayryeng - Monica

8

Mathematica, 79 95 80 bayt

Bu sadece marja sığabilir.

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

Test yapmak

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

output


7

CJam, 51 46 43 bayt

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

Bu tam program gücü ve ardından STDIN'den gelen tabanı okur.

CJam tercümanında çevrimiçi olarak deneyin .


6

Matlab, 141 140 bayt

Bu, sonucu stdout'ta görüntüleyen fonksiyon olarak kodlanır.

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

Örnek kullanım:

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

Veya çevrimiçi olarak Octave'da deneyin .

Bir baytı kaldırmak için @flawr teşekkürler.


Her zaman kaçınıyorum, sprintfçünkü aslında çok da karmaşık bir durum değildi! Ve bir bsxfunkez daha unuttum , bu çok zarif bir çözüm. Özellikle son argümandaki tek / çift indekslemeyi kötüye kullanma şeklini seviyorum =) (Orada bir boşluğu da kaldırabilirsin!)
kusur

Teşekkürler! Genellikle disp, Code Golf dışında da kullanıyorum :-P
Luis Mendo

Eğer kullanırsanız fprintfyerine sprintf, bu "ans" göstermez
Jonas

@Jonas Ama sonuç ve ardından istemi yazdırır >>biraz tuhaf aynı çizgide,
Luis Mendo

Kullanabilirsiniz fprintf, ancak elle taşıma iadesi yapmanız gerekir.
rayryeng - Monica

5

CJam, 53 51 bayt

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

Çevrimiçi deneyin

Giriş formatı, x cörneklerde kullanılan sıranın tersidir.

Açıklama:

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 karakter

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 bayt

Genelde MATLAB'da cevap veririm, ancak bu dilde zaten iki çözüm olduğundan, başka bir dil deneyeceğimi düşündüm :)

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]

Açıklamaları ile Ungolfed kod

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

Örnek Çalıştırmalar

Bunu IPython'da yaptım:

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

Çevrimiçi deneyin!

http://ideone.com/tMjGdh

Kodu çalıştırmak istiyorsanız , üstteki düzenleme bağlantısına tıklayın , ardından STDIN parametresini bir boşlukla ayrılmış iki tamsayı ile değiştirin. İlk tamsayı, cdiğeri ise x. Şu anda c=3ve x=3ve sonucu şu anda görüntülenir.




2

C, 175 bayt

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

Kodu marja sığdırmak için yeni satırlar ekledim ve bir harf dizgesini böldüm - sayılacak / derlenecek golf kodu

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

İşlev argüman olarak falır cve xsonucu verir stdout.

açıklama

Bu, tarafından tanımlanan çizgiyi zikzaklayan yinelemeli bir çözümdür a^x + b^x = c^x. Biz başlamak a=cve b=1. Açıkçası, bu bizi hattın yanlış tarafına getiriyor, çünkü c^x + 1 > c^x. aÇizgiyi geçene kadar azalırız . Çizginin altındayken b, diğer tarafa geçene kadar artarız. Tekrarlayın kadar bkarşılar aen iyi çözümü hatırlayarak, Ave Bbiz gittikçe. Sonra yazdırın.

pbasit bir özyinelemeli uygulamasıdır a^x(içinx>0C'nin üs için herhangi bir operatör sağlamadığından ).

Sahte kodda:

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

Sınırlamalar

c^xaralığında gösterilebilir olmalıdır int. Bu sınırlama, çok sınırlayıcı ise, imza ptrivially için modifiye edilebilir long p(long,int)veya double p(double,int), ve mve Metmek longya da doubleherhangi bir değişiklik olmaksızın, sırasıyla f().

Test programı

Bu , komut satırı argümanları olarak kabul eder cve xsonucu yazdırır.

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

Galiba bunu olabildiğince golf oynadım:

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]

Kullanımı:

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

0

Haskell, 132 128 bayt

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]

Kullanım örneği: 7 # 3dizeyi döndürür "6^3 + 5^3 < 7^3".


0

Perl 5, 119 bayt

Bir alt yordam:

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

Örneğin kullanın:

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

0

Ruby, 125 bayt

Anonim işlev aDeğerler listesi oluşturur , a,bçiftler oluşturmak için kullanır , sonra ölçütlere uyan değerlerin maks değerini bulur ve buradan bir dize döndürür.

->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}"}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.