Apakah itu benar Tanya Jelly!


32

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

  • Semua standar berlaku.

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]

Berdasarkan kasus uji, apakah maksud Anda "mengandung angka 0" berarti di mana saja di struktur pohon? Bukan itu yang saya duga artinya.
xnor

Ya dimanapun. Saya akan mencoba mengklarifikasi itu.
Dennis

Apa yang sebenarnya Anda maksudkan "Anda tidak dapat mengasumsikan bahwa representasi string akan memiliki format tertentu"?
Dada

2
Ini bukan array bergerigi - array bergerigi akan memiliki semua angka pada kedalaman yang sama, karena hanya ukuran bervariasi, bukan tipe elemen.
Ørjan Johansen

2
@Qwertiy Benar, "sebagian besar" bahasa tempat "segalanya" adalah 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.
Ørjan Johansen

Jawaban:


38

Jelly, 3 byte

ṭFẠ

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)

FẠ^Ṇ

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.


F;WẠ

Ini jauh dalam semangat yang sama dengan Dennis F;LẠ, tetapi alih-alih menggunakan Luntuk meletakkan nol dalam daftar ketika daftar kosong, itu digunakan Wuntuk menempatkan daftar kosong ke dalam dirinya sendiri (menghasilkan [[]]), membuatnya mengandung elemen yang salah.


30
Kalah dalam tantangan saya sendiri dan bahasa saya sendiri ... Bagus sekali!
Dennis

15

Retina , 10 byte

