สร้างชิ้นจากอาร์เรย์


21

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

กฎระเบียบ

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

  • ถ้าnมากกว่าความยาวของอาเรAย์คุณจะต้องส่งคืนอาเรAย์เช่น: if n = 4และarray A = [1,2,3]คุณควรส่งคืน[1,2,3]

  • อาร์เรย์สามารถมีชนิดใด ๆ ได้มากกว่าจำนวน

  • คุณไม่ควรเปลี่ยนลำดับ (หรือทิศทาง) ของรายการใด ๆ จากซ้ายไปขวา ตัวอย่างและif n = 2 A= [1,2,3]ผลลัพธ์ใด ๆ ที่มากกว่า[[1,2],[3]]จะไม่ถูกต้อง

กรณีทดสอบ

n   A               Output

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

นี่คือดังนั้นคุณจึงไบต์ที่สั้นที่สุดของแต่ละภาษาจะเป็นผู้ชนะ


4
ถ้าnมากกว่าความยาวที่Aเราต้องการจะส่งคืนAyou คุณแน่ใจหรือว่าคุณไม่ได้ตั้งใจ[A]?
อดัม

9
@chaugiang ผมยังคิดว่ามีขนาดใหญ่เกินไปnควรกลับเช่น[A] [[1,2,3]]เกิดอะไรขึ้นถ้าnเป็นความยาวของA?
อดัม

4
@chaugiang Adam นั้นถูกต้อง imo ค่าส่งคืนควรสอดคล้องกัน
โยนาห์

1
@chaugiang nสามารถเท่ากับ1 ได้ไหม?
DJMcMayhem

4
ในภาษาที่พิมพ์ออกมาอย่างหนักมันเป็นไปไม่ได้ที่จะกลับมาAมากกว่า[A] ซึ่งจะไม่รวมภาษามากมาย
dfeuer

คำตอบ:



9

JavaScript (ES6), 36 ไบต์

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

n=>g=a=>a+a&&[a.splice(0,n),...g(a)]

ลองออนไลน์!

แสดงความคิดเห็น

n =>                  // n = chunk size
  g = a =>            // g = recursive function taking the array a[]
    a + a             // if a[] is empty, stop recursion and return an empty string
    &&                // otherwise, return an array made of:
    [ a.splice(0, n), //   the next chunk
      ...g(a)         //   followed by the result of a recursive call
    ]                 //   (the last call leads to ...'', which adds nothing)

ตอนนี้เป็นวิธีที่เรียบร้อยและสะอาดและฉันได้เรียนรู้เกี่ยวกับฟังก์ชั่นที่ไม่ระบุชื่อซ้ำด้วย!
Joe the Person

9

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

⊢⊂⍨(⍴⊢)⍴1↑⍨⊣

ขอบคุณAdámเป็นอย่างมากสำหรับการเล่นกอล์ฟโดยทั่วไป (และสำหรับความรู้ APL ทั้งหมดที่ฉันมีในปัจจุบัน> _>)

คำอธิบาย

 ⊂⍨           Partitioned enclose (commuted, i.e. left and right switched) - for each  in left,  in right, if  = 0, create a new sub-array, push  to latest sub-array
             Right argument of entire expression
             Reshape - Change size of right into dimensions specified by left
   (⍴ )       Shape of (here, there is only one dimension - length)
             Right argument of entire expression
         ↑⍨   Take (commuted) - takes  elements from left where  is right. Extra elements (zeroes here) are automatically added
        1     1
             Left argument of entire expression

การกระทำ

อาร์กิวเมนต์2, 1 2 3 4 5 6 7. โปรดทราบว่าอาร์เรย์ APL เป็นแบบฟอร์มa b cโดยมีวงเล็บล้อมรอบที่เป็นตัวเลือก

             2
        1     1
         ↑⍨   12 = 1 0
             1 2 3 4 5 6 7
   (⍴ )       1 2 3 4 5 6 7 = 7
             71 0 = 1 0 1 0 1 0 1
             1 2 3 4 5 6 7
 ⊂⍨           1 0 1 0 1 0 11 2 3 4 5 6 7 = (1 2)(3 4)(5 6)(7)

ลองออนไลน์!


7
ขอแสดงความยินดีกับคำตอบ APL แรกของคุณ และอธิบายอย่างดีเช่นกัน! ที่นี่มีพาย APL: 🥧
Adám

9

Python 3 , 61 ไบต์

lambda A,n:[A,[A[x:x+n]for x in range(0,len(A),n)]][n<len(A)]

ลองออนไลน์!

ปรับเปลี่ยนมีอยู่ 3 วิธีการแก้ปัญหาหลามเฮนรีทีการผลิตผลผลิตที่ถูกต้องสำหรับ n> = len (A)
การโพสต์เป็นคำตอบของตัวเองเนื่องจากขาดสิทธิ์ในการแสดงความคิดเห็น


7

