นับจาก 1 ถึง n โดยไม่ต้องต่อเนื่องตัวเลขใด ๆ


19

เป้าหมาย

คุณได้รับจำนวนเต็มn( n > 1) คุณจะต้องส่งออกหลายวิธีพีชคณิตของจำนวนเต็ม1จะnมีซึ่งเริ่มต้นที่1ปลายที่nและไม่ได้มีการติดต่อกันจำนวนเต็มสองจำนวนที่แตกต่างกันโดย 1

อีกทางเลือกหนึ่งถ้าคุณใช้กราฟที่สมบูรณ์K_nและลบขอบของเส้นทาง1-2-3-...-nคุณจะต้องนับเส้นทางของ Hamiltonian จาก1ไปเป็นnในกราฟที่เหลือ

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


ตัวอย่าง

สำหรับn = 6ทางออกที่เป็นไปได้คือ1-3-5-2-4-6

แต่ไม่ได้เป็นวิธีการแก้ปัญหาที่ถูกต้องเพราะมันไม่ได้จบด้วย1-3-5-2-6-46

ในความเป็นจริงสำหรับn = 6มีเพียง 2 โซลูชั่น ( 1-4-2-5-3-6เป็นอีกทางหนึ่ง)

f(6) = 2ด้วยเหตุนี้


สำหรับn = 4การเรียงสับเปลี่ยนเท่านั้นที่เริ่มต้น1และสิ้นสุดใน4คือ1-2-3-4และ1-3-2-4. ในทั้งสองของพวกเขา2อยู่ติดกับ3ให้จำนวนเต็มติดต่อกันซึ่งแตกต่างกันโดย 1 f(4) = 0ดังนั้น


กรณีทดสอบ

f(6) = 2
f(4) = 0
f(8) = 68
f(13) = 4462848

เกณฑ์การชนะ

นี่คือรหัสกอล์ฟคำตอบที่สั้นที่สุดชนะ


7
คุณเห็นเด็ก ๆ คุณไม่สามารถตรวจสอบได้ว่ามีพีชคณิตจำนวนเท่าไรที่[2..n-1]ไม่มีเดลตาส1หรือ-1คุณต้องตรวจสอบว่าไม่มีพวกเขาเริ่มต้น2หรือสิ้นสุดด้วยn-1...
ETHproductions

1
รายการต้องเริ่มต้นด้วย 1 และลงท้ายด้วยหมายเลขหรือไม่
Okx

3
บางที OP หมายถึง "ติดกัน" ไม่ใช่ "ติดต่อกัน"?
Stilez

6
ลำดับที่นี่อยู่ที่นี่: algo.inria.fr/l ไลบรารี/autocomb/graphs99.psที่เขียนหน้า 6 Q_ser:=z + 2 z^6 + 10 z^7 + 68 z^8 + 500 z^9 + 4174 z^10 + 38774 z^11 + 397584z^12 + 4462848 z^13 + 54455754 z^14ฉันใช้เวลาตอนนี้พยายามใช้สูตร แต่ฉันไม่สามารถเขียนสูตรที่สร้างลำดับได้ น่าทึ่งที่ได้เห็นเลขชี้กำลังของ z คืออินพุทของสูตรและผลลัพธ์คือปัจจัยการคูณ วิธีที่สามารถอนุมานสูตรจากอาจเป็นหนึ่งเดียวกับคำตอบที่สั้นที่สุดในไบต์
Christiaan Westerbeek

1
@ChristiaanWesterbeek ที่เรียกว่าฟังก์ชั่นการสร้างสำหรับลำดับ มีหลายซีเควนซ์ที่มีฟังก์ชั่นการสร้างที่มีรูปแบบปิดดีกว่าลำดับตัวเองมันเจ๋งมาก!
Carmeister

คำตอบ:


6

MATL , 16 ไบต์

qtq:Y@0&Yc!d|qAs

ลองออนไลน์!

สำหรับอินพุตเกิน12หน่วยความจำหมด

คำอธิบาย

q      % Implicitly input n. Push n-1
tq     % Duplicate and subtract 1: pushes n-2
:      % Range [1 2 ... n-2]
Y@     % Matrix with all permutations, each in a row
0      % Push 0
&Yc    % Append n-1 and predend 0 to each row
!      % Tranpose
d      % Consecutive differences along each column
|      % Absolute value
q      % Subtract 1
A      % All: true if all values in each column are non-zero
s      % Sum. Implicitly display

1
ทำงานดีทำดี :)
ฟิลิปป์

