Motivasi : Terkadang item tertentu dalam daftar tidak dihitung terhadap total Anda. Misalnya, menghitung penumpang pesawat dalam barisan, di mana bayi duduk di pangkuan orang tua.
Tantangan : menulis sebuah program untuk membagi daftar item menjadi potongan-potongan. Setiap potongan (kecuali mungkin yang terakhir) adalah ukuran yang sama , di mana ukuran didefinisikan sebagai jumlah item yang melewati fungsi predikat.
Aturan :
- Program Anda harus ambil
- daftar barang
- ukuran bilangan bulat positif
- fungsi predikat (mengambil item, dan mengembalikan benar atau salah)
- Anda harus mengembalikan daftar input yang dipecah menjadi beberapa bagian
- Setiap chunk adalah daftar item
- Secara keseluruhan barang harus tetap dalam urutan yang sama, tanpa ada yang dibuang
- Jumlah item yang melewati predikat di setiap chunk (kecuali mungkin yang terakhir) harus sesuai dengan ukuran chunk input.
- item yang gagal predikat seharusnya tidak diperhitungkan dalam ukuran ini
- Item yang gagal predikatnya adalah
- masih termasuk dalam potongan output
- dialokasikan ke chunk paling awal, dalam hal chunk adalah "penuh" tetapi item berikutnya adalah yang gagal predikat
- jadi potongan terakhir mungkin tidak hanya terdiri dari barang-barang yang gagal dengan predikat
- Potongan terakhir mungkin berukuran kurang dari ukuran potongan karena semua item telah diperhitungkan.
Contoh tidak lengkap:
Contoh paling sederhana adalah untuk mempertimbangkan 1
s dan 0
s, di mana fungsi predikat berada x ==> x > 0
. Dalam hal ini, sum
setiap chunk harus cocok dengan ukuran chunk.
- item:,
[]
ukuran2
:, predikat:x > 0
-> salah satu[]
atau[[]]
- item:,
[0, 0, 0, 0, 0, 0]
ukuran2
:, predikat:x > 0
->[[0, 0, 0, 0, 0, 0]]
- item:,
[0, 1, 1, 0]
ukuran2
:, predikat:x > 0
->[[0, 1, 1, 0]]
- item:,
[0, 1, 1, 0, 1, 0, 0]
ukuran2
:, predikat:x > 0
->[[0, 1, 1, 0], [1, 0, 0]]
- item:,
[0, 1, 0, 0, 1, 0, 1, 1, 0]
ukuran2
:, predikat:x > 0
->[[0, 1, 0, 0, 1, 0], [1, 1, 0]]
Dan mari kita selesaikan dengan penumpang pesawat di mana bayi duduk di pangkuan orang tua . A
untuk orang dewasa, b
untuk bayi, baris pesawat adalah 3
kursi lebar, orang dewasa selalu terdaftar sebelum bayi mereka:
- item:,
[A, b, A, b, A, A, A, b, A, b, A, A, b]
ukuran3
:, predikat:x => x == A
->[[A, b, A, b, A], [A, A, b, A, b], [A, A, b]]
sumber
Jawaban:
Jelly , 10 byte
Program lengkap yang menggunakan fungsi kotak hitam monadik sebagai argumen opsional pertama, daftar sebagai argumen opsional kedua dan ukuran chunk sebagai argumen opsional ketiga yang mencetak representasi Python dari daftar daftar yang dihasilkan (untuk menghindari penghancuran implisit Jelly dari daftar yang berisi karakter).
Cobalah online! (perhatikan bahwa daftar karakter diteruskan ke program Jelly dengan memformatnya sebagai string yang dikutip Python)
Bagaimana?
sumber
Brachylog , 37 byte
Cobalah online!
Saya terkejut menemukan bahwa ini - cukup banyak pernyataan kembali - berhasil berakhir dan menghasilkan output yang benar.
Asumsikan predikat 2 hadir sebagai predikat di bawah kode ini. Mengeluarkan daftar daftar ("bongkahan"), atau
false
untuk input kosong.Penjelasan:
sumber
Apl (Dyalog Unicode)
1716 byte (SBCS)Terima kasih Adám karena telah menyelamatkan saya 1 byte.
Cobalah online! untuk tujuan penjelasan saya akan meninggalkan solusi 17 byte.
⍺⍺¨⍵
aplies predikat ke dalam daftar mengembalikan vektor boolean+\
menghasilkan menjalankan keseluruhan1⌈
Menggantikan terkemuka0
s dengan1
s⌈⍺÷⍨
membagi setiap elemen dengan ukuran potongan dan putaran up⍵⊆⍨
partisi vektor asli oleh inisumber
w⊆⍨⌈⎕÷⍨1⌈+\⎕¨w←⎕
Bersih ,
9692 byteMenggunakan fungsi bernama yang
f :: a -> Bool
diizinkan sesuai dengan konsensus meta.Cobalah online!
Diperluas (dengan penyorotan default untuk membuat komentar muncul):
sumber
Java 10,
207186159148 byteJava jelas bukan bahasa yang tepat untuk tantangan ini (atau tantangan codegolf apa pun tentu saja ..)
-21 byte berkat @OOBalance
Cobalah online.
Penjelasan:
Format input kotak hitam:
Asumsikan ada fungsi bernama
boolean f(Object i)
, yang diizinkan sesuai dengan jawaban meta ini .Saya memiliki kelas abstrak yang
Test
berisi fungsi defaultf(i)
, serta lambda di atas:Untuk kasus uji, saya menimpa fungsi ini
f
. Sebagai contoh, test case terakhir disebut seperti ini:sumber
(or any codegolf-challenge of course..)
" ehh, entahlah, Anda sudah mengalahkan jawaban Bersih saya setidaknya dalam beberapa kasus. Bagaimanapun, saya selalu menantikan jawaban Anda.Arrays.copyOfRange
!.sublist
. Fungsionalitas Anda tetap sama, tetapi menyimpan banyak byte dan menghapus impor. (Dan sekarang ini juga berfungsi untuk kasus uji dengan karakter bukan bilangan bulat.)R , 58 byte
Cobalah online!
sumber
C (gcc) ,
7066 byteSaya menggunakan struktur untuk mencatat awal sub-daftar, karena C tidak tahu tentang hal-hal seperti itu.
Terima kasih kepada ceilingcat untuk sarannya.
Cobalah online!
sumber
Haskell, 72 byte
Cobalah online!
sumber
MATL, 19 byte
Berdasarkan jawaban APL yang sangat baik dari jslip .
MATL tidak benar-benar memiliki fungsi yang ditentukan pengguna seperti itu, tetapi ia memiliki cara untuk memanggil ke lingkungan yang sedang berjalan (MATLAB / Oktaf), jadi ini menggunakan itu untuk fungsi predikat. Penggunaan akan menjadi seperti ini , tetapi fungsionalitas itu dinonaktifkan online karena alasan keamanan, jadi inilah versi yang menggunakan
isodd
fungsi predikat hardcoded sebagai gantinya: Cobalah di MATL Online .sumber
JavaScript (ES6), 69 byte
Disimpan 3 byte berkat @tsh
Mengambil input dalam sintaks currying
(size)(predicate)(array)
.Cobalah online!
sumber
s=>p=>g=a=>a.every(x=>p(x)?k--:++j,j=k=s)?[a]:[a.splice(0,j),...g(a)]
Ruby , 57 byte
Cobalah online!
Lambda anonim menerima array input
a
, ukuran chunkn
, dan predikatg
. Mempertahankan counterc
item yang cocok dengan predikat dan mengelompokkan item dengan jumlah potongan yang sudah habis. Sayangnya, nilai awal -1 / n tidak membulatkan ke 0, jadi kita harus menghabiskan beberapa byte untuk memperbaikinya.sumber
R , 100 byte
Cobalah online!
dikalahkan dengan mudah oleh digEmAll
sumber
Python 2 , 92 byte
Cobalah online!
sumber
JavaScript (Node.js) , 90 byte
Cobalah online!
Diminta sebagai
F(2, x => x > 0)([0, 1, 1, 0])
sumber
Mathematica, 82 byte
Tidak Disatukan:
l
adalah daftar input;s
adalah ukuran chunk;p
adalah fungsi tanpa nama / anonim / murni / lambda yang mengembalikan operasi benar / salah pada elemen daftar.Last@Reap[...]
mengembalikan daftar daftar setiap elemen yangSow
-n di dalamnya...
. Mereka dikelompokkan ke dalam sublists oleh argumen keduae~Sow~t
yang merupakan singkatanSow[e, t]
.Saya harus menginisialisasi penghitung ke -1 untuk menangani ukuran chunk 1, jika tidak saya perlu memeriksa
Mod[i, s]
(i~Mod~s
) sama dengan 1, yang tidak akan pernah terjadi.Sisa kode dijelaskan di blok yang tidak ditandai.
sumber