ตัวเลขนี้เป็นปัจจัยหรือไม่


38

งาน

รับหมายเลขธรรมชาติเป็นอินพุตงานของคุณคือส่งออกค่าจริงหรือเท็จตามว่าอินพุตเป็นปัจจัยของจำนวนธรรมชาติใด ๆ คุณสามารถสันนิษฐานได้ว่าจำนวนการป้อนข้อมูลจะเป็นในช่วงของตัวเลขการสนับสนุนจากภาษาของคุณ แต่คุณต้องไม่ละเมิดประเภทจำนวนพื้นเมืองทำเป็นปัญหา

มาตรฐานช่องโหว่ใช้


อินพุต

คุณจะได้รับหมายเลขธรรมชาติ (ประเภทIntegerหรือคล้ายกัน)

คุณสามารถป้อนข้อมูลในแบบที่คุณต้องการยกเว้นสมมติว่าเป็นตัวแปรที่กำหนดไว้ล่วงหน้า อนุญาตให้อ่านจากไฟล์คอนโซลกล่องโต้ตอบ ( prompt) กล่องอินพุตและอื่น ๆ อนุญาตให้ป้อนค่าเป็นอาร์กิวเมนต์ของฟังก์ชันได้เช่นกัน!


เอาท์พุต

โปรแกรมของคุณควรส่งออกค่าจริงหรือเท็จตามว่าหมายเลขอินพุตเป็นปัจจัยของจำนวนธรรมชาติใด ๆ

ตรวจสอบให้แน่ใจว่าค่าความจริง / เท็จของคุณสอดคล้องกับอินพุตทั้งหมดเช่นถ้าคุณใช้คู่ 1 และ 0 เพื่อแสดงค่าความจริงและเท็จตามลำดับจากนั้นโปรแกรมของคุณจะต้องแสดงผลลัพธ์ 1 สำหรับอินพุตทั้งหมดที่ควรมีค่าจริงและ 0 สำหรับ อินพุตทั้งหมดที่ควรมีค่าเป็นเท็จ

คุณสามารถเอาท์พุทในแบบที่คุณต้องการยกเว้นการเขียนลงในตัวแปร อนุญาตให้เขียนไฟล์คอนโซลหน้าจอและอื่น ๆ ได้ ฟังก์ชั่นreturnได้รับอนุญาตเช่นกัน!

โปรแกรมของคุณจะต้องไม่สร้างข้อผิดพลาดสำหรับการป้อนข้อมูลใด ๆ !


กรณีทดสอบ

Input     Output

1         Truthy (0! or 1!)
2         Truthy (2!)
3         Falsey
4         Falsey
5         Falsey
6         Truthy (3!)
7         Falsey
8         Falsey
24        Truthy (4!)
120       Truthy (5!)

เกณฑ์การชนะ

นี่คือดังนั้นโค้ดที่สั้นที่สุดในหน่วยไบต์ชนะ!


2
หากภาษารองรับเฉพาะตัวเลขในช่วง {0,1} ฉันจะคาดหวังได้ว่าอินพุตจะเป็น1อย่างไร
eush77


1
คือ 4! ความจริง?
tuskiomi

คำถาม: ทำไมคุณไม่ใช้ค่าเริ่มต้นของ I / O
CalculatorFeline

คำตอบ:


37

Brachylogขนาด 1 ไบต์

ลองออนไลน์!

คำอธิบาย

เป็นบิวด์อินที่อ้างถึงความสัมพันธ์ต่อไปนี้: เอาต์พุตของมันคือแฟคทอเรียลของอินพุต เราเพียงแค่ให้มันตั้งค่าเอาท์พุทและดูว่ามันประสบความสำเร็จหรือไม่กับอินพุตตัวแปร


6
@BetaDecay นั่นเป็นเพราะมันเป็นวิธีที่จะพิมพ์ใน Prolog (นี้จะทำอย่างไรกับความจริงที่ว่าtrue.เป็นคำสั่งและtrueไม่ได้เป็น)
Fatalize

6
มันเป็นวิธีแก้ปัญหาเล็กน้อย แต่ก็ฉลาดเพราะวิธีการทำงานของอารัมภบท
แยกผลไม้


17
ภาษาที่กำหนดเองเป็นครั้งแรกจากนั้นการเข้ารหัสที่กำหนดเอง ... การตีกอล์ฟผิดพลาด เราได้บ่อนทำลายปัญหาความสนุกเหล่านี้อย่างครบถ้วนตั้งแต่แรก
Alexander

13
@Alexander การเข้ารหัสที่กำหนดเองไม่เกี่ยวข้องกับปัญหาใด ๆ ที่คุณกำลังพูดถึง ฉันสามารถใช้การเข้ารหัส "ที่มีอยู่" ใด ๆ แทนและมันจะยังคงเป็น 1 ไบต์ มันจะอ่านได้น้อยลง
ทำให้เสียชีวิต


19

เยลลี่ขนาด 4 ไบต์

Œ?IE

ไม่ใช่คำตอบของเยลลี่ที่สั้นที่สุด แต่ค่อนข้างมีประสิทธิภาพ

ลองออนไลน์!

มันทำงานอย่างไร

Œ?IE  Main link. Argument: n

Œ?    Yield the n-th permutation of the positive integers, without the sorted tail.
      For 120, this yields [5, 4, 3, 2, 1], the tail being [6, 7, 8, ...].
  I   Increments; compute all forward differences.
      For 120, this yields [-1, -1, -1, -1].
   E  Check if all differences are equal.

2
เพราะเรารหัสนักกอล์ฟใส่ใจเกี่ยวกับประสิทธิภาพ
Okx

12
มันเป็นการปรับปรุงความซับซ้อนอย่างมากในราคาหนึ่งไบต์และเป็นการใช้งานที่ชาญฉลาดในตัวหากฉันอาจบอกตัวเองได้ ¯ \ _ (ツ) _ / ¯
Dennis

สิ่งที่น่าสนใจก็คือผลตอบแทนจริงสำหรับ 0 ในขณะที่คำตอบ 3 ไบต์ของ @ LeakyNun ในขณะที่ช้าลงมากโดยทั่วไปแล้วคืนค่าเท็จให้เป็น 0 อย่างถูกต้องจำเป็นต้องใช้ไบต์พิเศษเพิ่มเติมเพื่อคืนค่าเท็จเป็น 0 ในคำตอบ
Deadcode

@Deadcode การตรวจสอบสำหรับ 0 จะต้องมีสองไบต์พิเศษ หากไม่แน่ใจว่าคำจำกัดความของ OP ของ "หมายเลขธรรมชาติ" มี 0 หรือไม่ กรณีทดสอบทำไม่ได้ ...
เดนนิส

17

ECMAScript Regex, 733+ 690+ 158 119 118 (117🐌)ไบต์

