Un conjunto de n
números positivos tiene 2^n
subconjuntos. Llamaremos a un conjunto "agradable" si ninguno de esos subconjuntos tiene la misma suma. {2, 4, 5, 8}
Es uno de esos conjuntos bonitos. Como ninguno de los subconjuntos tiene la misma suma, podemos ordenar los subconjuntos por suma:
[{}, {2}, {4}, {5}, {2, 4}, {2, 5}, {8}, {4, 5}, {2, 8}, {2, 4, 5}, {4, 8}, {5, 8}, {2, 4, 8}, {2, 5, 8}, {4, 5, 8}, {2, 4, 5, 8}]
Si etiquetamos los números [2, 4, 5, 8]
con los símbolos [a, b, c, d]
en orden creciente, obtenemos el siguiente orden abstracto:
[{}, {a}, {b}, {c}, {a, b}, {a, c}, {d}, {b, c}, {a, d}, {a, b, c}, {b, d}, {c, d}, {a, b, d}, {a, c, d}, {b, c, d}, {a, b, c, d}]
Otro buen conjunto de números positivos puede tener el mismo orden abstracto o uno diferente. Por ejemplo, [3, 4, 8, 10]
es un buen conjunto con un orden abstracto diferente:
[{}, {a}, {b}, {a, b}, {c}, {d}, {a, c}, {b, c}, {a, d}, {b, d}, {a, b, c}, {a, b, d}, {c, d}, {a, c, d}, {b, c, d}, {a, b, c, d}]
En este desafío, debe contar el número de ordenamientos abstractos distintos de conjuntos agradables de n
números positivos. Esta secuencia es OEIS A009997 , y los valores conocidos, comenzando en n=1
, son:
1, 1, 2, 14, 516, 124187, 214580603
Por ejemplo, para n=3
, los siguientes son los dos posibles ordenamientos abstractos:
[{}, {a}, {b}, {c}, {a, b}, {a, c}, {b, c}, {a, b, c}]
[{}, {a}, {b}, {a, b}, {c}, {a, c}, {b, c}, {a, b, c}]
Para n=4
, los siguientes son los 14 posibles ordenamientos abstractos, más un buen conjunto de ejemplos con ese ordenamiento:
[{}, {a}, {b}, {a, b}, {c}, {a, c}, {b, c}, {a, b, c}, {d}, {a, d}, {b, d}, {a, b, d}, {c, d}, {a, c, d}, {b, c, d}, {a, b, c, d}], [8, 4, 2, 1]
[{}, {a}, {b}, {a, b}, {c}, {a, c}, {b, c}, {d}, {a, b, c}, {a, d}, {b, d}, {a, b, d}, {c, d}, {a, c, d}, {b, c, d}, {a, b, c, d}], [10, 6, 3, 2]
[{}, {a}, {b}, {a, b}, {c}, {a, c}, {d}, {b, c}, {a, d}, {a, b, c}, {b, d}, {a, b, d}, {c, d}, {a, c, d}, {b, c, d}, {a, b, c, d}], [10, 7, 4, 2]
[{}, {a}, {b}, {a, b}, {c}, {a, c}, {d}, {a, d}, {b, c}, {a, b, c}, {b, d}, {a, b, d}, {c, d}, {a, c, d}, {b, c, d}, {a, b, c, d}], [8, 6, 4, 1]
[{}, {a}, {b}, {a, b}, {c}, {d}, {a, c}, {b, c}, {a, d}, {b, d}, {a, b, c}, {a, b, d}, {c, d}, {a, c, d}, {b, c, d}, {a, b, c, d}], [10, 8, 4, 3]
[{}, {a}, {b}, {a, b}, {c}, {d}, {a, c}, {a, d}, {b, c}, {b, d}, {a, b, c}, {a, b, d}, {c, d}, {a, c, d}, {b, c, d}, {a, b, c, d}], [8, 7, 4, 2]
[{}, {a}, {b}, {c}, {a, b}, {a, c}, {b, c}, {a, b, c}, {d}, {a, d}, {b, d}, {c, d}, {a, b, d}, {a, c, d}, {b, c, d}, {a, b, c, d}], [10, 4, 3, 2]
[{}, {a}, {b}, {c}, {a, b}, {a, c}, {b, c}, {d}, {a, b, c}, {a, d}, {b, d}, {c, d}, {a, b, d}, {a, c, d}, {b, c, d}, {a, b, c, d}], [8, 4, 3, 2]
[{}, {a}, {b}, {c}, {a, b}, {a, c}, {d}, {b, c}, {a, d}, {a, b, c}, {b, d}, {c, d}, {a, b, d}, {a, c, d}, {b, c, d}, {a, b, c, d}], [8, 5, 4, 2]
[{}, {a}, {b}, {c}, {a, b}, {a, c}, {d}, {a, d}, {b, c}, {a, b, c}, {b, d}, {c, d}, {a, b, d}, {a, c, d}, {b, c, d}, {a, b, c, d}], [10, 7, 6, 2]
[{}, {a}, {b}, {c}, {a, b}, {d}, {a, c}, {b, c}, {a, d}, {b, d}, {a, b, c}, {c, d}, {a, b, d}, {a, c, d}, {b, c, d}, {a, b, c, d}], [8, 6, 4, 3]
[{}, {a}, {b}, {c}, {a, b}, {d}, {a, c}, {a, d}, {b, c}, {b, d}, {a, b, c}, {c, d}, {a, b, d}, {a, c, d}, {b, c, d}, {a, b, c, d}], [10, 8, 6, 3]
[{}, {a}, {b}, {c}, {d}, {a, b}, {a, c}, {b, c}, {a, d}, {b, d}, {c, d}, {a, b, c}, {a, b, d}, {a, c, d}, {b, c, d}, {a, b, c, d}], [8, 6, 5, 4]
[{}, {a}, {b}, {c}, {d}, {a, b}, {a, c}, {a, d}, {b, c}, {b, d}, {c, d}, {a, b, c}, {a, b, d}, {a, c, d}, {b, c, d}, {a, b, c, d}], [7, 6, 5, 3]
Lo siguiente no es un orden abstracto válido:
{}, {a}, {b}, {c}, {d}, {a,b}, {e}, {a,c}, {b,c}, {a,d}, {a,e}, {b,d}, {b,e}, {c,d}, {a,b,c}, {a,b,d}, {c,e}, {d,e}, {a,b,e}, {a,c,d}, {a,c,e}, {b,c,d}, {b,c,e}, {a,d,e}, {b,d,e}, {a,b,c,d}, {c,d,e}, {a,b,c,e}, {a,b,d,e}, {a,c,d,e}, {b,c,d,e}, {a,b,c,d,e}
Este orden implica que:
d < a + b
b + c < a + d
a + e < b + d
a + b + d < c + e
Sumar estas desigualdades da:
2a + 2b + c + 2d + e < 2a + 2b + c + 2d + e
Lo cual es una contradicción. Su código no debe contar este pedido. Tales contraejemplos aparecen por primera vez en n=5
. Ejemplo de este documento , ejemplo 2.5 en la página 3.
Este pedido no es válido a pesar del hecho de que A < B
implica que A U C < B U C
, para cualquier C
disyunción de A
y B
.
Su código o programa debe ser lo suficientemente rápido como para poder ejecutarlo n=4
antes de enviarlo.
Las presentaciones pueden ser programas, funciones, etc., como de costumbre.
Las lagunas estándar están prohibidas, como siempre. Este es el código de golf, por lo que la respuesta más corta en bytes gana. Siéntase libre de hacer preguntas aclaratorias en los comentarios.
fuente
Respuestas:
Python 3 + SciPy,
396390385351336355 bytesPruébalo en línea!
Esto ahora funciona para n = 5 en aproximadamente 5 segundos. Se
if~-(v in u):
puede eliminar por −18 bytes pero una gran penalización de rendimiento.Si desea imprimir todos los ordenamientos abstractos tal como se encuentran en lugar de contarlos, agregue
if c:print(s.x.round(),y)
antes delfor
ciclo. (Los subconjuntos están representados por enteros binarios donde cada bit corresponde a la presencia o ausencia de un elemento: { a , c , d } ↔ 1101₂ = 13.)Cómo funciona
f
recursivamente cuenta los ordenamientos abstractos que satisfacen una lista dada de restricciones. Comenzamos con las restricciones n ≤ a , a + n ≤ b , b + n ≤ c , c + n ≤ d . Mediante la programación lineal, encontramos una solución a las restricciones (o devolvemos 0 si no hay una); en este caso obtenemos a = 4, b = 8, c = 12, d = 16. Redondeamos la solución a enteros , luego calcule un orden de referencia ordenando todos sus subconjuntos por su suma:{ a }, { b }, { c }, { a , b }, { d }, { a , c }, { a , d }, { b , c }, { b , d }, { a , b , c }, { c , d }, { a , b , d }, { a , c , d }, { b , c , d }, {a , b , c , d }
El redondeo no puede causar que ninguna restricción sea violada por más de n / 2, razón por la cual agregamos un margen de n .
Dado que Python
sorted
es estable, cualquier vínculo entre los subconjuntos se rompe en el mismo orden inverso-lexicográfico en el que los generamos. Entonces podríamos imaginar reemplazar { a , b , c , d } con { a · 2 ^ n + 2 ^ 0, b · 2 ^ n + 2 ^ 1, c · 2 ^ n + 2 ^ 2, d · 2 ^ n + 2 ^ 3} para obtener el mismo orden sin ningún vínculo.El plan es clasificar todos los demás ordenamientos abstractos por análisis de casos basados en donde primero no están de acuerdo con el ordenamiento de referencia:
Ya sea { a }> { b },
o { a } <{ b }> { c },
o { a } <{ b } <{ c }> { a , b }
o { a } <{ b } < { c } <{ a , b }> { d },
⋮
Dentro de cada caso, agregamos estas nuevas restricciones con un margen de n , y recurrimos recursivamente
f
con las nuevas restricciones agregadas.Notas
Durante un tiempo supuse (pero no supuse) que las soluciones de programa lineal con margen 1 en las restricciones siempre serán enteros. Esto resulta ser falso: un contraejemplo con n = 7 es {2.5, 30, 62.5, 73.5, 82, 87.5, 99.5}.
Python, 606 bytes (más rápido, sin bibliotecas externas)
Pruébalo en línea!
Esto funciona para n = 5 en un cuarto de segundo, yn = 6 en 230 segundos (75 segundos en PyPy).
Incluye un solucionador de programación lineal codificado a mano que usa matemática entera en coordenadas homogéneas para evitar problemas de redondeo de punto flotante.
fuente
options={'tol':.1}
, lo que parece solucionar el problema.Ruby, 308 bytes, mucho más rápido.
Ejecuta el caso 4 en ~ 150 ms. No se utiliza una biblioteca especializada.
Recurre recíprocamente el resultado de un caso menor, por ejemplo
con los subconjuntos correspondientes con un elemento adicional agregado: deben mantener el mismo orden relativo. También asegura que el nuevo singleton se agregue después de todos los singleton anteriores.
La parte que verifica el cumplimiento es la misma que antes, pero no las combinaciones para probar son mucho menos.
Versión ampliada y comentada:
Ruby, 151 bytes, bastante lento
(el caso de tres elementos toma << 1s, el caso de cuatro todavía se está ejecutando)
Funciona en la representación de campo de bits de los subconjuntos, por lo que es posible que tenga que dar masajes a la salida si es necesario para mostrar los subconjuntos.
formateado:
fuente
...x-1
=>..x-2
,.select{...}.count
=>.count{...}
,|(x,y)|
=>|x,y|
,x&~y==0||y&~x!=0
=>x&~y<1||y&~x>0
yaa&~b
que no puede ser negativo si no me equivocon=5
contraejemplo que acabo de agregar. Si no me equivoco, su código lo aceptaría.P
, por lo que no puede ser anónima. Además, creo que todavía falla debido al contraejemplo que publiqué.P=
). Además, creo que debe devolver un número, por lo que es posible que tenga que incorporarlo.size
en algún lugar.