Czy to prawda? Zapytaj Jelly!


32

tło

Zainspirowany bardzo dogodną interpretacją macierzy prawda / fałsz Octave (a przez to MATL), Jelly otrzymała atom Ȧ ( wszystko w stylu Octave ).

Ȧ przyjmuje tablicę jako dane wejściowe i zwraca 1, jeśli tablica nie jest pusta i nie zawiera liczby 0 (liczba całkowita, liczba zmiennoprzecinkowa lub liczba złożona) w dowolnym miejscu w strukturze drzewa ; w przeciwnym razie zwraca 0 .

Na przykład tablica [[]] jest prawdziwa, ponieważ nie jest pusta i nie zawiera zer, ale [[0]] jest fałszem, ponieważ zawiera 0 na najbardziej wewnętrznym poziomie.

Zadanie

W wybranym języku programowania napisz pełny program lub funkcję, która pobiera jako dane wejściowe pustą, prawdopodobnie postrzępioną tablicę liczb całkowitych i wyświetla lub zwraca wartość prawdy lub fałszu wskazującą, czy Ȧ zwróci odpowiednio 1 lub 0 .

Twoje zgłoszenie musi być zgodne z następującymi zasadami.

  • Wartości prawdziwości i fałszowania muszą być spójne dla wszystkich danych wejściowych , tj. Dla wszystkich tablic, dla których Ȧ zwraca 1, muszą być odwzorowane na tę samą wartość prawdziwości, a wszystkie tablice, dla których Ȧ zwraca 0, muszą być odwzorowane na tę samą wartość fałszowania.

  • Ponieważ pełne programy mogą pobierać reprezentacje łańcuchowe tablic jako dane wejściowe, jest to dozwolone. Musisz jednak użyć kanokalnej reprezentacji swojego języka, zwróconej przez reprlub w podobny sposób.

    W szczególności nie można zakładać, że pierwszy element tablicy będzie poprzedzony spacją.

  • Jeśli (i tylko wtedy) twój język nie może natywnie reprezentować poszarpanych tablic, możesz wziąć ciąg znaków reprezentujący dane wejściowe, używając kanonicznej składni dowolnego wcześniej istniejącego języka programowania.

  • Jeśli twój język ma kilka sposobów reprezentowania poszarpanych tablic (np. List i krotek), musisz obsługiwać tylko jeden z nich.

  • Jeśli Twój język ma wbudowaną funkcję, która sama jest prawidłowym poddaniem się temu wyzwaniu, nie możesz użyć go w swojej odpowiedzi . Wszystkie inne wbudowane elementy są dozwolone.

  • Zachęcamy do publikowania odpowiedzi przy użyciu zarówno operacji tablicowych, jak i łańcuchowych, nawet jeśli jedna jest znacznie krótsza od drugiej.

  • Obowiązują wszystkie standardowe zasady .

Niech wygra najkrótszy kod w bajtach!

Prawdziwe przypadki testowe

[1]
[10]
[[]]
[[[[1]]]]
[[], [1], [1, 2]]
[[1], [1, [2]], [1, [2, [3]]]]
[[8], [8, [9]], [8, [9, [10]]]]

Przypadki testowe Falsy

[]
[0]
[0, -1]
[-1, 0]
[[[[0]]]]
[[0], [1, 2], [3, 4, 5]]
[[8], [8, [9]], [8, [9, [1, 0]]]]
[-1, 0, 0, 0]

Czy na podstawie przypadków testowych masz na myśli „zawiera liczbę 0” w dowolnym miejscu w strukturze drzewa? Zgadłem, że to nie to.
xnor

Tak, gdziekolwiek Spróbuję to wyjaśnić.
Dennis

Co dokładnie masz na myśli „nie możesz założyć, że reprezentacja ciągu będzie miała określony format”?
Dada,

2
Nie są to postrzępione tablice - tablice postrzępione miałyby wszystkie liczby na tej samej głębokości, ponieważ różnią się tylko rozmiarami, a nie typami elementów.
Ørjan Johansen

