Fondo
Los Estados Unidos tienen un amor único por la gerrymandering, la manipulación deliberada de un distrito electoral para predecir ciertos resultados de votación. Recientemente se presentó un caso de gerrymandering ante la Corte Suprema. Gerrymandering, especialmente cuando está relacionado con la raza, se considera ilegal y da como resultado el requisito de volver a dibujar las líneas del distrito.
Dado un mapa rectangular de un municipio (matriz 2d), dibujará líneas de distrito para ayudar a su grupo a obtener la mayor representación. Es decir, usted gerrymander. Cada municipio tiene dos partidos, 0
y 1
. El mapa estará compuesto por cuadrados con uno 0
o 1
sobre ellos. Aquí hay un mapa de ejemplo:
Reto
Agrupará el mapa en distritos para que la 1
parte obtenga al menos el número de distritos especificados por la Entrada.
Entrada
La entrada consistirá en un mapa, el número de distritos que se dibujarán y el número mínimo de distritos que el 1
partido necesita ganar (el puntaje mínimo).
Salida
El resultado será un mapa de los distritos. Cada distrito estará compuesto únicamente por una letra mayúscula del alfabeto. Sí, esto significa que no habrá más de 26 distritos.
Si no hay salida posible donde la parte ingresada gana suficientes distritos, tampoco:
- Imprimir "Intentamos ..."
- Error fatal porque el partido resultó irreparablemente dañado por los resultados electorales
- O ambos
Reglas (también muy importantes)
- Todos los distritos deben ser contiguos.
- Los distritos pueden no tener otros distritos en ellos
- Cada distrito debe tener al menos cuatro nodos. La entrada será coherente con las reglas, lo que significa que habrá al menos
number_of_districts * 4
nodos en el mapa - El puntaje de cada partido es el número de distritos en los que tiene mayoría
- Si un distrito tiene el mismo número de
0
s y1
S, entonces ni los beneficios del partido de ella - Reglas normales de no hacer trampa
- Este es el código de golf , por lo que gana el código más corto en bytes.
Casos de prueba
1. Input 1. Output 2. Input 2. Output 3. Input 3. Output
districts: 5 Image and map districts: 3 Image below districts: 3 fatal error
min wins: 3 min wins: 3 min wins: 3
map: map: map:
00000110000 AAAAAAAAAAA 101101 101101
10000010000 AAAAAAAAAAA 100000 100000
10010000011 AAAAAAAAAAA 011011 011011
11001110000 BBBBBBBAAAA 111111 100111
00111111000 BBBBBBBAAAA
01111111000 CCCCCDDDAAA
01111111001 CCCCCDDDAAA
01000111100 EEEEEDDDDDD
00000001000 EEEEEDDDDDD
Por supuesto, su programa debería funcionar para cualquier caso de prueba válido, no solo para estos.
fuente
Respuestas:
R ,
938896858952 bytesPruébalo en línea!
Una solución masiva
> 900> 800(¡no!)> 900 bytes. El código funciona de la siguiente manera. Sea N el número de distritos electorales y M el número mínimo de distritos donde 1 desea tener una mayoría.Primero, el código asigna aleatoriamente N distritos a diferentes grupos. Luego, los expande al azar, es decir, agrega un distrito a un grupo seleccionado al azar, asegurando que el distrito esté al lado de un distrito que ya pertenece a ese grupo. En el proceso de expansión, da prioridad a un distrito con una mayoría de 1, si el grupo de distrito aún no es una mayoría de 1; si el grupo ya es una cierta mayoría de 1, entonces da prioridad a un distrito 0. Continúa hasta que todos los distritos hayan sido asignados.
Cada grupo donde hay una mayoría para la 1 parte se almacena y sus distritos están cerrados. Si hay al menos M grupos con una mayoría de 1, entonces todo está bien y
podemos imprimir el resultado, podemos verificar si hay al menos 4 distritos en cada grupo. Si se cumple el límite de 4 distritos, entonces podemos imprimir felizmente el resultado. De lo contrario, el código intenta reasignar los distritos que no están bloqueados a tantos grupos como estén disponibles, es decir, N - # grupos almacenados.Los códigos lo intentan varias veces (9 veces). Si falla, restablece todo y comienza de nuevo. Lo hace por otras 9 veces antes de darse por vencido e imprimir "intentamos ...".
Si el código no tiene éxito al principio, intente nuevamente varias veces. Ajusté la cantidad de repeticiones para que pueda ejecutarse en TIO en menos de un minuto. Sin embargo, si hay una solución, este código puede (eventualmente) encontrarla. La parte de aleatoriedad del algoritmo da una probabilidad distinta de cero de que, si hay una solución, pueda encontrarla. El número limitado de ensayos es el único factor limitante para el éxito.
EDITAR: se agregó el control de que ningún grupo de distrito puede estar completamente rodeado por otro solo, a menos que el grupo de distrito tenga distritos en el borde del cuadrado dado. Creo que me lo perdí al principio.
fuente
==0
con<1
cuando la variable era estrictamente entera y positiva.if...else
las declaraciones, el intercambioc
deas.vector
, cambiando"\n"
con las nuevas líneas literales, y con el hecho de que>
serán automáticamente números de coacción contra a los personajes en silencio y comparar sus puntos de código. Probablemente hay otros campos de golf que hice que no puedo recordar, pero este es un comienzo. Creo que hay algunas cosas más que podemos ajustar, pero no estoy 100% seguro de entender el código ...