1
แม้ว่าจะมีความก้าวหน้าที่ดีมากสำหรับปัญหานี้ แต่วิธีการแก้ปัญหาของคุณก็ยังสั้นที่สุด มันเร็วกว่าเจลลี่อีกด้วย Congratz!
ฟิลิปป์

19

Mathematica, 58 ไบต์, เวลาพหุนาม ( n )

Abs[Sum[(k-1)Hypergeometric2F1[k,k-#,2,2](#-k)!,{k,#}]-1]&

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

แทนที่จะวนซ้ำกับการเรียงสับเปลี่ยนโดยใช้กำลังดุร้ายเราใช้หลักการรวม - แยกออกเพื่อนับพวกมันรวมกัน

ให้ S เป็นเซตของพีชคณิตทั้งหมดของ [1, …, n] ด้วยσ 1 = 1, σ n = n , และให้ S iเป็นเซตของพีชคณิตσ∈ S เช่นนั้น | σ i - σ i + 1 | = 1. จากนั้นจำนวนที่เราต้องการคือ

| S | - | S 1 ∪⋯∪ S n - 1 | = ∑ 2 ≤ kn + 1; 1 ≤ i 2 <⋯ < i k - 1 < n (−1) k - 2 | S i 2 ∩⋯∩ S i k - 1 |

ตอนนี้ | S i 2 ∩⋯∩ S i k - 1 | เพียง แต่ขึ้นอยู่กับkและจำนวนของการทำงานของดัชนีติดต่อกัน [ ฉัน1 , ฉัน2 , ... , ฉันk - 1 , ฉันk ] ที่เพื่อความสะดวกของเราจะแก้ไขปัญหาผม1 = 0 และฉันk = n โดยเฉพาะอย่างยิ่ง

| S i 2 ∩⋯∩ S i k - 1 | = 2 j - 2 ( n - k )!, สำหรับ 2 ≤ jkn ,
| S i 2 ∩⋯∩ S i k - 1 | = 1, สำหรับj = 1, k = n + 1

จำนวนของดัชนีดังกล่าวตั้งค่า [ i 1 , i 2 , …, i k - 1 , i k ] ด้วยj run คือ

( k - 1 C j - 1 ) ( n - k C j - 2 ), สำหรับ 2 ≤ jkn ,
1, สำหรับj = 1, k = n + 1

ผลที่ได้คือ

(-1) n - 1 + ∑ 2 ≤ kn 2 ≤ jk (−1) k - 2 ( k - 1 C j - 1 ) ( n - k C j - 2 ) 2 j - 2 ( n - k )!

ผลรวมภายในมากกว่าJสามารถเขียนได้ใช้hypergeometric 2 F 1ฟังก์ชั่น :

(−1) n - 1 + ∑ 2 ≤ kn (−1) k ( k - 1) 2 F 1 (2 - k , k - n ; 2; 2) ( n - k )!

ซึ่งเราใช้การแปลง Pfaff ที่ช่วยให้เราสามารถกำจัดพลังของ −1 โดยใช้ค่าสัมบูรณ์:

(−1) n - 1 + ∑ 2 ≤ kn (−1) n ( k - 1) 2 F 1 ( k , k - n ; 2; 2) ( n - k )!
= | −1 + ∑ 1 ≤ kn ( k - 1) 2 F 1 ( k , k - n ; 2; 2) ( n - k )! |

การสาธิต

In[1]:= Table[Abs[Sum[(k-1)Hypergeometric2F1[k,k-#,2,2](#-k)!,{k,#}]-1]&[n],{n,50}]

Out[1]= {1, 0, 0, 0, 0, 2, 10, 68, 500, 4174, 38774, 397584, 4462848, 

>    54455754, 717909202, 10171232060, 154142811052, 2488421201446, 

>    42636471916622, 772807552752712, 14774586965277816, 297138592463202402, 

>    6271277634164008170, 138596853553771517492, 3200958202120445923684, 

>    77114612783976599209598, 1934583996316791634828454, 

>    50460687385591722097602304, 1366482059862153751146376304, 

>    38366771565392871446940748410, 1115482364570332601576605376898, 

>    33544252621178275692411892779180, 1042188051349139920383738392594332, 

>    33419576037745472521641814354312790, 

>    1105004411146009553865786545464526206, 

>    37639281863619947475378460886135133496, 

>    1319658179153254337635342434408766065896, 

>    47585390139805782930448514259179162696722, 

>    1763380871412273296449902785237054760438426, 

>    67106516021125545469475040472412706780911268, 

>    2620784212531087457316728120883870079549134420, 

>    104969402113244439880057492782663678669089779118, 

>    4309132147486627708154774750891684285077633835734, 

>    181199144276064794296827392186304334716629346180848, 

>    7800407552443042507640613928796820288452902805286368, 

>    343589595090843265591418718266306051705639884996218154, 

>    15477521503994968035062094274002250590013877419466108978, 

>    712669883315580566495978374316773450341097231239406211100, 

>    33527174671849317156037438120623503416356879769273672584588, 

>    1610762789255012501855846297689494046193178343355755998487686}

3
ใจของฉันปลิวไปได้ดี
ฟิลิปป์

6

เยลลี่ , 17 16 ไบต์

ṖḊŒ!ð1;;⁹IỊṀðÐḟL

ลิงค์ monadic

ลองออนไลน์!

อย่างไร?

ṖḊŒ!ð1;;⁹IỊṀðÐḟL - Link: number n
Ṗ                - pop (implicit range build) -> [1,n-1]
 Ḋ               - dequeue -> [2,n-1]
  Œ!             - all permutations of [2,n-1]
    ð       ðÐḟ  - filter discard those entries for which this is truthy:
     1;          -   1 concatenated with the entry
       ;⁹        -   ...concatenated with right (n)
         I       -   incremental differences
          Ị      -   is insignificant (absolute value <=1)
           Ṁ     -   maximum
               L - length (the number of valid arrangements)

ขออภัย แต่ไม่ตรงกับกรณีทดสอบ
Philippe

1
ใช่คุณทำผิดพลาดเหมือนกัน Okx และฉันทำในตอนแรก คุณต้องคำนึงถึงความจริงที่ว่าตัวเลขที่สองไม่สามารถเป็น 2 และตัวเลขที่สอง - สุดท้ายไม่สามารถเป็น n-1
ETHproductions

@ ฟิลิปป์ซ่อมมันได้แล้ว
Jonathan Allan

ฉันไม่คิดว่าการใช้IỊṀนั้นถูกต้อง โดยเฉพาะถ้า-2เป็นหนึ่งในสามเหลี่ยมปากแม่น้ำที่นั่นเป็นตัวอย่าง? คุณสามารถแก้ไขได้ด้วยIAỊṀสำหรับ +1
Erik the Outgolfer

1
@JonathanAllan Ooh x <= 1ฉันคิดว่ามันกลับมา
Erik the Outgolfer

5

Japt , 19 18 ไบต์

o2 á è_pU äÉ m²e>1

ทดสอบออนไลน์! 10ฉันจะไม่แนะนำการทดสอบในสิ่งที่มีขนาดใหญ่กว่า

คำอธิบาย

o2 á è_  pU äÉ  m²  e>1
o2 á èZ{ZpU ä-1 mp2 e>1}
                          : Implicit: U = input integer
o2                        : Create the range [2..U-1].
   á                      : Generate all permutations of this range.
     èZ{               }  : Check how many permutations Z return a truthy value:
        ZpU               :   Push U to the end of Z.
            ä-1           :   Push 1 to the beginning of Z, then take the difference
                          :   of each pair of items.
                m         :   Map each item X to
                 p2       :     X ** 2. This gives a number greater than 1 unless the
                          :     item is 1 or -1.
                    e>1   :   Return whether every item in this list is greater than 1.
                          :   This returns `true` iff the permutation contains no
                          :   consecutive pairs of numbers.
                          : Implicit: output result of last expression

เยี่ยมมาก! ขำ ๆ ว่ารหัสแรงเดรัจฉานของฉันไม่สามารถผ่านได้ n = 13 ใช่แล้วอา
ฟิลิปป์

@ ฟิลิปป์ฉันไม่อยากแนะนำให้ยอมรับอย่างรวดเร็วฉันแน่ใจว่านี่จะสั้นกว่าใน 05AB1E หรือ Jelly ;-)
ETHproductions

ล้มเหลวใน 1testcase
Okx

2
@Okx OP ได้ระบุว่าเราสามารถสันนิษฐานn > 1ได้
ETHproductions


5

Haskell, 76 65 ไบต์

บันทึกแล้ว 11 ไบต์ขอบคุณ @xnor

เราใช้ผลลัพธ์สำหรับQ_recหน้า 7 ของการค้นหาของ @ ChristiaanWesterbeek

f 1=1
f n|n<6=0
f n=sum$zipWith((*).f)[n-5..][n-4,1,10-2*n,4,n-2]

ฉันไม่เข้าใจว่าผลลัพธ์ต่อไปของพวกเขาเป็นอย่างไร haเกี่ยวข้องกับสิ่งนี้อย่างไร แต่หลังจากเร่งความเร็ว (ครั้งแรกโดยการบันทึกช่วยจำให้ดูรุ่นก่อนหน้าและด้านล่าง) ฉันจะได้รับหมายเลขของพวกเขา

ในขณะที่ข้างต้นก็โอเคสำหรับn=20มันเป็นตัวอย่างที่จำเป็นที่จะไม่เรียกซ้ำ นี่คือรุ่นที่เร็วกว่า (สำหรับเท่านั้นn>=6) ที่จะต้องใช้หน่วยความจำคงที่ด้วย - หากตัวเลขไม่เพิ่มขึ้นเรื่อย ๆ ...

f n=last$foldl(#)[1,0,0,0,0][6..n]
l#n=tail l++[sum$zipWith(*)l[n-4,1,10-2*n,4,n-2]]

ที่ให้

Prelude> f 50
1610762789255012501855846297689494046193178343355755998487686
Prelude> f 500
659178618863924802757920269977240274180092211041657762693634630044383805576666007245903670780603497370173231423527767109899936008034229541700392144282505597945561328426013937966521561345817045884498867592832897938083071843810602104434376305964577943025310184523643816782047883794585616331928324460394146825636085453532404319881264974005968087265587062691285454120911586459406436421191277596121471930913837355151842093002557978076653884610826296845041929616496533544124347765641367732716560025553179112645454078955409181466212732427071306363820080109636358537270466838558068527692374178581063316309789026101221004745226182671038004326069705775312654329754698423385241664984156235692539255677944294995403233446243315371404887473868003155621849544566385172835597260848972758443874423271017007843907015007416644383573987606586308556317833384896267539628278571497402655322562624217658332870157802254043614726316296058329670971054977099155788604175817828380564156329839201579006169173002756295957371639199917376529472990059986681882194726437566769717959443857298155265292535858523609764515938314672724480762724541633037484152303637096

ไม่มีปัญหาที่จะได้รับf 5000แต่ฉันไม่ต้องการวางผลลัพธ์ ...


BTW เป็นไปได้ที่จะไม่ใช้คณิตศาสตร์แฟนซีและยังไม่ใช้กำลังดุร้าย (พิเศษ) ขั้นแรกแทนที่จะมองหาพีชคณิตทั้งหมดให้ดูที่พีชคณิตบางส่วนแล้วขยายเมื่อไม่ถูกต้องเท่านั้น 1 6 5มันใช้งานเพื่อดูพีชคณิตทั้งหมดเริ่มต้นด้วยไม่มี ประการที่สองมีการเรียงสับเปลี่ยนบางส่วนเช่น1 3 5 7และ1 5 3 7มีการต่อเนื่องที่ถูกต้องเหมือนกันดังนั้นจัดการพวกมันเข้าด้วยกัน ด้วยความคิดเหล่านี้ฉันสามารถคำนวณค่าได้ถึงn=16 0.3s


คุณสามารถเขียนการแสดงออก recursive f n=sum$zipWith((*).f)[n-5..][n-4,1,10-2*n,4,n-2]สั้นเช่นจุดโดยแยกออกมาจากค่าสัมประสิทธิ์ไปนี้:
xnor

@xnor ถูกต้องขอบคุณ!
Christian Sievers

นี่เป็นผลงานที่ดีฉันประหลาดใจกับผลลัพธ์ที่ชุมชนนี้ได้รับ! น่าเสียดายที่มันเป็นสนามกอล์ฟ ^^
ฟิลิปป์


3

Mathematica, 66 ไบต์

Count[Permutations@Range@#,x:{1,__,#}/;FreeQ[Differences@x,1|-1]]&

คำอธิบาย

Function#กับอาร์กิวเมนต์แรก

Count[                                                             (* Count the number of *)
      Permutations@                                                (* permutations of *)
                   Range@#,                                        (* the list {1, ..., #} *)
                           x:{1,__,#}                              (* of the form {1, __, #} *)
                                     /;                            (* such that *)
                                             Differences@x,        (* the list of differences of consecutive elements *)
                                       FreeQ[                      (* is free of elements of the form *)
                                                           1|-1    (* 1 or -1 *)
                                                               ]]&

3

Javascript (ES6), 100 74 72 60 ไบต์

f=n=>n--<6?!n|0:f(n)*--n+4*f(n--)-2*f(n--)*--n+f(n)*++n+f(n)

ด้านล่างนี้เป็นเวอร์ชั่นก่อนกอล์ฟ - มาสเตอร์ของ @PeterTaylor

f=n=>n<6?n==1|0:(n-4)*f(n-5)+f(n-4)-2*(n-5)*f(n-3)+4*f(n-2)+(n-2)*f(n-1)

ขอบคุณคำตอบจาก @ChristianSievers ที่จัดการร่างโซลูชั่น Haskell จากกระดาษที่ฉันพบหลังจาก googling '0, 2, 10, 68, 500, 4174, 38774, 397584' นี่คือเวอร์ชัน Javascript ที่ไม่อนุญาตเช่นกัน

การใช้

for (i=1; i<=20; i++) {
  console.log(i, f(i))
}

1 1 
2 0 
3 0 
4 0 
5 0 
6 2 
7 10 
8 68 
9 500 
10 4174 
11 38774 
12 397584 
13 4462848 
14 54455754 
15 717909202 
16 10171232060 
17 154142811052 
18 2488421201446 
19 42636471916622 
20 772807552752712

1
คำอธิบายภารกิจจะถามเพียงf(n)เมื่อใดn>1จึงไม่สำคัญว่าคุณจะกลับมาเป็นn=1อย่างไร นอกจากนี้ฉันคิดว่าf(1)=1ถูกต้อง
Christian Sievers

คุณสามารถรวมกรณีพิเศษn<6?n==1|0:เพื่อการประหยัดสองตัวต่อไป
Peter Taylor

ยิ่งใหญ่ ฉันปรับสำหรับ 2 ความคิดเห็นเหล่านั้น
Christiaan Westerbeek

1
และโดยการเรียงลำดับคำศัพท์ใหม่ ๆ และอาศัยการเรียงลำดับของการประเมินเป็นไปได้ที่จะลดลงถึง 60:f=n=>n--<6?!n|0:f(n)*--n+4*f(n--)-2*f(n--)*--n+f(n)*++n+f(n)
Peter Taylor

1

Brachylogขนาด 26 ไบต์

{⟦₁pLh1&~tLs₂ᶠ{-ȧ>1}ᵐ}ᶜ|∧0

ลองออนไลน์!

คำอธิบาย

{                    }ᶜ       Output = count the number of outputs of:
 ⟦₁pL                           L is a permutation of [1, …, Input]
    Lh1                         The head of L is 1
       &~tL                     The tail of L is the Input
          Ls₂ᶠ                  Find all sublists of length 2 of L
              {    }ᵐ           Map on each sublist:
               -ȧ>1               The elements are separated by strictly more than 1
                       |      Else (no outputs to the count)
                        ∧0    Output = 0

1

Python 3 , 109 107 102 ไบต์

q=lambda s,x,n:sum(q(s-{v},v,n)for v in s if(v-x)**2>1)if s else x<n;f=lambda n:q({*range(2,n)},1,n-1)

ลองออนไลน์!

ลบสี่ไบต์โดยไม่พยายามใช้ฟังก์ชัน (ตามที่แนะนำโดย @shooqie) และอีกหนึ่งไบต์โดยแทนที่absด้วยช่องสี่เหลี่ยม (ต้องการ Python 3.5+)




0

Mathematica, 134 ไบต์

(s=Permutations@Range[2,#-1];g=Table[Join[Prepend[s[[i]],1],{#}],{i,Length@s}];Length@Select[Union@*Abs@*Differences/@g,FreeQ[#,1]&])&


กรณีทดสอบ n: 2 ถึง 12

{0, 0, 0, 0, 2, 10, 68, 500, 4174, 38774, 397584}


0

Python 2 , 105 ไบต์

lambda n:reduce(lambda a,i:a+[i*a[-5]+a[-4]+2*(1-i)*a[-3]+4*a[-2]+(i+2)*a[-1]],range(2,n),[0,1]+4*[0])[n]

ลองออนไลน์!

สิ่งนี้มีพื้นฐานมาจากกระดาษของ Philippe Flajolet ที่ค้นพบโดย@Christiaan Westerbeek ; มันเร็วกว่ามากและสั้นกว่าสองไบต์กว่าโซลูชัน Python 3ของฉันซึ่งระบุการเรียงสับเปลี่ยนที่เป็นไปได้ (ใน Python 3 reduceย้ายไปfunctoolsอย่างน่ารำคาญ)

มีเวอร์ชันที่สั้นกว่ามากโดยใช้ผลิตภัณฑ์ dot ของ numpy แต่โอเวอร์โฟลนั้นค่อนข้างเร็วและต้องการนำเข้า numpy แต่สำหรับสิ่งที่คุ้มค่า:

lambda n:reduce(lambda a,i:a+[dot([i,1,2-2*i,4,i+2],a[-5:])],range(2,n),[0,1]+4*[0])[n]
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.