El margen es demasiado estrecho

30

Alrededor del año 1637, Pierre de Fermat escribió al margen de su copia de la Aritmética:

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.

Desafortunadamente para nosotros, el margen sigue siendo demasiado estrecho para contener la prueba. Hoy, vamos a escribir en los márgenes un programa simple que confirma la prueba de entradas arbitrarias.

El reto

Queremos un programa para la función que, dado un poder, lo separe en dos pares de dos poderes que estén lo más cerca posible del poder. Queremos que el programa que hace esto sea lo más pequeño posible para que pueda encajar en los márgenes.


Entrada

La potencia y el número de potencia: c,x

Restricciones: c > 2yx > 2

La entrada puede ser a través de argumentos de programa, argumentos de función o del usuario.

Salida

Esta cadena exacta: " a^x + b^x < c^x" con a, b, c, y xreemplazado con sus valores enteros literales. ay bdebe elegirse de modo que a^x + b^x < c^xy ningún otro valor de ao blo acerque más c^x. También:a>=b>0

La salida puede ser a través del valor de retorno de la función, stdout, guardado en un archivo o mostrado en pantalla.


Ejemplos:

> 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

Debido a las habilidades de escritura promedio de Fermat, no se permiten caracteres no imprimibles. El programa con el menor número de caracteres gana.


Tablas de clasificación

Aquí hay un fragmento de pila para generar una tabla de clasificación regular y una descripción general de los ganadores por idioma.

Para asegurarse de que su respuesta se muestre, comience con un título, usando la siguiente plantilla de Markdown:

## Language Name, N characters

Alternativamente, puede comenzar con:

## Language Name, N bytes

¿Dónde Nestá el tamaño de su envío? Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:

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

Si desea incluir varios números en su encabezado (por ejemplo, porque su puntaje es la suma de dos archivos o desea enumerar las penalizaciones de la bandera del intérprete por separado), asegúrese de que el puntaje real sea el último número en el encabezado:

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

También puede hacer que el nombre del idioma sea un enlace que luego aparecerá en el fragmento de la tabla de clasificación:

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

El numero uno
fuente
1
Creo que debería ser a>=b>0o su primer ejemplo sería inválido. ¿Y por qué tenemos que mostrar <cuando quieres que sea <=?
flawr
@flawr Fixed :)
TheNumberOne
¿Estaría bien tomar los argumentos en el orden opuesto? Primero x, entonces c?
Reto Koradi
@RetoKoradi Sure :)
TheNumberOne

Respuestas:

9

Pyth, 38 bytes

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

Toma entrada en este formato:

x
c
orlp
fuente
8

Matlab, 169153 bytes

El puntaje puede ser + -1 dependiendo de los problemas no resueltos en los comentarios =) El puntaje permanece igual. Esta es solo una búsqueda de fuerza bruta para el mejor (a,b)par.

Bastante decepcionante: primero intenté experimentar con algunas cosas 'elegantes' y luego me di cuenta de que dos bucles anidados simples son mucho más cortos ...

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)

Versión antigua:

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])
falla
fuente
Eliminar los espacios en m = 0? Aún así, eso no te acercará a mi respuesta: -PP
Luis Mendo
Además, parece que podría eliminar q=de la definición de la función
Luis Mendo
No veo que la qvariable se use en ningún lado. Puede recortar un par de bytes simplemente haciendo function f(c,x)y quitando el punto y coma también.
rayryeng - Restablecer Monica
8

Mathematica, 79 95 80 bytes

Esto podría encajar en el margen.

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

Pruebas

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

salida

DavidC
fuente
7

CJam, 51 46 43 bytes

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

Este programa completo lee el poder, luego la base de STDIN.

Pruébelo en línea en el intérprete de CJam .

Dennis
fuente
6

Matlab, 141 140 bytes

Esto se codifica como una función que muestra el resultado en 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])

Ejemplo de uso:

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

