Примітка про N!


32

JE Max Maxfield довів наступну теорему (див. DOI: 10.2307 / 2688966 ):

Якщо A - будь-яке додатне ціле число, що має m цифр, існує додатне ціле число N таке, що перші m цифри N!являють собою ціле число A .

Виклик

Ваше завдання дається деякий знайти відповідне N \ geqslant 1 .A1N1

Деталі

  • N!являє собою факторN!=123N зN .
  • Цифри A в нашому випадку розуміються в базі 10 .
  • Ваша заявка повинна працювати для довільного 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

Найменше можливий N для кожного A можна знайти на https://oeis.org/A076219


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. Деякі люди вважають це чесною грою, але я особисто вважаю це трохи дивним.

Але це коштує всього 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), id est 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
Реалізація факторіального предиката в Брахілогу дещо заплутана, тому його можна використовувати обома способами з прийнятною ефективністю. Можна було б реалізувати набагато швидший алгоритм для обчислення факторіалу, але було б надзвичайно повільно працювати іншим способом (тобто знайти оригінальне число з факторіалу).
Фаталізувати

О, круто! Дивлячись на джерело, я не можу сказати, що все це робить, але я можу сказати, що ви вклали в нього багато хороших думок.
Непов’язана струна

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)!n10n


Вам більше не потрібно рахувати прапори, тому це 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, ви також можете видалити, 1якщо 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))
roofcat

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 байти завдяки Шасу Брауну


@JoKing приємно, дякую
HyperNeutrino


@ChasBrown дякую
HyperNeutrino

Я думаю, що те, f=що у вас є в заголовку, повинно зараховуватися до вашого рахунку.
mypetlion

@mypetlion Ви маєте рацію; дякую за те, що це зробив.
HyperNeutrino






0

Haskell, 89 байт

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

Якщо хтось знає, як обійти необхідний імпорт, дайте мені знати.


Здається, ви виведетеа не як потрібно. N!N
дефект
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.