หมายเหตุเกี่ยวกับ N!


32

JE Maxfield พิสูจน์ทฤษฎีบทต่อไปนี้ (ดูDOI: 10.2307 / 2688966 ):

ถ้าAเป็นจำนวนเต็มบวกใด ๆ ที่มีตัวเลขmจะมีเลขจำนวนเต็มบวกNซึ่งนั่นคือตัวเลขmแรกของประกอบขึ้นเป็นจำนวนเต็มN!A

ท้าทาย

ความท้าทายของคุณจะได้รับค้นหากันA1N1

รายละเอียด

  • N!แสดงถึง factorialN!=123NของNN
  • ตัวเลขของในกรณีของเรามีความเข้าใจที่จะอยู่ในฐาน10A10
  • การส่งข้อมูลของคุณควรใช้กับมีเวลาและหน่วยความจำเพียงพอ เพียงแค่ใช้เช่นชนิด 32 บิตเพื่อแทนจำนวนเต็มไม่เพียงพอA1
  • คุณไม่จำเป็นต้องส่งออกอย่างน้อยเป็นไปได้ไม่มี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/A076219NA


26
ฉัน ... ทำไมเขาถึงพิสูจน์ทฤษฎีบทนั้น? เขาเพิ่งตื่นขึ้นมาหนึ่งวันแล้วพูดว่า "ฉันจะแก้ปัญหานี้!" หรือว่ามันมีจุดประสงค์
Magic Octopus Urn

11
@MagicOctopusUrn ไม่เคยจัดการกับนักทฤษฎีจำนวนมาก่อนใช่ไหม?
Brady Gilg

2
นี่คือข้อพิสูจน์ที่ทุกคนสนใจ
แยกผลไม้

คำตอบ:


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 พระบาทสมเด็จพระเจ้าอยู่หัวและ @xnor ซึ่งจะมีการป้อนข้อมูลเป็นตัวเลขและผลตอบแทนสำหรับการป้อนข้อมูลTrue บางคนคิดว่านี่เป็นเกมที่ยุติธรรม แต่โดยส่วนตัวแล้วฉันคิดว่ามันแปลก ๆ1

แต่มันมีค่าใช้จ่ายเพียง 3 ไบท์เท่านั้นที่จะรวมผลลัพธ์บูลีนแบบ icky ไว้ใน+()นั้นทำให้เรามีคำว่า "ดี" ที่สั้นลง:

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)

ลองออนไลน์!

ใช้เวลาสตริงเป็น input f('18')เช่น

เคล็ดลับที่นี่ก็คือ x.find(y) == 0x.startswith(y)อย่างแม่นยำเมื่อ

การandแสดงออกจะลัดวงจรที่`p`.find(a)มีผล0ทันทีที่`p`เริ่มต้นด้วยa; มิฉะนั้นจะประเมินเป็น-~f(a,n+1,p*n) , 1 + f(a,n+1,p*n)EST

ผลลัพธ์ที่ได้คือ1 + (1 + (1 + (... + 0))), ชั้นลึกเพื่อให้nn


ทางออกที่ดีโดยวิธีการ ฉันทำงานในวิธีเดียวกัน แต่คำนวณแฟคทอเรียลในการวนซ้ำแต่ละครั้ง การนำแนวทางของคุณไปใช้ช่วยฉันสักสองสามไบต์+1แล้ว
ปุย

1
สำหรับรุ่น True-for-1 ของคุณคุณสามารถทำให้เงื่อนไขกรณีเล็กลงโดยaใช้ตัวเลข
xnor

@xnor ฉันจะไม่ได้คิด `` -aใน-p`` ที่เป็นเคล็ดลับที่เรียบร้อย :)
ลินน์

หากการพิสูจน์ยังคงมีอยู่หาก N ถูก จำกัด ให้มีค่าเท่ากันโซลูชัน 45 ไบต์นี้จะส่งออกตัวเลขเสมอ
ลบเจ็ด

9

Brachylog , 3 5 ไบต์

ℕ₁ḟa₀

ลองออนไลน์!

รับอินพุตผ่านตัวแปรเอาต์พุตและเอาต์พุตผ่านตัวแปรอินพุต (วิธีอื่น ๆ มันก็พบว่าคำนำหน้าโดยพลการของการป้อนข้อมูลของปัจจัยซึ่งไม่ได้ค่อนข้างเป็นที่น่าสนใจ.) ไทม์ออกมาในกรณีทดสอบที่สองไปล่าสุดเมื่อวันที่ติ้ว แต่ไม่ดีในคนสุดท้าย ฉันใช้งานบน 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

คุณสามารถใช้ชื่ออักขระเดียวสำหรับฟังก์ชั่นบันทึกสองสามไบต์
ขนดก


6

05AB1E , 7 ไบต์

∞.Δ!IÅ?

ลองออนไลน์หรือตรวจสอบ - เกือบทุกกรณีทดสอบ ( 841หมดเวลาดังนั้นจะถูกยกเว้น)

คำอธิบาย:

∞.Δ      # Find the first positive integer which is truthy for:
   !     #  Get the factorial of the current integer
    IÅ?  #  And check if it starts with the input
         # (after which the result is output implicitly)

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)

ลองออนไลน์!

บันทึกสองสามไบต์โดยใช้วิธีการของ "อาคาร" ของลินน์แทนการคำนวณในแต่ละการวนซ้ำดังนั้นโปรดแก้ปัญหาของเธอด้วยเช่นกันหากคุณกำลังเร่งแก้ปัญหานี้


น่าเศร้าที่_Ês bU}f1Japt ไม่ทำงาน
ศูนย์รวมแห่งความไม่รู้

@EmbodimentofIgnorance ใช่ฉันก็มีเช่นกัน คุณสามารถลบพื้นที่หลังจากsนั้น
Shaggy

@EmbodimentofIgnorance คุณสามารถลบได้1หาก0สามารถส่งคืนn=1ได้
Shaggy

3 ไบต์น้อยกว่า:x=i=1n;f=n=>`${x*=++i}`.search(n)?f(n):i
vrugtehagel

@ vrugtehagel ที่ไม่สามารถใช้ซ้ำได้
Shaggy




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เพิ่มขึ้นเรื่อย ๆ ในขณะที่ ...
  • -.@ ไม่ใช่กรณีที่ ...
  • {.@ Elm แรกเป็นการจับคู่เริ่มต้นของ ...
  • E.&":สตริงย่อยทั้งหมดตรงกัน (หลังจาก stringfying ทั้งสองอาร์กิวเมนต์&":) ของการค้นหาอินพุตต้นฉบับใน ...
  • ! factorial ของจำนวนที่เราเพิ่มขึ้น

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

ฉันชอบการใช้ "จุดคงที่" เพื่อหลีกเลี่ยงการใช้เวลาแบบดั้งเดิม
โยนาห์


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 ไบต์ขอบคุณ Jo King

-3 ไบต์ขอบคุณ Chas Brown


@ Joeing ดีมากขอบคุณ
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..])

หากใครรู้วิธีหลีกเลี่ยงการนำเข้าที่ต้องการให้ฉันรู้


ดูเหมือนว่าคุณจะออก ยังไม่มีข้อความ! และไม่ ยังไม่มีข้อความตามความจำเป็น.
ข้อบกพร่อง
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.