2
@ Qwertiy Racja, „większość” języków, w których „wszystko” jest Object… moim ulubionym jest Haskell, gdzie nie jest. Ani w C, przynajmniej nie w sposób, który pozwala bezpiecznie mieszać tablice i int. Oba te języki są doskonale zdolne do tworzenia postrzępionych tablic, ale nadal nie mogą ich używać do tego problemu.
Ørjan Johansen

Odpowiedzi:


38

Galaretka, 3 bajty

ṭFẠ

F spłaszcza listę wejściową.

halsuje na oryginalnej liście danych wejściowych jako element, co jest fałszem wtedy i tylko wtedy, gdy jest pusta.

następnie sprawdza, czy jakikolwiek element na spłaszczonej liście lub na samej oryginalnej liście jest fałszywy.


(Oryginalna odpowiedź)

FẠ^Ṇ

Dzięki Dennisowi za zachęcenie do znalezienia rozwiązania pasującego do jego.

FẠdaje 0, jeśli dane wejściowe zawierają wartość fałszowania na dowolnej głębokości, w przeciwnym razie 1. To Ȧrobi, z wyjątkiem pustych list.

daje 1, jeśli dane wejściowe są wartością fałszowania, w przeciwnym razie 0. Jedyną listą fałszów jest pusta lista.

XOR-ing tych dwóch daje odpowiedź.


F;WẠ

Jest to w tym samym duchu, co Dennisa F;LẠ, ale zamiast Lwstawiania zera na liście, gdy lista jest pusta, używa Wdo umieszczenia pustej listy w sobie (produkując [[]]), dzięki czemu zawiera ona element fałsz.


30
Outgolfed we własnym wyzwaniu i we własnym języku ... Dobra robota!
Dennis

15

Siatkówka , 10 bajtów

