N-chotomize รายการ


12

รับรายการจำนวนเต็มLและจำนวนเต็มNเอาต์พุตแยกLในNรายการย่อยที่มีความยาวเท่ากัน

ความยาวไม่สามารถหารได้

หากNไม่แบ่งความยาวของLมันก็เป็นไปไม่ได้ที่รายการย่อยทั้งหมดจะมีความยาวเท่ากัน

ในกรณีใด ๆ รายการย่อยสุดท้ายของเอาท์พุทคือรายการที่ปรับความยาวเพื่อให้มีส่วนที่เหลือของรายการ

ซึ่งหมายความว่ารายการย่อยทั้งหมดของLยกเว้นรายการสุดท้ายควรมีความยาวlength(L) // Nโดยที่การ//หารแบบพื้น (เช่น3//2 = 1)

กฎบางอย่าง

  • L สามารถว่างเปล่า

  • N >= 1.

  • คุณสามารถใช้บิวท์อินที่คุณต้องการ

  • คุณสามารถรับอินพุตSTDINเป็นอาร์กิวเมนต์ของฟังก์ชันหรืออะไรก็ได้ที่คล้ายกัน

  • คุณสามารถพิมพ์ผลลัพธ์ไปที่STDOUTส่งคืนจากฟังก์ชันหรือสิ่งอื่นที่คล้ายคลึงกัน

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

กรณีทดสอบ

Input:  [1,2,3,4], 2
Output: [[1,2],[3,4]]

Input:  [-1,-2,3,4,-5], 2
Output: [[-1,-2],[3,4,-5]]

Input:  [1,2,3,4], 1
Output: [[1,2,3,4]]

Input:  [4,8,15,16,23,42], 5
Output: [[4],[8],[15],[16],[23,42]]

Input:  [4,8,15,16,23,42], 7
Output: [[],[],[],[],[],[],[4,8,15,16,23,42]]

Input:  [2,3,5,7,11,13,17,19,23], 3
Output: [[2,3,5],[7,11,13],[17,19,23]]

Input:  [], 3
Output: [[],[],[]]

Input:  [1,2,3,4,5,6,7,8], 3
Output: [[1,2],[3,4],[5,6,7,8]]

เกณฑ์การให้คะแนน

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




เฉพาะจำนวนเต็มบวก หรืออาจเพิ่มกรณีทดสอบ
Luis Mendo

@LuisMendo ไม่ฉันเปลี่ยนกรณีทดสอบเพื่อแสดงว่า
เสียชีวิต

รายการความยาว 8 ที่มีความยาว n = 3 (แนะนำโดย user2357112) จะเป็นกรณีทดสอบที่ดี - มันทำให้วิธีการของฉันพัง
xnor

คำตอบ:


2

Pyth, 11 10 ไบต์

1 ไบต์ขอบคุณที่@FryAmTheEggman

cJEt*R/lJQ

ชุดทดสอบ

รับอินพุตตามลำดับที่กลับรายการ

ตัวอย่างอินพุต:

5
[1,2,3,4,5,6,7]

ตัวอย่างผลลัพธ์:

[[1], [2], [3], [4], [5, 6, 7]]

คำอธิบาย

cJEt*R/lJQ     Main function, first input:Q, second input:E.
cJEt*R/lJQQ    Implicit arguments.

c              The function c is special.
               It can chop arrays.
               If the second argument is a list of integers,
               then it chops the first array at the indices
               specified by the second array.

 JE            The first argument is the second input, stored
               to the variable J.

   t*R/lJQQ    This is the second argument.
      /lJQ     Yield length of J, integer-divided by Q.
    *R    Q    Multiply it to the following respectively:
                   [0,1,2,3,...,Q-1]
   t           Then throw away the first element.
               For example, if Q=3 and E=[1,2,3,4,5,6,7,8],
               we would now have [3,6].


2

Python, 76 73 ไบต์

