Il margine è troppo stretto


30

Intorno all'anno 1637, Pierre de Fermat scrisse a margine della sua copia dell'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.

Sfortunatamente per noi, il margine è ancora troppo limitato per contenere la prova. Oggi scriveremo a margine un semplice programma che confermi la prova di input arbitrari.

La sfida

Vogliamo un programma per funzioni che danno un potere, lo separano in due coppie di due poteri che sono il più vicino possibile al potere. Vogliamo che il programma che esegue questa operazione sia il più piccolo possibile in modo da adattarsi ai margini.


Ingresso

La potenza e il numero di potenza: c,x

Vincoli: c > 2ex > 2

L'input può avvenire tramite argomenti di programma, argomenti di funzioni o dall'utente.

Produzione

Questa stringa esatta: " a^x + b^x < c^x" con a, b, c, e xsostituito con i loro valori interi letterali. ae bdeve essere scelto in modo che a^x + b^x < c^xe nessun altro valore di ao blo avvicinerebbe c^x. Anche:a>=b>0

L'output può avvenire tramite il valore di ritorno della funzione, stdout, salvato in un file o visualizzato sullo schermo.


Esempi:

> 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

A causa delle abilità di scrittura medie di Fermat, i caratteri non stampabili non sono ammessi. Vince il programma con il minor numero di caratteri.


Classifiche

Ecco uno snippet di stack per generare sia una classifica regolare che una panoramica dei vincitori per lingua.

Per assicurarti che la tua risposta venga visualizzata, ti preghiamo di iniziare la risposta con un titolo, utilizzando il seguente modello Markdown:

## Language Name, N characters

In alternativa, puoi iniziare con:

## Language Name, N bytes

dov'è Nla dimensione del tuo invio. Se si migliora il punteggio, è possibile mantenere i vecchi punteggi nel titolo, colpendoli. Per esempio:

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

Se si desidera includere più numeri nell'intestazione (ad es. Perché il punteggio è la somma di due file o si desidera elencare separatamente le penalità del flag dell'interprete), assicurarsi che il punteggio effettivo sia l' ultimo numero nell'intestazione:

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

Puoi anche rendere il nome della lingua un collegamento che verrà quindi visualizzato nello snippet della classifica:

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


1
Penso che dovrebbe essere a>=b>0o il tuo primo esempio non sarebbe valido. E perché dobbiamo mostrarlo <quando vuoi che sia <=?
flawr

@flawr Fixed :)
TheNumberOne

Andrebbe bene prendere gli argomenti nell'ordine opposto? Prima xallora c?
Reto Koradi,

@RetoKoradi Sure :)
TheNumberOne

Risposte:


9

Pyth, 38 byte

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

Accetta input in questo formato:

x
c

8

Matlab, 169 153 byte

Il punteggio può essere + -1 a seconda dei problemi irrisolti nei commenti =) Il punteggio rimane lo stesso. Questa è solo una ricerca di forza bruta per la (a,b)coppia migliore .

Abbastanza deludente: ho prima provato a sperimentare alcune cose "fantasiose" e poi ho capito che due semplici anelli nidificati per i loop sono molto più brevi ...

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)

Vecchia versione:

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

Rimuovere gli spazi in m = 0? Tuttavia, questo non ti avvicinerà alla mia risposta: -PP
Luis Mendo,

Inoltre, sembra che potresti rimuoverlo q=dalla definizione della funzione
Luis Mendo,

Non vedo la qvariabile utilizzata da nessuna parte. Puoi radere un paio di byte semplicemente facendo function f(c,x)e rimuovendo anche il punto e virgola.
Rayryeng - Ripristina Monica il

8

Mathematica, 79 95 80 byte

Questo potrebbe adattarsi al margine.

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

analisi

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

produzione


7

CJam, 51 46 43 byte

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

Questo programma completo legge la potenza, quindi la base da STDIN.

Provalo online nell'interprete CJam .


6