A`\b0
^...

Wypróbuj online!

Najpierw usuwamy dane wejściowe, jeśli zawierają zero. Staramy się dopasować co najmniej trzy znaki od początku łańcucha (aby upewnić się, że dane wejściowe nie zostały wyeliminowane w poprzednim etapie, lub tylko []na początek).


12

Rubin, 25 24 23 18 16 bajtów

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

Wymaga -nflagi w wierszu poleceń (+1 bajt, -e-> -ne).

Wypróbuj online!

Jest to pełny program, który pobiera dane wejściowe w kanonicznym formacie tablicy Ruby na STDIN i wyjściach truelub falsena 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

Wersja z 23 bajtami :

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

Jest to proc, który wymaga jednego argumentu - testowanej tablicy.

Podziękowania dla Martina Endera za bajt i Ventero za dwa bajty!


Możesz zaoszczędzić jeszcze dwa bajty, używając p$_!~/\D0|^..$/(lub p ! ~/\D0|^..$/, co jest znaczną spacją) razem z -nflagą.
Ventero

8

Galaretka , 4 bajty

FẠ_Ṇ

Wypróbuj online!

Ȧdaje, 0jeśli dane wejściowe są puste lub zawiera a 0, w przeciwnym razie jest 1.

FẠdaje, 0jeśli spłaszczone wejście zawiera a 0, pozostawiając jedynie przypadek krawędzi pustej tablicy (ponieważ wejście jest gwarantowane jako tablica).

jest logiką niewektoryzującą, a nie monadą, i dlatego zwraca 0dowolną niepustą listę i 1pustą listę. Jako taki można to po prostu usunąć z wyniku FẠużycia _.


Jeden w dół, co najmniej jeszcze jeden do zrobienia.
Dennis

@Dennis To nie FẠạṆprawda, prawda?
Erik the Outgolfer

@EriktheOutgolfer Nie, nie jest. Odpowiedź, którą mam na myśli, dotyczy inaczej przypadku krawędzi pustej tablicy i dałaby inny wynik dla nie-tablic.
Dennis

@Dennis Jak zwrot A dla wartości True, B dla wartości false, C dla wartości pustej i D dla wartości innej niż tablica? To byłoby niekonkurujące. To, co zrobiłem, to użycie absolutnej różnicy zamiast różnicy, ponieważ nie ma negatywnych boolanów.
Erik the Outgolfer

@EriktheOutgolfer B musi być równy C, aby zachować zgodność ze specyfikacją wyzwania, ale D może być dowolne, ponieważ wejściem jest gwarantowana tablica.
Dennis

8

05AB1E , 9 8 bajtów

-1 bajty dzięki Emignie

)Q¹˜0å~_

Wyjaśnienie:

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

Wypróbuj online!


Wygląda na porażkę [[]].
Dennis

Czy 0 naprawdę jest prawdą w 05AB1E?
Dennis

wszystkie tablice, dla których Ȧ zwraca 1, muszą być odwzorowane na tę samą prawdziwą wartość, a wszystkie tablice, dla których Ȧ zwraca 0, muszą być odwzorowane na tę samą wartość fałszowania ( wyróżnienie moje)
Dennis

1
@Dennis W porządku, rzucił się w logiczny bajt negacji.
Okx,

1
Aw, tylko dla mnie. : P
Dennis

7

Mathematica, 17 bajtów

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

FreeQrobi 0dla nas sprawdzenie , ale oczywiście wróciłoby Truepo dane wejściowe {}, więc musimy sprawdzić tę sprawę osobno.


7

APL (Dyalog), 21 12 7 bajtów

Grał w golfa 5 bajtów dzięki Adámowi za pomocą widelców

⍬∘≡⍱0∊∊

Wypróbuj online!

To moja pierwsza próba w Dyalog. Wskazówki dotyczące gry w golfa są mile widziane!

Wyjaśnienie

⍬∘≡                   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 Pamiętaj, że łączysz wyniki dwóch testów. Jest to idealne rozwiązanie na widelec. ⍬∘≡jest testem po lewej stronie (pusty zestaw ograniczony do identycznego z) i 0∊∊jest testem prawym (sam rozwidlenie; zerowy element zapisanej formy). Umieścić go razem: ⍬∘≡⍱0∊∊. Wypróbuj online!
Adám

Możesz także użyć nazwy „APL (Dyalog)”, aby inni mogli znaleźć to, czego używasz.
Adám

@ Adám Dzięki za wskazówki!
Kritixi Lithos

6

Operacyjny język skryptowy Flashpoint , 199 188 bajtów

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}}

Zadzwoń z:

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

lub z:

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

Wyjaśnienie:

W języku skryptowym gry można wywoływać dowolny ciąg znaków zawierający kod. Nawiasy klamrowe{} oznaczają początek i koniec sznurka. (Znaki cudzysłowu też działają, ale stają się nieporządne, gdy są zagnieżdżone.) Tak więc A={...}przypisuje ciąg do zmiennej A, a zmienną można następnie wywołać jak funkcję z:<argument> call A . Zasadniczo każdy ciąg może być traktowany jako blok kodu.

Następnie wewnątrz „funkcji” Adefiniujemy inną funkcję f. privatedeklaruje dwie zmienne _ii _rlokalne do działania f. Nazwa zmiennej lokalnej musi zaczynać się znakiem podkreślenia.

while {} do {}jest pętlą, w której pierwszy ciąg (oznaczony przez {}) zawiera kod warunku pętli, a drugi ciąg dla treści pętli.

_thisto argument przekazany z callfunkcją. _thismoże być dowolnego typu, ale tutaj zakładamy, że jest to tablica.

W pętli o=_this select _iuzyskuje dostęp do elementu _i: th tablicy i przypisuje go do zmiennej o. if (o in [o])jest sztuczką, aby ustalić, czy ojest to kolejna tablica, czy nie. Jeśli ojest liczbą (lub czymkolwiek innym niż tablica), o in [o]zostanie obliczona na true, ponieważ infunkcja znajdzie wartość pasującą oz tablicy [o]. Jeśli ojest tablicą, wyrażenie daje wynik false, ponieważ inodmawia porównania tablic.

Jeśli onie jest tablicą, sprawdzamy, czy jest równa zero, a jeśli tak, ustawiamy zmienną _r, której użyjemy jako wartość zwracaną, na zero. W przeciwnym razie, jeśli ojest tablicą, przypisujemy do _rwartości zwracanej wywołanie rekurencyjne fz nową tablicąo jako argumentem.

Po zakończeniu pętli, na końcu funkcji f, oceniamy wyrażenie _r, które daje wartość _r, a ponieważ jest to ostatnie wyrażenie do oceny, to właśnie fzwraca to wywołanie funkcji .

Teraz, gdy zdefiniowaliśmy f( fnie musimy być w środku A, ale w ten sposób moglibyśmy zadeklarować ją jako lokalną zmienną / funkcję (tak naprawdę nie ma różnicy), Ajeśli nie chcemy zapisywać niektórych bajtów), wróćmy A. if (count _this == 0)sprawdza, czy Atablica wejściowa jest pusta, a jeśli tak,A zwraca 0. W przeciwnym razie funkcja fjest wywoływana, a jej zwracana wartość będzie Awartością zwracaną.

Można zauważyć, że wydaje się, że w kilku miejscach brakuje średnika, ale tak nie jest, ponieważ średnik jest potrzebny tylko po instrukcji, jeśli inna instrukcja podąża za nim w tym samym bloku kodu (tj. Ciągu znaków).


Czekaj, co?! Operacja Flashpoint?
Brain Guider

co jak? co??? zmieszany
Christopher

@DownChristopher Dodano wyjaśnienie.
Steadybox

1
@AnderBiguri Tak, dlaczego nie? Język skryptowy gry pasuje do definicji języka programowania podanej w poście w linku do pytania.
Steadybox

1
@ Steadybox Jestem zdezorientowany co do istnienia rzeczy, a nie jej ważności !!
Brain Guider

5

Perl 5 , 15 bajtów

Zaoszczędzono 2 bajty, stosując tę ​​samą technikę, co Rubinowa odpowiedź Doorknob .

14 bajtów kodu + -pflaga

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

Wypróbuj online!

/.../zapewnia, że ​​tablica nie jest pusta (będzie pasować do dowolnej tablicy, ale [].
/\b0/będzie pasować tylko, jeśli istnieje0 w tablicy jest tablica. ( \bgwarantuje, że 0nie jest to część innej liczby, ale liczba całkowita).


5

Haskell , 48 bajtów

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

Wypróbuj online!

Dzięki Lynn za przypadki testowe i x<"[]" sztuczkę.

Zewnętrzna nierówność musi (x<"[]")mieć wartość True (niepusta lista) ior[elem c"[,"|c:'0':_<-scanr(:)[]x] False (bez zer).

Znaki 0są wykrywane jako następujące po ,lub [, w przeciwieństwie do liczb takich jak 20. Wyrażenie scanr(:)[]xgeneruje wszystko, co wystarcza l, i c:'0':_<-chwyta tych, których drugą postacią jest '0'. Następnie elem c"[,"sprawdza, czy pierwszym znakiem jest ,lub[ .

Zakładam tutaj, że listy w stylu Haskell nie mają spacji, ale jeśli tak, to ','można je po prostu zastąpić' ' .

Oto bardziej bezpośrednia 48-bajtowa metoda, chociaż produkuje 0i 1nie są Truthy / Falsey w Haskell.

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

5

Galaretka , 4 bajty

F;LẠ

Wypróbuj online!

Jak to działa

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.

Zauważ, że atom Ạ zachowuje się jak Python, alla zatem różni się raczej od zbanowanego Ȧ.


8
Heads-up: To nie jedyne 4-bajtowe rozwiązanie Jelly, oprócz oczywistych L;FẠ. Kto może znaleźć inny?
Dennis

4

JavaScript (ES6), 34 bajty

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

Przypadki testowe


Prawdopodobnie możesz użyć !!a[0]zamiast a.length. (Nie musisz się martwić, a[0]że będziesz zerowy, ponieważ i tak wynik musi być fałszywy.)
Neil

Nieważne, widziałem, że Qwerty już tam dotarł.
Neil

4

Julia, 45 bajtów

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

Tworzy to funkcję, gktóra wskazuje, czy Ȧ będzie wynosić 1 czy 0, wywołując funkcję rekurencyjnąa . Aby zrobić odpowiedni a, używamy wielu wysyłek:

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

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

Funkcja all przyjmuje argument funkcji, więc wywołujemy akażdy element danych wejściowych. Następnie po prostu definiujemy funkcję przesyłania jako

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

Zasadniczo potrzebujemy a ale z czekiem, aby poprawnie obsługiwać[] .

Wypróbuj online!


można zdefiniować funkcję a(x)lub g(x)co !xw zamian?
Cyoce,

4

Brud , 16 14 11 bajtów

Dzięki Zgarbowi za oszczędność 5 bajtów.

e`s\0v#|!..

