Маржа занадто вузька


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.

На жаль для нас, маржа все ще занадто вузька, щоб містити докази. Сьогодні ми збираємося записати в поля просту програму, яка підтверджує доказ для довільних даних.

Змагання

Ми хочемо, щоб програма для функції, яка дала потужність, розділяла її на дві пари двох потужностей, максимально наближених до потужності. Ми хочемо, щоб програма, яка робить це, була якомога меншою, щоб вона могла вписатися в поля.


Вхідні дані

Потужність і кількість енергії: 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

@flawr Виправлено :)
TheNumberOne

Було б нормально приймати аргументи у зворотному порядку? Спочатку x, потім c?
Рето Коради

@RetoKoradi Sure :)
TheNumberOne

Відповіді:


9

Pyth, 38 байт

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

Вводиться в такому форматі:

x
c

8

Матлаб, 169 153 байт

Оцінка може бути + -1, залежно від невирішених проблем у коментарях =) Оцінка залишається однаковою. Це просто жорстокий пошук найкращої (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
Луїс Мендо

Крім того, схоже, ви можете видалити q=з визначення функції
Луїс Мендо

Я не бачу, щоб qзмінна використовувалася ніде. Ви можете поголити пару байтів, просто зробивши function f(c,x)і видаливши напівколонку.
rayryeng

8

Математика, 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]

вихід



6

Матлаб, 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

Або спробуйте в Інтернеті в Octave .

Дякуємо @flawr, що видалив один байт.


Я завжди уникав, sprintfтому що це здавалося таким складним, хоча насправді це насправді немає! І я bsxfunще раз забув про це , так що це дуже елегантне рішення. Мені особливо подобається те, як ви зловживали одинарним / подвійним індексуванням в останньому аргументі =) (Ви також можете там видалити пробіл!)
flawr

Спасибі! Зазвичай я також використовую disp, за винятком Code Code :-P
Луїс Мендо

Якщо ви використовуєте fprintfзамість sprintf, він не відображає "ans"
Jonas

@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, але оскільки на цій мові вже є два рішення, я б спробував спробувати іншу мову :)

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

Для введення коду в поле, я вставив нові рядки і розділив рядок буквально вгорі - гольф-код, який потрібно рахувати / компілювати,

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і xяк аргументи, і виробляє результат на stdout.

Пояснення

Це ітеративне рішення, яке зигзагує лінію, визначену 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^xповинні бути представницькими в межах int. Якщо це обмеження є занадто обмежуючим, підпис 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

Безголовки:

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}"}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.