Prolog (SWI) , 90 84 61 ไบต์

รหัส:

[]*_*[].
L*N*[P|R]:-length(P,N),append(P,T,L),T*N*R;P=L,R=[].

รูปแบบการป้อนข้อมูลอาจจะแปลกไปบ้าง แต่ก็เป็น:

A * n * Result.

ตัวอย่างเช่นสำหรับอินพุต:

n = 2
 A = [1, 2, 3, 4, 5, 6]

[1, 2, 3, 4, 5, 6] * 2 * Result.คุณจะต้องใช้

ลองออนไลน์!


เวอร์ชันที่ไม่ถูกปรับแต่ง:

divide([], _, []).
divide(List, N, [Prefix | Result]) :-
    length(Prefix, N), append(Prefix, Remaining, List), divide(Remaining, N, Result) 
  ; Prefix = List, Result = [].

ลองออนไลน์! .


6

PHP, 15 ไบต์

$f=array_chunk;

ต้อง PHP 7. $f(ARRAY, N)โทรด้วย


6
ฉันไม่คิดว่าคุณจะต้องให้ชื่ออื่นแก่บิวด์อินดังนั้นนี่แค่คะแนน 11 ​​ใช่มั้ย
Neil

@Neil ผมคิดว่าอาจจะเป็นช่องโหว่ที่ต้องห้าม ; แต่คุณอาจจะถูก
ติตัส

6

Perl 6 , 13 ไบต์

{*.batch($_)}

ลองออนไลน์!

ฟังก์ชั่น curried ห่อในbatchตัว


พวกเขาแก้ไขข้อผิดพลาดที่คุณต้องมี;รหัสอะไรหลังจาก?
Jo King

2
@JoKing ครั้งที่คุณจะต้อง;เมื่อผ่านข้อโต้แย้งด้วย$^a@_หรือ
nwellnhof


5

Python 2 , 39 ไบต์

i,j=input()
while j:print j[:i];j=j[i:]

ลองออนไลน์!

สมมติว่า 1 ชิ้นต่อบรรทัดเป็นเอาต์พุตที่ยอมรับได้


4
36 ไบต์เป็นฟังก์ชั่นแลมบ์ดา recursive
OVS

@ovs - ดีมากและแตกต่างกันมากพอที่คุณจะโพสต์เป็นคำตอบของคุณเองหากคุณต้องการ
ElPedro

5

Brainfuck, 71 ไบต์

,[>+>+<<-]>>>,[<[>.,<-]>>>++++[<++++++++>-]<.[-]<<<[<+>>+<-]<[->+<]>>>]

Dunno ถ้าสิ่งนี้นับหรือไม่ ... รูปแบบอินพุต:

<character whose ascii is n>AAAAAAAAAAAAA
For example, in the input:
 1234567890123492034
n is 32 since the ASCII value of space is 32

รับอินพุตและวางในช่องว่างทุกครั้งที่nอักขระผ่าน

คำอธิบาย (ไม่มีเครื่องหมายจุลภาคเพราะจะทำให้โปรแกรมแตก):

, take n
[>+>+<<-] copy into next two cells (destroys original)
>>>, take first of A into next cell
[ while that input exists
<[>.,<-] if n is nonzero output take next of A subtract one from n
>>>++++[<++++++++>-]<.[-]< n is zero so put a space
<<[<+>>+<-] copy the old n into surrounding cells
<[->+<] move from first cell to second
>>>] take input, do again

2
ลบช่องว่างสำหรับ 71 ตัวอักษร
MilkyWay90

ฮ่า ๆ ฉันคิดว่าฉันลบทั้งหมด แต่ฉันไม่ได้สังเกตเห็นขอบคุณ!
vityavv

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

จนถึงตอนนี้ฉันมีn n n A spaceการตั้งค่ามือถือของฉันถ้าคุณสามารถคิดวิธีที่ดีกว่า ...
vityavv

สามารถA space n n n ...ทำงานได้ (หรือspace A n n n...)
MilkyWay90





4

ถ่าน 1 ไบต์

ลองออนไลน์! I / O เริ่มต้นของ Charcoal ทำให้ยากที่จะแสดงให้เห็นถึงการใช้อะไรก็ได้ยกเว้นสตริง หากคุณต้องการโปรแกรมเต็มรูปแบบที่ใช้รายการตัวเลขและรายการที่จัดรูปแบบผลลัพธ์ผลลัพธ์นี้สามารถทำได้ดังนี้:

E⪪AN⪫ι,

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

  A      Input array
 ⪪       Split into chunks of
   N     Input number
E       Map over chunks
     ι  Current chunk
    ⪫   Joined with
      , Literal `,`
        Implicitly print each chunk on its own line

4

C # (Visual C # Interactive Compiler) , 78 77 43 ไบต์

a=>b=>{int i=0;return a.GroupBy(_=>i++/b);}

ลองออนไลน์!