Wypróbuj online!

eMówi Grime spróbować dopasować całe wejście i wydrukować 0lub1 w zależności od tego, czy jest to możliwe.

Jest |!to efektywnie operator „żaden”, ponieważ x|!yjest skrótem od (x|y)!. Dlatego upewniamy się, że dane wejściowe nie zawierają zera poprzedzonego symbolem ani nie zawierają ciągu dwóch znaków ([] ).

Uwaga na temat drugiej połowy: P#pasuje do prostokąta zawierającego co najmniej jedno dopasowanie P. Jednak w naszym przypadku Pskłada się zarówno si \0tak, że normalnie wymagają nawiasów: (s\0)#(bo pierwszeństwo #jest zbyt wysoka). Ale Grime ma naprawdę fajną funkcję, w której możesz modyfikować pierwszeństwo operatorów za pomocą ^i v. Więc za pomocą v#możemy obniżyć #„s pierwszeństwo więc, że jest to niższy niż jakiegokolwiek innego operatora (w tym łączenie), która pozwala nam zapisać bajt w nawiasach.


3

Pip , 12 bajtów

#Va&`\b0`NIa

Pobiera tablicę jako argument wiersza polecenia w formie repr Pipa, np [1;[2;3]]. Zwraca 1za prawdę, 0za falsey. Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie

              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

