Tạo khối từ một mảng


21

Nhiệm vụ của bạn là viết một chương trình đưa ra một mảng và một số, bạn cần chia mảng thành các phần với kích thước là số.

Quy tắc

Chương trình của bạn sẽ nhận được một mảng A, cũng như một số nguyên dương n. Mảng sau đó nên được chia thành các đoạn có độ dài n, nếu độ dài của chuỗi không chia hết cho nbất kỳ phần dư nào ở cuối thì nên được coi là đoạn riêng của nó.

  • Nếu nlớn hơn độ dài của mảng A, bạn sẽ cần trả về mảng A, ví dụ: if n = 4array A = [1,2,3], bạn nên trả về[1,2,3]

  • Các mảng có thể chứa bất kỳ loại chứ không phải số.

  • Bạn không nên thay đổi thứ tự (hoặc hướng) của bất kỳ mục nào từ trái sang phải. Ví dụ if n = 2A= [1,2,3]. Bất kỳ kết quả hơn là [[1,2],[3]]sẽ không hợp lệ.

Các trường hợp thử nghiệm

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]]

Đây là , do đó, các byte ngắn nhất của mỗi ngôn ngữ sẽ là người chiến thắng.


4
Nếu nlớn hơn độ dài Achúng tôi cần trả lại ABạn có chắc là bạn không hiểu [A]?
Adám

9
@chaugiang Tôi vẫn nghĩ một số tiền quá lớn nnên quay lại [A], vd [[1,2,3]]. Điều gì nếu nchính xác là chiều dài của A?
Adám

4
@chaugiang Adam là imo đúng. Giá trị trả lại phải nhất quán.
Giô-na

1
@chaugiang n có thể bằng 1 không?
DJMcMayhem

4
Trong một ngôn ngữ được gõ mạnh, đơn giản là không thể quay lại Athay vì [A] , điều này sẽ loại trừ rất nhiều ngôn ngữ.
dfeuer

Câu trả lời:



9

JavaScript (ES6), 36 byte

Đưa đầu vào là (n)(array).

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

Hãy thử trực tuyến!

Đã bình luận

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)

Bây giờ đó là một giải pháp gọn gàng và sạch sẽ, và tôi cũng đã học về các hàm ẩn danh đệ quy!
Joe the Person

9

APL (Dyalog Unicode) , 12 byte SBCS

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

Cảm ơn rất nhiều về Adám về cơ bản đã thực hiện tất cả các môn đánh gôn (và về cơ bản tất cả các kiến ​​thức về APL tôi hiện có> _>).

Giải trình

 ⊂⍨           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

Chấp hành

Lập luận 2, 1 2 3 4 5 6 7. Lưu ý rằng mảng APL có dạng a b c, với các dấu ngoặc đơn xung quanh tùy chọn.

             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)

Hãy thử trực tuyến!


7
Chúc mừng câu trả lời APL đầu tiên của bạn. Và giải thích độc đáo quá! Tại đây, có một chiếc bánh APL:
Adám


7

Prolog (SWI) , 90 84 61 byte

Mã số:

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

Định dạng đầu vào có thể hơi lạ, nhưng đó là:

A * n * Result.

Ví dụ: đối với đầu vào:

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

Bạn sẽ cần phải sử dụng [1, 2, 3, 4, 5, 6] * 2 * Result..

Hãy thử trực tuyến!


Phiên bản bị đánh cắp:

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

Hãy thử trực tuyến! .


6

PHP, 15 byte

$f=array_chunk;

yêu cầu PHP 7. Gọi với $f(ARRAY, N).


6
Tôi không nghĩ rằng bạn bắt buộc phải đặt tên khác cho nội dung, vì vậy đây chỉ là điểm 11, phải không?
Neil

@Neil Tôi nghĩ rằng đó có thể là một lỗ hổng bị cấm ; nhưng bạn có thể đúng
Tít



5

Python 2 , 39 byte

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

Hãy thử trực tuyến!

Giả sử rằng 1 chunk trên mỗi dòng là đầu ra chấp nhận được.


4
36 byte là một hàm lambda đệ quy
OVS

@ovs - Rất đẹp và cũng đủ khác biệt để bạn đăng bài dưới dạng câu trả lời của riêng bạn nếu bạn muốn.
ElPedro

5

Brainfuck, 71 byte

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

Không biết điều này có tính hay không ... định dạng đầu vào:

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

Đưa đầu vào và đặt vào khoảng trống mỗi khi nký tự đi qua

Giải thích (không có dấu phẩy vì điều đó sẽ phá vỡ chương trình):

, 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
Xóa khoảng trắng cho 71 ký tự
MilkyWay90

lol, tôi nghĩ rằng tôi đã loại bỏ tất cả chúng nhưng tôi đã không chú ý đến chúng, cảm ơn!
vityavv

Hãy thử sắp xếp lại các ô sao cho các ô bạn sử dụng dễ truy cập hơn (ví dụ: nếu ô đầu vào (ô bạn sử dụng ,nhiều hơn) được sử dụng nhiều hơn thì có thể đặt một ô dễ truy cập hơn so với ô được đặt trong các tế bào khác) hoặc sử dụng một bruteforcer. Tôi không có kỹ năng chơi golf ở BF nên những gợi ý này có thể không hữu ích.
MilkyWay90

Cho đến nay tôi đã n n n A spacethiết lập tế bào của mình, nếu bạn có thể nghĩ ra một cách tốt hơn ...
vityavv

Có thể A space n n n ...làm việc (hoặc space A n n n...)?
MilkyWay90





4

than củi , 1 byte

Hãy thử trực tuyến!I / O mặc định của Char than làm cho việc chứng minh bằng cách sử dụng bất cứ thứ gì ngoại trừ chuỗi. Nếu bạn muốn một chương trình đầy đủ lấy danh sách số và xuất ra danh sách được định dạng thì điều này có thể được thực hiện như sau:

E⪪AN⪫ι,

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

  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

J , 4 byte

<\~-

Hãy thử trực tuyến!

Lấy mảng là arg trái và kích thước chunk như arg phải.

Sử dụng hook dyadic và trạng từ infix với một đối số phủ định, đó là những gì chúng ta muốn theo định nghĩa.

Lưu ý: Loại trả về phải được đóng hộp vì J chỉ cho phép các bảng của các mục có kích thước bằng nhau.



3

PHP , 45 byte

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

Hãy thử trực tuyến!


3
Sẽ chỉ array_chunklà một câu trả lời hợp lệ?
Arnauld

@Arnauld Tôi không biết. Không bao giờ chơi golf trong php trước mặc dù tôi sử dụng nó trong công việc.
Luis felipe De jesus Munoz

Tôi cũng không chắc chắn 100%, nhưng chúng ta có thể lạm dụng chuyển đổi ngầm định các biến không được khai báo thành một chuỗi và làm điều gì đó tương tự .
Arnauld

(erratum: Ý tôi là hằng số không xác định )
Arnauld

3

Java 10, 106 80 byte

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

In các đoạn mà không có dấu phân cách.

Hãy thử trực tuyến.

106 byte:

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;}

Thực tế trả về một danh sách các danh sách.

Hãy thử trực tuyến.

Giải trình:

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 byte

òÀf,r

Hãy thử trực tuyến!

Hexdump:

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

Giải trình:

ò           " 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 byte

#(partition %)

tôi đoán


Xin chào, mời vào. Hàm nên có hai đối số: mảng được phân vùng và độ dài của đoạn. Ngoài ra, điều gì xảy ra nếu đoạn cuối không "đầy" khi sử dụng phân vùng?
NikoNyrh



Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.