A`\b0
^...

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


12

Ruby, 25 24 23 18 16 byte

p$_!~/\D0|^..$/

Membutuhkan -ntanda 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 trueatau falsepada STDOUT.

 $_              # line of input that was read automatically (-n)
   !~/        /  # does not match the regex...
      \D0        #   a non-digit followed by a 0
         |       #   or...
          ^..$   #   a 2-length string (which must be [], the empty array)
p                # output the result

Versi fungsi 23 byte :

->a{"#{a}"!~/\D0|^..$/}

Ini adalah proc yang membutuhkan satu argumen, array untuk diuji.

Terima kasih kepada Martin Ender untuk satu byte dan untuk Ventero selama dua byte!


Anda dapat menyimpan dua byte lagi dengan menggunakan p$_!~/\D0|^..$/(atau p ! ~/\D0|^..$/, ruang kosong signifikan) bersama dengan -nflag.
Ventero

8

Jelly , 4 byte

FẠ_Ṇ

Cobalah online!

Ȧmenghasilkan 0jika input kosong atau mengandung 0, jika tidak 1.

FẠmenghasilkan 0jika input rata berisi a 0, hanya menyisakan case tepi array kosong (karena input dijamin menjadi array).

adalah logika non-vektorisasi bukan monad, dan karenanya mengembalikan 0untuk setiap daftar yang tidak kosong dan 1untuk daftar kosong. Dengan demikian ini dapat dengan mudah disubstitusikan dari hasil FẠmenggunakan _.


Satu jatuh, setidaknya satu lagi.
Dennis

@ Dennis Tidak FẠạṆ, kan?
Erik the Outgolfer

@EriktheOutgolfer Tidak, tidak. Jawaban yang saya pikirkan berbeda dengan kasus tepi array kosong dan akan menghasilkan hasil yang berbeda untuk non-array.
Dennis

@ Dennis Seperti mengembalikan A untuk True, B untuk false, C untuk kosong dan D untuk non-array? Itu tidak akan bersaing. Apa yang saya lakukan adalah menggunakan perbedaan absolut alih-alih perbedaan karena tidak ada boolean negatif.
Erik the Outgolfer

@EriktheOutgolfer B harus sama dengan C untuk memenuhi spesifikasi tantangan, tetapi D bisa berupa apa saja karena input dijamin menjadi array.
Dennis

8

05AB1E , 9 8 byte

-1 byte, terima kasih kepada Emigna

)Q¹˜0å~_

Penjelasan:

)Q        Is the length of the input 0?
  ~    _  ... NOR ... (just for you, Dennis) 
   ¹˜     Input deep flattened
     0å   Contains 0

Cobalah online!


Tampaknya gagal [[]].
Dennis

Apakah 0 benar-benar jujur ​​di 05AB1E?
Dennis

semua array yang ȧ mengembalikan 1 harus peta untuk sama truthy nilai, dan semua array yang ȧ mengembalikan 0 harus memetakan ke yang sama falsy nilai (penekanan)
Dennis

1
@ Dennis Baiklah, melemparkan byte negasi logis di sana.
Okx

1
Ah, hanya untukku. : P
Dennis

7

Mathematica, 17 byte

#!={}&&#~FreeQ~0&

FreeQmelakukan pengecekan terhadap 0kami, tetapi tentu saja itu akan kembali Trueuntuk input {}, jadi kami perlu memeriksa kasus itu secara terpisah.


7

APL (Dyalog), 21 12 7 byte

Golf 5 byte berkat Adám dengan menggunakan garpu

⍬∘≡⍱0∊∊

Cobalah online!

Ini adalah percobaan pertama saya di Dyalog. Tips bermain golf dipersilakan!

Penjelasan

⍬∘≡                   Fork; Is the argument a null set
   ⍱                  Nor
    0∊∊               0 belongs to the enlisted form of the argument
                      For example, (1 (2 (3 (0)))) would become
                      1 2 3 0 using the ∊ monad
                      Then we check if zero belongs to this vector

+1 Perhatikan bahwa Anda menggabungkan hasil dari dua tes. Ini sempurna untuk garpu. ⍬∘≡adalah tes kiri (set kosong terikat ke identik-to), dan 0∊∊merupakan tes kanan (itu sendiri garpu; nol anggota-bentuk terdaftar). Meletakkannya bersama-sama: ⍬∘≡⍱0∊∊. Cobalah online!
Adám

Juga, Anda mungkin ingin menggunakan nama "APL (Dyalog)" sehingga orang dapat menemukan apa yang Anda gunakan.
Adám

@ Adám Terima kasih atas tipsnya!
Kritixi Lithos

6

Operasi bahasa scripting Flashpoint , 199 188 byte

A={f={private["_i","_r"];_r=1;_i=0;while{_i<count _this}do{o=_this select _i;if(o in [o])then{if(o==0)then{_r=0}}else{_r=o call f};_i=_i+1};_r};if(count _this==0)then{0}else{_this call f}}

Telepon dengan:

[3,6,4,[4,6],[3,6,[],[2,4,[0],3]]] call A

atau dengan:

hint format["%1", [3,6,4,[4,6],[3,6,[],[2,4,[0],3]]] call A]

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 variabel A, 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 lain f. privatemendeklarasikan dua variabel _idan _rlokal berfungsi f. 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 dengan call fungsi. _thisbisa dari jenis apa pun, tetapi di sini kita menganggap itu adalah array.

Dalam loop, o=_this select _imengakses elemen _i: th dari array dan menugaskannya ke variabel o. if (o in [o])adalah trik untuk menentukan apakah oarray lain atau tidak. Jika oangka (atau apa pun selain array), o in [o]akan dievaluasi true, karena infungsi menemukan nilai yang cocok odari array [o]. Jika oadalah array, ekspresi menghasilkan false, karena inmenolak untuk membandingkan array.

Jika obukan 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, jika omerupakan array, kami menetapkan _rnilai balik panggilan rekursif fdengan array baru osebagai 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 fungsi fkembali.

Sekarang kita telah mendefinisikan f( ftidak perlu berada di dalam A, tetapi dengan cara ini kita dapat mendeklarasikannya sebagai variabel / fungsi lokal (tidak ada perbedaan sebenarnya) Ajika kita tidak ingin menyimpan beberapa byte), mari kita kembali A. if (count _this == 0)memeriksa apakah Aarray input kosong, dan jika itu, Amengembalikan 0. Jika tidak fungsi fdipanggil dan nilai pengembaliannya akan menjadi Anilai 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).


Tunggu apa?! Operasi Flashpoint?
Brain Guider

bagaimana caranya? apa??? confuzed
Christopher

@DownChristopher Menambahkan penjelasan.
Steadybox

1
@AnderBiguri Yap, mengapa tidak? Bahasa scripting game cocok dengan definisi bahasa pemrograman yang diberikan dalam meta post yang terhubung dalam pertanyaan.
Steadybox

1
@Steadybox Saya bingung tentang keberadaan benda itu, bukan validitasnya !!
Brain Guider

5

Perl 5 , 15 byte

Disimpan 2 byte dengan menggunakan teknik yang sama seperti jawaban Ruby Doorknob .

14 byte kode + -pbendera

$_=!/\b0|^..$/

Cobalah online!

/.../memastikan bahwa array tidak kosong (itu akan cocok pada array apa pun tetapi [].
/\b0/hanya akan cocok jika ada 0dalam array. (yang \bmemastikan bahwa 0bukan bagian dari nomor lain tetapi seluruh nomor).


5

Haskell , 48 byte

f x=or[elem c"[,"|c:'0':_<-scanr(:)[]x]<(x<"[]")

Cobalah online!

Terima kasih kepada Lynn untuk test case dan x<"[]"triknya.

Ketimpangan luar (x<"[]")harus Benar (daftar kosong) dan or[elem c"[,"|c:'0':_<-scanr(:)[]x]Salah (tidak ada nol).

Karakter 0terdeteksi sebagai berikut ,atau [, sebagai lawan dari angka seperti 20. Ekspresi scanr(:)[]xmenghasilkan semua cukup l, dan c:'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 dan 1' s yang bukan Truthy / Falsey di Haskell.

f"[]"=0
f(c:'0':_)|elem c"[,"=0
f(_:t)=f t
f _=1

5

Jelly , 4 byte

F;LẠ

Cobalah online!

Bagaimana itu bekerja

F;LẠ  Main link. Argument: A (array)

F     Flatten A.
  L   Yield A's length.
 ;    Concatenate.
   Ạ  All; Tell if all elements of the resulting 1D array are truthy.

Perhatikan bahwa Ạ atom berperilaku seperti Python alldan karenanya agak berbeda dari anned yang dilarang.


8
Heads-up: Ini bukan satu-satunya solusi Jelly 4-byte, terlepas dari yang sudah jelas L;FẠ. Siapa yang bisa menemukan yang lain?
Dennis

4

JavaScript (ES6), 34 byte

a=>a.length&&+!~`,${a}`.search`,0`

Uji kasus


Anda mungkin bisa menggunakan !!a[0]sebagai gantinya a.length. (Anda tidak perlu khawatir a[0]menjadi nol karena hasilnya pasti salah dalam kasus ini.)
Neil

Sudahlah, saya melihat Qwerty sudah sampai di sana.
Neil

4

Julia, 45 byte

a(x)=all(a,x);a(x::Int)=x!=0;g(x)=x!=[]&&a(x)

Ini menciptakan fungsi gyang menunjukkan apakah Ȧ adalah 1 atau 0 dengan memanggil fungsi rekursif a. Untuk membuat yang cocok a, kami menggunakan beberapa pengiriman:

# A method for scalar values
a(x::Int) = x != 0

# A recursive fallback for arrays
a(x) = all(a, x)

Fungsi allmengambil argumen fungsi, jadi kami memanggil asetiap elemen input. Kemudian kita cukup mendefinisikan fungsi untuk pengiriman sebagai

g(x) = x != [] && a(x)

Pada dasarnya kita hanya perlu atetapi dengan cek untuk menangani dengan benar [].

Cobalah online!


dapatkah Anda mendefinisikan fungsi a(x)atau g(x)sebagai !xgantinya?
Cyoce

4

Grime , 16 14 11 byte

Terima kasih kepada Zgarb karena telah menghemat 5 byte.

e`s\0v#|!..

