Finden Sie das Polynom


20

Wir wissen, dass f ein Polynom mit nicht negativen ganzzahligen Koeffizienten ist.

Gegeben f (1) und f (1 + f (1)) geben f zurück . Sie können f als eine Liste von Koeffizienten, ein ASCII-formatiertes Polynom oder ähnliches ausgeben .

Beispiele:

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
Zufällige Frage: Ich bin zu müde, um dies jetzt zu beweisen / zu widerlegen, aber ist garantiert, dass wir immer eine Antwort von f(1)und erhalten können f(1+f(1))?
HyperNeutrino

4
@HyperNeutrino Ich hätte diese Herausforderung sonst nicht gemacht.
Orlp

Richtig, das ist ein guter Punkt. Hm. Interessant, ich werde versuchen, das morgen zu beweisen, denn das ist sehr interessant. Danke für die interessante Herausforderung!
HyperNeutrino

1
Das Base-Conversion- Tag soll ein Hinweis sein?
Thunda

9
So sehr dies ein niedliches Puzzle ist, denke ich, dass der Code im Grunde eine Basisumwandlung ist. Möglicherweise betrogen?
30.

Antworten:


27

Gelee , 3 Bytes

‘b@

Probieren Sie es online!

Gibt das Polynom als Liste von Koeffizienten zurück.

Da wir wissen, dass das Polynom nicht negative ganzzahlige Koeffizienten hat, kann f (b) durch die Definition einer Basis als "die Koeffizienten des Polynoms, die als Stellen der Basis b genommen werden" interpretiert werden . Dies unterliegt der Bedingung, dass keiner der Koeffizienten b überschreitet oder gleich ist , aber wir wissen, dass b um eins größer ist als die Summe der Koeffizienten (die f (1) ist ).

Das Programm inkrementiert einfach das erste Argument ( ), um 1 + f (1) zu erhalten , und ruft dann das Basisumwandlungsatom ( b) mit dem ersten Argument als Basis und dem zweiten Argument als Zahl auf (wobei @die Reihenfolge der Argumente vertauscht wird). da in der bRegel die Nummer zuerst und die Basis Sekunde nimmt).

Dies war eine ziemlich clevere Herausforderung. danke orlp!


13
Wie um
alles

Ich muss Gelee lernen ...
sagiksp

Dennis muss das unbedingt sehen.
Erik der Outgolfer

6

Mathematica, 29 28 Bytes

Vielen Dank an JungHwan Min für das Speichern von 1 Byte! (ironischerweise mit a Max)

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

Reine Funktion, die zwei nichtnegative Ganzzahlen verwendet und eine Liste von (nichtnegativen Ganzzahl-) Koeffizienten zurückgibt. #2~IntegerDigits~(#+1)wäre der gleiche Algorithmus wie in Doorknobs Gelee-Antwort ; Leider IntegerDigitsdrosselt Mathematica, wenn die Basis gleich 1 ist, weshalb zusätzliche Bytes erforderlich sind Max[...,2].


2
Haha, schön.
JungHwan Min

4

Python 2 , 38 Bytes

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

Probieren Sie es online!


gibt durch Zeilenumbruch getrennte Koeffizienten aus

Beispielausgabe für 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

Wenn es automatisch formatiert wird, sieht es so aus:

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

Der \Betreiber ist eine Bodenteilung


1

AHK , 63 Bytes

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

AutoHotkey weist den eingehenden Parametern die Nummern 1-n als Variablennamen zu. Es verursacht einige Probleme, wenn Sie versuchen, diese in Funktionen zu verwenden, da es denkt, dass Sie die Literalzahl 1 anstelle der Variablen mit dem Namen 1 bedeuten . Die beste Lösung, die ich finden kann, besteht darin, sie verschiedenen Variablen zuzuweisen.


1

Java, 53 Bytes

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

Gibt eine Liste von Koeffizienten aus. Vielen Dank an Ovs für die Mathematik.

Der Ausdruck muss a zugewiesen Function<Integer, IntConsumer>und aufgerufen werden, indem zuerst applydie Funktion und dann acceptdie int. Für Java 9 sind keine Importe erforderlich 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

Common Lisp, 87 Bytes

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

(a,b)=>{var r="";a++;while(b>0){r+=(b%a)+" ";b/=a;}return r;};
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.