Latar Belakang
Terinspirasi oleh Octave (dan, dengan ekstensi, MATL) interpretasi yang sangat nyaman dari matriks kebenaran / kepalsuan, Jelly mendapatkan atom Ȧ ( semua gaya oktaf ).
Ȧ mengambil array sebagai input dan mengembalikan 1 jika array tidak kosong dan tidak mengandung angka 0 (integer, float, atau complex) di mana saja dalam struktur pohon ; jika tidak, ia mengembalikan 0 .
Sebagai contoh, array [[]] adalah benar karena tidak kosong dan tidak mengandung nol, tetapi [[0]] salah karena berisi 0 pada level terdalam.
Tugas
Dalam bahasa pemrograman pilihan Anda, tulislah program lengkap atau fungsi yang menggunakan array bilangan bulat kosong yang mungkin bergerigi sebagai input dan cetak atau kembalikan nilai yang benar atau salah yang mengindikasikan apakah Ȧ akan mengembalikan 1 atau 0 , masing-masing.
Kiriman Anda harus mematuhi aturan berikut.
The truthy dan nilai-nilai falsy harus konsisten untuk semua masukan , yaitu, semua array yang ȧ mengembalikan 1 harus memetakan dengan nilai truthy yang sama, dan semua array yang ȧ mengembalikan 0 harus memetakan dengan nilai falsy yang sama.
Karena program lengkap hanya dapat mengambil representasi string dari array sebagai input, ini diizinkan. Namun, Anda harus menggunakan representasi bahasa Anda yang kanopi, seperti yang dikembalikan oleh
repr
atau serupa.Khususnya Anda tidak dapat mengasumsikan bahwa elemen pertama array akan didahului oleh spasi.
Jika (dan hanya jika) bahasa Anda tidak dapat mewakili array bergerigi secara asli, Anda dapat mengambil representasi string dari input, menggunakan sintaksis kanonik dari bahasa pemrograman yang sudah ada sebelumnya.
Jika bahasa Anda memiliki beberapa cara untuk mewakili array bergerigi (misalnya, daftar dan tupel), Anda hanya perlu mendukung salah satunya.
Jika bahasa Anda memiliki built-in yang merupakan pengajuan yang valid untuk tantangan ini, Anda tidak dapat menggunakannya dalam jawaban Anda . Semua bawaan lainnya diizinkan.
Anda disarankan untuk mengirim jawaban menggunakan manipulasi array dan string, meskipun yang satu jauh lebih pendek dari yang lain.
Semoga kode terpendek dalam byte menang!
Kasus uji kebenaran
[1]
[10]
[[]]
[[[[1]]]]
[[], [1], [1, 2]]
[[1], [1, [2]], [1, [2, [3]]]]
[[8], [8, [9]], [8, [9, [10]]]]
Kasus uji palsu
[]
[0]
[0, -1]
[-1, 0]
[[[[0]]]]
[[0], [1, 2], [3, 4, 5]]
[[8], [8, [9]], [8, [9, [1, 0]]]]
[-1, 0, 0, 0]
Object
... favorit saya adalah Haskell, di mana tidak. Atau di C, setidaknya tidak dengan cara yang memungkinkan Anda untuk mencampur array dan ints dengan aman. Kedua bahasa tersebut sangat mampu membuat array bergerigi, tetapi masih tidak dapat menggunakannya untuk masalah ini.Jawaban:
Jelly, 3 byte
F
meratakan daftar input.ṭ
paku pada daftar input asli sebagai elemen, yang falsy jika dan hanya jika itu kosong.Ạ
kemudian periksa apakah ada elemen dalam daftar yang diratakan, atau daftar asli itu sendiri, salah.(Jawaban asli)
Terima kasih kepada Dennis karena mendorong menemukan solusi yang cocok dengan miliknya.
FẠ
memberikan 0 jika input berisi nilai falsy pada kedalaman apa pun, jika tidak 1. Ini adalah apaȦ
, kecuali untuk daftar kosong.Ṇ
memberi 1 jika input adalah nilai falsy, atau 0. Satu-satunya daftar falsy adalah daftar kosong.XOR-ing keduanya memberikan jawabannya.
Ini jauh dalam semangat yang sama dengan Dennis
F;LẠ
, tetapi alih-alih menggunakanL
untuk meletakkan nol dalam daftar ketika daftar kosong, itu digunakanW
untuk menempatkan daftar kosong ke dalam dirinya sendiri (menghasilkan[[]]
), membuatnya mengandung elemen yang salah.sumber
Retina , 10 byte
Cobalah online!
Pertama-tama kita menghapus input jika mengandung nol. Kami mencoba mencocokkan setidaknya tiga karakter dari awal string (untuk memastikan bahwa input belum dihilangkan pada tahap sebelumnya, atau hanya
[]
untuk memulai dengan).sumber
Ruby,
2524231816 byteMembutuhkan
-n
tanda pada baris perintah (+1 byte,-e
->-ne
).Cobalah online!
Ini adalah program lengkap yang mengambil input dalam format array kanonik Ruby pada STDIN dan output
true
ataufalse
pada STDOUT.Versi fungsi 23 byte :
Ini adalah proc yang membutuhkan satu argumen, array untuk diuji.
Terima kasih kepada Martin Ender untuk satu byte dan untuk Ventero selama dua byte!
sumber
p$_!~/\D0|^..$/
(ataup ! ~/\D0|^..$/
, ruang kosong signifikan) bersama dengan-n
flag.Jelly , 4 byte
Cobalah online!
Ȧ
menghasilkan0
jika input kosong atau mengandung0
, jika tidak1
.FẠ
menghasilkan0
jika input rata berisi a0
, hanya menyisakan case tepi array kosong (karena input dijamin menjadi array).Ṇ
adalah logika non-vektorisasi bukan monad, dan karenanya mengembalikan0
untuk setiap daftar yang tidak kosong dan1
untuk daftar kosong. Dengan demikian ini dapat dengan mudah disubstitusikan dari hasilFẠ
menggunakan_
.sumber
FẠạṆ
, kan?05AB1E ,
98 byte-1 byte, terima kasih kepada Emigna
Penjelasan:
Cobalah online!
sumber
[[]]
.Mathematica, 17 byte
FreeQ
melakukan pengecekan terhadap0
kami, tetapi tentu saja itu akan kembaliTrue
untuk input{}
, jadi kami perlu memeriksa kasus itu secara terpisah.sumber
APL (Dyalog),
21127 byteGolf 5 byte berkat Adám dengan menggunakan garpu
Cobalah online!
Ini adalah percobaan pertama saya di Dyalog. Tips bermain golf dipersilakan!
Penjelasan
sumber
⍬∘≡
adalah tes kiri (set kosong terikat ke identik-to), dan0∊∊
merupakan tes kanan (itu sendiri garpu; nol anggota-bentuk terdaftar). Meletakkannya bersama-sama:⍬∘≡⍱0∊∊
. Cobalah online!Operasi bahasa scripting Flashpoint ,
199188 byteTelepon dengan:
atau dengan:
Penjelasan:
Dalam bahasa scripting game, string apa pun yang berisi kode dapat dipanggil. Kurung kurawal
{}
menunjukkan awal dan akhir sebuah string. (Tanda kutip bekerja juga, tetapi itu menjadi berantakan ketika mereka bersarang.) Jadi,A={...}
berikan string ke variabelA
, dan variabel tersebut kemudian dapat disebut seperti fungsi dengan:<argument> call A
. Pada dasarnya string apa pun dapat diperlakukan sebagai blok kode.Kemudian, di dalam "fungsi"
A
, kita mendefinisikan fungsi lainf
.private
mendeklarasikan dua variabel_i
dan_r
lokal berfungsif
. Nama variabel lokal harus dimulai dengan garis bawah.while {} do {}
adalah loop, di mana string pertama (dilambangkan dengan{}
) berisi kode untuk kondisi loop dan yang kedua untuk tubuh loop._this
adalah argumen yang disahkan dengancall
fungsi._this
bisa dari jenis apa pun, tetapi di sini kita menganggap itu adalah array.Dalam loop,
o=_this select _i
mengakses elemen _i: th dari array dan menugaskannya ke variabelo
.if (o in [o])
adalah trik untuk menentukan apakaho
array lain atau tidak. Jikao
angka (atau apa pun selain array),o in [o]
akan dievaluasitrue
, karenain
fungsi menemukan nilai yang cocoko
dari array[o]
. Jikao
adalah array, ekspresi menghasilkanfalse
, karenain
menolak untuk membandingkan array.Jika
o
bukan array, kami memeriksa apakah itu sama dengan nol, dan jika ya, kami akan mengatur variabel_r
, yang akan kami gunakan sebagai nilai balik, menjadi nol. Jika tidak, jikao
merupakan array, kami menetapkan_r
nilai balik panggilan rekursiff
dengan array baruo
sebagai argumen.Setelah loop, pada akhir fungsi
f
, kami mengevaluasi ekspresi_r
, yang menghasilkan nilai_r
, dan karena ini adalah ekspresi terakhir yang dievaluasi, inilah yang menjadi pemanggilan fungsif
kembali.Sekarang kita telah mendefinisikan
f
(f
tidak perlu berada di dalamA
, tetapi dengan cara ini kita dapat mendeklarasikannya sebagai variabel / fungsi lokal (tidak ada perbedaan sebenarnya)A
jika kita tidak ingin menyimpan beberapa byte), mari kita kembaliA
.if (count _this == 0)
memeriksa apakahA
array input kosong, dan jika itu,A
mengembalikan 0. Jika tidak fungsif
dipanggil dan nilai pengembaliannya akan menjadiA
nilai balik.Orang mungkin memperhatikan bahwa tampaknya tanda titik koma akan hilang dari beberapa tempat, tetapi ini bukan kasusnya, karena tanda titik koma hanya diperlukan setelah pernyataan jika pernyataan lain mengikutinya di dalam blok kode yang sama (yaitu string).
sumber
Perl 5 , 15 byte
Disimpan 2 byte dengan menggunakan teknik yang sama seperti jawaban Ruby Doorknob .
14 byte kode +
-p
benderaCobalah online!
/.../
memastikan bahwa array tidak kosong (itu akan cocok pada array apa pun tetapi[]
./\b0/
hanya akan cocok jika ada0
dalam array. (yang\b
memastikan bahwa0
bukan bagian dari nomor lain tetapi seluruh nomor).sumber
Haskell , 48 byte
Cobalah online!
Terima kasih kepada Lynn untuk test case dan
x<"[]"
triknya.Ketimpangan luar
(x<"[]")
harus Benar (daftar kosong) danor[elem c"[,"|c:'0':_<-scanr(:)[]x]
Salah (tidak ada nol).Karakter
0
terdeteksi sebagai berikut,
atau[
, sebagai lawan dari angka seperti20
. Ekspresiscanr(:)[]x
menghasilkan semua cukupl
, danc:'0':_<-
menangkap orang-orang yang karakter keduanya'0'
. Kemudian,elem c"[,"
periksa apakah karakter pertama adalah,
atau[
.Saya berasumsi di sini bahwa daftar gaya Haskell tidak memiliki ruang, tetapi jika demikian
','
dapat digantikan oleh' '
.Berikut adalah metode 48-byte yang lebih langsung, meskipun menghasilkan
0
's dan1
' s yang bukan Truthy / Falsey di Haskell.sumber
Jelly , 4 byte
Cobalah online!
Bagaimana itu bekerja
Perhatikan bahwa Ạ atom berperilaku seperti Python
all
dan karenanya agak berbeda dari anned yang dilarang.sumber
L;FẠ
. Siapa yang bisa menemukan yang lain?JavaScript (ES6), 34 byte
Uji kasus
Tampilkan cuplikan kode
sumber
!!a[0]
sebagai gantinyaa.length
. (Anda tidak perlu khawatira[0]
menjadi nol karena hasilnya pasti salah dalam kasus ini.)Julia, 45 byte
Ini menciptakan fungsi
g
yang menunjukkan apakah Ȧ adalah 1 atau 0 dengan memanggil fungsi rekursifa
. Untuk membuat yang cocoka
, kami menggunakan beberapa pengiriman:Fungsi
all
mengambil argumen fungsi, jadi kami memanggila
setiap elemen input. Kemudian kita cukup mendefinisikan fungsi untuk pengiriman sebagaiPada dasarnya kita hanya perlu
a
tetapi dengan cek untuk menangani dengan benar[]
.Cobalah online!
sumber
a(x)
ataug(x)
sebagai!x
gantinya?Grime ,
161411 byteTerima kasih kepada Zgarb karena telah menghemat 5 byte.
Cobalah online!
The
e
memberitahu Grime untuk mencoba dan mencocokkan seluruh masukan dan mencetak0
atau1
tergantung pada apakah itu mungkin.Secara
|!
efektif operator "tidak", karenax|!y
adalah singkatan(x|y)!
. Jadi kami memastikan bahwa input tidak mengandung nol yang didahului oleh simbol dan juga bukan string yang hanya terdiri dari dua karakter ([]
).Catatan tentang babak kedua:
P#
cocok dengan kotak yang berisi setidaknya satu pertandinganP
. Namun, dalam kasus kamiP
terdiri dari keduanyas
dan\0
itu biasanya membutuhkan tanda kurung:(s\0)#
(karena diutamakan#
terlalu tinggi). Tetapi Grime memiliki fitur yang sangat rapi di mana Anda dapat memodifikasi prioritas operator dengan^
danv
. Jadi dengan menggunakanv#
#
prioritas kami yang lebih rendah sehingga lebih rendah dari operator lainnya (termasuk penggabungan), yang memungkinkan kami menyimpan byte pada tanda kurung.sumber
Pip , 12 byte
Mengambil array sebagai argumen baris perintah dalam bentuk repr Pip, seperti
[1;[2;3]]
. Kembali1
untuk kebenaran,0
untuk kebohongan. Cobalah secara online atau verifikasi semua kasus uji .Penjelasan
Jawaban bonus, 12 byte
Inilah fungsi yang mengambil daftar sebagai gantinya:
TIO
sumber
Röda ,
5944 byteCobalah online!
f
mengambil input dari alirannya sebagai daftar yang dapat berisi daftar dan bilangan bulat lainnya. Ia kembali1
jikaa
benar dan tidak sebaliknya. Fungsi helperg
memeriksa apakaha
mengandung nol.Penjelasan:
Sebuah solusi yang menggunakan regex sangat mungkin lebih pendek.
Jawaban ini bisa lebih pendek jika diizinkan untuk mengembalikan beberapa nilai. Ini telah dibahas dalam salah satu jawaban saya sebelumnya, dan disimpulkan bahwa diperbolehkan dalam aturan default untuk mengembalikan nilai kebenaran dan kepalsuan yang berbeda untuk input yang berbeda, tetapi untuk beberapa alasan OP melarangnya di sana-sini. :(
sumber
Bertanya-tanya , 15 byte
Pemakaian:
Ratakan input, dapatkan semua kemunculan 0, logis TIDAK, logis DAN dengan input.
sumber
Haskell , 62 byte
Cobalah online!
Ini sebuah fungsi
String -> Bool
. Daftar Haskell beragam, jadi tidak ada cara bawaan untuk mewakili daftar seperti[0, [0]]
.sumber
,
untuk ``.Python 2 ,
45 3938 byteCobalah online!
-6 terima kasih kepada @BenFrankel
versi sebelumnya, tanpa mengkonversi daftar ke string repr, 68 byte:
sumber
[]
. Berikut ini menghemat 6 byte dan berhasil pada[]
:lambda a:bool(a)^(' 0'in`a`or'[0'in`a`)
MATLAB, 49 byte
Karena MATLAB (dan juga Oktaf) tidak mengizinkan array bertingkat ini, kami menafsirkannya sebagai string.
Pertama kita mengganti semua karakter non-digit dengan spasi. Kemudian kita gunakan
str2num
untuk mengonversinya menjadi array (1D), yang dapat kita terapkanall
(yang diizinkan, karena tidak sepenuhnya menyelesaikan tugas ini dengan sendirinya.)sumber
egrep, 7 + 3 = 10 byte
+3 byte untuk
-v
bendera yang diperlukan untuk membalikkan hasilnya.Grep tidak memiliki konsep array, jadi ini menggunakan representasi string seperti yang diberikan dalam pertanyaan. Mengambil input pada satu baris dari stdin, kembali melalui kode keluar (abaikan stdout).
(Sekarang menggunakan versi yang tidak menjelaskan
01
dan serupa, karena kata-all-allah tidak masalah)Entri bash / grep asli:
Temukan
0
di mana saja (menggunakan cek batas kata\<
dan\>
untuk mendiskon hal-hal seperti10
ataua1
), atau pencocokan keseluruhan string[]
, lalu membalikkan kecocokan.Kerusakan:
sumber
\<0\|^.]
plus-v
akan dihitung sebagai solusi 11 byte.egrep
daripadagrep
menyimpan byte tambahan; nama bahasa tidak diperhitungkan terhadap byte-count!)Javascript ES6, 24 karakter
Bekerja dengan berbagai, mengembalikan
1
atau0
:Uji:
sumber
!!
(meskipun kemudian Anda harus mengubah&
ke&&
). Menghemat satu byte.&
. Dalam hal&&
tanpa!!
output yang konsisten akan rusak:undefined
untuk[]
,0
untuk[0]
dan[0,1,2]
danfalse
untuk orang lain.&&
adalah bahwa Anda perlu jika Anda mengambil saran pertama saya, sejak itu2 & 1 == 0
.√ å ı ¥ ® Ï Ø ¿ ,
124 bytePenjelasan
Jika hasilnya perlu di-output ...
Solusi sebelumnya
Saya telah memposting ini sebelum menyadari bahwa bahasa berbasis stack dapat meninggalkan nilai pada stack sebagai bentuk output
Penjelasan
sumber
Haskell, 45
Seperti yang dikatakan Lynn dan xnor , Haskell tidak datang dengan tipe daftar yang bersarang heterogen. Tetapi mudah untuk menambahkannya sebagai tipe data khusus dan membiarkan fungsi beroperasi pada tipe itu, dan ini jauh lebih disukai untuk beroperasi pada string (urgh!) .
Untuk benar-benar dapat menulis daftar seperti literal dengan
[1, [2]]
sintaks, Anda juga memerlukan beberapa typeclass fu. Kasus uji penuh:Cobalah online!
sumber
Vim, 23 byte
Cobalah online!
Menghasilkan string kosong untuk false, atau
1
untuk true. Ini bisa lebih pendek jika saya dapat menampilkan string kosong atau[]
untuk false (keduanya merupakan nilai falsy dalam vim).sumber
Ditumpuk , 20 byte
Cobalah online!
Atau, menggunakan string:
Cobalah online!
sumber
Lithp , 74 byte
Cobalah online!
Nah, ini ternyata lebih lama dari yang saya harapkan. The
[]
kasus menipu aku dan menambahkan beberapa byte. Ini hanya meratakan daftar dan melipat yang tersisa, dan jika menemukan 0 maka set akumulator menjadi 0.sumber
Ruby ,
2422 byteCobalah online!
Ya, saya tahu ada solusi yang lebih baik di Ruby, tetapi saya ingin menemukan satu yang mengambil array di input daripada string.
sumber
tinylisp ,
7064 byteBaris terakhir adalah fungsi lambda tanpa nama yang mengambil daftar dan mengembalikan
1
untuk "true-under-Ȧ" dan0
untuk falsey. Cobalah online!Tidak disatukan
Fungsi pembantu rekursif
_Ȧ
melakukan sebagian besar pekerjaan. Jika argumennya adalah daftar, kitamap
_Ȧ
ke elemen-elemennya dan kembali1
jika mereka benarall
,0
jika ada yang palsu. (Mudah,all
kembali1
ketika diberi daftar kosong.) Jika tidak, argumen harus berupa bilangan bulat; kami mengembalikannya apa adanya (0
adalah falsey dan semua bilangan bulat lainnya benar di tinylisp).Fungsi utama
Ȧ
memeriksa apakah daftar ini kosong. Jika demikian, ia memanggil_Ȧ
; jika tidak, ia kembali0
.Versi golf mengambil keuntungan dari beberapa perilaku yang tidak terdefinisi: daripada menggunakan
(e(type X)List)
untuk menguji apakahX
bilangan bulat atau daftar, itu(c()X)
yang mencoba untukcons
(mendahului) daftar kosong keX
. JikaX
daftar, ini menghasilkan daftar kosong, yang benar. JikaX
bilangan bulat, tinylisp menampilkan pesan kesalahan dan mengembalikan daftar kosong, yang merupakan falsey. Karena stderr diabaikan, pendekatan ini valid.sumber
PHP,
6354 byte9 byte disimpan oleh @ user63956
mengambil array sebagai input; mengembalikan
true
ataufalse
: Jika$a
tidak kosong,periksa apakah
print_r
output mengandung a0
nilai.solusi array, 83 byte
mengembalikan fungsi rekursif
1
atau0
.kerusakan
sumber
strpos(print_r($a,1)," 0")
bukanpreg_match(...)
.print_r
parameter kedua . Besar!