ความสนใจใน regex ของฉันได้รับการกระตุ้นด้วยความแข็งแรงที่ได้รับการปรับปรุงใหม่หลังจากไม่มีการใช้งานนานกว่า4½ปี ดังนั้นฉันจึงค้นหาชุดตัวเลขและฟังก์ชั่นที่เป็นธรรมชาติมากขึ้นเพื่อให้ตรงกับ regexes ECMAScript ที่ยังไม่เสร็จปรับปรุงการพัฒนาเอนจิ้น regex ของฉันและเริ่มแปรงบน PCRE ด้วย

ฉันรู้สึกทึ่งกับความแปลกใหม่ของการสร้างฟังก์ชันทางคณิตศาสตร์ใน ECMAScript regex ปัญหาจะต้องได้รับการทาบทามจากมุมมองที่แตกต่างกันอย่างสิ้นเชิงและจนกว่าจะได้ข้อมูลเชิงลึกที่สำคัญทราบว่าพวกเขาสามารถแก้ไขได้ทั้งหมด มันบังคับให้มีเครือข่ายที่กว้างขึ้นมากในการค้นหาว่าคุณสมบัติทางคณิตศาสตร์ใดที่สามารถใช้เพื่อสร้างปัญหาเฉพาะที่แก้ไขได้

การจับคู่หมายเลขแฟคทอเรียลเป็นปัญหาที่ฉันไม่ได้คิดแม้แต่ในการแก้ปัญหาในปี 2014 - หรือถ้าฉันทำได้เพียงชั่วขณะหนึ่งก็ให้ไล่ออกเพราะไม่น่าจะเป็นไปได้ แต่เมื่อเดือนที่แล้วฉันรู้ว่ามันสามารถทำได้

เช่นเดียวกับการโพสต์ regex ECMA อื่น ๆ ของฉันฉันจะให้คำเตือน:ฉันขอแนะนำให้เรียนรู้วิธีการแก้ปัญหาทางคณิตศาสตร์ที่ไม่ธรรมดาใน ECMAScript regex มันเป็นการเดินทางที่น่าสนใจสำหรับฉันและฉันไม่ต้องการที่จะทำลายมันสำหรับใครก็ตามที่อาจต้องการลองด้วยตัวเองโดยเฉพาะผู้ที่มีความสนใจในทฤษฎีจำนวน ดูโพสต์ก่อนหน้านี้สำหรับรายการปัญหาที่แนะนำติดแท็กสปอยเลอร์ติดต่อกันเพื่อแก้ไขทีละรายการ

ดังนั้นไม่ได้อ่านเพิ่มเติมใด ๆ ถ้าคุณไม่ต้องการบางขั้นสูงมายากล regex เอกมากมายสำหรับคุณ หากคุณต้องการถ่ายภาพเพื่อหาเวทมนตร์นี้ด้วยตัวเองฉันขอแนะนำให้เริ่มต้นด้วยการแก้ปัญหาบางอย่างใน ECMAScript regex ดังที่อธิบายไว้ในโพสต์ที่ลิงก์ด้านบน

นี่คือความคิดของฉัน:

ปัญหาเกี่ยวกับการจับคู่ชุดหมายเลขนี้เช่นเดียวกับคนอื่น ๆ ส่วนใหญ่คือใน ECMA โดยปกติแล้วจะไม่สามารถติดตามการเปลี่ยนแปลงของตัวเลขสองตัวในวง บางครั้งพวกเขาสามารถ multiplexed (เช่นพลังของฐานเดียวกันสามารถเพิ่มเข้าด้วยกันอย่างไม่น่าสงสัย) แต่ขึ้นอยู่กับคุณสมบัติของพวกเขา ดังนั้นฉันจึงไม่สามารถเริ่มต้นด้วยหมายเลขอินพุตและหารด้วยการเพิ่มเงินปันผลที่เพิ่มขึ้นเรื่อย ๆ จนกว่าจะถึง 1 (หรืออย่างน้อยฉันก็คิดว่าอย่างน้อย)

จากนั้นฉันก็ทำการวิจัยเกี่ยวกับความหลากหลายของปัจจัยสำคัญในจำนวนแฟคทอเรียลและเรียนรู้ว่ามีสูตรสำหรับสิ่งนี้ - และมันเป็นสิ่งที่ฉันสามารถนำไปใช้ในระบบ ECMA regex!

หลังจาก stewing มันในขณะที่และสร้าง regexes อื่น ๆ ในระหว่างนี้ฉันเอางานเขียน regex factorial ใช้เวลาหลายชั่วโมง แต่สุดท้ายก็ทำงานได้ดี อัลกอรึทึมสามารถคืนค่าแฟกทอเรียลในรูปแบบของการแข่งขันได้ ไม่มีการหลีกเลี่ยงได้แม้แต่; โดยธรรมชาติของวิธีการที่จะต้องดำเนินการใน ECMA มันเป็นสิ่งจำเป็นที่จะคาดเดาสิ่งที่ปัจจัยผกผันคือก่อนที่จะทำอะไรอย่างอื่น

ข้อเสียคืออัลกอริธึมนี้ทำมานานมากสำหรับ regex ... แต่ฉันยินดีที่มันต้องใช้เทคนิคที่ใช้ใน regex คูณ 651 byte ของฉัน (อันที่ลงท้ายด้วยล้าสมัยเพราะวิธีการที่แตกต่างกันสำหรับ 50 byte regex) ฉันได้รับหวังว่าปัญหาจะปรากฏขึ้นที่ต้องใช้เคล็ดลับนี้: การดำเนินการกับตัวเลขสองซึ่งเป็นพลังทั้งสองของฐานเดียวกันในวงโดยการเพิ่มพวกเขาเข้าด้วยกันอย่างไม่น่าสงสัยและแยกพวกเขาในแต่ละรอบ

แต่เนื่องจากความยากลำบากและความยาวของอัลกอริทึมนี้ฉันจึงใช้ lookaheads ระดับโมเลกุล (จากรูปแบบ(?*...)) เพื่อใช้งาน นั่นคือคุณลักษณะที่ไม่ได้อยู่ใน ECMAScript หรือเครื่องมือหลัก regex อื่น ๆ แต่อย่างหนึ่งที่ผมได้นำมาใช้ในเครื่องยนต์ของฉัน หากไม่มีการจับภาพใด ๆ ภายในโมเลกุลลุดเฮดก็สามารถใช้งานได้เทียบเท่ากับอะตอมลีดเดอร์อะตอม แต่ด้วยการจับมันอาจทรงพลังมาก เครื่องยนต์จะย้อนกลับไปที่ lookahead และสิ่งนี้สามารถใช้ในการคาดเดาค่าซึ่งวนรอบผ่านความเป็นไปได้ทั้งหมด (สำหรับการทดสอบในภายหลัง) โดยไม่ต้องใช้อักขระของอินพุต การใช้มันสามารถทำให้เกิดการใช้ที่สะอาดยิ่งขึ้น (Lookbe-length lookbehind เป็นอย่างน้อยที่สุดเท่าที่เท่าเทียมกันในการใช้พลังงานกับโมเลกุล lookahead แต่หลังมีแนวโน้มที่จะทำให้การใช้งานตรงไปตรงมาและสง่างามมากขึ้น)

