关于N的注解!


32

JE Maxfield证明了以下定理(请参见DOI:10.2307 / 2688966):

如果A是任何正整数具有m数字,存在一个正整数N使得第一m的数字N!构成整数A

挑战

你的挑战是给一些A1找到相应。N1

细节

  • N!代表阶乘N!=123NN
  • 在我们的情况下,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以前从未与数字理论家打过交道,对吗?
Brady Gilg

2
是任何人感兴趣的证明。
硕果累累

Answers:


14

Python 2,50个字节

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

在线尝试!

这是下面说明的47字节解决方案的一种变体,已调整为返回1input '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作为input 1有人认为这是公平的游戏,但我个人觉得有些奇怪。

但是,只需要3个字节即可将icky布尔结果包装在中+(),从而为我们提供了一个更短的“不错”的解决方案:

Python 2,48个字节

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

这是我先前的解决方案,返回0input '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我不会想到“ -ain -p”,这是一个巧妙的技巧:)
Lynn

如果在N限制为偶数的情况下证明仍然成立,则此45字节的解决方案将始终输出数字。

9

Brachylog3 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中阶乘谓词的实现有些复杂,因此可以以可接受的效率同时使用两种方式。一个人可以实现一个更快的算法来计算阶乘,但是以另一种方式运行(即从阶乘中找到原始数)会非常慢。
致命

哦,太酷了!从源头上看,我不知道它在做什么,但是我可以告诉你,它投入了很多思想。
不相关的字符串

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
Ruslan

您可以为该函数使用单个字符名称,并节省几个字节。
毛茸茸的



2

Pyth-8个字节

f!x`.!Tz

f              filter. With no second arg, it searches 1.. for first truthy
 !             logical not, here it checks for zero
  x    z       indexof. z is input as string
   `           string repr
    .!T        Factorial of lambda var

在线尝试


2

JavaScript,47岁 43字节

输出为BigInt。

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

在线尝试!

采用Lynn的“构建”阶乘方法而不是在每次迭代中进行计算,从而节省了一些字节,因此,如果您赞成这一解决方案,请也对她的解决方案予以支持。


可悲的是,_Ês bU}f1在Japt中不起作用
无知的体现

@EmbodimentofIgnorance,是的,我也有。您可以在之后删除空格s
毛茸茸的

@EmbodimentofIgnorance,您还可以删除可以返回的1if 。0n=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

Perl 6、23个字节

{+([\*](1..*).../^$_/)}

在线尝试!

说明

{                     }  # Anonymous code block
   [\*](1..*)            # From the infinite list of factorials
             ...         # Take up to the first element
                /^$_/    # That starts with the input
 +(                  )   # And return the length of the sequence

1

木炭,16字节

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

在线尝试!链接是详细版本的代码。说明:

⊞υ¹

1送到空白列表,以便从定义的产品开始。

W⌕IΠυθ

重复输入,但在列表产品的开头找不到输入时...

⊞υLυ

...将列表的长度推到自身。

I⊟υ

打印上次推送到列表的值。



1

J28 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))
ceilingcat



0

干净,88字节

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

在线尝试!

定义 $ :: Integer -> Integer

Data.Integer对IO 使用的任意大小整数。





0

Haskell,89个字节

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

如果有人知道如何绕过所需的导入,请告诉我。


看来你输出 ñ 并不是 ñ按要求。
flawr
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.