O pruébelo en línea en Octave .

Gracias a @flawr por eliminar un byte.

Luis Mendo
fuente
Siempre evité sprintfporque parecía muy complicado, ¡pero en realidad no lo es! Y me olvidé una bsxfunvez más, así que esa es una solución muy elegante. En especial me gusta la forma en que abusó de la doble indexación / solo en el último argumento =) (usted podría quitar un espacio allí también)!
flawr
¡Gracias! Usualmente disptambién uso , excepto en Code Golf :-P
Luis Mendo
Si usa en fprintflugar de sprintf, no muestra "ans"
Jonas
@Jonas Pero imprime el resultado y luego el aviso >>en la misma línea, lo cual es un poco extraño
Luis Mendo
Puede usar fprintf, pero tendría que insertar un retorno de carro manual.
rayryeng - Restablecer Monica
5

CJam, 53 51 bytes

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

Pruébalo en línea

El formato de entrada es x c , que es el reverso del orden utilizado en los ejemplos.

Explicación:

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.
Reto Koradi
fuente
5

R, 139 caracteres

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)})
flodel
fuente
4

Python 2, 182 161 157 bytes

Normalmente respondo en MATLAB, pero como ya hay dos soluciones en ese idioma, me imagino que probaría otro idioma :)

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]

Código sin golf con explicaciones

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

Ejecuciones de ejemplo

Ejecuté esto en 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

Pruébalo en línea!

http://ideone.com/tMjGdh

Si desea ejecutar el código, haga clic en el enlace de edición cerca de la parte superior, luego modifique el parámetro STDIN con dos enteros separados por un espacio. El primer entero es cy el siguiente es x. En este momento, c=3y x=3su resultado se muestra actualmente.

rayryeng - Restablece a Monica
fuente
3

Pyth, 53 52 50 bytes

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

Pruébalo en línea.

Toma como entrada c,xdónde cestá el número objetivo y xes la base.

PurkkaKoodari
fuente
2

C, 175 bytes

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

Para ajustar el código en el margen, inserté nuevas líneas y dividí un literal de cadena arriba: el código de golf que se contará / compilará es

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 función ftoma cy xcomo argumentos, y produce el resultado en stdout.

Explicación

Esta es una solución iterativa que zigzaguea la línea definida por a^x + b^x = c^x. Comenzamos con a=cy b=1. Obviamente, eso nos pone del lado equivocado de la línea, porque c^x + 1 > c^x. Disminuimos ahasta que cruzamos la línea. Cuando estamos debajo de la línea, incrementamos bhasta que la cruzamos en la otra dirección. Repita hasta que se bencuentre a, recordando la mejor solución en Ay Bsobre la marcha. Luego imprímalo.

pes una implementación recursiva simple de a^x(parax>0 ) ya que C no proporciona ningún operador para la exponenciación.

En pseudocódigo:

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

Limitaciones

c^xdebe ser representable dentro del rango de int. Si esa limitación es demasiado restrictivo, la firma del ppodría ser modificado trivialmente a long p(long,int)o double p(double,int), y my Ma longo doublerespectivamente, sin ninguna modificación a f().

Programa de prueba

Esto acepta cy xcomo argumentos de línea de comandos, e imprime el resultado.

#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;
}
Toby Speight
fuente
1

Haskell, 120 bytes

Creo que he jugado golf tanto como puedo:

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

Sin golf:

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"
CR Drost
fuente
0

Haskell, 132128 bytes

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]

Ejemplo de uso: 7 # 3devuelve la cadena "6^3 + 5^3 < 7^3".

nimi
fuente
0

Perl 5, 119 bytes

Una subrutina:

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

Usar como por ejemplo:

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

Ruby, 125 bytes

Función anónima. Crea una lista de avalores, la usa para construir a,bpares, luego encuentra el máximo para los que se ajustan a los criterios y devuelve una cadena desde allí.

->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}"}
Tinta de valor
fuente