Cobalah online!

The ememberitahu Grime untuk mencoba dan mencocokkan seluruh masukan dan mencetak 0atau 1tergantung pada apakah itu mungkin.

Secara |!efektif operator "tidak", karena x|!yadalah 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 pertandingan P. Namun, dalam kasus kami Pterdiri dari keduanya sdan \0itu 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 ^dan v. Jadi dengan menggunakanv## prioritas kami yang lebih rendah sehingga lebih rendah dari operator lainnya (termasuk penggabungan), yang memungkinkan kami menyimpan byte pada tanda kurung.


3

Pip , 12 byte

#Va&`\b0`NIa

Mengambil array sebagai argumen baris perintah dalam bentuk repr Pip, seperti [1;[2;3]]. Kembali 1untuk kebenaran, 0untuk kebohongan. Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan

              a is 1st cmdline arg (implicit)
 Va            Eval a (converting from a string to a list)
#              Take the length (0 if empty, nonzero if nonempty)
   &          Logical AND
    `\b0`      Regex pattern: word boundary followed by 0 (avoids things like 10)
         NIa   Not in a (0 if `\b0` matches in a, 1 if it doesn't)
              Autoprint

Jawaban bonus, 12 byte

Inilah fungsi yang mengambil daftar sebagai gantinya:

#_>0=0N_Js^s

#_            Len(arg)
  >0          is greater than 0
    =         which also equals the following (comparison operators chain like Python's):
     0N       Count of 0's in
       _Js^s  arg, joined on space and then split on space (a hacky way to flatten)

TIO


3

Röda , 59 44 byte

f a{[1]if{g(a)[[]!=a]}}g a{[a!=0];try a|g _}

Cobalah online!

fmengambil input dari alirannya sebagai daftar yang dapat berisi daftar dan bilangan bulat lainnya. Ia kembali 1jika abenar dan tidak sebaliknya. Fungsi helper gmemeriksa apakaha mengandung nol.

Penjelasan:

f a{[1]if{g(a)[[]!=a]}}
f a{                  } /* Function declaration */
          g(a)          /* Call g -> pushes some booleans to the stream */
              [[]!=a]   /* Push value []!=a to the stream */
       if{           }  /* If all booleans in the stream are true: */
    [1]                 /*   Push 1 to the stream */
                        /* Otherwise return nothing */

g a{[a!=0];try a|g _}   /* Helper function */
g a{                }   /* Function declaration */
    [a!=0];             /* Push value a!=0 to the output stream */
           try          /* Ignore errors in the following if a is not a list */
               a        /* Push values in a to the stream */
                |g _    /* Pull values from the stream and */
                        /*   call g for each of them */
                        /*   (pushes boolean values to the output stream) */

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. :(


3

Bertanya-tanya , 15 byte

@&#0! iO0flat#0

Pemakaian:

(@&#0! iO0flat#0)[1;2;3;[8;9;0]]

Ratakan input, dapatkan semua kemunculan 0, logis TIDAK, logis DAN dengan input.


3

Haskell , 62 byte

import Data.List
(%)=isInfixOf
f x=not(",0"%x||"[0"%x)&&x<"[]"

Cobalah online!

Ini sebuah fungsi String -> Bool. Daftar Haskell beragam, jadi tidak ada cara bawaan untuk mewakili daftar seperti [0, [0]].


Berdasarkan aturan yang diucapkan ulang, input tidak boleh memiliki spasi karena array Haskell tidak secara default. Setidaknya, saya pikir itulah interpretasinya walaupun Haskell tidak mengizinkan array bergerigi. Tetapi sepertinya kode Anda akan bekerja sama dengan ,untuk ``.
xnor

2
Saat saya berdalih dalam komentar pertanyaan, Haskell memang memiliki array yang bergerigi (dan daftar) - hanya saja itu tidak cukup untuk kebutuhan pertanyaan ini.
Ørjan Johansen

3

Python 2 , 45 39 38 byte

lambda a:(a>[])^(' 0'in`a`or'[0'in`a`)

Cobalah online!

-6 terima kasih kepada @BenFrankel


versi sebelumnya, tanpa mengkonversi daftar ke string repr, 68 byte:

lambda a:(len(a)and g(a))*1
g=lambda b:all(map(g,b))if b>[]else b!=0

Ini memberikan positif palsu []. Berikut ini menghemat 6 byte dan berhasil pada []:lambda a:bool(a)^(' 0'in`a`or'[0'in`a`)
Ben Frankel

2

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 str2numuntuk mengonversinya menjadi array (1D), yang dapat kita terapkan all(yang diizinkan, karena tidak sepenuhnya menyelesaikan tugas ini dengan sendirinya.)

s=input('');s(s<45|s>57)=32;disp(all(str2num(s)))

2

egrep, 7 + 3 = 10 byte

\<0|^.]

+3 byte untuk -vbendera 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 01dan serupa, karena kata-all-allah tidak masalah)

Entri bash / grep asli:

grep -Ev '\<0+\>|^.]'

Temukan 0di mana saja (menggunakan cek batas kata \<dan \>untuk mendiskon hal-hal seperti 10atau a1), atau pencocokan keseluruhan string [], lalu membalikkan kecocokan.

Kerusakan:

grep
     -E \    # extended regular expression syntax
     -v \    # invert match
     \<0+\>  # a number of 0s with alphanumeric boundaries on both sides
     |^.\]   # or ']' as the second character (implies '[]')

Tidak curang, hanya bermain golf bagus. :) Btw, grep mampu melakukan pengujian primality, jadi ini adalah bahasa pemrograman sejauh yang menyangkut PPCG. \<0\|^.]plus -vakan dihitung sebagai solusi 11 byte.
Dennis

