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.


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)

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!


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


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! .


6

PHP, 15 byte

$f=array_chunk;

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


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

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.


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

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

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



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.



3

PHP , 45 byte

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

Cobalah online!


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





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

3

Clojure, 14 byte

#(partition %)

builtin kurasa


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

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!


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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.