Em teoria dos conjuntos, os números naturais geralmente são codificados como conjuntos puros , ou seja, conjuntos que contêm apenas o conjunto vazio ou outros conjuntos que são puros. No entanto, nem todos os conjuntos puros representam números naturais. Esse desafio é decidir se um determinado conjunto puro representa uma codificação do número natural ou não.
A codificação de números naturais funciona da seguinte maneira 1 :
- Zero é o conjunto vazio:
- Para um número :
Assim, as codificações dos primeiros números naturais são
A tarefa
- Dada uma sequência que representa um conjunto puro, determine se esse conjunto codifica um número natural de acordo com a construção acima.
- Observe, no entanto, que os elementos de um conjunto não são ordenados; portanto, não é a única representação válida de como, por exemplo, representa o mesmo conjunto.
- Você pode usar
[]
,()
ou em<>
vez de{}
. - Você pode assumir que os conjuntos são fornecidos sem o
,
separador as. - Você pode assumir que não haverá elementos duplicados na entrada, por exemplo,
{{},{}}
não é uma entrada válida e que a entrada está bem formada, por exemplo{{},
, não{,{}}
ou similar.
Casos de teste
Verdade:
{}
{{}}
{{},{{}}}
{{{}},{}}
{{},{{}},{{},{{}}}}
{{{},{{}}},{},{{}}}
{{{{}},{}},{{}},{}}
{{},{{}},{{},{{}}},{{},{{}},{{},{{}}}}}
{{{{{}},{}},{{}},{}},{{}},{},{{},{{}}}}
{{},{{}},{{},{{}},{{},{{}}},{{},{{}},{{},{{}}}}},{{{}},{}},{{},{{}},{{},{{}}}}}
{{{{{{{{}},{}},{{}},{}},{{{}},{}},{{}},{}},{{{{}},{}},{{}},{}},{{{}},{}},{{}},{}},{{{{{}},{}},{{}},{}},{{{}},{}},{{}},{}},{{{{}},{}},{{}},{}},{{{}},{}},{{}},{}},{{{{{{}},{}},{{}},{}},{{{}},{}},{{}},{}},{{{{}},{}},{{}},{}},{{{}},{}},{{}},{}},{{{{{}},{}},{{}},{}},{{{}},{}},{{}},{}},{{{{}},{}},{{}},{}},{{{}},{}},{{}},{}}
Falso:
{{{}}}
{{{{}}}}
{{{{}},{}}}
{{},{{}},{{{}}}}
{{{},{{}}},{{}}}
{{{{{}}},{}},{{}},{}}
{{},{{}},{{},{{}}},{{},{{}},{{{}}}}}
{{{{{}},{}},{{{}}},{}},{{}},{},{{},{{}}}}
{{{{{{{{}},{}},{{}},{}},{{{}},{}},{{}},{}},{{{{}},{}},{{}},{}},{{{}},{}},{{}},{}},{{{{{}},{}},{{}},{}},{{{}},{}},{{}},{}},{{{{}},{}},{{}},{}},{{{}},{}},{{}},{}},{{{{{{}},{}},{{}},{}},{{{}},{}},{{}},{}},{{{{}},{}},{{}},{}},{{{}},{}},{{}},{}},{{{{{}},{}},{{}},{}},{{{}},{}},{{}}},{{{{}},{}},{{}},{}},{{{}},{}},{{}},{}}
Relacionado: Construção natural (gera a codificação definida de um determinado número natural.)
1 Consulte https://en.wikipedia.org/wiki/Set-theoretic_definition_of_natural_numbers
code-golf
decision-problem
set-theory
Laikoni
fonte
fonte
Respostas:
JavaScript (Node.js) ,
534844 bytesExperimente online! Casos de teste roubados descaradamente da resposta de @ Arnauld. Explicação: Se um conjunto representa um número natural, então o número natural que representa deve ser igual ao tamanho do conjunto e (considerando que os elementos são garantidos distintos), os elementos devem ser as representações dos números naturais menores que ele, e estes devem, portanto, ter comprimentos mais curtos. Isso é trivialmente verdadeiro para o conjunto vazio, é claro. Editar: salvou 5 bytes graças a @Arnauld. Economizou 4 bytes graças a @Cowsquack.
fonte
!e[a.length-1]
deve salvar 3 bytesa[e.length]&&
por 5 bytes!g=(A,a=eval(A))=>a.every(e=>a[e.length]&&g(e))
funcionaria?Python 3 ,
695844 bytes11 bytes graças a Erik, o Outgolfer.
14 bytes graças ao Sr. Xcoder.
Experimente online!
fonte
Wolfram Language (Mathematica) ,
6059 bytesExperimente online!
O núcleo desta solução é a função
que converte uma lista do formulário
{0,1,2,...,n-1}
em qualquer ordem na saídan
(em particular, converte{}
em0
) e converte qualquer outra coisa no número realE
.Chame esta função
f
. Dada uma entrada como"{{{}},{}}"
, fazemos o seguinte:f
em todos os níveis, obtendof[{f[{f[{}]}], f[{}]}]
.f
itens produzirá um número natural para uma entrada que o representa. Por exemplo,f[{f[{f[{}]}], f[{}]}]
=f[{f[{0}], 0}]
=f[{1, 0}]
=2
. Qualquer outra coisa irá produzirE
.E
.fonte
Brachylog (v2), 9 bytes
Experimente online!
Como sempre, para um problema de decisão , este é um programa completo. Entrada da entrada padrão, usando colchetes. Saída para saída padrão como
true.
versusfalse.
.Explicação
Embora eu tenha dito acima que este é um programa completo, é realmente mais interessante que isso; é tanto um programa completo e uma função. Quando usado como um programa completo, ele imprime
true.
se o conjunto é um número natural oufalse.
se não é. Quando usado como uma função, "normaliza" um número natural (ou seja, normaliza todos os seus elementos e os classifica em ordem por valor; este programa usa listas internamente, não conjuntos), ou "gera uma exceção" (na verdade uma falha, pois é Prolog) se a entrada não for um número natural.O comportamento completo do programa é fácil de explicar: é puramente implícito no tratamento do Brachylog de programas completos que não contêm instruções de E / S. O comportamento em questão é "execute a função, obtendo sua entrada da entrada padrão e afirmando que sua saída corresponde à descrição fornecida pelo primeiro argumento da linha de comando; se a asserção falhar ou o programa lançar uma exceção, imprima
false.
, imprimatrue.
" . Nesse caso, o argumento da linha de comando está ausente (ou seja, "vale tudo"), portanto, o comportamento de exceção / não exceção da função fornece a saída.Quanto ao comportamento da função:
Um número natural é definido como contendo duas partes: os elementos do número natural abaixo, unidos ao próprio número. Assim, todos os seus elementos também são números naturais. Podemos reconhecer um número natural: a) verificando se todos os seus elementos são números naturais; b) verificando se o maior elemento do conjunto é idêntico ao conjunto sem seu maior elemento.
Quando estamos usando listas em vez de conjuntos (portanto, colchetes), precisamos colocá-los em uma ordem consistente para que as comparações de igualdade funcionem (nesse caso, classificadas por "valor"). A ordem de classificação padrão de Brachylog classificará um prefixo de uma lista antes da própria lista, o que significa convenientemente que classificará números naturais por valor numérico. Assim, podemos classificar recursivamente todos os nossos números para colocá-los em uma ordem consistente. De fato, através da função que definimos recursivamente, podemos alcançar os dois resultados ao mesmo tempo: classificando recursivamente os elementos do número e verificando se é um número natural.
A função tem assim quatro partes principais.
↰ᵐ
é a chamada recursiva, garantindo que cada elemento seja um número natural e convertendo cada elemento em um formato normalizado.o
o normaliza o número em si (seus elementos já estão normalizados, então tudo o que precisamos fazer é classificá-lo). Depois,.t~k|
garante que temos a estrutura que queremos, verificando se o maior elemento e outros elementos são os mesmos. Uma lista vazia (ou seja, 0) não possui um último elemento; portanto, ocorrerá uma falha de asserçãot
; o|Ė
manipula esse caso, fornecendo um fallback explícito no caso em que a lista de entrada está vazia.fonte
K (ngn / k) ,
262427 bytesExperimente online!
input é uma string json analisada por
`j@
(sintaxe específica para ngn / k){
}
é uma função recursiva com argumentox
. retorna o número natural representado pelo conjuntox
ou null (0N
) se não representar um.$[
;
;
]
é if-then-else. 0 é falsey, outros números inteiros são verdadeiros!#x
os números inteiros de 0 (inclusive) até o comprimento dex
(exclusivo)^
semo'x
recursion (o
) em cada ('
) elemento dex
#
comprimento^
é nulo?~
não@
age como um último verbo fictício, de modo que,~
e^
seja composto com, em{
}
vez de ser aplicado a elefonte
Gelatina , 10 bytes
Experimente online!
fonte
Japonês , 9 bytes
Solução JS do Port of Neil . Por favor, vote se você está votando isso.
Experimente ou execute todos os casos de teste
fonte
Vermelho , 81 bytes
Experimente online!
Semelhante à resposta Python 3 de Leaky Nun
fonte
Geléia , 8 bytes
Como a entrada deve ser uma sequência, esse envio é válido apenas como um programa completo.
Experimente online! ou verifique todos os casos de teste
Como funciona
Isso produz uma representação canônica da entrada, consistindo apenas em matrizes classificadas.
fonte
Geléia , 7 bytes
Esta é uma porta da resposta Python de Leaky Nun .
Como a entrada deve ser uma sequência, esse envio é válido apenas como um programa completo.
Experimente online! ou verifique todos os casos de teste
Como funciona
fonte
Wolfram Language (Mathematica) , 52 bytes
Experimente online!
fonte