1
@Dennis keren, terima kasih! (Saya beralih ke egrepdaripada grepmenyimpan byte tambahan; nama bahasa tidak diperhitungkan terhadap byte-count!)
Dave

2

Javascript ES6, 24 karakter

Bekerja dengan berbagai, mengembalikan 1atau 0:

a=>!!a[0]&!/\b0/.test(a)

Uji:

f=a=>!!a[0]&!/\b0/.test(a)

console.log([
  [1],
  [10],
  [[]],
  [[[[1]]]],
  [[], [1], [1, 2]],
  [[1], [1, [2]], [1, [2, [3]]]],
  [[8], [8, [9]], [8, [9, [10]]]],
].every(x => f(x)===1))

console.log([
  [],
  [0],
  [0, -1],
  [-1, 0],
  [[[[0]]]],
  [[0], [1, 2], [3, 4, 5]],
  [[8], [8, [9]], [8, [9, [1, 0]]]],
].every(x => f(x)===0))


Karena nilai kembali bisa benar / salah, Anda dapat menjatuhkan !!(meskipun kemudian Anda harus mengubah &ke &&). Menghemat satu byte.
Brian McCutchon

@BrianMcCutchon, tidak ada biner &. Dalam hal &&tanpa !!output yang konsisten akan rusak: undefineduntuk [], 0untuk [0]dan [0,1,2]dan falseuntuk orang lain.
Qwertiy