ดังนั้นความยาว 733 และ 690 ไบต์จึงไม่ได้เป็นตัวแทนของ ECMAScript ที่เข้ากันได้ของโซลูชัน - ดังนั้นจึงมีเครื่องหมาย "+" ตามหลัง แน่นอนว่าเป็นไปได้ที่จะทำการอัลกอริธึมนั้นให้บริสุทธิ์ ECMAScript (ซึ่งจะเพิ่มความยาวได้ไม่มากนัก) แต่ฉันไม่ได้เข้าใกล้มัน ... เพราะฉันคิดว่าอัลกอริทึมที่ง่ายและกะทัดรัดมากขึ้น! หนึ่งที่สามารถดำเนินการได้อย่างง่ายดายโดยไม่ต้องโมเลกุล lookaheads มันเร็วกว่ามากเช่นกัน

ใหม่นี้ก่อนหน้านี้จะต้องเดาที่ปัจจัยผกผันขี่จักรยานผ่านความเป็นไปได้ทั้งหมดและทดสอบพวกเขาสำหรับการแข่งขัน มันหาร N ด้วย 2 เพื่อให้มีที่ว่างสำหรับงานที่ต้องทำแล้วจึงวนซ้ำซึ่งจะแบ่งการป้อนข้อมูลซ้ำโดยตัวหารที่เริ่มต้นที่ 3 และเพิ่มขึ้นในแต่ละครั้ง (เช่น 1! และ 2! ไม่สามารถจับคู่โดยอัลกอริทึมหลักและต้องจัดการแยกต่างหาก) ตัวหารจะถูกติดตามโดยการเพิ่มลงในความฉลาดทางวิ่ง ตัวเลขสองตัวนี้สามารถแยกออกได้อย่างไม่น่าเชื่อเพราะสมมุติว่า M! == N หารด้วยผลหารจะยังคงถูกหารด้วย M จนกว่าจะเท่ากับ M

regex นี้ทำการหารด้วยตัวแปรในส่วนด้านในสุดของลูป อัลกอริธึมการหารเหมือนกับใน regexes อื่น ๆ ของฉัน (และคล้ายกับอัลกอริธึมการคูณ): สำหรับA≤B, A * B = C หากมีเฉพาะถ้า C% A = 0 และ B เป็นจำนวนมากที่สุดซึ่งตรงกับ B satisfC และ C% B = 0 และ (CB- (A-1))% (B-1) = 0 โดยที่ C คือเงินปันผล A คือตัวหารและ B คือผลหาร (อัลกอริทึมที่คล้ายกันสามารถใช้กับกรณีที่A≥Bและหากไม่ทราบว่า A เปรียบเทียบกับ B ได้อย่างไรการทดสอบการหารพิเศษหนึ่งรายการเป็นสิ่งที่จำเป็น)

ดังนั้นฉันจึงรักว่าปัญหานั้นสามารถลดความซับซ้อนลงให้น้อยลงกว่าฟีโบนักชีเรกซ์ที่ได้รับการปรับปรุงให้ดีขึ้น แต่ฉันถอนหายใจด้วยความผิดหวังว่าเทคนิคมัลติเพลกซ์พาวเวอร์ - ของ - ของ - ฐานเดียวกันจะต้องรอปัญหาอื่น ที่จริงต้องการมันเพราะอันนี้ไม่ได้ มันเป็นเรื่องราวของอัลกอริทึมการคูณ 651 ไบต์ของฉันที่ถูกแทนที่ด้วย 50 ไบต์อีกครั้ง!

แก้ไข: ฉันสามารถดรอป 1 ไบต์ (119 → 118) โดยใช้กลอุบายที่Grimyพบซึ่งสามารถทำให้การหารสั้นลงในกรณีที่รับประกันความฉลาดทางนั้นมากกว่าหรือเท่ากับตัวหาร

ด้วยความกังวลใจต่อไปนี่คือ regex:

รุ่นจริง / เท็จ (118 ไบต์):

^((x*)x*)(?=\1$)(?=(xxx\2)+$)((?=\2\3*(x(?!\3)xx(x*)))\6(?=\5+$)(?=((x*)(?=\5(\8*$))x)\7*$)x\9(?=x\6\3+$))*\2\3$|^xx?$

ลองออนไลน์!

ส่งคืนปัจจัยแบบตรงข้ามหรือไม่จับคู่ (124 ไบต์)

^(?=((x*)x*)(?=\1$)(?=(xxx\2)+$)((?=\2\3*(x(?!\3)xx(x*)))\6(?=\5+$)(?=((x*)(?=\5(\8*$))x)\7*$)x\9(?=x\6\3+$))*\2\3$)\3|^xx?$

ลองออนไลน์!

ส่งคืนปัจจัยแบบตรงข้ามหรือไม่จับคู่ในECMAScript +\K (120 ไบต์):

^((x*)x*)(?=\1$)(?=(xxx\2)+$)((?=\2\3*(x(?!\3)xx(x*)))\6(?=\5+$)(?=((x*)(?=\5(\8*$))x)\7*$)x\9(?=x\6\3+$))*\2\K\3$|^xx?$

และเวอร์ชันที่เว้นว่างพร้อมความคิดเห็น:

  ^
  (?=                           # Remove this lookahead and the \3 following it, while
                                # preserving its contents unchanged, to get a 119 byte
                                # regex that only returns match / no-match.
    ((x*)x*)(?=\1$)             # Assert that tail is even; \1 = tail / 2;
                                # \2 = (conjectured N for which tail == N!)-3; tail = \1
    (?=(xxx\2)+$)               # \3 = \2+3 == N; Assert that tail is divisible by \3
    # The loop is seeded: X = \1; I = 3; tail = X + I-3
    (
      (?=\2\3*(x(?!\3)xx(x*)))  # \5 = I; \6 = I-3; Assert that \5 <= \3
      \6                        # tail = X
      (?=\5+$)                  # Assert that tail is divisible by \5
      (?=
        (                       # \7 = tail / \5
          (x*)                  # \8 = \7-1
          (?=\5(\8*$))          # \9 = tool for making tail = \5\8
          x
        )
        \7*$
      )
      x\9                       # Prepare the next iteration of the loop: X = \7; I += 1;
                                # tail = X + I-3
      (?=x\6\3+$)               # Assert that \7 is divisible by \3
    )*
    \2\3$
  )
  \3                            # Return N, the inverse factorial, as a match
|
  ^xx?$                         # Match 1 and 2, which the main algorithm can't handle

ประวัติที่สมบูรณ์ของการเพิ่มประสิทธิภาพกอล์ฟของฉันของ regexes เหล่านี้อยู่ใน GitHub:

regex สำหรับการจับคู่หมายเลขแฟกทอเรียล - วิธีการเปรียบเทียบหลายหลากพร้อมด้วย lookahead.txt โมเลกุล
regex สำหรับการจับคู่แฟคทอเรียล number.txt (ที่แสดงด้านบน)

((x*)x*)((x*)+)((x+)+)n=3!\23-3=0

