Buat potongan dari array

21

Tugas Anda adalah untuk menulis sebuah program yang diberi array dan angka, Anda perlu membagi array menjadi potongan-potongan dengan ukuran angka.

Aturan

Program Anda akan menerima array A, serta bilangan bulat positif n. Array kemudian harus dibagi menjadi potongan-potongan panjang n, jika panjang string tidak habis dibagi oleh nsisa di akhir harus dianggap potongannya sendiri.

  • Jika nlebih besar dari panjang array A, Anda harus mengembalikan array A, misalnya: jika n = 4dan array A = [1,2,3], Anda harus kembali[1,2,3]

  • Array dapat berisi jenis apa saja dan bukan angka.

  • Anda tidak boleh mengubah urutan (atau arah) item apa pun dari kiri ke kanan. Sebagai contoh if n = 2dan A= [1,2,3]. Hasil apa pun bukannya [[1,2],[3]]tidak valid.

Uji Kasus

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

Ini adalah , sehingga Anda byte terpendek dari setiap bahasa akan menjadi pemenangnya.

chau giang
sumber
4
Jika nlebih besar dari panjang Akami harus Akembali‽ Apakah Anda yakin tidak bermaksud demikian [A]?
Adám
9
@chaugiang Saya masih berpikir terlalu besar nharus kembali [A], misalnya [[1,2,3]]. Bagaimana jika npanjangnya persis A?
Adám
4
@chaugiang Adam benar imo. Nilai pengembalian harus konsisten.
Jonah
1
@chaugiang Can n pernah sama 1 ?
DJMcMayhem
4
Dalam bahasa yang sangat diketik, tidak mungkin untuk kembali Adaripada [A] , yang akan mengecualikan banyak bahasa.
dfeuer

Jawaban:

9

JavaScript (ES6), 36 byte

Mengambil input sebagai (n)(array).

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

Cobalah online!

Berkomentar

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)
Arnauld
sumber
Nah, itu adalah solusi yang rapi dan bersih, dan saya juga belajar tentang fungsi anonim rekursif!
Joe the Person
9

APL (Dyalog Unicode) , 12 byte SBCS

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

Terima kasih banyak kepada Adám karena pada dasarnya melakukan semua golf (dan pada dasarnya semua pengetahuan APL yang saya miliki saat ini> _>).

Penjelasan

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

Eksekusi

Argumen 2, 1 2 3 4 5 6 7. Perhatikan bahwa array APL adalah formulir a b c, dengan tanda kurung opsional di sekitarnya.

             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)

Cobalah online!

Khusus ASCII
sumber
7
Selamat atas jawaban APL pertama Anda. Dan dijelaskan dengan baik juga! Di sini, miliki kue APL: 🥧
Adám
9

Python 3 , 61 byte

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

Cobalah online!

Memodifikasi solusi Python 3 Henry T yang ada untuk menghasilkan output yang valid untuk n> = len (A).
Posting sebagai jawaban sendiri karena kurangnya hak komentar.

Pasang kembali Monica
sumber
7

Prolog (SWI) , 90 84 61 byte

Kode:

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

Format input mungkin agak aneh, tetapi:

A * n * Result.

Misalnya, untuk input:

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

Anda harus menggunakan [1, 2, 3, 4, 5, 6] * 2 * Result..

Cobalah online!


Versi tidak disatukan:

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

Cobalah online! .

Adnan
sumber
6

PHP, 15 byte

$f=array_chunk;

membutuhkan PHP 7. Hubungi dengan $f(ARRAY, N).

Titus
sumber
6
Saya tidak berpikir Anda diharuskan untuk memberikan nama lain untuk builtin, jadi ini hanya skor 11, bukan?
Neil
@Neil saya pikir itu mungkin jalan terlarang ; tetapi Anda mungkin benar.
Titus
5

Bersih , 54 byte

import StdEnv
$n l=[l%(i,i+n-1)\\i<-[0,n..length l-1]]

Cobalah online!

Suram
sumber
5

Python 2 , 39 byte

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

Cobalah online!

Menganggap bahwa 1 chunk per line adalah output yang dapat diterima.

ElPedro
sumber
4
36 byte sebagai fungsi lambda rekursif
ovs
@ovs - Sangat bagus dan juga cukup berbeda untuk Anda kirim sebagai jawaban Anda sendiri jika diinginkan.
ElPedro
5

Brainfuck, 71 byte

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

Entah apakah ini diperhitungkan atau tidak ... format input:

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

Mengambil input dan menempatkan spasi setiap kali nkarakter lewat

Penjelasan (tidak ada koma karena itu akan merusak program):

