Encuentra el polinomio


20

Sabemos que f es un polinomio con coeficientes enteros no negativos.

Dada f (1) y f (1 + f (1)) de retorno f . Puede generar f como una lista de coeficientes, un polinomio con formato ASCII o similar.

Ejemplos:

f(1)  f(1+f(1))  f
0     0          0
1     1          1
5     75         2x^2 + 3
30    3904800    4x^4 + 7x^3 + 2x^2 + 8x + 9
1     1073741824 x^30

1
Pregunta aleatoria: estoy demasiado cansado para intentar probar / refutar esto en este momento, pero ¿está garantizado que siempre podremos obtener una respuesta de f(1)y f(1+f(1))?
HyperNeutrino

44
@HyperNeutrino No habría hecho este desafío de otra manera.
orlp

Bien, ese es un buen punto. Hm. Interesante, buscaré probar eso mañana porque eso es muy interesante. ¡Gracias por el interesante desafío!
HyperNeutrino

1
¿Se supone que la etiqueta de conversión de base es una pista?
Thunda

99
Por mucho que sea un lindo rompecabezas, creo que el código es básicamente una conversión de base. Posiblemente engañado?
xnor

Respuestas:


27

Jalea , 3 bytes

‘b@

Pruébalo en línea!

Devuelve el polinomio como una lista de coeficientes.

Como sabemos que el polinomio tiene coeficientes enteros no negativos, f (b) puede interpretarse como "los coeficientes del polinomio, tomados como dígitos de base b ", por la definición de una base. Esto está sujeto a la condición de que ninguno de los coeficientes exceda o sea igual a b , pero lo sabemos, porque b es uno mayor que la suma de los coeficientes (que es f (1) ).

El programa simplemente incrementa el primer argumento ( ) para obtener 1 + f (1) , luego llama al átomo de conversión de base ( b) con el primer argumento como base y el segundo argumento como número (usando @para intercambiar el orden de los argumentos, ya que bgeneralmente toma el número primero y la segunda base).

Este fue un desafío bastante inteligente; gracias orlp!


13
¿Cómo es esto posible?
Thunda

Necesito aprender gelatina ...
sagiksp

Dennis tiene que ver este seguro.
Erik the Outgolfer

6

Mathematica, 29 28 bytes

¡Gracias a JungHwan Min por guardar 1 byte! (irónicamente, con a Max)

#2~IntegerDigits~Max[#+1,2]&

Función pura que toma dos enteros no negativos y devuelve una lista de coeficientes (enteros no negativos). #2~IntegerDigits~(#+1)sería el mismo algoritmo que en la respuesta Jelly de Doorknob ; desafortunadamente, Mathematica se IntegerDigitsahoga cuando la base es igual a 1, de ahí la necesidad de bytes adicionales Max[...,2].


2
Jaja, linda.
JungHwan Min

4

Python 2 , 38 bytes

a,b=input()
while b:print b%-~a;b/=a+1

Pruébalo en línea!


produce coeficientes separados por nueva línea

Ejemplo de salida para 30, 3904800:

9
8
2
7
4

=> 9*x^0 + 8*x^1 + 2*x^2 + 7*x^3 + 4*x^4


3

VBA, 75 bytes

Sub f(b,n)
b=b+1
Do While n>0
s=n Mod b &" " &s
n=n\b
Loop
Debug.?s
End Sub

Cuando se formatea automáticamente, se ve así:

Sub f(b, n)
    b = b + 1
    Do While n > 0
        s = n Mod b & " " & s
        n = n \ b
    Loop
    Debug.Print s
End Sub

El \operador es una división de piso


1

AHK , 63 bytes

a=%1%
b=%2%
a+=1
While b>0
{s:=Mod(b,a) " "s
b:=b//a
}
Send,%s%

AutoHotkey asigna los números 1-n como nombres de variables para los parámetros entrantes. Causa algunos problemas cuando intenta usarlos en funciones porque cree que se refiere al número literal 1 en lugar de la variable llamada 1. La mejor solución que puedo encontrar es asignarlos a diferentes variables.


1

Java, 53 bytes

a->b->{while(b>0){System.out.println(b%-~a);b/=a+1;}}

Emite una lista de coeficientes. Gracias a los ovs por las matemáticas.

La expresión debe asignarse a a Function<Integer, IntConsumer>y llamarse primero applycon la función, luego acceptcon el int. No se necesitan importaciones con Java 9 jshell:

C:\Users\daico>jshell
|  Welcome to JShell -- Version 9-ea
|  For an introduction type: /help intro

jshell> Function<Integer, IntConsumer> golf =
        a->b->{while(b>0){System.out.println(b%-~a);b/=a+1;}}
golf ==> $Lambda$14/13326370@4b9e13df

jshell> golf.apply(30).accept(3904800)
9
8
2
7
4

1

Lisp común, 87 bytes

(defun p(x y)(multiple-value-bind(q m)(floor y (1+ x))(if(= 0 q)`(,m)`(,m ,@(p x q)))))

Sin golf:

(defun find-polynomial (f<1> f<1+f<1>>)
  (multiple-value-bind (q m)
      (floor f<1+f<1>> (1+ f<1>))
    (if (zerop q) `(,m)
      (cons m (find-polynomial f<1> q)))))

0

C #, 62 bytes

(a,b)=>{var r="";a++;while(b>0){r+=(b%a)+" ";b/=a;}return r;};
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.