เอ็นจิ้น. NET regex ไม่เลียนแบบพฤติกรรมนี้ในโหมด ECMAScript ของมันและทำให้ 117 byte regex ทำงาน:

ลองออนไลน์! (รุ่นเอ็กซ์โพเนนเชียล - ช้าลงพร้อมด้วย. NET regex engine + ECMAScript emulation)


14

JavaScript (ES6), 30 29 28 ไบต์

คาดว่าจะเป็นจำนวนเต็มบวก ผลตอบแทน-1สำหรับความเท็จและ-2เพื่อความจริง

f=(n,k=2)=>n>1?f(n/k,k+1):~n

console.log(1,  '-->',f(1))   // Truthy (0! or 1!)
console.log(2,  '-->',f(2))   // Truthy (2!)
console.log(3,  '-->',f(3))   // Falsey
console.log(4,  '-->',f(4))   // Falsey
console.log(5,  '-->',f(5))   // Falsey
console.log(6,  '-->',f(6))   // Truthy (3!)
console.log(7,  '-->',f(7))   // Falsey
console.log(8,  '-->',f(8))   // Falsey
console.log(24, '-->',f(24))  // Truthy (4!)
console.log(120,'-->',f(120)) // Truthy (5!)

หมายเหตุ : ฟังก์ชั่นนี้รองรับอินพุตที่มีขนาดใหญ่พอสมควร (คุณควรอ่านสิ่งนี้เป็น: 'ค่อนข้างใหญ่สำหรับ JS') มันควรจะทำงานได้อย่างปลอดภัยถึง2 53 - 1 มันจะล้มเหลวอย่างแน่นอนเริ่มต้นที่N = 121,645,100,408,831,992อินพุทนี้จะถูกปัดเศษเป็น19! = 121,645,100,408,832,000เนื่องจากการเข้ารหัส IEEE-754 มีอาจจะเป็นผลบวกปลอมอื่น ๆ ก่อนที่จะ121.645.100.408.831.991เนื่องจากการปัดเศษข้อผิดพลาด แต่ผมไม่ทราบว่า


Nice - ชอบการใช้งาน~ในตอนท้าย
Steve Bennett

คุณสามารถแก้ไขเพื่อให้ฉันสามารถยกเลิกการลงคะแนนได้หรือไม่ (ถ้าคุณต้องการทราบว่าทำไมฉันถึงลงเพราะนั่นก็เป็นเพราะฉันลืมกฎ I / O ที่ผิดปกติของคำถามนี้)
CalculatorFeline

@Arnauld Undownvoted
CalculatorFeline

11

Python 3 , 39 38 ไบต์

f=lambda n,i=1:n>1and f(n/i,i+1)or n<1

ฟังก์ชั่นการ recursive จำนวนเต็มnกลับค่าบูลีน inversley เป็นตัวแทนผล (truthy: False, falsey: True)

ลองออนไลน์!

ซ้ำแล้วซ้ำอีกแบ่งnโดยiมีค่าเริ่มต้นของ1จนเหลือน้อยกว่าหรือเท่ากับ1การทดสอบแล้วถ้าเหลือที่น้อยแล้ว1เท่านั้น factorials จะจบลงด้วยการที่เหลือเท่ากับ1และเป็นไบต์สั้นกว่า<==


@ov เราถูก จำกัด ให้มีเอาต์พุตที่สอดคล้องกันสองรายการ ที่น่าเสียดายที่ผลตอบแทน1สำหรับ factorials ทั้งหมดยกเว้นที่จะส่งกลับ1 True
Jonathan Allan

11

Java 8, 46 ไบต์

i->{int j=1,c=0;for(;j<i;j*=++c);return j==i;}

นี่เป็นไปตามรายการของ Roman Gräfที่ฉันสามารถเคาะออกเป็นโหลหรือมากกว่านั้น ฉันอยากจะแนะนำที่นี่ แต่ฉันยังไม่มีชื่อเสียงพอที่จะแสดงความคิดเห็น! รหัสนักทดสอบที่ฉันแก้ไข:

import java.util.function.Function;
import java.util.stream.IntStream;

public class IsFactorial {
    public static Function<Integer, Boolean> isFactorial = i->{int j=1,c=0;for(;j<i;j*=++c);return j==i;};
    public static int[] truthyCases = {1,2,6,24,120};
    public static int[] falsyCases = {3,4,5,7,8};
    public static void main(String[] args){
        System.out.println(
            IntStream.of(truthyCases).allMatch(i->isFactorial.apply(i)) &&
            IntStream.of(falsyCases).allMatch(i->!isFactorial.apply(i)));
    }
}

9

เรติน่า50 50ไบต์

บันทึก 12 ไบต์ด้วย @Neil ด้วยการรวมการทำให้สั้นลงและการกำจัด ;

.+
1¶$&$*
+`^(1+)¶(\1)+$
1$1¶$#2$*
¶.$

ลองออนไลน์!

เอาต์พุต1สำหรับ true และ0false

.+ ตรงกับจำนวนทั้งหมด

1¶$&$*แทนที่ด้วยการ1ขึ้นบรรทัดใหม่และการแข่งขันถูกแปลงเป็น unary

โปรแกรมที่เหลือจะหารจำนวนหมายเลขในบรรทัดล่างโดยเพิ่มจำนวนเต็มบวกต่อเนื่องติดตามในบรรทัดบนสุดในขณะที่สามารถทำได้

+` วนซ้ำจนกว่าสตริงจะยังคงเหมือนเดิม

  • ^(1+)¶(\1)+$จับคู่บรรทัดด้านบนกับหลาย ๆ ตัว1และหลายตัว1อยู่ในบรรทัดด้านล่างและแทนที่ด้วย

  • 1$1¶$#2$* บรรทัดบนสุดมากมาย 1ที่มีอีก1นั่นคือการเพิ่มจำนวนที่แสดงโดยบรรทัดบนสุด 1 ตามด้วย newline และจำนวนการแข่งขันของบรรทัดบนสุดในบรรทัดล่าง (เช่นการนับการจับคู่ของกลุ่มการจับภาพที่สอง ) จำนวนมาก1นั่นคือการหารจำนวนด้านล่างด้วยจำนวนสูงสุด

เมื่อไม่สามารถทำได้อีกต่อไป

¶.$ให้จำนวนการแข่งขันของ regex นี้คือ มีอยู่คนเดียวหรือเปล่า1ในบรรทัดล่างซึ่งจะเกิดขึ้นหากตัวเลขเป็นปัจจัย


หากอนุญาตให้ไม่มีข้อผิดพลาด / ความผิดพลาดแทนค่าความจริง / ค่าเท็จฉันจะได้รับ36 34 ไบต์