, 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
vityavv
sumber
2
Hapus spasi untuk 71 karakter
MilkyWay90
lol, saya pikir saya sudah menghapus semuanya tetapi saya tidak menyadarinya, terima kasih!
vityavv
Coba atur ulang sel sehingga sel yang Anda gunakan lebih banyak lebih mudah diakses (misalnya, jika sel input (yang Anda gunakan ,lebih banyak) digunakan lebih banyak, itu bisa menempatkan sel yang lebih mudah diakses daripada jika ditempatkan di sel lain) atau gunakan bruteforcer. Saya tidak terampil bermain golf di BF sehingga saran ini mungkin tidak membantu.
MilkyWay90
Sejauh ini saya memiliki n n n A spacepengaturan sel saya, jika Anda bisa memikirkan cara yang lebih baik ...
vityavv
Bisakah A space n n n ...bekerja (atau space A n n n...)?
MilkyWay90
4

CJam , 3 byte

{/}

Ini adalah blok anonim yang mengambil larik angka dan angka dari tumpukan, dan menggantinya dengan larik array.

Cobalah online!

Luis Mendo
sumber
4

Arang , 1 byte

Cobalah online! I / O bawaan Charcoal membuatnya sulit untuk didemonstrasikan menggunakan apa pun kecuali string. Jika Anda menginginkan program lengkap yang mengambil daftar angka dan mengeluarkan daftar yang diformat maka ini dapat dilakukan sebagai berikut:

E⪪AN⪫ι,

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

  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
Neil
sumber
4

C # (Visual C # Interactive Compiler) , 78 77 43 byte

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

Cobalah online!

Saya pikir kita harus bisa menulis int i;karena 0 adalah default dari int. Saya biarkan untuk menghindari kesalahan: error CS0165: Use of unassigned local variable 'i'.

aloisdg kata Reinstate Monica
sumber
4

J , 4 byte

<\~-

Cobalah online!

Mengambil array sebagai arg kiri dan ukuran chunk sebagai arg kanan.

Menggunakan hook diad dan kata keterangan infix dengan argumen negatif, yang melakukan apa yang kita inginkan dengan definisi.

Catatan: Jenis pengembalian harus kotak karena J hanya memungkinkan tabel dengan item berukuran sama.

Yunus
sumber
3

PHP , 45 byte

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

Cobalah online!

Luis felipe De jesus Munoz
sumber
3
Apakah hanya array_chunkjawaban yang valid?
Arnauld
@Arnauld saya tidak tahu. Tidak pernah bermain golf di php sebelumnya meskipun saya menggunakannya di tempat kerja.
Luis felipe De jesus Munoz
Saya juga tidak 100% yakin, tetapi kami dapat menyalahgunakan konversi implisit variabel yang tidak dideklarasikan ke string dan melakukan sesuatu seperti itu .
Arnauld
(erratum: Maksud saya konstanta tidak terdefinisi )
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));}

Mencetak potongan tanpa pembatas.

Cobalah online.

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

Sebenarnya mengembalikan daftar daftar.

Cobalah online.

Penjelasan:

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
Kevin Cruijssen
sumber
3

V , 6 byte

òÀf,r

Cobalah online!

Hexdump:

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

Penjelasan:

ò           " 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
DJMcMayhem
sumber
3

Clojure, 14 byte

#(partition %)

builtin kurasa

nihilazo
sumber
Halo selamat datang. Fungsi harus mengambil dua argumen: array yang akan dipartisi dan panjang chunk. Juga apa yang terjadi jika potongan terakhir tidak "penuh" saat menggunakan partisi?
NikoNyrh
3

Haskell , 26 byte

import Data.Lists
chunksOf

Berikut ini versi yang lebih menarik, dengan hanya beberapa byte lagi (terima kasih kepada nimi selama lima byte di setiap solusi):

Haskell , 31 byte

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

Cobalah online!

dfeuer
sumber
Saya pikir Anda bisa
aloisdg mengatakan Reinstate Monica
1
n!x=take n x:n!drop n x. Data.Listsmenyediakan juga chunksOf.
nimi
3

PowerShell , 67 65 byte

-2 byte terima kasih AdmBorkBork

param($n,$a)$a|%{$b+=,$_
if($b.Count-ge$n){,$b;rv b}}
if($b){,$b}

Cobalah online!

mazzy
sumber
2
Anda harus dapat rv b(alias untuk Remove-Variable) alih-alih $b=@()menyimpan dua byte.
AdmBorkBork
3

Jelly , 1 byte

s

Cobalah online!

Sementara printer membuatnya tampak seperti elemen tunggal tidak dibagi menjadi daftar, mereka sebenarnya.

Yang Mulia
sumber
1
Malam ini memberikan output yang lebih baik untuk menunjukkan bahwa array elemen tunggal sebenarnya masih array.
Nick Kennedy
Er, apakah downvote karena saya tidak menambahkan tautan @Nick Kennedy?
Ven
tentu bukan dari saya
Nick Kennedy