Примечание о N!


32

Дж. Максфилд доказал следующую теорему (см. DOI: 10.2307 / 2688966 ):

Если A является любым положительным целым числом, имеющим m цифр, существует такое положительное целое число N , что первые m цифр N!представляют собой целое число A .

Вызов

Вашему вызову дан некоторый найдите соответствующий .A1N1

Детали

  • N!представляет факториал из .N!=123NN
  • В нашем случае цифры понимаются как основание .A10
  • Ваша заявка должна работать для произвольногоA1 учитывая достаточно времени и памяти. Простого использования, например, 32-битных типов для представления целых чисел недостаточно.
  • Вам не обязательно нужно вывести наименьшее возможное .N

Примеры

A            N
1            1
2            2
3            9
4            8
5            7
6            3
7            6
9           96
12           5
16          89
17          69
18          76
19          63
24           4
72           6
841      12745
206591378  314

Наименьшее возможное для каждого можно найти по адресу https://oeis.org/A076219.NA


26
Я ... почему он доказал эту теорему? Он проснулся однажды и сказал: «Я решу это!» или это послужило цели?
Волшебная Урна Осьминога

11
@MagicOctopusUrn Никогда раньше не занимался теорией чисел?
Брейди Гилг

2
Вот доказательство того, что кому-то интересно.
Esolanging Fruit

Ответы:


14

Python 2 , 50 байт

f=lambda a,n=2,p=1:(`p`.find(a)and f(a,n+1,p*n))+1

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

Это вариация 47-байтового решения, описанного ниже, с поправкой на возврат 1для ввода '1'. (А именно, мы добавляем 1к полному выражению, а не к рекурсивному вызову, и начинаем считать, n==2чтобы удалить один слой глубины, балансируя результат для всех не '1'входных данных.)

Python 2 , 45 байт (карты 1 в True)

f=lambda a,n=2,p=1:`-a`in`-p`or-~f(a,n+1,p*n)

Это еще один вариант, @Jo King и @xnor, который принимает входные данные как число и возвращает их Trueдля ввода 1. Некоторые люди думают это честная игра, но я лично нахожу ее немного странной.

Но для обтекания результата icky Boolean требуется всего 3 байта +(), что дает нам более короткое «хорошее» решение:

Python 2 , 48 байт

f=lambda a,n=2,p=1:+(`-a`in`-p`)or-~f(a,n+1,p*n)

Это мое предыдущее решение, которое возвращает 0для ввода '1'. Это было бы справедливо, если бы вопрос касался неотрицательногоN .

Python 2 , 47 байт (неверно)

f=lambda a,n=1,p=1:`p`.find(a)and-~f(a,n+1,p*n)

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

Принимает строку в качестве ввода, например f('18') .

Хитрость в том, что x.find(y) == 0именно когдаx.startswith(y) .

and-Expression будет короткое замыкание на `p`.find(a)с результатом , 0как только `p`начинается с a; в противном случае он будет оцениваться -~f(a,n+1,p*n), то есть1 + f(a,n+1,p*n) .

Конечный результат 1 + (1 + (1 + (... + 0))), nслои глубокие, так n.


Хорошее решение, кстати. Я работал над тем же методом, но вычислял факториал на каждой итерации; В +1любом случае реализация вашего подхода позволила мне сэкономить несколько байт .
Лохматый

1
Для вашей версии True-for-1 вы можете сократить условие базового случая, приняв aчисло.
xnor

@xnor Я бы не подумал о `` -aв -p``, это хитрый трюк :)
Линн

Если доказательство все еще верно, если N ограничено четными значениями, то это 45-байтовое решение всегда будет выводить число.
минус семь

9

Брахилог , 3 5 байт

ℕ₁ḟa₀

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

Принимает ввод через свою выходную переменную и выводит через свою входную переменную. (С другой стороны, он просто находит произвольные префиксы факториала входных данных, что не так интересно.) Время ожидания второго контрольного примера на TIO, но хорошо на последнем . На момент написания этой статьи я запускал его на 841 на своем ноутбуке в течение нескольких минут, и он пока не выдал ответ, но я в это верю.

         The (implicit) output variable
   a₀    is a prefix of
  ḟ      the factorial of
         the (implicit) input variable
ℕ₁       which is a positive integer.

Поскольку единственный вход ḟa₀не работает для 1, а 1 является положительным префиксом 1! = 1,1|ḟa₀ работает так же хорошо.

Кроме того, на момент этого редактирования 841 работал почти три часа и до сих пор не дал результатов. Я предполагаю, что вычисление факториала каждого целого числа от 1 до 12745 не совсем быстрое.


2
Реализация факториального предиката в Brachylog немного запутана, так что его можно использовать в обоих направлениях с приемлемой эффективностью. Можно было бы реализовать гораздо более быстрый алгоритм для вычисления факториала, но он был бы крайне медленным, если выполнял бы другой путь (т.е. находил исходное число из факториала).
Fatalize

О, круто! Глядя на источник для этого, я не могу сказать, что все это делает, но я могу сказать, что вы вложили много хорошего в это.
Несвязанная строка

7

