ซ้ำแล้วซ้ำอีก! factorials!


34

เพื่อไม่ให้สับสนกับค้นหาปัจจัย!

บทนำ

แฟคทอเรียลของจำนวนเต็มnสามารถคำนวณได้โดย

n!=n×(n1)×(n2)×(...)×2×1

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

n!!=n×(n2)×(n4)×(...)×4×2
n!!=n×(n2)×(n4)×(...)×3×1
n!!!=n×(n3)×(n6)×(...)×6×3
n!!!=n×(n3)×(n6)×(...)×5×2
n!!!=n×(n3)×(n6)×(...)×4×1

โดยสรุป: โดยที่ หรือในภาษาอังกฤษธรรมดา: ลบจำนวนแฟกทอเรียลออกจากจำนวนฐานซ้ำ ๆ กันและคูณจำนวนเต็มบวกทั้งหมดที่เกิดขึ้น

n!(k)={1if n=0nif 0<nkn((nk)!(k))if n>k
n!(k)=n!!k

ความท้าทาย

เขียนฟังก์ชั่นที่จะคำนวณแฟคทอเรียลแบบซ้ำสำหรับจำนวนเต็มใด ๆ ที่ไม่เป็นลบ

อินพุต

ทั้ง

  • สตริงที่มีจำนวนเต็มฐานสิบที่ไม่เป็นลบตามด้วยเครื่องหมายอัศเจรีย์ 1 ตัวหรือมากกว่า เช่น"6!"หรือหรือ"9!!""40!!!!!!!!!!!!!!!!!!!!"

หรือ

  • ค่าเดียวกันที่แสดงโดยจำนวนเต็มสองตัวคือค่าฐานที่ไม่เป็นลบหนึ่งค่าและค่าบวกหนึ่งค่าที่แทนการนับแบบแฟคทอเรียล ซึ่งสามารถทำได้ตามรูปแบบใด ๆ จากกฎ I / O เริ่มต้น

เอาท์พุต

ผลการคำนวณดังกล่าว

คำพูดที่ท้าทาย

  • 0!เท่ากับ1โดยนิยาม รหัสของคุณจะต้องบัญชีสำหรับสิ่งนี้
  • การนับแฟคทอเรียลนั้นถูก จำกัด ด้วยนอกช่วงนี้คุณมีอิสระที่จะเอาท์พุทอะไรก็ได้ นอกเหนือจากซึ่งเป็นข้อยกเว้นเฉพาะกฎนี้
    0<factorial countbase value
    0!

ตัวอย่าง

Input                              Output

3!!!                               3
0!                                 1
6!                                 720
9!!                                945
10!!!!!!!!                         20
40!!!!!!!!!!!!!!!!!!!!             800
420!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!  41697106428257280000000000000000

ลองใช้ด้วยการใช้งาน Python ที่ไม่ได้รับโชค: ลองออนไลน์!

ข้อสังเกตทั่วไป


6
รายการตัวอย่าง0!แต่ข้อสังเกตที่ท้าทายกล่าวว่าจำนวนแฟคทอเรียลจะน้อยกว่าหรือเท่ากับค่าฐาน
Jonathan Allan

1
จะไม่ 3 !!! เป็นศูนย์หรือไม่ n * (n-3) = 3 * (3-3) = 0.
ouflak

2
@ouflak ถ้ามันใช้งานได้เหมือน 1! มันเหมือน 1! = 1. 2 !! = 2. 3 !!! = 3 ไม่มีการคำนวณเนื่องจากคุณอยู่ท้ายการเรียกซ้ำ ไม่มี 0 ในผลิตภัณฑ์หรืออย่างอื่นทุกแฟคทอเรียลจะลดลงเป็น 0 ในท้ายที่สุด
V. Courtois

4
3!!!!!!!3ไม่ควรที่จะกำหนดมันก็ควรจะให้ผลผลิตคำตอบ มันเหมือนกับ1!!=1(ไม่ได้ไม่ได้กำหนด) นอกจากนี้ข้อมูลจำเพาะอินพุตของคุณบอกว่าจะมีอย่างน้อยหนึ่ง!เสมอดังนั้นตัวอย่างแรก3จะไม่ตรงกับข้อกำหนด
Greg Martin

3
@ FabianRöling: แต่นั่นไม่ใช่สิ่งนี้ ไม่ใช่(3!)!ว่าจะเป็นการลบคำศัพท์ออกจากแฟกทอเรียล มันเป็นชื่อที่ทำให้เข้าใจผิด ฉันคิดว่ามันจะใช้ฟังก์ชันแฟคทอเรียลซ้ำ ๆ ในโซ่และต้องอ่านอย่างละเอียดเพื่อดูว่ามันคืออะไร โชคดีที่คำถามไม่ได้อธิบายอย่างชัดเจน ชื่อที่ดีกว่าอาจเป็นแฟกทอเรียลหรือแฟคทอเรียลหรืออะไรก็ได้
Peter Cordes

คำตอบ:



13

ArnoldC , 702 698 634 ไบต์

LISTEN TO ME VERY CAREFULLY f
I NEED YOUR CLOTHES YOUR BOOTS AND YOUR MOTORCYCLE n
I NEED YOUR CLOTHES YOUR BOOTS AND YOUR MOTORCYCLE p
GIVE THESE PEOPLE AIR
HEY CHRISTMAS TREE r
YOU SET US UP 1
HEY CHRISTMAS TREE c
YOU SET US UP 0
STICK AROUND n
GET TO THE CHOPPER r
HERE IS MY INVITATION r
YOU'RE FIRED n
ENOUGH TALK
GET TO THE CHOPPER n
HERE IS MY INVITATION n
GET DOWN p
ENOUGH TALK
GET TO THE CHOPPER c
HERE IS MY INVITATION 0
LET OFF SOME STEAM BENNET n
ENOUGH TALK
BECAUSE I'M GOING TO SAY PLEASE c
GET TO THE CHOPPER n
HERE IS MY INVITATION 0
ENOUGH TALK
YOU HAVE NO RESPECT FOR LOGIC
CHILL
I'LL BE BACK r
HASTA LA VISTA, BABY

ลองออนไลน์!

แปลเป็น pseudocode:

f(n,p) {
  r=1;
  c=0;
  while (n) {
    r=r*n;
    n=n-p;
    c=n<0;
    if (c) n=0;
  }
  return r;
}

หมายเหตุ: ArnoldC มีข้อมูลประเภทเดียวเท่านั้น: จำนวนเต็มที่มีเครื่องหมาย 16 บิต ดังนั้นฉันไม่สามารถทดสอบ420!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!เคสได้


แค่อยากรู้เกี่ยวกับรหัสของคุณ ตัวแปร 'c' มีไว้เพื่ออะไร?
ouflak

@ouflak ฉันแก้ไขคำตอบของฉันสองสามครั้งแล้วลืมมันไป cตัวแปรจริงเก็บค่าของการเปรียบเทียบระหว่างและn 0
ชาร์ลี

+1 และฉันยืมมัน (ลบ 'c') สำหรับคำตอบ LUA ของฉัน
ouflak

12

เยลลี่ 4 ไบต์

RṚmP

ลองออนไลน์!

อย่างไร? รับและเป็นครั้งแรกที่สร้างช่วง (กับ) จากนั้นมันจะเก็บทุกองค์ประกอบของช่วงนี้ (ดังนั้น ) และในที่สุดพวกเขาโดยใช้คูณnkn,,1k th n , n - k , n - 2 k , , n - n / k kRṚmkthn,nk,n2k,,nn/kkP


ทำงานได้ดีและเรียบง่ายในที่สุด ฉันไม่รู้จัก Jelly เลย แต่อย่างน้อยมันก็ดูดี :)
V. Courtois

