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
repr
lub 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 gry w golfa .
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]
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.Odpowiedzi:
Galaretka, 3 bajty
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ź)
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ź.
Jest to w tym samym duchu, co Dennisa
F;LẠ
, ale zamiastL
wstawiania zera na liście, gdy lista jest pusta, używaW
do umieszczenia pustej listy w sobie (produkując[[]]
), dzięki czemu zawiera ona element fałsz.źródło
Siatkówka , 10 bajtów
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).źródło
Rubin,
2524231816 bajtówWymaga
-n
flagi 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
true
lubfalse
na STDOUT.Wersja z 23 bajtami :
Jest to proc, który wymaga jednego argumentu - testowanej tablicy.
Podziękowania dla Martina Endera za bajt i Ventero za dwa bajty!
źródło
p$_!~/\D0|^..$/
(lubp ! ~/\D0|^..$/
, co jest znaczną spacją) razem z-n
flagą.Galaretka , 4 bajty
Wypróbuj online!
Ȧ
daje,0
jeśli dane wejściowe są puste lub zawiera a0
, w przeciwnym razie jest1
.FẠ
daje,0
jeśli spłaszczone wejście zawiera a0
, pozostawiając jedynie przypadek krawędzi pustej tablicy (ponieważ wejście jest gwarantowane jako tablica).Ṇ
jest logiką niewektoryzującą, a nie monadą, i dlatego zwraca0
dowolną niepustą listę i1
pustą listę. Jako taki można to po prostu usunąć z wynikuFẠ
użycia_
.źródło
FẠạṆ
prawda, prawda?05AB1E ,
98 bajtów-1 bajty dzięki Emignie
Wyjaśnienie:
Wypróbuj online!
źródło
[[]]
.Mathematica, 17 bajtów
FreeQ
robi0
dla nas sprawdzenie , ale oczywiście wróciłobyTrue
po dane wejściowe{}
, więc musimy sprawdzić tę sprawę osobno.źródło
APL (Dyalog),
21127 bajtówGrał w golfa 5 bajtów dzięki Adámowi za pomocą widelców
Wypróbuj online!
To moja pierwsza próba w Dyalog. Wskazówki dotyczące gry w golfa są mile widziane!
Wyjaśnienie
źródło
⍬∘≡
jest testem po lewej stronie (pusty zestaw ograniczony do identycznego z) i0∊∊
jest testem prawym (sam rozwidlenie; zerowy element zapisanej formy). Umieścić go razem:⍬∘≡⍱0∊∊
. Wypróbuj online!Operacyjny język skryptowy Flashpoint ,
199188 bajtówZadzwoń z:
lub z:
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ęcA={...}
przypisuje ciąg do zmiennejA
, 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”
A
definiujemy inną funkcjęf
.private
deklaruje dwie zmienne_i
i_r
lokalne do działaniaf
. 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._this
to argument przekazany zcall
funkcją._this
może być dowolnego typu, ale tutaj zakładamy, że jest to tablica.W pętli
o=_this select _i
uzyskuje dostęp do elementu _i: th tablicy i przypisuje go do zmiennejo
.if (o in [o])
jest sztuczką, aby ustalić, czyo
jest to kolejna tablica, czy nie. Jeślio
jest liczbą (lub czymkolwiek innym niż tablica),o in [o]
zostanie obliczona natrue
, ponieważin
funkcja znajdzie wartość pasującąo
z tablicy[o]
. Jeślio
jest tablicą, wyrażenie daje wynikfalse
, ponieważin
odmawia porównania tablic.Jeśli
o
nie 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ślio
jest tablicą, przypisujemy do_r
wartości zwracanej wywołanie rekurencyjnef
z 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śnief
zwraca to wywołanie funkcji .Teraz, gdy zdefiniowaliśmy
f
(f
nie musimy być w środkuA
, ale w ten sposób moglibyśmy zadeklarować ją jako lokalną zmienną / funkcję (tak naprawdę nie ma różnicy),A
jeśli nie chcemy zapisywać niektórych bajtów), wróćmyA
.if (count _this == 0)
sprawdza, czyA
tablica wejściowa jest pusta, a jeśli tak,A
zwraca 0. W przeciwnym razie funkcjaf
jest wywoływana, a jej zwracana wartość będzieA
wartoś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).
źródło
Perl 5 , 15 bajtów
Zaoszczędzono 2 bajty, stosując tę samą technikę, co Rubinowa odpowiedź Doorknob .
14 bajtów kodu +
-p
flagaWypró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. (\b
gwarantuje, że0
nie jest to część innej liczby, ale liczba całkowita).źródło
Haskell , 48 bajtów
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
0
są wykrywane jako następujące po,
lub[
, w przeciwieństwie do liczb takich jak20
. Wyrażeniescanr(:)[]x
generuje wszystko, co wystarczal
, ic:'0':_<-
chwyta tych, których drugą postacią jest'0'
. Następnieelem 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
0
i1
nie są Truthy / Falsey w Haskell.źródło
Galaretka , 4 bajty
Wypróbuj online!
Jak to działa
Zauważ, że atom Ạ zachowuje się jak Python,
all
a zatem różni się raczej od zbanowanego Ȧ.źródło
L;FẠ
. Kto może znaleźć inny?JavaScript (ES6), 34 bajty
Przypadki testowe
Pokaż fragment kodu
źródło
!!a[0]
zamiasta.length
. (Nie musisz się martwić,a[0]
że będziesz zerowy, ponieważ i tak wynik musi być fałszywy.)Julia, 45 bajtów
Tworzy to funkcję,
g
która wskazuje, czy Ȧ będzie wynosić 1 czy 0, wywołując funkcję rekurencyjnąa
. Aby zrobić odpowiednia
, używamy wielu wysyłek:Funkcja
all
przyjmuje argument funkcji, więc wywołujemya
każdy element danych wejściowych. Następnie po prostu definiujemy funkcję przesyłania jakoZasadniczo potrzebujemy
a
ale z czekiem, aby poprawnie obsługiwać[]
.Wypróbuj online!
źródło
a(x)
lubg(x)
co!x
w zamian?Brud ,
161411 bajtówDzięki Zgarbowi za oszczędność 5 bajtów.
Wypróbuj online!
e
Mówi Grime spróbować dopasować całe wejście i wydrukować0
lub1
w zależności od tego, czy jest to możliwe.Jest
|!
to efektywnie operator „żaden”, ponieważx|!y
jest 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 dopasowanieP
. Jednak w naszym przypadkuP
składa się zarównos
i\0
tak, ż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ą^
iv
. 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.źródło
Pip , 12 bajtów
Pobiera tablicę jako argument wiersza polecenia w formie repr Pipa, np
[1;[2;3]]
. Zwraca1
za prawdę,0
za falsey. Wypróbuj online lub sprawdź wszystkie przypadki testowe .Wyjaśnienie
Dodatkowa odpowiedź, 12 bajtów
Oto funkcja, która zamiast tego pobiera listę:
TIO
źródło
Röda ,
5944 bajtówWypróbuj online!
f
pobiera dane wejściowe ze swojego strumienia jako listę, która może zawierać inne listy i liczby całkowite. Zwraca,1
jeślia
jest prawdą i nic innego. Funkcja pomocniczag
sprawdza, czya
zawiera zera.Wyjaśnienie:
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. :(
źródło
Cud , 15 bajtów
Stosowanie:
Spłaszcz wejście, uzyskaj wszystkie wystąpienia 0, logiczne NIE, logiczne ORAZ z wejściem.
źródło
Haskell , 62 bajty
Wypróbuj online!
To jest funkcja
String -> Bool
. Listy Haskella są heterogeniczne, więc nie ma wbudowanego sposobu reprezentowania takich list[0, [0]]
.źródło
,
``.Python 2 ,
45 3938 bajtówWypróbuj online!
-6 dzięki @BenFrankel
poprzednia wersja, bez konwersji listy na ciąg repr, 68 bajtów:
źródło
[]
. The following saves 6 bytes and succeeds on[]
:lambda a:bool(a)^(' 0'in`a`or'[0'in`a`)
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 applyall
(which is allowed, as it does not completely solve this task by itself.)źródło
egrep, 7+3=10 bytes
+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:
Finds
0
s anywhere (using the word boundary checks\<
and\>
to discount things like10
ora1
), or a whole string matching[]
, then inverts the match.Breakdown:
źródło
\<0\|^.]
plus-v
would count as an 11 byte solution.egrep
rather thangrep
to save an additional byte; language name doesn't count towards byte-count!)Javascript ES6, 24 chars
Works with array, returns
1
or0
:Test:
źródło
!!
(though then you must change&
to&&
). Saves one byte.&
. In case of&&
without!!
consistent output will be broken:undefined
for[]
,0
for[0]
and[0,1,2]
andfalse
for others.&&
is that you would need to if you take my first suggestion, since2 & 1 == 0
.√ å ı ¥ ® Ï Ø ¿ ,
124 bytesExplanation
If result needs to be outputted ...
Previous solution
I had posted this before realising that stack based languages could leave the value on the stack as a form of output
Explanation
źródło
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.
To actually be able to write out such lists as literals with
[1, [2]]
syntax, you also need some typeclass fu. Full test case:Try it online!
źródło
Vim, 23 bytes
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).źródło
Stacked, 20 bytes
Try it online!
Alternatively, using a string:
Try it online!
źródło
Lithp, 74 bytes
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.źródło
Ruby,
2422 bytesTry 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.
źródło
tinylisp,
7064 bytesThe last line is an unnamed lambda function that takes a list and returns
1
for "truthy-under-Ȧ" and0
for falsey. Try it online!Ungolfed
The recursive helper function
_Ȧ
does most of the work. If its argument is a list, wemap
_Ȧ
to its elements and return1
if they areall
truthy,0
if any are falsey. (Conveniently,all
returns1
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 returns0
.The golfed version takes advantage of some undefined behavior: rather than using
(e(type X)List)
to test whetherX
is an integer or a list, it does(c()X)
, which attempts tocons
(prepend) the empty list ontoX
. IfX
is a list, this results in a nonempty list, which is truthy. IfX
is an integer, tinylisp outputs an error message and returns an empty list, which is falsey. Since stderr is ignored, this approach is valid.źródło
PHP,
6354 bytes9 bytes saved by @user63956
takes an array as input; returns
true
orfalse
: If$a
is not empty,check if
print_r
output contains a0
value.array solution, 83 bytes
recursive function returns
1
or0
.breakdown
źródło
strpos(print_r($a,1)," 0")
instead ofpreg_match(...)
.print_r
parameter. Great!