Tulis program atau fungsi yang mengambil daftar kosong bilangan bulat positif. Anda dapat menganggapnya sebagai input dalam format praktis yang wajar seperti "1 2 3 4"
atau [1, 2, 3, 4]
.
Angka-angka dalam daftar input mewakili irisan bagan pai penuh di mana setiap ukuran irisan sebanding dengan angka yang sesuai dan semua irisan diatur di sekitar bagan dalam urutan yang diberikan.
Misalnya, kue untuk 1 2 3 4
adalah:
Pertanyaan yang harus dijawab oleh kode Anda adalah: Apakah diagram lingkaran pernah dibagi dua ? Yaitu, adakah garis lurus yang sempurna dari satu sisi lingkaran ke sisi lainnya, membelahnya secara simetris menjadi dua?
Anda perlu menampilkan nilai kebenaran jika setidaknya ada satu garis-bagi dan menghasilkan nilai palsu jika tidak ada .
Dalam 1 2 3 4
contoh ada pembagian dua antara 4 1
dan 2 3
hasilnya akan benar.
Tetapi untuk input 1 2 3 4 5
tidak ada garis bagi sehingga output akan menjadi palsu:
Contoh tambahan
Mengatur nomor secara berbeda dapat menghapus garis bagi.
mis. 2 1 3 4
→ falsy:
Jika hanya satu nomor dalam daftar input, pie tidak dibagi dua.
mis. 10
→ falsy:
Mungkin ada beberapa garis bagi. Selama ada lebih dari nol hasilnya benar.
mis. 6 6 12 12 12 11 1 12
→ truthy: (ada 3 garis-bawah di sini)
Biseksi mungkin ada bahkan jika mereka tidak jelas secara visual.
mis. 1000000 1000001
→ falsy:
misalnya 1000000 1000001 1
→ benar:
(Terima kasih kepada nces.ed.gov untuk membuat diagram lingkaran.)
Uji Kasus
Truthy
1 2 3 4
6 6 12 12 12 11 1 12
1000000 1000001 1
1 2 3
1 1
42 42
1 17 9 13 2 7 3
3 1 2
10 20 10
Falsy
1 2 3 4 5
2 1 3 4
10
1000000 1000001
1
1 2
3 1 1
1 2 1 2 1 2
10 20 10 1
Mencetak gol
Kode terpendek dalam byte menang. Tiebreaker adalah jawaban sebelumnya.
sumber
Jawaban:
J, 18 byte
5 byte berkat Dennis.
@HelkaHomba : Tidak.
Pemakaian
Tidak disatukan
Versi 23 byte sebelumnya:
Pemakaian
Tidak disatukan
Penjelasan
Jumlah semua substring dihitung oleh black_magic. The
+/\
menghitung jumlah parsial.Misalnya,
a b c d
menjadia a+b a+b+c a+b+c+d
.The
-/~
kemudian membangun sebuah meja pengurangan berdasarkan masukan, sehinggax y z
menjadi:Ketika diterapkan
a a+b a+b+c a+b+c+d
, hasilnya adalah:Ini menghitung jumlah semua substring yang tidak mengandung
a
.Ini menjamin cukup, karena jika satu pembelahan berisi
a
, pembelahan yang lain tidak akan berisia
dan juga tidak akan membungkus.sumber
+/e.&,2*+/\\.
Jelly ,
98 byteKembalikan daftar yang tidak kosong (benar) atau daftar kosong (salah). Cobalah online! atau verifikasi semua kasus uji .
Bagaimana itu bekerja
sumber
Julia,
343029 byteTerima kasih kepada @GlenO untuk bermain golf 1 byte!
Cobalah online!
Bagaimana itu bekerja
Setelah menyimpan jumlah kumulatif 2x dalam x , kita kurangi vektor baris x ' dari vektor kolom x , menghasilkan matriks dari semua perbedaan yang mungkin. Pada dasarnya, ini menghitung jumlah dari semua subarrays berdekatan x yang tidak mengandung nilai pertama, negatifnya, dan 0 's di diagonal.
Akhirnya, kami menguji apakah jumlah array asli x milik matriks yang dihasilkan. Jika ini masalahnya, jumlah setidaknya satu dari sub daftar yang berdekatan sama dengan separuh dari jumlah keseluruhan daftar, yang berarti bahwa setidaknya ada satu garis-bagi.
sumber
Python 2, 64 byte
Secara rekursif mencoba untuk menghapus elemen dari depan atau akhir hingga jumlah yang tersisa sama dengan jumlah dari apa yang telah dihapus, yang disimpan adalah
s
. Membutuhkan waktu yang eksponensial dalam panjang daftar.Dennis menyimpan 3 byte dengan
pop
.sumber
f=lambda l,s=0:l and(sum(l)==s)*l+f(l[1:],s+l[0])+f(l,s+l.pop())
Haskell, 41 byte
Idenya adalah untuk memeriksa apakah ada sublist
l
yang jumlahnya sama dengansum l/2
. Kami menghasilkan jumlah dari daftar ini sebagaiscanr(:)[]l>>=scanl(+)0
. Mari kita lihat bagaimana ini bekerjal=[1,2,3]
Lama 43 byte:
Menghasilkan daftar
c
jumlah kumulatif. Kemudian, periksa apakah ada dua dari jumlah ini yang berbedasum l/2
dengan memeriksa apakah itu merupakan elemen dari daftar perbedaan(-)<$>c<*>c
.sumber
Pyth,
109 byteUji di Kompiler Pyth .
Bagaimana itu bekerja
sumber
Sebenarnya, 21 byte
Cobalah online!
Program ini mencetak
0
untuk kasus yang salah, dan bilangan bulat positif untuk kasus yang benar.Penjelasan:
Versi yang tidak bersaing, 10 byte
Cobalah online!
Program ini menampilkan daftar kosong untuk kasus-kasus palsu dan daftar tidak kosong sebaliknya. Ini pada dasarnya adalah port jawaban Dennis's Jelly . Ini non-bersaing karena jumlah kumulatif dan fungsi perbedaan yang di-vektor-kan setelah tanggal tantangan.
Penjelasan:
sumber
Python 2,
76747066 byteTerima kasih kepada @xnor karena bermain golf
48 byte!Uji di Ideone . (kasus uji yang lebih besar tidak termasuk)
sumber
n=sum(x)
melakukannyan in ...
; tidak ada salahnya menggunakan nilai yang lebih besar untukn
.MATL , 10 byte
Outputnya adalah jumlah garis bagi.
Cobalah online!
Penjelasan
Pendekatan yang sama dengan jawaban Dennis 'Julia .
sumber
Rubi,
6053 byteMenghasilkan semua partisi yang mungkin dengan mengambil setiap rotasi array input dan kemudian mengambil semua irisan panjang 1 ..
n
, di manan
ukuran array input. Kemudian periksa apakah ada partisi dengan jumlah setengah jumlah total array input.sumber
JavaScript (ES6), 83 byte
Hasilkan semua jumlah yang mungkin, kemudian periksa untuk melihat apakah setengah dari jumlah terakhir (yang merupakan jumlah dari seluruh daftar) muncul dalam daftar. (Menghasilkan jumlah dalam urutan yang sedikit canggung untuk mengatur jumlah yang saya butuhkan adalah yang terakhir menghemat 4 byte.)
sumber
Dyalog APL, 12 byte
Uji dengan TryAPL .
Bagaimana itu bekerja
sumber
Python 2 , 47 byte
Cobalah online!
Saya kembali 2,75 tahun kemudian untuk mengalahkan solusi lama saya hingga lebih dari 25% menggunakan metode baru.
Versi 1 byte yang lebih panjang ini sedikit lebih jelas.
Cobalah online!
Idenya adalah untuk menyimpan set jumlah kumulatif
t
sebagai bitk
, menetapkan bit2*t
untuk menunjukkan bahwa itut
adalah jumlah kumulatif. Kemudian, kami memeriksa apakah ada dua jumlah kumulatif yang berbeda setengah dari jumlah daftar (finalt
) dengan sedikit menggeserk
sebanyak ini dan melakukan sedikit demi sedikit&
dengan yang asli untuk melihat hasilnya tidak nol (benar).sumber
APL, 25 karakter
Dengan asumsi daftar diberikan padaX ← 1 2 3 4
.Penjelasan:
Catatan pertama bahwa APL mengevaluasi formulir dari kanan ke kiri. Kemudian:
X←⎕
mengambil input pengguna dan menyimpannya diX
⍴X
memberi panjangX
⍳⍴X
angka dari 1 hingga⍴X
The
⍺
dan⍵
di{2×+/⍺↑⍵↓X,X}
adalah argumen kiri dan kanan untuk fungsi diad kita mendefinisikan di dalam kurung kurawal.⍺↑⍵↓X,X
bagian ini:X,X
hanya menyatukan X dengan dirinya sendiri;↑
dan↓
ambil dan jatuhkan.+/
mengurangi / melipat di+
atas daftar di sebelah kanannyaJadi
2 {2×+/⍺↑⍵↓X,X} 1
=2×+/2↑1↓X,X
=2×+/2↑1↓1 2 3 4 1 2 3 4
==
2×+/2↑2 3 4 1 2 3 4
=2×+/2 3
=2×5
=10
.∘.brace⍨idx
hanyaidx ∘.brace idx
. (⍨
adalah peta diagonal;∘.
adalah produk luar)Jadi ini memberi kita
⍴X
dengan⍴X
matriks yang berisi dua kali jumlah dari semua sublists terhubung.Hal terakhir yang harus kita lakukan adalah memeriksa apakah jumlah
X
ada di suatu tempat di dalam matriks ini.(+/X)∊matrix
.sumber
Brachylog , 6 byte
Cobalah online!
Keluaran melalui keberhasilan atau kegagalan, pencetakan
true.
ataufalse.
jika dijalankan sebagai suatu program.sumber
C,
161145129 byteTidak dicoba coba online
sumber
i<n;i++
kei++<n
(meskipun Anda mungkin perlu berurusan dengan beberapa offset.Haskell, 68 byte
Fungsi
f
pertama-tama membuat daftar jumlah semua irisan yang mungkin dari daftar yang diberikan. Kemudian membandingkan dengan jumlah total elemen daftar. Jika kita mendapatkan setengah dari jumlah total, maka kita tahu bahwa kita memiliki dua bagian. Saya juga menggunakan fakta bahwa jika Andatake
ataudrop
lebih banyak elemen dari yang ada dalam daftar, Haskell tidak membuat kesalahan.sumber
Mathematica, 48 byte
Fungsi anonim, mirip dalam aksi dengan banyak jawaban lainnya.
Outer[Plus, #, -#]
, saat beraksiAccumulate@#
(yang pada gilirannya bertindak pada daftar input, memberikan daftar total berturut-turut) pada dasarnya menghasilkan tabel yang sama, seperti di bagian bawah jawaban Leaky Nun.!FreeQ[..., Last@#/2]
memeriksa apakah(Last@#)/2
ini tidak absen dari meja yang dihasilkan, danLast@#
merupakan yang terakhir dari jumlah berturut-turut, yaitu jumlah dari semua elemen dari daftar masukan.Jika jawaban ini agak menarik, itu bukan karena algoritma baru, tetapi lebih banyak tentang trik khusus untuk Mathematica; misalnya
!FreeQ
bagus, dibandingkan denganMemberQ
, karena tidak memerlukan perataan tabel yang diperiksa dan menyimpan byte.sumber
!FreeQ[2Tr/@Subsequences@#,Tr@#]&
harus bekerja, tetapi saya tidak akan memiliki 10,4 tersedia untuk mengujinya selama 10 hari ke depan.APL (NARS), karakter 95, byte 190
Pertimbangkan satu larik input 4 elemen: 1 2 3 4. Bagaimana kita dapat memilih yang berguna untuk partisi latihan set ini? Beberapa orang berpikir bahwa partisi dari 4 elemen ini dapat kita gunakan digambarkan dalam angka biner di sebelah kiri:
(1001 atau 1011 ecc bisa berada di set itu tetapi kita sudah memiliki 0110 dan 0100 ecc) jadi kita cukup menuliskan satu fungsi yang dari jumlah elemen array input, buat angka biner ini ... itu akan menjadi:
bahwa dari input 1 2 4 8 [2 ^ 0..lenBytesArgument-1] temukan 3 6 12, 7 14, 15; jadi temukan biner dari angka-angka ini dan gunakan mereka menemukan partisi yang tepat dari array input ... Saya menguji fungsi c hanya untuk itu input 4 elemen, tetapi tampaknya itu ok untuk jumlah elemen lainnya ...
uji:
sumber