1
@ V.Courtois เมื่อรับและจะสร้างช่วงแรกเป็น (พร้อม) จากนั้นจะเก็บทุกองค์ประกอบของช่วงนี้ (ดังนั้น ) และในที่สุดพวกเขาโดยใช้คูณ เพียงวิธีการตรงไปตรงมา แก้ไข:ฉันเพิ่มคำอธิบายนี้ในคำตอบ k n , , 1 k th n , n - k , n - 2 k , , n - n / k knkn,,1RṚmkthn,nk,n2k,,nn/kkP
Mr. Xcoder

ขอบคุณมาก อยู่มาวันหนึ่งฉันอาจต้องการเล่นกอล์ฟในภาษานี้ดังนั้นฉันจะต้องเรียนรู้พระเหล่านั้น, ผ้าพิมพ์และอื่น ๆ
V. Courtois

ทางเลือกที่มีลักษณะเช่น r1mPCJam:
Erik the Outgolfer

1
@KyeWShi Jelly มีเพจรหัสของตัวเองดังนั้นอักขระ 256 ตัวในนั้นจึงถูกเข้ารหัสเป็น 1 ไบต์
Mr. Xcoder

8

APL (Dyalog Extended) , 7 ไบต์SBCS

ฟังก์ชันนำหน้าเงียบโดยไม่ระบุชื่อ ใช้[n,b]เป็นอาร์กิวเมนต์