ฉันคิดว่าเราน่าจะเขียนได้int i;เพราะ 0 คือค่าเริ่มต้นของ int ฉันปล่อยให้มันหลีกเลี่ยงข้อผิดพลาด: error CS0165: Use of unassigned local variable 'i'.



4

J , 4 ไบต์

<\~-

ลองออนไลน์!

ใช้อาร์เรย์เป็น ARG ด้านซ้ายและขนาดก้อนเป็น ARG ที่เหมาะสม

ใช้ตะขอ dyadic และinfix adverb ที่มีอาร์กิวเมนต์เป็นลบซึ่งทำสิ่งที่เราต้องการโดยคำจำกัดความ

หมายเหตุ: ประเภทการส่งคืนจะต้องใส่กล่องเพราะ J อนุญาตเฉพาะตารางรายการที่มีขนาดเท่ากันเท่านั้น



3

PHP , 45 ไบต์

function f($a,$b){return array_chunk($a,$b);}

ลองออนไลน์!


3
จะarray_chunkเป็นคำตอบที่ถูกต้องหรือไม่
Arnauld

@Arnauld ฉันไม่รู้ ไม่เคยเล่นกอล์ฟใน php มาก่อนแม้ว่าฉันจะใช้มันในที่ทำงาน
Luis felipe De jesus Munoz

ฉันก็ไม่แน่ใจเหมือนกัน 100% แต่เราสามารถใช้การแปลงตัวแปรที่ไม่ได้ประกาศกับสตริงและทำบางอย่างเช่นนั้นได้
Arnauld

(erratum: ฉันหมายถึงค่าคงที่ที่ไม่ได้กำหนด)
Arnauld

3

Java 10, 106 80 ไบต์

L->n->{for(int l=L.size(),i=0;i<l;)System.out.print(L.subList(i,(i+=n)<l?i:l));}

พิมพ์ชิ้นโดยไม่มีตัวคั่น

ลองออนไลน์

106 ไบต์:

L->n->{var r=new java.util.Stack();for(int l=L.size(),i=0;i<l;)r.add(L.subList(i,(i+=n)<l?i:l));return r;}

ส่งคืนรายการของจริง

ลองออนไลน์

คำอธิบาย:

L->n->{                       // Method with List and integer parameters and List return-type
  var r=new java.util.Stack();//  Create an empty List
  for(int l=L.size(),         //  Determine the size of the input-List
      i=0;i<l;)               //  Loop `i` in the range [0, size):
    r.add(                    //   Add to the result-List:
      L.subList(i,            //    A sublist of the input-list in the range from `i`
        Math.min(i+=n,l)));   //    to the minimum of: `i` + input-integer or the size
                              //    (and increase `i` by the input-integer at the same)
  return r;}                  //  Return the List of Lists of integers as result





3

V , 6 ไบต์

òÀf,r

ลองออนไลน์!

hexdump:

00000000: f2c0 662c 720a                           ..f,r.

คำอธิบาย:

ò           " Until an error happens:
  f         "   (f)ind the...
 À          "     n'th...
   ,        "     ","
            "   (If there are less than n commas after the cursor, throw an error)
    r       "   Replace the char under the cursor with...
     <cr>   "     A newline

3

Clojure 14 ไบต์

#(partition %)

builtins ฉันเดา


สวัสดียินดีต้อนรับ ฟังก์ชั่นควรใช้สองข้อโต้แย้ง: อาร์เรย์ที่จะแบ่งพาร์ติชันและความยาวของอัน จะเกิดอะไรขึ้นถ้าอันสุดท้ายไม่ "เต็ม" เมื่อใช้พาร์ติชัน?
NikoNyrh

3

Haskell , 26 ไบต์

import Data.Lists
chunksOf

นี่เป็นรุ่นที่น่าสนใจมากขึ้นโดยมีเพียงไม่กี่ไบต์ (ขอบคุณ nimi สำหรับห้าไบต์ในแต่ละโซลูชัน):

Haskell , 31 ไบต์

n![]=[]
n!x=take n x:n!drop n x

ลองออนไลน์!


ฉันคิดว่าคุณทำได้
aloisdg พูดว่า Reinstate Monica

1
n!x=take n x:n!drop n x. ให้ยังData.Lists chunksOf
nimi


3

เยลลี่ 1 ไบต์

s

ลองออนไลน์!

ในขณะที่เครื่องพิมพ์ทำให้ดูเหมือนแยกองค์ประกอบเดียวไม่ได้ห่อเป็นรายการพวกเขาเป็นจริง


1
คืนนี้ให้ผลลัพธ์ที่ดีกว่าเพื่อแสดงให้เห็นว่าอาร์เรย์องค์ประกอบเดียวยังคงเป็นอาร์เรย์จริง
Nick Kennedy

เอ้อเป็น downvote เพราะฉันไม่ได้เพิ่มลิงก์ของ @Nick Kennedy?
เวน

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