Trouver le polynôme

20

Nous savons que f est un polynôme à coefficients entiers non négatifs.

Étant donné f (1) et f (1 + f (1)), renvoyer f . Vous pouvez afficher f sous la forme d'une liste de coefficients, d'un polynôme au format ASCII ou similaire.

Exemples:

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
orlp
la source
1
Question aléatoire: je suis trop fatigué pour essayer de prouver / réfuter cela en ce moment, mais est-il garanti que nous serons toujours en mesure d'obtenir une réponse de f(1)et f(1+f(1))?
HyperNeutrino
4
@HyperNeutrino Je n'aurais pas fait ce défi autrement.
orlp
Bon, c'est un bon point. Hm. Intéressant, je vais essayer de le prouver demain parce que c'est très intéressant. Merci pour le défi intéressant!
HyperNeutrino
1
La balise de conversion de base est censée être un indice?
Thunda
9
Autant que c'est un joli puzzle, je pense que le code est essentiellement une conversion de base. Peut-être dupe?
2017

Réponses:

27

Gelée , 3 octets

‘b@

Essayez-le en ligne!

Renvoie le polynôme sous forme de liste de coefficients.

Puisque nous savons que le polynôme a des coefficients entiers non négatifs, f (b) peut être interprété comme «les coefficients du polynôme, pris comme chiffres de base b », par la définition d'une base. Ceci est soumis à la condition qu'aucun des coefficients ne dépasse ou n'est égal à b , mais nous savons que, parce que b est supérieur à la somme des coefficients (qui est f (1) ).

Le programme incrémente simplement le premier argument ( ) pour obtenir 1 + f (1) , puis appelle l'atome de conversion de base ( b) avec le premier argument comme base et le deuxième argument comme nombre (en utilisant @pour permuter l'ordre des arguments, car bprend généralement le numéro en premier et la seconde en base).

C'était un défi assez intelligent; merci orlp!

Poignée de porte
la source
13
Comment est-ce possible dans le monde
Thunda
J'ai besoin d'apprendre la gelée ...
sagiksp
Dennis doit voir celui-ci à coup sûr.
Erik the Outgolfer
6

Mathematica, 29 28 octets

Merci à JungHwan Min pour avoir économisé 1 octet! (ironiquement, avec un Max)

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

Fonction pure prenant deux entiers non négatifs et renvoyant une liste de coefficients (entiers non négatifs). #2~IntegerDigits~(#+1)serait le même algorithme que dans la réponse Jelly de Doorknob ; malheureusement, Mathematica IntegerDigitss'étouffe lorsque la base est égale à 1, d'où le besoin d'octets supplémentaires Max[...,2].

Greg Martin
la source
2
Haha, chouette.
JungHwan Min
4

Python 2 , 38 octets

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

Essayez-le en ligne!


affiche des coefficients séparés par une nouvelle ligne

Exemple de sortie pour 30, 3904800:

9
8
2
7
4

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

ovs
la source
3

VBA, 75 octets

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

Lorsqu'il formate automatiquement, il ressemble à ceci:

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

L' \opérateur est une division au sol

Ingénieur Toast
la source
1

AHK , 63 octets

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

AutoHotkey attribue les nombres 1-n comme noms de variables pour les paramètres entrants. Cela provoque des problèmes lorsque vous essayez d'utiliser ces fonctions, car il pense que vous voulez dire le nombre littéral 1 au lieu de la variable nommée 1. La meilleure solution de contournement que je puisse trouver est de les affecter à différentes variables.

Ingénieur Toast
la source
1

Java, 53 octets

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

Produit une liste de coefficients. Merci aux ovs pour les maths.

L'expression doit être affecté à un Function<Integer, IntConsumer>et a appelé d'abord applying la fonction, accepting la int. Aucune importation n'est nécessaire avec 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
David Conrad
la source
1

Lisp commun, 87 octets

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

Non 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)))))
zelcon
la source
0

C #, 62 octets

(a,b)=>{var r="";a++;while(b>0){r+=(b%a)+" ";b/=a;}return r;};
CHENGLIANG YE
la source