C ++ (gcc) , 107 95 байт, используя-lgmp и-lgmpxx

Спасибо людям в комментариях за указание на некоторые глупые ошибки.

#import<gmpxx.h>
auto f(auto A){mpz_class n,x=1,z;for(;z!=A;)for(z=x*=++n;z>A;z/=10);return n;}

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

Вычисляет n!умножением (n1)!по n , затем многократно делит его на 10 пока оно не станет больше, чем переданное целое число. В этот момент цикл завершается, если факториал равен переданному целому числу или переходит к следующему N противном случае.


Вам больше не нужно считать флаги, так что это 107байты.
AdmBorkBork

Зачем вам вторая точка с запятой раньше return?
Руслан

Вы можете использовать одно символьное имя для функции, сохранив пару байтов.
лохматый




2

JavaScript, 47 43 байта

Вывод как BigInt.

n=>(g=x=>`${x}`.search(n)?g(x*++i):i)(i=1n)

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

Сохраните несколько байтов, приняв подход Линн «строить» факториал, а не вычислять его на каждой итерации, поэтому, пожалуйста, также проголосуйте за ее решение, если вы голосуете против этого.


К сожалению, _Ês bU}f1в Japt не работает
Воплощение неведения

@EmbodimentofIgnorance, да, у меня это тоже было. Вы можете удалить пространство после s.
Лохматый

@EmbodimentofIgnorance, вы также можете удалить 1if 0для n=1.
Лохматый

На 3 байта меньше:x=i=1n;f=n=>`${x*=++i}`.search(n)?f(n):i
vrugtehagel

@ Vrugtehagel, это не будет многоразовым.
Лохматый


1

Желе , 16 байт

‘ɼ!³;D®ß⁼Lḣ@¥¥/?

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

объяснение

‘ɼ                | Increment the register (initially 0)
  !               | Factorial
   ³;             | Prepend the input
     D            | Convert to decimal digits
        ⁼   ¥¥/?  | If the input diguts are equal to...
         Lḣ@      | The same number of diguts from the head of the factorial
      ®           | Return the register
       ß          | Otherwise run the link again


1

Древесный уголь , 16 байт

⊞υ¹W⌕IΠυθ⊞υLυI⊟υ

Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:

⊞υ¹

Нажмите 1на пустой список, чтобы он начинался с определенного продукта.

W⌕IΠυθ

Повторите, пока вход не может быть найден в начале произведения списка ...

⊞υLυ

... подтолкнуть длину списка к себе.

I⊟υ

Выведите последнее значение, помещенное в список.



1

J , 28 22 байта

-6 байт благодаря FrownyFrog

(]+1-0{(E.&":!))^:_&1x

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

оригинальный ответ J , 28 байт

>:@]^:(-.@{.@E.&":!)^:_ x:@1

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

  • >:@] ... x:@1 начиная с повышенной точности 1 , продолжайте увеличивать его, пока ...
  • -.@ дело не в том, что ...
  • {.@ первый вяз - стартовый матч ...
  • E.&":все подстроки совпадают (после строкового определения обоих аргументов &":) поиска исходного ввода в ...
  • ! факториал числа, которое мы увеличиваем

(]+1-0{(E.&":!))^:_&1x
FrownyFrog

Мне нравится это использование «фиксированной точки», чтобы избежать традиционного времени.
Иона

1

C (gcc) -lgmp, 161 байт

#include"gmp.h"
f(a,n,_,b)char*a,*b;mpz_t n,_;{for(mpz_init_set_si(n,1),mpz_init_set(_,n);b=mpz_get_str(0,10,_),strstr(b,a)-b;mpz_add_ui(n,n,1),mpz_mul(_,_,n));}

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


Предлагаю strstr(b=mpz_get_str(0,10,_),a)-b;mpz_mul(_,_,n))mpz_add_ui(n,n,1)вместоb=mpz_get_str(0,10,_),strstr(b,a)-b;mpz_add_ui(n,n,1),mpz_mul(_,_,n))
floorcat

1

Python 3 , 63 байта

f=lambda x,a=2,b=1:str(b).find(str(x))==0and a-1or f(x,a+1,b*a)

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

-24 байта благодаря Джо Кингу

-3 байта благодаря Часу Брауну


@ Отлично, спасибо
HyperNeutrino


@ChasBrown спасибо
HyperNeutrino

Я думаю, f=что то, что у вас есть в заголовке, должно засчитываться в счет ваших битов.
mypetlion

@mypetlion Вы правы; спасибо, что поймали это.
HyperNeutrino


0

Чисто , 88 байт

import StdEnv,Data.Integer,Text
$a=hd[n\\n<-[a/a..]|startsWith(""<+a)(""<+prod[one..n])]

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

Определяет $ :: Integer -> Integer.

Использует Data.Integerпроизвольные целые числа размера для ввода-вывода.





0

Haskell, 89 байт

import Data.List
a x=head$filter(isPrefixOf$show x)$((show.product.(\x->[1..x]))<$>[1..])

Если кто-нибудь знает, как обойти требуемый импорт, дайте мне знать.


Кажется, вы выводите N! и нет Nкак требуется.
flawr
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.