En la teoría de conjuntos, los números naturales generalmente se codifican como conjuntos puros , es decir, conjuntos que solo contienen el conjunto vacío u otros conjuntos que son puros. Sin embargo, no todos los conjuntos puros representan números naturales. Este desafío consiste en decidir si un conjunto puro dado representa una codificación de número natural o no.
La codificación de números naturales funciona de la siguiente manera 1 :
- Cero es el conjunto vacío:
- Para un número :
Por lo tanto, las codificaciones de los primeros números naturales son
La tarea
- Dada una cadena que representa un conjunto puro, determine si este conjunto codifica un número natural de acuerdo con la construcción anterior.
- Sin embargo, tenga en cuenta que los elementos de un conjunto no están ordenados, por lo que no es la única representación válida de ya que, por ejemplo, representa el mismo conjunto.
- Puede usar
[]
,()
o en<>
lugar de{}
. - Puede suponer que los conjuntos se proporcionan sin el
,
separador as. - Puede suponer que no habrá elementos duplicados en la entrada, por ejemplo,
{{},{}}
no es una entrada válida, y que la entrada está bien formada, por ejemplo{{},
, no ,{,{}}
o similar.
Casos de prueba
Cierto:
{}
{{}}
{{},{{}}}
{{{}},{}}
{{},{{}},{{},{{}}}}
{{{},{{}}},{},{{}}}
{{{{}},{}},{{}},{}}
{{},{{}},{{},{{}}},{{},{{}},{{},{{}}}}}
{{{{{}},{}},{{}},{}},{{}},{},{{},{{}}}}
{{},{{}},{{},{{}},{{},{{}}},{{},{{}},{{},{{}}}}},{{{}},{}},{{},{{}},{{},{{}}}}}
{{{{{{{{}},{}},{{}},{}},{{{}},{}},{{}},{}},{{{{}},{}},{{}},{}},{{{}},{}},{{}},{}},{{{{{}},{}},{{}},{}},{{{}},{}},{{}},{}},{{{{}},{}},{{}},{}},{{{}},{}},{{}},{}},{{{{{{}},{}},{{}},{}},{{{}},{}},{{}},{}},{{{{}},{}},{{}},{}},{{{}},{}},{{}},{}},{{{{{}},{}},{{}},{}},{{{}},{}},{{}},{}},{{{{}},{}},{{}},{}},{{{}},{}},{{}},{}}
Falso:
{{{}}}
{{{{}}}}
{{{{}},{}}}
{{},{{}},{{{}}}}
{{{},{{}}},{{}}}
{{{{{}}},{}},{{}},{}}
{{},{{}},{{},{{}}},{{},{{}},{{{}}}}}
{{{{{}},{}},{{{}}},{}},{{}},{},{{},{{}}}}
{{{{{{{{}},{}},{{}},{}},{{{}},{}},{{}},{}},{{{{}},{}},{{}},{}},{{{}},{}},{{}},{}},{{{{{}},{}},{{}},{}},{{{}},{}},{{}},{}},{{{{}},{}},{{}},{}},{{{}},{}},{{}},{}},{{{{{{}},{}},{{}},{}},{{{}},{}},{{}},{}},{{{{}},{}},{{}},{}},{{{}},{}},{{}},{}},{{{{{}},{}},{{}},{}},{{{}},{}},{{}}},{{{{}},{}},{{}},{}},{{{}},{}},{{}},{}}
Relacionado: Construcción natural (genera la codificación de conjunto de un número natural dado).
1 Consulte https://en.wikipedia.org/wiki/Set-theoretic_definition_of_natural_numbers
code-golf
decision-problem
set-theory
Laikoni
fuente
fuente
Respuestas:
JavaScript (Node.js) ,
534844 bytesPruébalo en línea! Los casos de prueba fueron robados descaradamente de la respuesta de @ Arnauld. Explicación: Si un conjunto representa un número natural, entonces el número natural que representa debe ser igual al tamaño del conjunto y (dado que los elementos están garantizados distintos) los elementos deben ser las representaciones de los números naturales menores que él, y estos por lo tanto deben tener longitudes más cortas. Esto es trivialmente cierto del conjunto vacío, por supuesto. Editar: Guardado 5 bytes gracias a @Arnauld. Guardado 4 bytes gracias a @Cowsquack.
fuente
!e[a.length-1]
debería guardar 3 bytesa[e.length]&&
por 5 bytes!g=(A,a=eval(A))=>a.every(e=>a[e.length]&&g(e))
funcionaría?Python 3 ,
695844 bytes11 bytes gracias a Erik the Outgolfer.
14 bytes gracias al Sr. Xcoder.
Pruébalo en línea!
fuente
Wolfram Language (Mathematica) ,
6059 bytesPruébalo en línea!
El núcleo de esta solución es la función.
que convierte una lista de la forma
{0,1,2,...,n-1}
en cualquier orden en la salidan
(en particular, se convierte{}
a0
), y convierte cualquier otra cosa en el número realE
.Llama a esta función
f
. Dada una entrada como"{{{}},{}}"
, hacemos lo siguiente:f
en todos los niveles, obteniendof[{f[{f[{}]}], f[{}]}]
.f
's producirá un número natural para una entrada que lo represente. Por ejemplo,f[{f[{f[{}]}], f[{}]}]
=f[{f[{0}], 0}]
=f[{1, 0}]
=2
. Cualquier otra cosa produciráE
.E
.fuente
Brachylog (v2), 9 bytes
Pruébalo en línea!
Como de costumbre para un problema de decisión , este es un programa completo. Entrada desde entrada estándar, usando corchetes. Salida a salida estándar como
true.
versusfalse.
.Explicación
Aunque dije anteriormente que este es un programa completo, en realidad es más interesante que eso; Es a la vez un programa completo y una función. Cuando se usa como un programa completo, imprime
true.
si el conjunto es un número natural ofalse.
si no lo es. Cuando se usa como una función, "normaliza" un número natural (es decir, normaliza todos sus elementos y los ordena en orden por valor; este programa usa listas internamente, no conjuntos), o "arroja una excepción" (en realidad un error, ya que esto es Prolog) si la entrada no es un número natural.El comportamiento completo del programa es bastante fácil de explicar: está puramente implícito en el tratamiento de Brachylog de los programas completos que no contienen instrucciones de E / S. El comportamiento en cuestión es "ejecutar la función, tomando su entrada de la entrada estándar y afirmando que su salida coincide con la descripción dada por el primer argumento de la línea de comando; si la afirmación falla o el programa arroja una excepción, imprime
false.
, de lo contrario imprimetrue.
" . En este caso, falta el argumento de la línea de comandos (es decir, "todo vale"), por lo que el comportamiento de excepción / sin excepción de la función proporciona el resultado.En cuanto al comportamiento de la función:
Un número natural se define como el que contiene dos partes: los elementos del número natural a continuación, unidos con el número mismo. Por lo tanto, todos sus elementos también son números naturales. Podemos reconocer un número natural a) verificando que todos sus elementos son números naturales, b) verificando que el elemento más grande del conjunto es idéntico al conjunto sin su elemento más grande.
Cuando usamos listas en lugar de conjuntos (por lo tanto, corchetes), debemos ponerlos en un orden consistente para que funcionen las comparaciones de igualdad (en este caso, ordenadas por "valor"). El orden de clasificación predeterminado de Brachylog ordenará un prefijo de una lista antes de la lista misma, lo que convenientemente significa que ordenará los números naturales por valor numérico. Entonces podemos ordenar recursivamente todos nuestros números para ponerlos en un orden consistente. De hecho, a través de la función que estamos definiendo recursivamente, podemos lograr ambos resultados al mismo tiempo: ordenando recursivamente los elementos del número y verificando que sea un número natural.
La función tiene cuatro partes principales.
↰ᵐ
es la llamada recursiva, asegurando que cada elemento sea un número natural, y convirtiéndolo en una forma normalizada.o
normaliza el número en sí (sus elementos ya están normalizados, por lo que todo lo que tenemos que hacer es ordenarlo). Luego se.t~k|
asegura de que tenemos la estructura que queremos al verificar que el elemento más grande y otros elementos son iguales. Una lista vacía (es decir, 0) no tiene un último elemento, por lo que obtendrá un error de aserción cont
; El|Ė
maneja este caso, al dar un respaldo explícito en el caso donde la lista de entrada está vacía.fuente
K (ngn / k) ,
262427 bytesPruébalo en línea!
input es una cadena json analizada por
`j@
(sintaxis específica de ngn / k){
}
Es una función recursiva con argumentox
. devuelve el número natural representado por el conjuntox
, o nulo (0N
) si no representa uno.$[
;
;
]
es if-then-else. 0 es falsey, otros enteros son verdaderos!#x
los enteros desde 0 (inclusive) hasta la longitud dex
(exclusivo)^
sino'x
recursividad (o
) en cada ('
) elemento dex
#
longitud^
¿es nulo?~
no@
actúa como un maniquí última verbo de manera que~
y^
conseguir compuesta con{
}
lugar de ser aplicado a ellafuente
Jalea , 10 bytes
Pruébalo en línea!
fuente
Japt , 9 bytes
Solución JS del puerto de Neil . Vota eso si estás votando esto.
Pruébalo o ejecuta todos los casos de prueba
fuente
Rojo , 81 bytes
Pruébalo en línea!
Respuesta similar a Python 3 de Leaky Nun
fuente
Jalea , 8 bytes
Dado que la entrada debe ser una cadena, este envío solo es válido como un programa completo.
Pruébalo en línea! o verificar todos los casos de prueba
Cómo funciona
Esto produce una representación canónica de la entrada, que consta únicamente de matrices ordenadas.
fuente
Jalea , 7 bytes
Este es un puerto de la respuesta Python de Leaky Nun .
Dado que la entrada debe ser una cadena, este envío solo es válido como un programa completo.
Pruébalo en línea! o verificar todos los casos de prueba
Cómo funciona
fuente
Wolfram Language (Mathematica) , 52 bytes
Pruébalo en línea!
fuente