×/-\…1¨

ลองออนไลน์!

 หนึ่งสำหรับแต่ละองค์ประกอบของการโต้แย้ง [1,1]

-\ ผลต่างสะสม [n,n-b]

 ช่วงโดยใช้องค์ประกอบที่สองของอาร์กิวเมนต์ซ้ายเป็นตัวบ่งชี้ของขั้นตอนเช่น[9,7]ดำเนินการต่อด้วย5

×/ สินค้า


7

Haskell , 21 ไบต์

n%a=product[n,n-a..1]

ลองออนไลน์!

การรวมฟังก์ชั่นผลิตภัณฑ์ในตัวกับการระบุช่วงการก้าวจะเป็นสิ่งที่ฉันสามารถเขียนโค้ดซ้ำได้

22 ไบต์

n%a|n<1=1|m<-n-a=n*m%a

ลองออนไลน์!

นี่เป็นวิธีแก้ปัญหาการป้อนข้อมูลในรูปแบบสตริง9!!ซึ่งฉันคิดว่าน่าสนใจกว่า

42 ไบต์

(\[(n,a)]->product[n,n-length a..1]).reads

ลองออนไลน์!


2
ฉันคิดว่าคุณสามารถแก้ปัญหาการเรียกซ้ำให้สั้นลงถึงn%a|n<1=1|m<-n-a=n*m%a
ข้อผิดพลาด


5

JavaScript (ES6), 21 ไบต์

(k)(n)จะเข้าเป็น

k=>g=n=>n<1||n*g(n-k)

ลองออนไลน์!

หรือ24 ไบต์เพื่อรองรับ BigInts


JavaScript (ES6), 55 ไบต์

รับอินพุตเป็นสตริงโดยใช้รูปแบบที่อธิบายไว้ในการท้าทาย

s=>(a=s.split`!`,k=a.length-1,g=n=>n<1||n*g(n-k))(a[0])

ลองออนไลน์!


5

ช่องว่าง , 91 ไบต์

[S S S T    N
Push_1][S N
S _Duplicate_1][S N
S _Duplicate_1][T   N
T   T   _Read_STDIN_as_integer_(base)][T    T   T   _Retrieve_base][S S S N
_Push_0][T  N
T   T   _Read_STDIN_as_integer_(factorial)][N
S S N
_Create_Label_LOOP][S N
S _Duplicate_base][S S S T  N
_Push_1][T  S S T   _Subtract][N
T   T   S N
_If_negative_jump_to_Label_PRINT_RESULT][S N
S _Duplicate_base][S T  S S T   S N
_Copy_0-based_2nd_(result)][T   S S N
_Multiply][S N
T   _Swap_top_two][S S S N
_Push_0][T  T   T   _Retrieve_factorial][T  S S T   _Subtract][N
S N
N
_Jump_to_Label_LOOP][N
S S S N
_Create_Label_PRINT_RESULT][S N
N
_Discard_top][T N
S T _Print_result_as_integer]

เพิ่มตัวอักษรS(ช่องว่าง), T(แท็บ) และN(บรรทัดใหม่) เป็นการเน้นเท่านั้น
[..._some_action]เพิ่มเป็นคำอธิบายเท่านั้น