^
1¶
{`.+$
$*
^(1+)¶(\1)+$
1$1¶$#2

สิ่งนี้ดำเนินไปในแนวทางเดียวกัน แต่รวม$*เข้ากับบรรทัดที่สามและสี่ บรรทัดที่สามเป็นต้นไปเป็นส่วนหนึ่งของลูปเดียวกันซึ่ง{ย่อมาจาก+(ที่(กลุ่มบรรทัดที่เหลืออยู่ในลูป แฟคทอเรียลสิ้นสุดลงในโปรแกรมที่แยกออกจากลูปในขณะที่ไม่ใช่แฟ็กทอเรียลติดอยู่ในวงตลอดไปจนกว่า Retina จะส่ง OverflowException ที่เกิดจากการแทนที่ครั้งสุดท้ายล้มเหลว แปลงบรรทัดล่างจากทศนิยมเป็น unary ดังนั้นมันจะระเบิดอย่างรวดเร็ว


บันทึกไบต์โดยการลบ1ตามที่มันบอกเป็นนัยเมื่อ$*อยู่ในตอนท้ายของการแทนที่
Neil

ยังดีกว่าให้รวม$*กับอีกสองบรรทัด
Neil


3
ฉันประทับใจที่คุณพบวิธีที่จะทำให้จอประสาทตาผิดปกติ :)
Martin Ender

2
คุณสามารถเพิ่มคำอธิบายได้ไหม?
CalculatorFeline

8

05AB1E , 4 ไบต์

L!QO

ลองออนไลน์!

คำอธิบาย

L      # range [1 ... input]
 !     # calculate factorial of each
  Q    # compare with input for equality
   O   # sum

1
คุณไม่จำเป็นต้องทำสำเนาข้อมูลซ้ำก่อนเพราะLจะปรากฏขึ้นหรือไม่ นอกจากนี้ยังÅ!ให้รายการแฟคทอเรียลที่น้อยกว่าหรือเท่ากับอินพุต
Neil A.

@NeilA โชคดีที่อินพุตถูกเปิดอีกครั้งหากมีอาร์กิวเมนต์ไม่เพียงพอในสแต็กสำหรับการดำเนินการดังนั้นฉันไม่ต้องการDที่นี่ Å!จับที่ดีเกี่ยวกับ ฉันมักจะลืมเกี่ยวกับรายการคำสั่ง มันจะไม่บันทึกไบต์ใด ๆ แต่จะมีประสิทธิภาพมากขึ้นอย่างแน่นอน
Emigna

ฉันไม่รู้เกี่ยวกับอินพุตที่ถูกเปิดอีกครั้ง ... ซึ่งแน่นอนว่าสามารถบันทึกจำนวนมากได้
Neil A.

@NeilA มันเป็นคุณสมบัติที่ค่อนข้างใหม่ มันเพิ่มน้อยกว่าหนึ่งเดือนที่แล้วฉันคิดว่า
Emigna

8

C ++, 102 100 92 ไบต์

#include<cmath>
int a(int n){int i=n,j=0;for(;i;)j|=lround(exp(lgamma(i--+1)))==n;return j;}

วนซ้ำค่าทั้งหมดจาก0ถึงnและคำนวณแฟคทอเรียลแล้วตรวจสอบว่าเท่ากับnหรือไม่

ขอบคุณคริสโตฟ! (บันทึกแล้ว 8 ไบต์)


Hi! ยินดีต้อนรับสู่ PPCG! คำตอบแรกที่ดี! ขอให้โชคดีในอนาคต!
อาร์จัน

คำตอบแรกที่ดี! int a(int n){int i=n,j=0;for(;i;)j|=lround(exp(lgamma(i--+1)))==n;return j;}คุณสามารถบันทึกไบต์ไม่กี่เช่นนี้ lroundและlgammaมีอยู่แล้ว C ++ 11 #include<cmath>เพื่อให้สามารถทำได้เพียงแค่ บางทีคุณสามารถปรับปรุงคำแนะนำของฉันได้อีก :) :)
Christoph

7

Haskell , 43 26 ไบต์

f n=elem n$scanl1(*)[1..n]

ลองออนไลน์!

  • บันทึกแล้ว 17 ไบต์ขอบคุณLaikoni

2
f n=elem n$scanl1(*)[1..n]ไม่มีประสิทธิภาพไร้สาระ แต่สั้นกว่า
Laikoni

มีกฎบางอย่างเกี่ยวกับประสิทธิภาพของโค้ดหรือไม่?
sudee

1
ไม่มีที่ฉันรู้ code-golfถามหาวิธีการแก้ปัญหาในไม่กี่ไบต์ที่เป็นไปได้โดยไม่ต้องมีประสิทธิภาพใด ๆ นอกจากนี้ในเครื่องของฉันฟังก์ชั่นยังทำงานได้40430โดยไม่ล่าช้า
Laikoni

ฉันหมายถึงบางสิ่งตามแนวของ "การแก้ปัญหาควรยุติลงภายในกรอบเวลาที่สมเหตุสมผล" แต่ฉันเดาว่ามันเหมาะกับความต้องการทั้งสองทาง ขอบคุณ!
sudee

1
ดีและเรียบง่าย ฉันคิดว่าฉันจะทำอย่างไรดีกับการแบ่งพูดdivModโดย[1..]ต่อเนื่องจนกว่าจะถึงเหลือศูนย์หาร 1 (ปัจจัย) หรือที่เหลือเป็นศูนย์ (ไม่ใช่ปัจจัย) แต่มันไม่ได้ดูเหมือนจะเป็นวิธีการที่เหมาะสม ฉันหาคำตอบ 46 ตัวละครที่น่ารักนี้มาแล้ว: f|let x%n=mod n x==0&&(x+1)%div n x||n==1=(1%).
Jon Purdy

6

Haskell , 38 ไบต์

m#n=n<2||mod n m<1&&(m+1)#div n m
(2#)

ลองออนไลน์! ตัวอย่างการใช้: (2#) 24. ผลตอบแทนหรือTrueFalse

นี่เป็นระยะสั้นที่สุดที่ฉันจะได้รับในขณะที่ยังคงมีประสิทธิภาพมาก แม้สำหรับตัวเลขที่มีขนาดใหญ่เท่า

145183092028285869634070784086308284983740379224208358846781574688061991349156420080065207861248000000000000000000

ผลลัพธ์จะได้รับทันที การแก้ปัญหาการทำงานโดยการหารการป้อนข้อมูลnโดยm = 2,3,4,5,...จนทั้งผลที่ได้คือหนึ่งหรือไม่หารด้วยnm

สำหรับวิธีการแก้ปัญหาที่ไม่มีประสิทธิภาพ 26 ไบต์สั้น แต่ที่น่าทึ่งซึ่งคำนวณn!สำหรับปัจจัยการผลิตที่ไม่ได้ factorials ดูที่นี่



5

ฟูริเยร์ , 40 39 ไบต์

I~Q1~N(i^~i*N~N{Q}{1~Xo}N>Q{1}{1~X0o}X)

ลองใช้กับ FourIDE!

โดยทั่วไปแล้วจะคูณจำนวน N ด้วยจำนวนที่เพิ่มขึ้นจนกระทั่ง N มีค่าเท่ากับ (เอาท์พุท 1) หรือมากกว่า (เอาท์พุท 0)

คำอธิบาย Pseudocode:

Q = Input
N = 1
While X != 1
    i += 1
    N = N*i
    If N = Q Then
        Print 1
        X = 1
    End If
    If N > Q Then
        Print 0
        X = 1
    End If
End While

5

Japt , 8 6 ไบต์

ol x¥U

ลองออนไลน์!

ผลลัพธ์นี้ 0 สำหรับเท็จและ 1 สำหรับจริง

คำอธิบาย

 ol x¥ U
Uol x==U
Uo       # Create the range [0 ... input]
  l      # Replace each element by its factorial
     ==U # Compare each element to the input (yielding 1 if equal and 0 otherwise)
    x    # And sum the result

1
ฉันควรเพิ่ม built-in "
contain

1
โอ้โหคุณสามารถเปลี่ยนaU ¦Jเป็นx¥U(แมปแต่ละอันXกับX==Uผลรวม) แม้ว่ามันจะไม่ทำงานบน TIO
ETHproductions

ไม่ผ่าน2เพราะoจะให้คุณ[0,1]เท่านั้น นี่คือการแก้ไขที่มีการบันทึก 1 ไบต์
Shaggy

4

Perl 5, 31 ไบต์

$a=<>;$a/=++$i while$a>1;exit$a

อินพุตถูกใช้ผ่าน STDIN เอาต์พุตจะถูกส่งผ่านรหัสทางออก (1 สำหรับแฟกทอเรียล

อินพุตถูกหารด้วยจำนวนเต็มต่อเนื่องจนกว่าจะเป็น 1 หรือเศษส่วนน้อยกว่าหนึ่งซึ่งถูกตัดทอนลงในผลลัพธ์


-5 bytes TIO
Nahuel Fouilleul

4

Perl 6 , 29 ไบต์

{($_,{$_/++$}...2>*).tail==1}

ทดสอบมัน

ขยาย:

{   # bare block lambda with implicit parameter 「$_」

  (              # generate a sequence

    $_,          # starting with the input

    {
      $_ / ++$   # divide previous element by an ever increasing number
                 # 1,2,3,4,5,6,7,8 ... *
    }

    ...          # keep generating until

    2 > *        # 2 is greater than what was generated
                 # ( 1 or a fractional number )

  ).tail == 1    # check if it ended at 1
}

17 {$_∈[\*] 1..$_}ไบต์: 2>*.polymod(1..*).sumอีกวิธีที่น่าสนใจคือ
nwellnhof

4

setlX , 32 ไบต์

f:=n|=>exists(x in{0..n}|n==x!);

สร้างฟังก์ชั่นที่เรียกว่าfที่คุณใช้ปัจจัยที่อาจเกิดขึ้นของคุณเป็นพารามิเตอร์

มันทำงานได้กับขนาดจำนวนเต็มตามอำเภอใจ แต่มันไม่มีประสิทธิภาพพอสมควร

(โดยวิธี: นี่คือการมีส่วนร่วมครั้งแรกของฉันในการเขียนโปรแกรมปริศนา)


4

C (gcc), 33 ไบต์

e;f(n){n=n%++e?n==!(e=0):f(n/e);}

โปรดทราบว่าผู้เขียนบางคนกำหนด "จำนวนธรรมชาติ" เป็นจำนวนเต็มบวก ดังนั้นฉันไม่สนใจที่f(0)ทำให้เกิดการเรียกซ้ำไม่สิ้นสุด



สามารถลดลงถึง 32 ไบต์: ลองออนไลน์! หรือ 31 ไบต์โดยส่งกลับค่าที่ไม่ใช่ศูนย์เป็นเท็จ: ลองออนไลน์!
Deadcode


4

C # (. NET Core) , 68 ไบต์

bool f(System.Numerics.BigInteger n,int k=2)=>n<2||n%k<1&f(n/k,k+1);

ลองออนไลน์!

ไม่ใช่ทางออกที่สั้นที่สุด แต่ใช้ได้กับจำนวนที่มากจริงๆ ลิงก์ TIO มีตัวอย่างด้วย10000!รวมถึงตัวอย่างกับ

นี่คือรุ่นที่สั้นกว่าซึ่งใช้intซึ่งมีค่าสูงสุด2147483647 2147483647

C # (. NET Core) 45 ไบต์

bool f(int n,int k=2)=>n<2||n%k<1&f(n/k,k+1);

ลองออนไลน์!

มอบเครดิตให้แก่ @KevinCruijssen สำหรับการเล่นกอล์ฟ 3 ไบต์โดยรวมจากคำตอบทั้งสอง!


2
&&สามารถแข็งแรงเล่นกอล์ฟไป&และต่อท้าย;ไม่ได้จะต้องมีการนับฟังก์ชั่นแลมบ์ดา นอกจากนี้ยังไม่ulong k=2สามารถuint k=2อยู่ในคำตอบ 50 ไบต์ของคุณ?
Kevin Cruijssen

1
จับดีในVS& &&ฉันคิดว่าฉันได้รับสแต็คล้น แต่ดูเหมือนว่าจะทำงานได้ตามปกติ ulongคือ 64 บิตในขณะที่uint32 ดูเหมือนว่าคนอื่นกำลังใช้อยู่intบางทีฉันจะใช้มันสำหรับเวอร์ชั่นสั้น ๆ ในส่วนที่เกี่ยวกับการลาก;สิ่งเหล่านี้เป็นฟังก์ชั่นเต็มรูปแบบไม่ใช่ lambdas ดังนั้นฉันคิดว่าฉันต้องรวมเอาไว้ด้วย?
dana

ที่แปลกจริงๆว่า .NET สามารถแก้ไข/และ%ระหว่างulongและuintแต่ไม่ได้และulong intไม่ทราบว่า :)
dana

1
@Oliver - เมื่อdoubleคุณเริ่มที่จะเห็นการปัดเศษในบางจุด - ตัวอย่างเช่น24! และ 120! ล้มเหลว. ในขณะที่System.Numerics.BigIntegerมีความแม่นยำมากที่สุดintคือคำตอบที่สั้นที่สุด :)
dana

1
@ รหัส - คุณถูกต้องเกี่ยวกับ 0 :) จากตัวอย่างในการท้าทายฉันตีความ "หมายเลขธรรมชาติ" เป็นค่าเฉลี่ย 1,2, ... ฉันยอมรับว่าในโลกแห่งความเป็นจริงมันจะดีกว่าถ้าใช้ตัว&&ดำเนินการลัดวงจรสั้น ๆ. แต่นี่คือ code golf;) ดีใจที่คุณชอบ10000!ตัวอย่าง!
dana

4

C ++ (เสียงดังกราว) 51 ไบต์

การเรียกซ้ำจะชนะเท่าที่การเล่นกอล์ฟดำเนินไป

51 ไบต์ศูนย์เป็นจริง:

int f(int n,int i=2){return n<2?!n:n%i|f(n/i,i+1);}

การเสียสละนี้ค่อนข้างเร็วสำหรับการออม 1 ไบต์ แทนที่|ด้วย||เพื่อให้รวดเร็วเนื่องจากการประเมินการลัดวงจรของตรรกะ OR

ลองออนไลน์! (รุ่นช้า 51 ไบต์)
ลองออนไลน์! (รุ่นที่รวดเร็ว 52 ไบต์)

เวอร์ชั่นช้าของ Ungolfed:

int isFactorial(int n, int i=2)
// returns 0 for true, and nonzero for false
{
    if (n < 2) // same as "if (n==0 || n==1)" in our natural number input domain
    {
        if (n==0)
            return 1; // not factorial
        else // n==1
            return 0; // is factorial (could be either 0! or 1!)
    }

    // Because any nonzero value represents "false", using "|" here is equivalent
    // to "||", provided that the chain of recursion always eventually ends. And
    // it does always end, because whether or not "n" is factorial, the "n / i"
    // repeated division will eventually give the value of zero or one, satisfying
    // the above condition of termination.
    return (n % i) | isFactorial(n / i, i+1);
}

เวอร์ชันเร็วที่ไม่น่ารังเกียจ:

int isFactorial(int n, int i=2)
// returns 0 for true, and nonzero for false
{
    if (n < 2) // same as "if (n==0 || n==1)" in our natural number input domain
    {
        if (n==0)
            return 1; // not factorial
        else // n==1
            return 0; // is factorial (could be either 0! or 1!)
    }

    if (n % i != 0)
        return 1; // not factorial
    else
        return isFactorial(n / i, i+1);
}

มีหลายวิธีในการจัดเรียงใหม่นี้

52 ไบต์ไม่ใช่ศูนย์จริง:

int f(int n,int i=2){return n<2?n:n%i?0:f(n/i,i+1);}

ลองออนไลน์!

52 ไบต์ศูนย์เป็นจริง:

int f(int n,int i=2){return!n?1:n%i?n-1:f(n/i,i+1);}

ลองออนไลน์!

ก่อนที่จะใช้การสอบถามซ้ำฉันพยายามทำซ้ำหลาย ๆ ครั้งและพวกเขาเข้ามาใกล้

54 ไบต์ไม่ใช่ศูนย์จริง:

int f(int n){for(int i=2;n>1;)n=n%i?0:n/i++;return n;}

ลองออนไลน์!

54 ไบต์ศูนย์จะเป็นจริง (ขึ้นอยู่กับการส่ง Java 8 ของ Roman Gräf ):

int f(int n){int a=1,i=0;for(;a<n;a*=++i);return a-n;}

ลองออนไลน์!

ตอนนี้สำหรับก้นถังรุ่นที่วนซ้ำโดยไม่มีการn==0จัดการ (ฉันถือว่าสิ่งที่ไม่ถูกต้องเหล่านี้เพราะ 0 เป็นจำนวนธรรมชาติและคำจำกัดความใด ๆ ที่ไม่ได้ทำให้เป็น ในเวอร์ชันด้านล่างการเรียกซ้ำแบบไม่สิ้นสุดของf(0)ทั้งสองเรียก segfault เนื่องจากล้นสแต็กหรือด้วยคอมไพเลอร์ที่ปรับให้เหมาะสมกับการวนซ้ำ, วนซ้ำไม่รู้จบ:

48 ไบต์ศูนย์เป็นจริง:

int f(int n,int i=2){return n%i?n-1:f(n/i,i+1);}

ลองออนไลน์!

48 ไบต์ศูนย์จะเป็นจริง (อิงจากการส่งของHagen von Eitzen 33 ไบต์ C (gcc) ):

int f(int n,int e=0){return n%++e?n-1:f(n/e,e);}

ลองออนไลน์!


50 แก้ไข: 49โดยไม่ต้องเรียกซ้ำ
Grimmy

กลับไปเรียกซ้ำสำหรับ48 และคุณอาจจะไม่ชอบสิ่งนี้ แต่44โดยใช้ var โกลบอล
Grimmy

3

Mathematica ขนาด 20 ไบต์

!FreeQ[Range[#]!,#]&

รุ่นอื่น ๆ เพื่อทดสอบตัวเลขขนาดใหญ่ (ดูความคิดเห็น)

Range[10^3]!~MemberQ~#&

ทดสอบมากถึง 1,000!


2
ตามที่ฉันเข้าใจคำถามถ้า Mathematica สามารถรับ 1001! ในฐานะที่เป็นอินพุตดังนั้นสิ่งนี้จึงไม่ตรงตามข้อกำหนด
ปีเตอร์เทย์เลอร์

2
คุณสามารถบันทึกสามไบต์ในขณะที่มันใช้ได้สำหรับอินพุตทั้งหมด เพียงแทนที่ 10 ^ 3 ด้วย #; คุณสามารถบันทึกไบต์อื่นด้วยการใช้ Range @ #
Julien Kluge

@Julien Klugethen กำลังค้นหา 1243234 อาจใช้เวลาตลอดไป ...
J42161217

1
ฉันคิดว่าคุณสามารถบันทึกไบต์อื่นโดยการแทนที่Range[#]ด้วยRange@#:)
numbermaniac

3
!Range@#!~FreeQ~#&ดูเหมือนว่าคุณยังสามารถบันทึกไบต์อื่นที่มีไวยากรณ์มัด:
numbermaniac

3

Cubix , 24 ไบต์

U0O@1I1>-?1u>*w;W;@Orq)p

ลองออนไลน์

Cubified

    U 0
    O @
1 I 1 > - ? 1 u
> * w ; W ; @ O
    r q
    ) p

เราเริ่มต้นด้วยการผลักดัน1, Input, 1บนสแต็ค สิ่งเหล่านี้จะเป็นดัชนีเป้าหมายและตัวสะสมของเราตามลำดับ

จากนั้นเราวนซ้ำ ในการวนซ้ำแต่ละครั้งเราจะลบตัวสะสมออกจากอินพุต หากผลเป็น 0 เรากำลังทำเพื่อให้เราผลักดัน1, Output และทางออก หากเป็นเชิงลบเราได้ไปไกลเกินไปดังนั้นเราจึงผลักดัน0, Output และทางออก มิฉะนั้นเราจะเห็น

;p)*rq;
;         Pop the difference off the stack.
 p)       Move the index to the top of the stack and increment it.
   *      Multiply the accumulator by the index to get the next factorial.
    rq;   Put the stack back in the right order.

3

Neim , 8 ไบต์

𝐈Γ𝐈𝐩₁𝔼)𝐠

คำอธิบาย:

Example input: 6
𝐈         Inclusive range [1 .. input]
          [1, 2, 3, 4, 5, 6]
 Γ        For each...
  𝐈         Inclusive range [1 .. element]
            [[[1], [1, 2], [1, 2, 3], [1, 2, 3, 4], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5, 6]]
   𝐩        Product
            [1, 2, 6, 24, 120, 720]
     𝔼      Check for equality with
    ₁       the first line of input
            [[0, 0, 1, 0, 0, 0]]
      )   End for each
       𝐠  Select largest element
          [1]

ลองมัน!

Neim , 3 ไบต์ (ไม่ใช่การแข่งขัน)

ไม่มีการแข่งขันเนื่องจากมีการเพิ่มโทเค็นและโทเค็นแบบแฟคทอเรียลหลังจากมีการท้าทาย

𝐈𝐓𝕚

คำอธิบาย:

Example input: 6
𝐈     Inclusive range [1 .. input]
      [[1, 2, 3, 4, 5, 6]
 𝐓    Factorial each
      [[1, 2, 6, 24, 120, 720]]
  𝕚   Check that the [cycled] input is in the list
      [1]

ลองมัน!


3

> <> , 24 22 ไบต์

-2 ไบต์ขอบคุณ @Aaron

ฉันกำลังลองภาษาใหม่ (เนื่องจากใบอนุญาต Mathematica ของฉันหมดอายุแล้ว ... )

01\{=n;
?!\$1+:@*:{:}(

ลองออนไลน์หรือที่สนามเด็กเล่นปลา

ถือว่าตัวเลขอินพุตอยู่ในสแต็กอยู่แล้วและส่งคืน 0 หรือ 1 ซึ่งทำงานโดยการคูณตัวเลขn ตัวแรกเข้าด้วยกันจนหยุดน้อยกว่าอินพุทแล้วพิมพ์ 1 ถ้ามันเท่ากับอินพุตและ 0 ถ้ามันไม่ได้ ' เสื้อ


คุณสามารถแปลงคุณv>\n<^เป็น\\n/; ดูที่นี่
Aaron

@Aaron ที่ยอดเยี่ยมขอขอบคุณ!
ไม่ใช่ต้นไม้

3

APL (Dyalog Unicode) , 5 6 7ไบต์

แข็งแรงเล่นกอล์ฟไบต์โดยการเปลี่ยน×/ไป!ต้องขอบคุณเอริก Outgolfer

⊢∊!∘⍳

ลองออนไลน์!

คำอธิบาย

                          Range of numbers from 1 to argument, 1 2 3 4 .. n
   !                       Factorial; 1! 2! 3! 4! .. n!
⊢∊                         Is the right argument a member of this list?

ยอดรวมสะสม
Leun Nun

@LeakyNun Fixed
Kritixi Lithos

หนึ่งไบต์พิเศษใน GNU APL 1.2 N∊×\⍳N←⎕สิ่งนี้จะโต้แย้งได้อย่างไร ฉันไม่เห็นnเลย นี่เป็นสิ่งที่เฉพาะเจาะจงของ Dyalog หรือไม่?
Arc676

2
@ Arc676 ทางออกของฉันคือรถไฟและคุณเรียกมันว่า(⊢∊(×/⍳)) right_argumentเป็นอย่างที่คุณเห็นในลิงค์ TIO และการอ้างถึงอาร์กิวเมนต์ที่ถูกต้อง
Kritixi Lithos

หมายเหตุ: AGL จะช่วยคุณประหยัดไบต์ ⊢∊×\ä⍳. โซลูชัน "ถูกต้อง" (แต่อีกต่อไป) จะเป็น0=1|!⍣¯1; "แฟคทอเรียลเป็นจำนวนเต็มหรือไม่"
อดัม

2

JavaScript (ES6), 71 ไบต์

สิ่งนี้ใช้เวลาในการป้อนข้อมูลเป็นฟังก์ชั่นการโต้แย้งและalertการส่งออก ขาออก0สำหรับ falsey และ1สำหรับ truthy

f=n=>n?n*f(n-1):1;g=(n,r=0,i=0)=>{while(i<=n){r=f(i)==n|r;i++}alert(r)}

คำอธิบาย

โปรแกรมประกอบด้วยสองฟังก์ชั่นและf เป็นฟังก์ชั่นการคำนวณแบบเรียกซ้ำและเป็นหน้าที่หลักของโปรแกรม ถือว่าจะมีอาร์กิวเมนต์เดียว มันกำหนดอาร์กิวเมนต์เริ่มต้นมีค่าเป็น 0 และอาร์กิวเมนต์เริ่มต้นอีกด้วยค่า มันแล้ว iterates กว่าทุกจำนวนเต็มจาก 0 ถึงและในแต่ละซ้ำตรวจสอบไม่ว่าจะเป็นฟังก์ชั่นใช้กับ(ดัชนีปัจจุบัน) เท่ากับคือไม่ว่าจะเป็นปัจจัยของ ถ้าเกิดว่าจะเป็นกรณีของค่าถูกกำหนดเป็น 1 ในตอนท้ายของฟังก์ชั่นที่เป็นเอ็ดgfgg nr0nfinnirralert

ตัวอย่างการทดสอบ

( หมายเหตุ: เอาต์พุตข้อมูลโค้ดใช้console.log()ที่ไม่มีใครเหมือนมากเกินไปน่ารำคาญalert()s. )

f=n=>n?n*f(n-1):1;g=(n,r=0,i=0)=>{while(i<=n){r=f(i)==n|r;i++}console.log(r)}

g(1)
g(2)
g(3)
g(4)
g(5)
g(6)
g(7)
g(8)
g(24)
g(120)


Eval อาจสั้นกว่าการใช้บล็อคโค้ด
Downgoat

@Downgoat ฉันควรทำอย่างไร ขออภัยถ้ามันชัดเจนเกินไป! : P
Arjun

2

QBIC , 21 19 ไบต์

[:|q=q*a~q=b|_x1}?0

คำอธิบาย

[:|     Start a FOR loop from 1 to n
q=q*a   q starts as 1 and is multiplied by the FOR loop counter
        consecutively: q=1*1, *2, *3, *4 ... *n
~q=b|   If that product equals n
_x1     Then quit, printing a 1
}       Close the IF and the FOR
?0      If we're here, we didn't quit early and didn't find a factorial, print 0

ก่อนหน้านี้

[:|q=q*a┘c=c+(q=b)}?c

คำอธิบาย:

[:|         Start a FOR loop from 1 to n
q=q*a       q starts as 1 and is multiplied by the FOR loop counter
            consecutively: q=1*1, *2, *3, *4 ... *n
┘           Syntactic line break
c=c+        c starts out at 0 and then keeps track of 
    (q=b)       how often our running total == n
}           Closes the FOR-loop
?c          Print c, which is 0 fir non-factorials and -1 otherwise.

2

Java 8, 59 ไบต์

i->{for(int j=1,c=0;j<=i;j*=++c)if(j==i)return 1;return 0;}

Testcode

import java.util.function.IntFunction;
import java.util.stream.IntStream;

public class IsFactorial
{
    public static IntFunction<Integer> isFactorial = i->
    {
        for(int j=1,c=0;j<=i;j*=++c)
            if(j==i)return 1;return 0;
    };

    public static int[] truthyCases = {1,2,6,24,120};
    public static int[] falsyCases = {3,4,5,7,8};

    public static void main(String[] args)
    {
        System.out.println
        (
            IntStream.of(truthyCases)
                .allMatch(i->isFactorial.apply(i)==1)
            && IntStream.of(falsyCases)
                .allMatch(i->isFactorial.apply(i)==0)
        );
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.