Dodatkowa odpowiedź, 12 bajtów

Oto funkcja, która zamiast tego pobiera listę:

#_>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 bajtów

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

Wypróbuj online!

fpobiera dane wejściowe ze swojego strumienia jako listę, która może zawierać inne listy i liczby całkowite. Zwraca, 1jeśli ajest prawdą i nic innego. Funkcja pomocnicza gsprawdza, czy azawiera zera.

Wyjaśnienie:

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) */

Rozwiązanie wykorzystujące wyrażenia regularne może być prawdopodobnie krótsze.

Ta odpowiedź mogłaby być krótsza, gdyby pozwolono na zwrócenie wielu wartości. Zostało to omówione wcześniej w jednej z moich odpowiedzi i stwierdzono, że w domyślnych regułach dozwolone jest zwracanie różnych wartości prawdy i fałszu dla różnych danych wejściowych, ale z jakiegoś powodu OP zabrania tego tu i tam. :(


3

Cud , 15 bajtów

@&#0! iO0flat#0

Stosowanie:

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

Spłaszcz wejście, uzyskaj wszystkie wystąpienia 0, logiczne NIE, logiczne ORAZ z wejściem.


3

Haskell , 62 bajty

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

Wypróbuj online!

To jest funkcja String -> Bool. Listy Haskella są heterogeniczne, więc nie ma wbudowanego sposobu reprezentowania takich list [0, [0]].


W oparciu o zmienione reguły wejścia nie powinny zawierać spacji, ponieważ tablice Haskell domyślnie nie. Przynajmniej myślę, że taka jest interpretacja, nawet jeśli Haskell nie zezwala na poszarpane tablice. Ale wygląda na to, że twój kod działałby tak samo z ,``.
xnor

2
Jak mam spierając się w komentarzach pytanie Haskell nie mają postrzępione tablic i list () - jest to po prostu, że to nie wystarczy do tego, co naprawdę wymaga to pytanie.
Ørjan Johansen

3

Python 2 , 45 39 38 bajtów

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

Wypróbuj online!

-6 dzięki @BenFrankel


poprzednia wersja, bez konwersji listy na ciąg repr, 68 bajtów:

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

This gives a false positive on []. The following saves 6 bytes and succeeds on []: lambda a:bool(a)^(' 0'in`a`or'[0'in`a`)
Ben Frankel

2

MATLAB, 49 bytes

As MATLAB (as well as Octave) does not allow these kind of nested arrays, we interpret it as a string.

First we replace all non-digit characters with a space. Then we use str2num to convert it to an (1D) array, on which we can apply all (which is allowed, as it does not completely solve this task by itself.)

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

2

egrep, 7+3=10 bytes

\<0|^.]

+3 bytes for the required -v flag to invert the result.