ลองใช้ออนไลน์ (ด้วยพื้นที่ว่างเปล่าแท็บและบรรทัดใหม่เท่านั้น)

คำอธิบายในรหัสเทียม:

Integer result = 1
Integer base = STDIN as integer
Integer factorial = STDIN as integer
Start LOOP:
  If(base <= 0):
    Call function PRINT_RESULT
  result = result * base
  base = base - factorial
  Go to next iteration of LOOP

function PRINT_RESULT:
  Print result as integer to STDOUT


4

Perl 6 , 22 ไบต์

{[*] $^a,*-$^b...^1>*}

ลองออนไลน์!

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


4

05AB1E , 10 8 7 ไบต์

ݦRIιнP

อินพุตเป็นสองอินพุตแยกกัน: อินพุตแรกเป็นbase; factorialเป็นอินพุทที่สอง

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

-2 ไบต์ขอบคุณที่@ Mr.Xcoder
-1 ขอบคุณไบต์@JonathanAllan

คำอธิบาย:

Ý        # Create a list in the range [0, (implicit) base-input]
 ¦       # And remove the first item to make it the range [1, base]
         # (NOTE: this is for the edge case 0. For the other test cases simply `L` instead
         #  of `ݦ` is enough.)
  R      # Reverse this list so the range is [base, 1]
   Iι    # Uninterleave with the second input as step-size
         #  i.e. base=3, factorial=7: [[3],[2],[1],[],[],[],[]]
         #  i.e. base=10, factorial=8: [[10,2],[9,1],[8],[7],[6],[5],[4],[3]]
         #  i.e. base=420, factorial=30: [[420,390,360,...,90,60,30],[419,389,359,...],...]
     н   # Only leave the first inner list
      P  # And take the product of its values
         # (which is output implicitly as result)

คำตอบเดิม 10 ไบต์ :

L0KD¤-IÖÏP

อินพุตเป็นสองอินพุตแยกกัน: อินพุตแรกเป็นbase; factorialเป็นอินพุทที่สอง

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย:

L           # Create a list in the range [1, (implicit) base-input]
 0K         # Remove all 0s (edge case for input 0, which will become the list [1,0])
   D        # Duplicate this list
    ¤       # Get the last value (without popping)
            # (could also be `Z` or `¹` for max_without_popping / first input respectively)
     -      # Subtract it from each item in the list
      IÖ    # Check for each if they're divisible by the second factorial-input
        Ï   # In the list we copied, only leave the values at the truthy indices
         P  # And take the product of those
            # (which is output implicitly as result)

1
6 byter นี้: LR²ιнP( ลองออนไลน์! ) ใช้ได้กับทุกกรณีทดสอบยกเว้น 0
Mr. Xcoder

แต่ฉันเดาว่ากรณี 0 สามารถแก้ไขได้ไม่เกิน 2 ไบต์ หากคุณหาวิธีแก้ไขมันได้คุณอาจเอามันมาแก้ไข :) บางทีLR²ιн0KP8 ไบต์?
Mr. Xcoder

@ Mr.Xcoder คำตอบที่ดี! ไม่เคยแม้แต่ใช้ uninterleave กับขั้นตอนที่กำหนด :)
Kevin Cruijssen

0Kควรไม่จำเป็นเนื่องจาก0!เป็นข้อมูลที่ไม่ถูกต้องตามข้อกำหนด (แม้ว่าจะรวมอยู่ในตัวอย่าง) - ฉันได้แสดงความคิดเห็นเกี่ยวกับเรื่องนี้แล้ว
Jonathan Allan

1
... และถ้า 0!อยู่ในโดเมนอินพุตݦRXιнPจะบันทึกไบต์
Jonathan Allan

4

รหัสเครื่อง x86-64 ขนาด 12 ไบต์

รหัสเครื่องเดียวกันทำสิ่งเดียวกันในโหมด 32 บิตและสำหรับจำนวนเต็ม 16 บิตในโหมด 16 บิต

นี้เป็นฟังก์ชั่น callable กับ args ,n=RCX k=ESI32 EAXบิตในค่าตอบแทน

