Найти полином

20

Мы знаем, что f - это многочлен с неотрицательными целыми коэффициентами.

Даны f (1) и f (1 + f (1)) возвращают f . Вы можете вывести f в виде списка коэффициентов, полинома в формате ASCII или аналогичного.

Примеры:

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
источник
1
Случайный вопрос: я слишком устал, чтобы пытаться доказать / опровергнуть это прямо сейчас, но гарантировано ли, что мы всегда сможем получить ответ, f(1)и f(1+f(1))?
HyperNeutrino
4
@HyperNeutrino Я бы не сделал этот вызов иначе.
orlp
Правильно, это хороший момент. Гектометр Интересно, я постараюсь доказать это завтра, потому что это очень интересно. Спасибо за интересный вызов!
HyperNeutrino
1
Базовое преобразование тег должен быть намеком?
Thunda
9
Как бы это ни было мило, я думаю, что код в основном является базовым преобразованием. Возможно обмануть?
xnor

Ответы:

27

Желе , 3 байта

‘b@

Попробуйте онлайн!

Возвращает полином в виде списка коэффициентов.

Поскольку мы знаем, что многочлен имеет неотрицательные целочисленные коэффициенты, f (b) может быть интерпретирована как «коэффициенты многочлена, взятые как цифры основания b », по определению основания. Это зависит от условия, что ни один из коэффициентов не превышает или равен b , но мы знаем это, потому что b на единицу больше, чем сумма коэффициентов (которая равна f (1) ).

Программа просто увеличивает первый аргумент ( ), чтобы получить 1 + f (1) , затем вызывает базовый атом преобразования ( b) с первым аргументом в качестве базового и вторым аргументом в качестве числа (используя, @чтобы поменять местами порядок аргументов, так bкак обычно занимает номер первое и базовое второе).

Это был довольно умный вызов; спасибо orlp!

Дверная ручка
источник
13
Как в мире это возможно
Thunda
Мне нужно научиться желе ...
sagiksp
Деннис должен увидеть это наверняка.
Эрик Outgolfer
6

Mathematica, 29 28 байт

Спасибо JungHwan Min за сохранение 1 байта! (как ни странно, с собой Max)

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

Чистая функция, принимающая два неотрицательных целых числа и возвращающая список (неотрицательных целых) коэффициентов. #2~IntegerDigits~(#+1)будет такой же алгоритм, как в ответе желе Doorknob's ; к сожалению, IntegerDigitsудары Mathematica, когда основание равно 1, отсюда и необходимость в дополнительных байтах Max[...,2].

Грег Мартин
источник
2
Ха-ха, хороший.
Юнг Хван Мин
3

VBA, 75 байт

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

Когда он автоматически форматируется, это выглядит так:

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

\Оператор пол разделяй

Инженер Тост
источник
1

AHK , 63 байта

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

AutoHotkey назначает номера 1-n в качестве имен переменных для входящих параметров. Это вызывает некоторые проблемы, когда вы пытаетесь использовать их в функциях, потому что думает, что вы имеете в виду буквальное число 1 вместо переменной с именем 1. Лучший обходной путь, который я могу найти, - это назначить их различным переменным.

Инженер Тост
источник
1

Java, 53 байта

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

Выводит список коэффициентов. Спасибо ovs за математику.

Выражение должно быть присвоено a Function<Integer, IntConsumer>и вызвано сначала с applyпомощью функции, затем acceptс помощью int. Нет необходимости в импорте с 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

Common Lisp, 87 байт

(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)))))
ZELCON
источник
0

C #, 62 байта

(a,b)=>{var r="";a++;while(b>0){r+=(b%a)+" ";b/=a;}return r;};
ЧЭНЛЬЯН Ю.Е.
источник