Saya tidak melihat bagaimana memecah output konsisten buruk dalam tantangan ini. Maksud saya dengan beralih ke &&adalah bahwa Anda perlu jika Anda mengambil saran pertama saya, sejak itu 2 & 1 == 0.
Brian McCutchon

@BrianMcCutchon, titik pertama dari pertanyaan: "Nilai kebenaran dan kepalsuan harus konsisten untuk semua input, yaitu, semua array yang Ȧ mengembalikan 1 harus dipetakan ke nilai kebenaran yang sama, dan semua array yang Ȧ mengembalikan 0 harus dipetakan ke nilai falsy yang sama. "
Qwertiy

Ah, saya membaca skim terlalu cepat. Sudahlah.
Brian McCutchon

2

√ å ı ¥ ® Ï Ø ¿ , 12 4 byte

i0Bu

Penjelasan

i            › Take input as a list and automatically flatten it. If empty, push 0.
 0           › Push 0 to the stack
  B          › Pop 0 and push the number of times it appears
   u         › convert top value to its boolean 

Jika hasilnya perlu di-output ...

i0Buo        › same as above; o outputs the top value on the stack

Solusi sebelumnya

Saya telah memposting ini sebelum menyadari bahwa bahasa berbasis stack dapat meninggalkan nilai pada stack sebagai bentuk output

i0B¿0oP?!¿o?

Penjelasan

i            › Take input as a list and automatically flatten it. If empty, push 0.
 0           › Push 0 to the stack
  B          › Pop 0 and push the number of times it appears
   ¿         › If the top value is true ...
    0        › Push 0
     o       › Output the top value on the stack
      P      › Pop the top value from the stack
       ?     › End if statement
        !    › Boolean opposite of top value
         ¿   › If the top value is true ...
          o  › Output the top value
           ? › End if statement