Matlab, 141 140 byte

Questo è codificato come funzione che visualizza il risultato in 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])

Esempio di utilizzo:

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

Oppure provalo online in Octave .

Grazie a @flawr per aver rimosso un byte.


Ho sempre evitato sprintfperché sembrava così complicato mentre in realtà non lo è! E mi sono dimenticato di bsxfunnuovo, quindi questa è una soluzione molto elegante. Mi piace soprattutto il modo in cui hai abusato dell'indicizzazione singola / doppia nell'ultimo argomento =) (Potresti rimuovere anche uno spazio lì!)
flawr

Grazie! Di solito lo uso dispanche io , tranne in Code Golf :-P
Luis Mendo,

Se si utilizza fprintfinvece di sprintf, non viene visualizzato "ans"
Jonas

@Jonas Ma stampa il risultato e quindi il prompt >>nella stessa riga, il che è un po 'strano
Luis Mendo,

Puoi usare fprintf, ma dovresti inserire un ritorno a capo manuale.
Rayryeng - Ripristina Monica il

5

CJam, 53 51 byte

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

Provalo online

Il formato di input è x c, ovvero il contrario dell'ordine utilizzato negli esempi.

Spiegazione:

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 caratteri

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

Di solito rispondo in MATLAB, ma poiché ci sono già due soluzioni in quella lingua, immagino che proverei un'altra lingua :)

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]

Codice non golfato con spiegazioni

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

Esecuzioni di esempio

Ho eseguito questo in 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

Provalo online!

http://ideone.com/tMjGdh

Se si desidera eseguire il codice, fare clic sul collegamento Modifica nella parte superiore, quindi modificare il parametro STDIN con due numeri interi separati da uno spazio. Il primo numero intero è ce il successivo è x. In questo momento, c=3e il x=3suo risultato è attualmente visualizzato.


3

Pyth, 53 52 50 byte

Ls^ReQbs[j" + "+R+\^eQ_Sh.MyZf<yT^FQ^UhQ2" < "j\^Q

Provalo online.

Prende come ingresso c,xdove cè il numero di destinazione ed xè la base.



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

Per adattare il codice al margine, ho inserito nuove righe e diviso una stringa letteralmente sopra: il codice golfizzato da contare / compilare è

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

La funzione faccetta ce xcome argomenti e produce il risultatostdout .

Spiegazione

Questa è una soluzione iterativa che zigzaga la linea definita da a^x + b^x = c^x. Iniziamo con a=ce b=1. Ovviamente, questo ci mette dalla parte sbagliata della linea, perché c^x + 1 > c^x. Diminuiamo afino a quando non attraversiamo la linea. Quando siamo sotto la linea, incrementiamo bfino a quando non la attraversiamo nella direzione opposta. Ripeti fino a quando si bincontra a, ricordando la soluzione migliore in Ae Bcome andiamo. Quindi stampalo.

p è una semplice implementazione ricorsiva di a^x (for x>0) poiché C non fornisce alcun operatore per l'espiazione.

In pseudo-codice:

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

limitazioni

c^xdeve essere rappresentabile nell'intervallo di int. Se tale limitazione è troppo restrittiva, la firma di ppotrebbe essere banalmente modificata in long p(long,int)o double p(double,int), e me Min longo doublerispettivamente, senza alcuna modifica af() .

Programma di test

Questo accetta ce xcome argomenti della riga di comando e stampa il risultato.

#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

Penso di aver giocato a golf il più possibile:

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]

Uso:

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]

Esempio di utilizzo: 7 # 3restituisce la stringa "6^3 + 5^3 < 7^3".


0

Perl 5, 119 byte

Una subroutine:

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

Utilizzare come ad es .:

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

0

Rubino, 125 byte

Funzione anonima. Crea un elenco di avalori, lo utilizza per costruire a,bcoppie, quindi trova il massimo per quelli che soddisfano i criteri e restituisce una stringa da lì.

->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}"}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.