Trova il polinomio


20

Sappiamo che f è un polinomio con coefficienti interi non negativi.

Data f (1) e F (1 + f (1)) ritorno f . È possibile generare f come un elenco di coefficienti, un polinomio formattato ASCII o simile.

Esempi:

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
Domanda casuale: sono troppo stanco per provare a dimostrare / confutare questo in questo momento, ma è garantito che saremo sempre in grado di ottenere una risposta da f(1)e f(1+f(1))?
HyperNeutrino,

4
@HyperNeutrino Non avrei fatto questa sfida altrimenti.
orlp

Bene, questo è un buon punto. Hm. Interessante, cercherò di dimostrarlo domani perché è molto interessante. Grazie per l'interessante sfida!
HyperNeutrino,

1
Il tag di conversione di base dovrebbe essere un suggerimento?
Thunda,

9
Per quanto si tratti di un puzzle carino, penso che il codice sia sostanzialmente una conversione di base. Forse ingannare?
xnor

Risposte:


27

Gelatina , 3 byte

‘b@

Provalo online!

Restituisce il polinomio come un elenco di coefficienti.

Poiché sappiamo che il polinomio ha coefficienti interi non negativi, f (b) può essere interpretato come "i coefficienti del polinomio, presi come cifre di base b ", dalla definizione di una base. Ciò è subordinato alla condizione che nessuno dei coefficienti superi o sia uguale a b , ma lo sappiamo, perché b è uno maggiore della somma dei coefficienti (che è f (1) ).

Il programma semplicemente incrementa il primo argomento ( ) per ottenere 1 + f (1) , quindi chiama l'atomo di conversione di base ( b) con il primo argomento come base e il secondo argomento come numero (usando @per scambiare l'ordine degli argomenti, poiché di bsolito prende il numero primo e il secondo base).

Questa è stata una vera sfida; grazie orlp!


13
Come nel mondo è possibile
Thunda,

Devo imparare la gelatina ...
sagiksp,

Dennis deve vederlo di sicuro.
Erik the Outgolfer,

6

Mathematica, 29 28 byte

Grazie a JungHwan Min per aver salvato 1 byte! (ironicamente, con a Max)

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

Funzione pura che prende due numeri interi non negativi e restituisce un elenco di coefficienti (numero intero non negativo). #2~IntegerDigits~(#+1)sarebbe lo stesso algoritmo della risposta Jelly di Doorknob ; sfortunatamente, Mathematica IntegerDigitssoffoca quando la base è uguale a 1, quindi la necessità di byte extra Max[...,2].


2
Ahah, bello.
JungHwan Min

4

Python 2 , 38 byte

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

Provalo online!


genera coefficienti separati newline

Esempio di output per 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 byte

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

Quando si formatta automaticamente, si presenta così:

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' \operatore ha una divisione del piano


1

AHK , 63 byte

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

AutoHotkey assegna i numeri 1-n come nomi di variabili per i parametri in arrivo. Provoca alcuni problemi quando si tenta di utilizzare quelli nelle funzioni perché pensa che intendi il numero letterale 1 invece della variabile denominata 1. La soluzione alternativa che posso trovare è assegnarle a variabili diverse.


1

Java, 53 byte

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

Emette un elenco di coefficienti. Grazie a ovs per la matematica.

L'espressione deve essere assegnata a Function<Integer, IntConsumer>e richiamata prima applydalla funzione, quindi acceptdalla int. Non sono necessarie importazioni 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 comune, 87 byte

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

Ungolfed:

(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 byte

(a,b)=>{var r="";a++;while(b>0){r+=(b%a)+" ";b/=a;}return r;};
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.