2

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

data L=L Int|T[L]
f(L n)=n/=0
f(T l)=all f l

Untuk benar-benar dapat menulis daftar seperti literal dengan [1, [2]]sintaks, Anda juga memerlukan beberapa typeclass fu. Kasus uji penuh:

{-# LANGUAGE OverloadedLists, TypeFamilies #-}
import GHC.Exts (IsList(..))

instance Num L where
  fromInteger = L . fromInteger
  negate (L n) = L $ negate n
instance IsList L where
  type Item L = L
  fromList = T
main = mapM_ (print . f) (
                    [ [1]
                    , [[[[0]]]]
                    , [[8], [8, [9]], [8, [9, [1, 0]]]]
                    ] :: [L])

Cobalah online!


2

Vim, 23 byte

:g/0\|^..$/d
:s/.\+/1/<CR>

Cobalah online!

Menghasilkan string kosong untuk false, atau 1untuk true. Ini bisa lebih pendek jika saya dapat menampilkan string kosong atau [] untuk false (keduanya merupakan nilai falsy dalam vim).



1

Lithp , 74 byte

(def f #L::((foldl(flatten L)(?(>(length L)0)1 0)#N,A::((?(== N 0)0 A)))))

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.


1

Ruby , 24 22 byte

->a{a[0]&&a*?!!~/\b0/}

Cobalah online!

Ya, saya tahu ada solusi yang lebih baik di Ruby, tetapi saya ingin menemukan satu yang mengambil array di input daripada string.


1

tinylisp , 70 64 byte

(load library
(d _(q((X)(i(c()X)(all(map _ X))X
(q((L)(i L(_ L)0

Baris terakhir adalah fungsi lambda tanpa nama yang mengambil daftar dan mengembalikan 1untuk "true-under-Ȧ" dan 0untuk falsey. Cobalah online!

Tidak disatukan

(load library)

(def _Ȧ
 (lambda (val)
  (if (equal? (type val) List)
   (all (map _Ȧ val))
   val)))

(def Ȧ
 (lambda (ls)
  (if ls
   (_Ȧ ls)
   0)))

Fungsi pembantu rekursif melakukan sebagian besar pekerjaan. Jika argumennya adalah daftar, kita map ke elemen-elemennya dan kembali 1jika mereka benar all, 0jika ada yang palsu. (Mudah, allkembali 1ketika 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 apakah Xbilangan bulat atau daftar, itu (c()X)yang mencoba untuk cons(mendahului) daftar kosong ke X. Jika Xdaftar, ini menghasilkan daftar kosong, yang benar. Jika Xbilangan bulat, tinylisp menampilkan pesan kesalahan dan mengembalikan daftar kosong, yang merupakan falsey. Karena stderr diabaikan, pendekatan ini valid.


0

PHP, 63 54 byte

9 byte disimpan oleh @ user63956

function a($a){return$a&&!strpos(print_r($a,1)," 0");}

mengambil array sebagai input; mengembalikan trueatau false: Jika $atidak kosong,
periksa apakah print_routput mengandung a0 nilai.

solusi array, 83 byte

function b($a,$r=0){$r|=$a;foreach($a as$v)$r|=is_array($v)?b($v,1):!!$v;return$r;}

mengembalikan fungsi rekursif 1atau0 .

kerusakan

function b($a,$r=0)
{
    $r|=$a;         # if $a is not empty, set $r (no effect in recursion)
    foreach($a as$v)    # loop through elements:    
        $r&=is_array($v)    # 2. if test failed, clear $r
            ?b($v,1)        # 1. if array, recurse
            :!!$v;          #    else test element <>0
    return$r;           # return $r
}

1
Anda dapat menyimpan beberapa byte dengan strpos(print_r($a,1)," 0")bukan preg_match(...).
user63956

@ user63956 ... dan juga memecahkan masalah 0-index. Saya tidak mengetahui print_rparameter kedua . Besar!
Titus
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.