Grep doesn't have any concept of arrays, so this uses a string representation as given in the question. Takes input on one line from stdin, returns via the exit code (ignore stdout).

(Now using a version which doesn't account for 01 and similar, since word-of-god is that it's OK)

Original bash/grep entry:

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

Finds 0s anywhere (using the word boundary checks \< and \> to discount things like 10 or a1), or a whole string matching [], then inverts the match.

Breakdown:

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 '[]')

Not cheating, just good golfing. :) Btw, grep is capable for primality testing, so it is a programming language as far as PPCG is concerned. \<0\|^.] plus -v would count as an 11 byte solution.
Dennis

1
@Dennis cool, thanks! (I switched to egrep rather than grep to save an additional byte; language name doesn't count towards byte-count!)
Dave

2

Javascript ES6, 24 chars

Works with array, returns 1 or 0:

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

Test:

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


Since the return value can be truthy/falsy, you can drop the !! (though then you must change & to &&). Saves one byte.
Brian McCutchon

@BrianMcCutchon, no as there is a binary &. In case of && without !! consistent output will be broken: undefined for [],0 for [0] and [0,1,2] and false for others.
Qwertiy

I don't see how breaking consistent output is bad in this challenge. My point with switching to && is that you would need to if you take my first suggestion, since 2 & 1 == 0.
Brian McCutchon

@BrianMcCutchon, the first point of the question: "The truthy and falsy values must be consistent for all inputs, i.e, all arrays for which Ȧ returns 1 must map to the same truthy value, and all arrays for which Ȧ returns 0 must map to the same falsy value."
Qwertiy

Ah, I skimmed that too quickly. Never mind.
Brian McCutchon

2

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

i0Bu

Explanation

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 

If result needs to be outputted ...

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

Previous solution

I had posted this before realising that stack based languages could leave the value on the stack as a form of output

i0B¿0oP?!¿o?

Explanation

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

As Lynn and xnor remarked, Haskell does not come with a heterogeneously-nested list type. But it's easy to add them as a custom data type and let the function operate on that type, and this is much preferrable to operating on (urgh!) strings.

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

To actually be able to write out such lists as literals with [1, [2]] syntax, you also need some typeclass fu. Full test case:

{-# 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])

Try it online!


2

Vim, 23 bytes

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

Try it online!

Outputs an empty string for false, or 1 for true. This could be shorter if I can output an empty string or [] for false (both of which are falsy values in vim).



1

Lithp, 74 bytes

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

Try it online!

Well, this turned out longer than I'd hoped. The [] case tripped me up and added a few bytes. It simply flattens the list and does a fold left over it, and if it finds a 0 it sets the accumulator to 0.


1

Ruby, 24 22 bytes

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

Try it online!

Yes I know there's a better solution in Ruby but I wanted to find one taking the array in input instead of a string.


1

tinylisp, 70 64 bytes

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

The last line is an unnamed lambda function that takes a list and returns 1 for "truthy-under-Ȧ" and 0 for falsey. Try it online!

Ungolfed

(load library)

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

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

The recursive helper function does most of the work. If its argument is a list, we map to its elements and return 1 if they are all truthy, 0 if any are falsey. (Conveniently, all returns 1 when given the empty list.) Otherwise, the argument must be an integer; we return it as-is (0 is falsey and all other integers are truthy in tinylisp).

The main function Ȧ checks if the list is nonempty. If so, it calls ; if not, it returns 0.

The golfed version takes advantage of some undefined behavior: rather than using (e(type X)List) to test whether X is an integer or a list, it does (c()X), which attempts to cons (prepend) the empty list onto X. If X is a list, this results in a nonempty list, which is truthy. If X is an integer, tinylisp outputs an error message and returns an empty list, which is falsey. Since stderr is ignored, this approach is valid.


0

PHP, 63 54 bytes

9 bytes saved by @user63956

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

takes an array as input; returns true or false: If $a is not empty,
check if print_r output contains a 0 value.

array solution, 83 bytes

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

recursive function returns 1 or 0.

breakdown

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
You can save a few bytes with strpos(print_r($a,1)," 0") instead of preg_match(...).
user63956

@user63956 ... and it also solves the 0-index problem. I wasn´t aware of the second print_r parameter. Great!
Titus
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.