เรียกได้จาก C พร้อมกับ x86-64 System V การเรียกการประชุมด้วย dummy args เพื่อรับ args จริงในการลงทะเบียนที่ถูกต้อง uint32_t factk(int, uint32_t k, int, uint64_t n); ฉันไม่สามารถใช้ Windows x64 เพียงเพราะmulclobbers RDX 1 ตัวถูกดำเนินการและเราไม่ต้องการให้ REX นำหน้า R8 / R9 nต้องไม่มีขยะใด ๆ ในระดับสูง 32 บิตดังนั้น JRCXZ จึงทำงานได้ แต่นอกเหนือไปจากนั้นคือทั้งหมด 32 บิต

รายการ NASM (ที่อยู่ญาติ, รหัสเครื่อง, แหล่งที่มา)

 1                         factk:
 2 00000000 6A01             push 1
 3 00000002 58               pop rax             ; retval = 1
 4 00000003 E306             jrcxz  .n_zero      ; if (n==0) return
 5                         .loop:                ; do {
 6 00000005 F7E1              mul   ecx            ; retval *= n  (clobbering RDX)
 7 00000007 29F1              sub   ecx, esi       ; n -= k
 8 00000009 77FA              ja   .loop         ; }while(sub didn't wrap or give zero)
 9                         .n_zero:
10 0000000B C3               ret

0xc = 12 ไบต์


หรือ 10 ไบต์ถ้าเราไม่ได้ต้องการที่จะจัดการกับกรณีพิเศษทิ้งออกn=0jrcxz

สำหรับแฟคทอเรียลมาตรฐานคุณจะใช้loopแทน sub / ja เพื่อบันทึก 2 ไบต์ แต่ไม่เช่นนั้นจะเป็นรหัสเดียวกัน


ทดสอบโทรที่ผ่านargcเป็นkที่มีnการกำหนดค่าตายตัว

align 16
global _start
_start:
  mov  esi, [rsp]
;main:
  mov  ecx, 9
  call factk

  mov  esi, eax
  mov  edx, eax
  lea  rdi, [rel print_format]
  xor  eax, eax
extern printf
  call printf
extern exit
  call exit

section .rodata
print_format: db `%#x\t%u\n`

```

3

APL (Dyalog Unicode) , 11 ไบต์SBCS

ฟังก์ชั่นเงียบสงบไม่ระบุชื่อ รับnอาร์กิวเมนต์ที่ถูกต้องและbอาร์กิวเมนต์ซ้าย

×/1⌈⊢,⊢-×∘⍳

ลองออนไลน์!

×∘⍳ คูณbโดยɩ ntegers 1 ผ่านn

⊢- ลบออกจาก n

⊢, ย่อหน้า n

1⌈ สูงสุดของหนึ่งและแต่ละเหล่านั้น

×/ สินค้า



3

ภาษา Wolfram (Mathematica) , 22 21 ไบต์

1##&@@Range[#,1,-#2]&

ลองออนไลน์!

-1 ขอบคุณ attinat: Times --> 1##&

คำอธิบาย: ใช้Rangeเพื่อสร้างรายการค่า{n, n-k, n-2k, n-3k, ...}หยุดก่อนที่จะไปต่ำกว่า 1 (เช่นหยุดเพียงขวา) จากนั้นคูณตัวเลขทั้งหมดในรายการนี้ด้วยTimes(หรือ1##&)


-1 ไบต์พร้อม1##&แทนTimes
attinat

3

Java 10, 44 ไบต์

f->b->{int r=1;for(;b>0;b-=f)r*=b;return r;}

รับแฟกทอเรียลเป็นอินพุตแรกฐานเป็นวินาที

ลองออนไลน์

สิ่งนี้ไม่ได้ผลสำหรับกรณีทดสอบที่ใหญ่ที่สุดเนื่องจากช่วงจำนวนเต็ม จำกัด (32- บิต) ในการแก้ไขปัญหานี้เราสามารถใช้ได้โดยบังเอิญBigIntegersซึ่งมีขนาดใหญ่เป็นสองเท่า - 88 79 ไบต์ :

f->b->{var r=f.ONE;for(;b.signum()>0;b=b.subtract(f))r=r.multiply(b);return r;}

-9 ไบต์ขอบคุณที่@ OlivierGrégoire

ลองออนไลน์

คำอธิบาย:

f->b->{       // Method with two integer parameters and integer return-type
  int r=1;    //  Result-integer, starting at 1
  for(;b>0;   //  Loop as long as the base is still larger than 0
      b-=f)   //    After every iteration: decrease the base by the factorial
    r*=b;     //   Multiply the result by the base
  return r;}  //  Return the result


@ OlivierGrégoire Np และขอบคุณ! :)
Kevin Cruijssen

2

Japtet , 8 ไบต์

TõUV f ×

ลองมัน

-1 ต้องขอบคุณ EoI ที่ชี้ให้เห็นว่าปุยที่ไม่มีคาเฟอีนเป็นใบ้ได้อย่างไร!


kTสามารถแทนที่ด้วยf1 ไบต์
ศูนย์รวมแห่งความไม่รู้

1
@EmbodimentofIgnorance แน่นอนมันสามารถ! ฉันรู้ว่ามันเร็วเกินไปสำหรับการเล่นกอล์ฟ! : \
ปุย


2

MathGolf , 7 6 ไบต์

╙╒x%ε*

ลองออนไลน์!

พบวิธีที่ฉลาดในการจัดการ 0! โดยไม่มีการเปลี่ยนแปลงกรณีทดสอบอื่น ๆ รับอินพุตเป็นk n(เรียงลำดับกลับกัน) ซึ่งช่วยในการ popping โดยนัย

คำอธิบาย

╙        maximum of two elements (pops largest of k and n,
         which is n for every valid case except 0!, where 1 is pushed)
 ╒       range(1,n+1)
  x      reverse int/array/string
   %     slice every k:th element
    ε*   reduce list with multiplication

2

ทูต , 21 19 ไบต์

${x<y∨x*$[x-y,y]}

ลองออนไลน์! การใช้งานแบบเรียกซ้ำโดยตรง (หมายเหตุ: trueมีความสำคัญ1เนื่องจากสามารถใช้ในการดำเนินการทางคณิตศาสตร์เป็น1.) นี่เป็นหนึ่งในไม่กี่โปรแกรมที่ฉันเขียนสำหรับไซต์นี้ซึ่งการใช้ตัวดำเนินการ unicode ช่วยประหยัดไบต์ (1 เพื่อความแม่นยำ)

ทางเลือก

20 ไบต์: ${x<y or x*$[x-y,y]}

21 ไบต์: Prod@${{_%y=x%y}\1:x}

27 ไบต์: ${x*[`1,$][x>y][x-y,y]∨1}

