Znajdź wielomian


20

Wiemy, że f jest wielomianem z nieujemnymi współczynnikami całkowitymi.

Biorąc pod uwagę f (1) i f (1 + f (1)), zwraca f . Możesz wypisać f jako listę współczynników, wielomian w formacie ASCII lub podobny.

Przykłady:

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
Losowe pytanie: jestem zbyt zmęczony, aby spróbować to udowodnić / obalić w tej chwili, ale czy jest zagwarantowane, że zawsze będziemy w stanie uzyskać odpowiedź od f(1)i f(1+f(1))?
HyperNeutrino

4
@HyperNeutrino inaczej nie podjąłbym tego wyzwania.
orlp

Racja, to dobra uwaga. Hm Interesujące, spróbuję to udowodnić jutro, ponieważ to bardzo interesujące. Dzięki za interesujące wyzwanie!
HyperNeutrino

1
Podstawa konwersji tag ma być wskazówką?
Thunda

9
Chociaż jest to urocza łamigłówka, myślę, że kod jest w zasadzie podstawową konwersją. Być może oszukany?
xnor

Odpowiedzi:


27

Galaretka , 3 bajty

‘b@

Wypróbuj online!

Zwraca wielomian jako listę współczynników.

Ponieważ wiemy, że wielomian ma nieujemne współczynniki liczb całkowitych, f (b) można interpretować jako „współczynniki wielomianu, przyjmowane jako zasada b cyfry ”, zgodnie z definicją zasady. Jest to uzależnione od warunku, że żaden ze współczynników nie przekracza lub nie jest równy b , ale wiemy o tym, ponieważ b jest o jeden większy niż suma współczynników (czyli f (1) ).

Program po prostu zwiększa pierwszy argument ( ), aby uzyskać 1 + f (1) , a następnie wywołuje atom konwersji bazowej ( b) z pierwszym argumentem jako bazą, a drugim argumentem jako liczbą (używając @do zamiany kolejności argumentów, ponieważ bzwykle bierze numer pierwszy, a drugi bazowy).

To było całkiem sprytne wyzwanie; dzięki, orlp!


13
Jak to możliwe na świecie
Thunda

Muszę nauczyć się galaretki ...
sagiksp

Dennis na pewno to zobaczy.
Erik the Outgolfer

6

Matematyka, 29 28 bajtów

Dzięki JungHwan Min za oszczędność 1 bajtu! (jak na ironię, zMax )

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

Czysta funkcja przyjmująca dwie nieujemne liczby całkowite i zwracająca listę współczynników (nieujemnych liczb całkowitych). #2~IntegerDigits~(#+1)byłby tym samym algorytmem, co w odpowiedzi Galaretki Doorknoba ; niestety, IntegerDigitsdławiki Mathematiki, gdy podstawa wynosi 1, stąd potrzeba dodatkowych bajtów Max[...,2].


2
Haha, niezły.
JungHwan Min

4

Python 2 , 38 bajtów

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

Wypróbuj online!


wyprowadza współczynniki oddzielone znakiem nowej linii

Przykładowe dane wyjściowe dla 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 bajtów

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

Kiedy formatuje się automatycznie, wygląda to tak:

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

\Operator podział podłogi


1

AHK , 63 bajty

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

AutoHotkey przypisuje liczby 1-n jako nazwy zmiennych dla przychodzących parametrów. Powoduje to pewne problemy, gdy próbujesz użyć tych funkcji, ponieważ myślisz, że masz na myśli dosłowną liczbę 1 zamiast zmiennej o nazwie 1. Najlepszym obejściem, jakie mogę znaleźć, jest przypisanie ich do różnych zmiennych.


1

Java, 53 bajty

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

Tworzy listę współczynników. Dzięki ovs za matematykę.

Wyrażenie musi być przypisane do a Function<Integer, IntConsumer>i wywołane najpierw applyprzez funkcję, a następnie acceptprzez int. Importowanie z Java 9 nie jest potrzebne 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 bajtów

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

Nie golfowany:

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.