fundo
Inspirado pela interpretação muito conveniente de Octave (e, por extensão, MATL) de matrizes de verdade / falsidade, Jelly obteve o átomo Ȧ ( tudo em estilo oitava ).
Ȧ pega uma matriz como entrada e retorna 1 se a matriz não estiver vazia e não contiver o número 0 (número inteiro, flutuante ou complexo) em qualquer lugar da estrutura da árvore ; caso contrário, ele retornará 0 .
Por exemplo, a matriz [[]] é verdadeira porque não está vazia e não contém zeros, mas [[0]] é falsa porque contém 0 no nível mais interno.
Tarefa
Em uma linguagem de programação de sua escolha, escreva um programa completo ou uma função que use uma matriz de números inteiros possivelmente vazia e possivelmente irregular como entrada e imprima ou retorne um valor verdadeiro ou falso que indica se return retornaria 1 ou 0 , respectivamente.
Seu envio deve obedecer às seguintes regras.
Os valores truthy e falsy devem ser consistentes para todas as entradas , ou seja, todas as matrizes para as quais Ȧ retorna 1 devem ser mapeadas para o mesmo valor de verdade e todas as matrizes para as quais Ȧ retorna 0 devem ser mapeadas para o mesmo valor de falsy.
Como os programas completos só podem receber representações de string de matrizes como entrada, isso é permitido. No entanto, você deve usar a representação canocical do seu idioma, retornada por
repr
ou similar.Em particular, você não pode assumir que o primeiro elemento da matriz será precedido por um espaço.
Se (e somente se) sua linguagem não puder representar matrizes irregulares nativamente, você poderá fazer uma representação em string da entrada, usando a sintaxe canônica de qualquer linguagem de programação pré-existente.
Se o seu idioma tiver várias maneiras de representar matrizes irregulares (por exemplo, listas e tuplas), você precisará apenas oferecer suporte a uma delas.
Se seu idioma possui um envio interno válido para esse desafio, você não pode usá-lo em sua resposta . Todos os outros built-ins são permitidos.
Você é encorajado a postar respostas usando a manipulação de array e string, mesmo que uma seja significativamente menor que a outra.
Todas as regras padrão de código de golfe se aplicam.
Que ganhe o menor código em bytes!
Casos de teste de verdade
[1]
[10]
[[]]
[[[[1]]]]
[[], [1], [1, 2]]
[[1], [1, [2]], [1, [2, [3]]]]
[[8], [8, [9]], [8, [9, [10]]]]
Casos de teste de falsidade
[]
[0]
[0, -1]
[-1, 0]
[[[[0]]]]
[[0], [1, 2], [3, 4, 5]]
[[8], [8, [9]], [8, [9, [1, 0]]]]
[-1, 0, 0, 0]
Object
... meu favorito é Haskell, onde não é. Nem em C, pelo menos não de uma maneira que permita misturar matrizes e ints com segurança. Ambos os idiomas são perfeitamente capazes de matrizes irregulares, mas ainda não podem usá-los para esse problema.Respostas:
Gelatina, 3 bytes
F
nivela a lista de entrada.ṭ
adere à lista de entrada original como um elemento, que é falso se e somente se estiver vazio.Ạ
depois verifica se algum elemento da lista nivelada ou da própria lista original é falso.(Resposta original)
Agradecemos a Dennis por encorajar a encontrar uma solução que corresponda à dele.
FẠ
fornece 0 se a entrada contiver um valor falso em qualquer profundidade, senão 1. É o queȦ
ocorre, exceto as listas vazias.Ṇ
fornece 1 se a entrada for um valor falso, senão 0. A única lista de falsidade é a lista vazia.XOR-ing os dois dá a resposta.
Isso é muito parecido com o de Dennis
F;LẠ
, mas, em vez deL
colocar um zero na lista quando a lista está vazia, ele usaW
para colocar a lista vazia em si mesma (produzindo[[]]
), fazendo com que ela contenha um elemento falso.fonte
Retina , 10 bytes
Experimente online!
Primeiro, removemos a entrada se ela contiver um zero. Tentamos corresponder pelo menos três caracteres desde o início da string (para garantir que a entrada não tenha sido eliminada no estágio anterior ou apenas
[]
para começar).fonte
Ruby,
2524231816 bytesRequer o
-n
sinalizador na linha de comando (+1 byte,-e
->-ne
).Experimente online!
Este é um programa completo que recebe entradas no formato de matriz canônica do Ruby no STDIN e nas saídas
true
oufalse
no STDOUT.Versão da função de 23 bytes :
Este é um processo que leva um argumento, a matriz a ser testada.
Obrigado a Martin Ender por um byte e a Ventero por dois bytes!
fonte
p$_!~/\D0|^..$/
(oup ! ~/\D0|^..$/
, espaço em branco significativo) junto com o-n
sinalizador.Gelatina , 4 bytes
Experimente online!
Ȧ
produz0
se a entrada estiver vazia ou contiver a0
, caso contrário, será1
.FẠ
produz0
se a entrada achatada contiver a0
, deixando apenas a caixa de borda de uma matriz vazia (desde que a entrada seja garantida como uma matriz).Ṇ
é uma mônada lógica não-vetorizadora e, portanto, retorna0
para qualquer lista não-vazia e1
para a lista vazia. Como tal, isso pode simplesmente ser subtraído do resultado doFẠ
uso_
.fonte
FẠạṆ
, certo?05AB1E ,
98 bytes-1 bytes graças a Emigna
Explicação:
Experimente online!
fonte
[[]]
.Mathematica, 17 bytes
FreeQ
faz a verificação contra0
nós, mas é claro que retornariaTrue
para entrada{}
, por isso precisamos verificar esse caso separadamente.fonte
APL (Dyalog),
21127 bytesGolpeou 5 bytes graças a Adám usando garfos
Experimente online!
Esta é a minha primeira tentativa no Dyalog. Dicas de golfe são bem-vindas!
Explicação
fonte
⍬∘≡
é o teste da esquerda (conjunto vazio vinculado ao idêntico a) e0∊∊
é o teste da direita (em si uma bifurcação; zero membro na forma alistada). Colocá-lo juntos:⍬∘≡⍱0∊∊
. Experimente online!Linguagem de script da operação Flashpoint ,
199188 bytesLigue para:
ou com:
Explicação:
Na linguagem de script do jogo, qualquer string que contenha código pode ser chamada. Os chavetas
{}
indicam o começo e o fim de uma corda. (As aspas também funcionam, mas isso fica confuso quando são aninhadas.) Portanto,A={...}
atribui uma string à variávelA
e a variável pode ser chamada como uma função com:<argument> call A
. Basicamente, qualquer string pode ser tratada como um bloco de código.Então, dentro da "função"
A
, definimos outra funçãof
.private
declara as duas variáveis_i
e_r
local para funcionarf
. O nome de uma variável local deve começar com um sublinhado.while {} do {}
é um loop, em que a primeira string (indicada por{}
) contém o código para a condição do loop e a segunda para o corpo do loop._this
é o argumento que foi passado com acall
função_this
pode ser de qualquer tipo, mas aqui assumimos que é uma matriz.No loop,
o=_this select _i
acessa o elemento _i: th da matriz e o atribui à variávelo
.if (o in [o])
é um truque para determinar seo
é outra matriz ou não. Seo
for um número (ou qualquer coisa que não seja uma matriz),o in [o]
será avaliado comotrue
, porque ain
função encontra um valor correspondenteo
na matriz[o]
. Seo
for uma matriz, a expressão renderáfalse
, porquein
se recusa a comparar matrizes.Se
o
não é uma matriz, verificamos se é igual a zero e, se o fizer, definiremos a variável_r
, que usaremos como valor de retorno, como zero. Caso contrário, seo
for uma matriz, atribuímos_r
o valor de retorno da chamada recursiva af
com a nova matrizo
como argumento.Após o loop, no final da função
f
, avaliamos a expressão_r
, que gera o valor de_r
, e como esta é a última expressão a ser avaliada, é isso que a chamada à funçãof
retorna.Agora que definimos
f
(f
não precisa estar lá dentroA
, mas dessa forma poderíamos tê-la declarado uma variável / função local (sem nenhuma diferença),A
se não desejássemos salvar alguns bytes), vamos voltarA
.if (count _this == 0)
verifica seA
a matriz de entrada está vazia e, se estiver,A
retorna 0. Caso contrário, a funçãof
é chamada e seu valor de retorno seráA
o valor de retorno.Pode-se notar que parece que um ponto-e-vírgula estaria faltando em alguns lugares, mas esse não é o caso, porque um ponto-e-vírgula só é necessário após uma instrução se outra instrução a seguir dentro do mesmo bloco de código (ou seja, string).
fonte
Perl 5 , 15 bytes
Economizou 2 bytes usando a mesma técnica da resposta Ruby da maçaneta da porta .
14 bytes de código +
-p
sinalizadorExperimente online!
/.../
garante que a matriz não está vazia (isto irá corresponder a qualquer matriz mas[]
./\b0/
só irá corresponder se houver um0
na matriz. (os\b
assegura que o0
não é uma parte de um outro número, mas um número inteiro).fonte
Haskell , 48 bytes
Experimente online!
Obrigado a Lynn pelos casos de teste e pelo
x<"[]"
truque.A desigualdade externa precisa
(x<"[]")
ser Verdadeira (lista não vazia) eor[elem c"[,"|c:'0':_<-scanr(:)[]x]
Falsa (sem zeros).Os caracteres de
0
são detectados como seguindo um,
ou[
, em oposição a um número como20
. A expressãoscanr(:)[]x
gera todos os elementos suficientesl
ec:'0':_<-
captura aqueles cujo segundo caractere é'0'
. Em seguida,elem c"[,"
verifica se o primeiro caractere é,
ou[
.Suponho aqui que as listas no estilo Haskell não tenham espaços, mas, se sim,
','
podem ser substituídas por' '
.Aqui está um método mais direto de 48 bytes, apesar de produzir
0
's1
' e 's que não são Truthy / Falsey em Haskell.fonte
Gelatina , 4 bytes
Experimente online!
Como funciona
Observe que o átomo be se comporta como o do Python
all
e, portanto, é bastante diferente do ned proibido.fonte
L;FẠ
. Quem pode encontrar outro?JavaScript (ES6), 34 bytes
Casos de teste
Mostrar snippet de código
fonte
!!a[0]
vez dea.length
. (Você não tem que se preocupar ema[0]
ser zero como o resultado deve ser falsa, neste caso, de qualquer maneira.)Julia, 45 bytes
Isso cria uma função
g
que indica se be seria 1 ou 0 chamando uma função recursivaa
. Para fazer um adequadoa
, usamos vários despachos:A função
all
aceita um argumento de função, portanto, estamos chamandoa
cada elemento da entrada. Em seguida, simplesmente definimos a função para o envio comoBasicamente, só precisamos,
a
mas com uma verificação para lidar corretamente[]
.Experimente online!
fonte
a(x)
oug(x)
como!x
?Grime ,
161411 bytesObrigado ao Zgarb por salvar 5 bytes.
Experimente online!
O
e
Grime diz para tentar combinar com toda a entrada e imprimir0
ou1
dependendo se isso é possível.O
|!
é efetivamente um operador "nenhum", porquex|!y
é uma abreviação para(x|y)!
. Portanto, garantimos que a entrada não contenha um zero precedido por um símbolo nem uma sequência de apenas dois caracteres ([]
).Uma observação sobre a segunda metade:
P#
corresponde a um retângulo que contém pelo menos uma correspondência deP
. No entanto, no nosso caso,P
consiste em amboss
e,\0
portanto, isso normalmente exigiria parênteses:(s\0)#
(porque a precedência de#
é muito alta). Mas o Grime tem um recurso realmente interessante, onde você pode modificar a precedência dos operadores com^
ev
. Portanto, usando av#
menor#
precedência, é menor que a de qualquer outro operador (incluindo concatenação), o que nos permite salvar um byte entre parênteses.fonte
Pip , 12 bytes
Toma a matriz como um argumento de linha de comando na forma de repr do Pip, como
[1;[2;3]]
. Retorna1
para verdade,0
para falsey. Experimente online ou verifique todos os casos de teste .Explicação
Resposta bônus, 12 bytes
Aqui está uma função que recebe uma lista:
TIO
fonte
Röda ,
5944 bytesExperimente online!
f
recebe a entrada de seu fluxo como uma lista que pode conter outras listas e números inteiros. Retorna1
sea
é verdade e nada mais. A função auxiliarg
verifica sea
contém zeros.Explicação:
Uma solução que faça uso de expressões regulares muito provavelmente poderia ser mais curta.
Essa resposta poderia ter sido menor se fosse permitido retornar vários valores. Isso foi discutido em uma das minhas respostas antes e concluiu-se que nas regras padrão é permitido retornar valores diferentes de verdade e falsidade para entradas diferentes, mas, por algum motivo, o OP proíbe aqui e ali. :(
fonte
Maravilha , 15 bytes
Uso:
Achate a entrada, obtenha todas as ocorrências de 0, NOT lógica, AND lógica com a entrada.
fonte
Haskell , 62 bytes
Experimente online!
Esta é uma função
String -> Bool
. As listas de Haskell são heterogêneas, portanto não há como incorporar listas como essa[0, [0]]
.fonte
,
for ` `.Python 2,
45 3938 bytesTry it online!
-6 thanks to @BenFrankel
previous version, without converting list to string repr, 68 bytes:
fonte
[]
. 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.)fonte
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:
fonte
\<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:
fonte
!!
(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
fonte
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!
fonte
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).fonte
Stacked, 20 bytes
Try it online!
Alternatively, using a string:
Try it online!
fonte
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.fonte
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.
fonte
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.fonte
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
fonte
strpos(print_r($a,1)," 0")
instead ofpreg_match(...)
.print_r
parameter. Great!