27 ไบต์: ${If[x>y,x*$[x-y,y],_or 1]}

27 ไบต์: ${x*[`1,$][x>y][x-y,y]or 1}

29 ไบต์: ${If[x>y,x*$[x-y,y],_+not _]}


2

สนิม , 92 73 61 ไบต์

fn f(n:i128,k:i128)->i128{if n<=0{return 1}return n*f(n-k,k)}

ฉันเพิ่งเริ่มเรียนรู้การเกิดสนิมดังนั้นฉันมั่นใจว่ามันจะสั้นกว่านี้ จะอัปเดตตามที่ฉันเรียนรู้ ค่าส่งคืนควรจะi128คำนวณการทดสอบครั้งสุดท้าย

แก้ไข: การเรียกซ้ำสั้นกว่า

ลองออนไลน์!

คุณสามารถเพิ่มการทดสอบของคุณเองหรือแก้ไขหนึ่งในการทดสอบที่มีอยู่แล้ว


2

q , 59 57 55 53 ไบต์

{prd 2+(&)1_i=last i:("J"$x(&)not[n])#(!)sum n:"!"=x}

คำอธิบาย:

q)x:"12!!" / let our input be 12!!, assign to x
q)sum n:"!"=x / count "!"s
2i
q)(!)sum n:"!"=x / (!)m -> [0,m)
0 1
q)("J"$x(&)not[n]) / isolate the number in input
12
q)("J"$x(&)not[n])#(!)sum n:"!"=x / x#y means take x items from list y, if x>y, circle around
0 1 0 1 0 1 0 1 0 1 0 1
q)i:("J"$x(&)not[n])#(!)sum n:"!"=x / assign to i
q)i
0 1 0 1 0 1 0 1 0 1 0 1
q)(last i)=i:("J"$x(&)not[n])#(!)sum n:"!"=x / take last elem of i and see which are equal in i
010101010101b
q)1_(last i)=i:("J"$x(&)not[n])#(!)sum n:"!"=x / drop first elem
10101010101b
q)(&)1_(last i)=i:("J"$x(&)not[n])#(!)sum n:"!"=x / indices of 1b (boolean TRUE)
0 2 4 6 8 10
q)2+(&)1_(last i)=i:("J"$x(&)not[n])#(!)sum n:"!"=x / add 2 across array
2 4 6 8 10 12
q)prd 2+(&)1_(last i)=i:("J"$x(&)not[n])#(!)sum n:"!"=x / product across array
46080

นี่คือรุ่นใน k (ตรรกะเดียวกัน), 42 41 ไบต์

{*/2+&1_i=last i:("J"$x@&~:n)#!+/n:"!"=x}

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

@ SriotchilismO'Zaic ขอบคุณ :-)
เขียน

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

@ mbomb007 น่าสนใจ บอทมีคำตอบการตั้งค่าสถานะหรือไม่ เกิดอะไรขึ้นกับการส่งที่มีคุณภาพต่ำ ฉันจะอัปเดตเร็ว ๆ นี้!
เขียนลวก ๆ

ใช่มีบอท StackExchange ใช้บ็อตเพื่อค้นหาสแปมที่เป็นไปได้และคำตอบคุณภาพต่ำ ผู้ที่มีชื่อเสียงมากพอสามารถดูคิวการตรวจสอบ meta.stackexchange.com/a/161391/285610
mbomb007

1

Physica , 22 ไบต์

f=>n;k:n<1||n*f[n-k;k]

ลองออนไลน์!


26 ไบต์

เรียนรู้วิธีใช้ "ภาษา" ของฉันเองอีกครั้ง \ หากฉันรู้วิธีเขียนโปรแกรมแยกวิเคราะห์เมื่อ 2 ปีที่แล้วนี่จะเป็น 20 ไบต์ :(

->n;k:GenMul##[n…1]{%%k}

หรือ

->n;k:GenMul##Range[n;1;k]

ลองออนไลน์!


1

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

^0
1
\d+
*!,
+`(!+)(!+),\1$
$1$2,$2,$1
!+$
1
+`(!+),(\d+)
$.($2*$1

ลองออนไลน์! ลิงค์นั้นรวมถึงกรณีทดสอบที่เร็วกว่า ขยำหมายเลขโดยไม่มีเครื่องหมายอัศเจรีย์ คำอธิบาย:

^0
1

0!แก้ไขปัญหาขึ้น

\d+
*!,

แปลงnเป็น unary และเพิ่มตัวคั่น

+`(!+)(!+),\1$
$1$2,$2,$1

ซ้ำแล้วซ้ำอีกลบkจากnในขณะที่n>kและเก็บผล

!+$
1

แทนที่kด้วย1(เป็นทศนิยม)

+`(!+),(\d+)
$.($2*$1

ทวีคูณโดยแต่ละค่ากลางเปลี่ยนเป็นทศนิยม




1

Forth (gforth) , 50 ไบต์

: f 1 1 2over / 1+ 0 do 2over i * - 1 max * loop ;

ลองออนไลน์!

รหัสคำอธิบาย

: f                \ start a new word definition
  1 1              \ add placeholder and accumulator to stack
  2over / 1+       \ get the number of times to run the loop (num/factorial + 1)
  0 do             \ start loop from 0 to num/factorial
    2over          \ copy num and factorial to the top of the stack
    i * -          \ get the current number to multiply by (num - factorial * i)
    1 max          \ make sure it can't be 0 or negative [set to 1 if it is]
    *              \ multiply accumulator by result
  loop             \ end loop
;                  \ end the word definition           



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