lambda L,N:list(map(lambda x,r=len(L)//N:L[x*r:][:r+(x>N-2)*N],range(N)))

โดยทั่วไปฟังก์ชั่นไม่มีชื่อที่ดำเนินการงาน ขอบคุณ LeakyNun ที่บันทึกไว้ในไบต์!


1
นอกจากนี้ยินดีต้อนรับสู่ PPCG!
Leun Nun

@LeakyNun Nun มันเป็น 73 ฉันคิดว่าจริง ๆ แล้ว มันเป็นความผิดของฉันส่วนใหญ่เนื่องจากฉันไม่ได้ให้ความสนใจมากในขณะที่แก้ไข อันตรายของ codegolfing ในที่ทำงาน: P
Lause

@LeakyNun - จนถึงจุดแรก - มันไม่ทำงาน การแสดงออกโดยทั่วไปคือ [: r] สำหรับรายการปกติและ [: r + N] สำหรับรายการสุดท้ายซึ่งควรจะจับองค์ประกอบที่เหลือทั้งหมด จุดที่สอง - ฉันพยายาม แต่ทุกวิธีที่ฉันรู้ว่าให้ฉันกำหนด r ทำให้มันยาวกว่ารหัสของฉัน
ลด

มันจะ แต่ในกรณีของ r * (x> N-2) มันคือ [: 0] ไม่ใช่ [:]
ลด


2

เสียงกระเพื่อมสามัญ, 114 ไบต์

(defun f(l n &optional(p(floor(length l)n))(i 1))(if(= i n)(list l)(cons(subseq l 0 p)(f(subseq l p)n p(+ i 1)))))

Ungolfed:

(defun f (l n &optional (p (floor (length l) n)) (i 1))
  (if (= i n) (list l)
              (cons (subseq l 0 p)
                    (f (subseq l p) n p (+ i 1))))
  )

ตัวอย่างการโทร:

(format t "~A~C~C" (f (read) (read)) #\return #\newline)

ลองที่นี่!

โดยทั่วไป:

  • หากเรากำลังตัดกลุ่มสุดท้ายให้คืนสิ่งที่เหลืออยู่ของรายการเริ่มต้น
  • มิฉะนั้นนำp = |L| / Nองค์ประกอบออกจากรายการและเข้าร่วมกับผลลัพธ์ของการโทรซ้ำในส่วนที่เหลือ iเป็นตัวนับการวนซ้ำที่ใช้สำหรับเงื่อนไขการหยุด

ฉันเข้าใจความท้าทายในตอนแรกโดยคิดว่าโปรแกรมควรสร้างกลุ่มของNองค์ประกอบมากกว่าNกลุ่ม อย่างไรก็ตามรุ่นนี้ใช้งานได้เพิ่ม 10 ไบต์ LisP จะไม่ชนะในครั้งนี้ แต่ฉันไม่สามารถพลาดโอกาส: ')


2

Haskell, 69 67 ไบต์

a%b=a#b where l#1=[l];l#n|(h,t)<-splitAt(div(length a)b)l=h:t#(n-1)

ตัวอย่างการใช้งาน: ->[1,2,3,4] % 3[[1],[2],[3,4]]

วิธีการ recursive ง่ายคล้ายกับ@ XNOR ของคำตอบ

แก้ไข: @Will Ness บันทึก 2 ไบต์ ขอบคุณ!


h:t#(n-1)ยังใช้งานได้
Will Ness

1

PowerShell v2 +, 125 ไบต์

param($l,$n)if($p=[math]::Floor(($c=$l.count)/$n)){1..$n|%{$l[(($_-1)*$p)..((($_*$p-1),$c)[!($_-$n)])]}}else{(,''*($n-1))+$l}

รู้สึกยาวเกินไป แต่ฉันไม่สามารถหาวิธีแบ่งส่วนเพื่อทำงานอย่างมีความสุขได้หากมีอาร์เรย์ว่างในเอาต์พุตดังนั้นฉันจึงต้องมีการห่อหุ้มif/ elseเพื่อจัดการกับกรณีเหล่านั้น นอกจากนี้เนื่องจากค่าเริ่มต้นของ PowerShell .ToString()สำหรับอาร์เรย์ผ่านเอาต์พุตคอนโซลสามารถดูแปลก ๆ ได้คุณสามารถตรึงบน-join','เพื่อแสดงอาร์เรย์ว่าคั่นด้วยเครื่องหมายจุลภาคแทนที่จะคั่นด้วยการขึ้นบรรทัดใหม่บนคอนโซล ฉันได้ทำไปแล้วในตัวอย่างด้านล่างเพื่อทำให้เอาต์พุตชัดเจนขึ้น แต่คุณไม่ต้องการทำเช่นนั้นหากคุณกำลังปล่อยเอาต์พุตบนไพพ์ไลน์เพื่อให้คำสั่งอื่นรับ

คำอธิบาย

รับอินพุตparam($l,$n)สำหรับรายการและจำนวนของพาร์ติชันตามลำดับ จากนั้นเราจะป้อนคำสั่งif/ elseถ้าขนาดของแต่ละพาร์ทิชันที่$pเป็นที่ไม่ใช่ศูนย์ (การตั้งค่าผู้ช่วยที่$cจะเป็น.countไปพร้อมกัน) ifเราอยู่ใน

ภายในifเราห่วงจาก1การ$nที่มีและแต่ละซ้ำที่เรากำลังทำชิ้นอาร์เรย์สวยซับซ้อนมอง|%{...} $l[(($_-1)*$p)..((($_*$p-1),$c)[!($_-$n)])]parens แรกคือดัชนีเริ่มต้นของเราตามพาร์ทิชันที่เราใช้อยู่และขนาดพาร์ติชั่นของเราใหญ่แค่ไหน เรามีช่วงนั้น..กับดัชนีสิ้นสุดของเราซึ่งเกิดจากแบบจำลองประกอบไปด้วย ที่นี่เรากำลังเลือกระหว่าง$c(ตัวอักษรท้ายของอาร์เรย์) หรือความยาวของพาร์ติชันของเราขึ้นอยู่กับว่าเราอยู่ในกลุ่มสุดท้าย$_-$nหรือไม่

elseมิฉะนั้นเราอยู่ใน เราสร้างอาร์เรย์ว่างด้วยตัวดำเนินการเครื่องหมายจุลภาค,''*เท่ากับหนึ่งพาร์ติชันน้อยกว่าที่ร้องขอและจากนั้นจะตรึงแถวอินพุตเป็นองค์ประกอบสุดท้าย

ตัวอย่าง

ที่นี่ฉันกำลังแสดงพาร์ทิชันที่คั่นด้วยบรรทัดใหม่และแต่ละองค์ประกอบแยกจากกัน,ตามที่อธิบายไว้ข้างต้น

PS C:\Tools\Scripts\golfing> .\n-chotomize-a-list.ps1 (1,2,3,4) 2
1,2
3,4

PS C:\Tools\Scripts\golfing> .\n-chotomize-a-list.ps1 (-1,-2,3,4,-5) 2
-1,-2
3,4,-5

PS C:\Tools\Scripts\golfing> .\n-chotomize-a-list.ps1 (1,2,3,4) 1
1,2,3,4

PS C:\Tools\Scripts\golfing> .\n-chotomize-a-list.ps1 (4,8,15,16,23,42) 5
4
8
15
16
23,42

PS C:\Tools\Scripts\golfing> .\n-chotomize-a-list.ps1 (4,8,15,16,23,42) 7






4,8,15,16,23,42

PS C:\Tools\Scripts\golfing> .\n-chotomize-a-list.ps1 (2,3,5,7,11,13,17,19,23) 3
2,3,5
7,11,13
17,19,23

PS C:\Tools\Scripts\golfing> .\n-chotomize-a-list.ps1 $null 3



PS C:\Tools\Scripts\golfing> 

1

F #, 100 98 ไบต์

fun n l->
let a=List.length l/n
List.init n (fun i->if i<n-1 then l.[a*i..a*i+a-1] else l.[a*i..])

ใช้ F # รายการหั่นกับข้อถ้าตัดสินใจว่าจะเลือกองค์ประกอบหรือองค์ประกอบที่เหลืออยู่ทั้งหมด


1

ภาษาโปรล็อก100 99 ไบต์

n(A,B):-length(B,A).
p(L,K,G):-n(K,G),append(A,[_],G),n(N,L),M is N//K,maplist(n(M),A),append(G,L).

โทรเช่น

? - p ([1,2,3,4,5,6,7], 3, X)
X = [[1, 2], [3, 4], [5, 6, 7]]


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