Fondo
La etiqueta del baño, cuando se trata de los urinarios disponibles, establece que el próximo urinario que se debe llenar debe ser el que minimice la incomodidad total. La ecuación de incomodidad total viene dada por el siguiente conjunto de ecuaciones:
dist (x, y) = distancia lineal entre la persona xy la persona y en unidades urinarias malestar (x) = sum (1 / (dist (x, y) * dist (x, y))) para todas las personas y excluyendo a la persona x Total_Discomfort = sum (malestar (x)) para todos los x
Aquí puede encontrar un documento más detallado sobre un problema similar (no exactamente el mismo): (¡Gracias a @Lembik por alertarme sobre este increíble documento técnico!)
De entrada y salida
Dada la entrada de un urinario vacío y lleno, genera el conjunto resultante de urinarios con la adición de una persona. Si hay un empate para una posición, los urinarios deben llenarse de izquierda a derecha. La salida debe estar en el mismo formato que la entrada.
- Si se le da un caso con urinarios llenos, devuelva la entrada.
- La entrada siempre tendrá al menos un urinario definido.
Casos de prueba
ENTRADA -> SALIDA 1000001 -> 1001001 101010101 -> 111010101 100 -> 101 00000 -> 10000 1111111 -> 1111111 0100 -> 0101 101000 -> 101001
Reglas
Este es el código de golf , por lo que gana el código más corto en bytes. Los agujeros de bucle estándar están prohibidos.
0100
y101000
en los casos de prueba (algunos basados en expresiones regulares enfoque de trabajo en los casos de prueba actuales, pero no funcionará en aquellos que todavía debe ser manejado)Respuestas:
Jalea ,
1312 bytesPruébalo en línea! o Verificar todos los casos de prueba.
Explicación
fuente
MATL ,
191817 bytesPruébalo en línea! O verifique todos los casos de prueba (código ligeramente modificado).
Explicación
Es suficiente calcular la distancia desde cada nueva posición potencial a las ya ocupadas. Las distancias restantes no dependen de la nueva posición potencial, por lo que constituyen un término constante que puede ignorarse.
Tomemos la entrada
[1 0 0 0 0 0 1]
como un ejemplo.fuente
JavaScript (ES6), 89 bytes
Salidas modificando la matriz de entrada.
fuente
R,
837667 bytesMe acabo de dar cuenta de que puedo guardar varios bytes sin molestarme en verificar si los urinarios candidatos están vacíos. Los urinarios no vacíos siempre devolverán un
Inf
valor de incomodidad, por lo que se excluyen en el curso del cálculo. Además, solo usa la indexación directa en lugar de hacerloreplace
, por lo que es más corto pero menos elegante.Explicación
Leemos el estado actual de stdin y lo llamamos
x
. Suponemos que la entrada es una secuencia de1
s y0
s separados por espacios o saltos de línea. A los fines de la explicación, digamos que ingresamos1 0 0 0 0 0 1
.Reemplazamos un valor de
x
en un índice particular con 1. Todo lo que hay entre ellos[ ]
es averiguar cuál es el mejor índice.Como los urinarios existentes son inmutables, no necesitamos considerar las distancias entre ellos. Solo necesitamos considerar las distancias entre los urinarios ocupados y el posible nuevo. Entonces determinamos los índices de los urinarios ocupados. Usamos
which
, una función para devolver los índices de un vector lógico que sonTRUE
. Todos los números en R, cuando están obligados a escribirlogical
, sonTRUE
distintos de cero yFALSE
si son cero. Simplemente hacerlowhich(x)
dará como resultado un error de tipoargument to 'which' is not logical
, comox
es un vector numérico. Por lo tanto, tenemos que obligarlo a lógico.!
es la función de negación lógica de R, que coacciona automáticamente a lógica. Aplicando dos veces,!!x
produce un vector deTRUE
yFALSE
indicando qué urinarios están ocupados. (Coacciones alternativos byte equivalente a lógica implican los operadores lógicos&
y|
y las órdenes internasT
yF
, por ejemplo,F|x
oT&x
y así sucesivamente.!!x
Apariencia más exclamatoria por lo que vamos a utilizar.)Esto se combina con
seq(x)
, que devuelve la secuencia de enteros1
a la longitud dex
, es decir, todas las ubicaciones de urinarios (y, por lo tanto, todas las ubicaciones posibles a considerar).Ahora tenemos los índices de nuestros urinarios ocupados:
1 7
y nuestros urinarios vacíos1 2 3 4 5 6 7
. Pasamos`-`
, la función de resta, a laouter
función para obtener la "resta externa", que es la siguiente matriz de distancias entre todos los urinarios y los urinarios ocupados:Elevamos esto al
-2
poder th. (Para aquellos que están un poco perdidos, en el OP, "incomodidad" se define como1 / (distance(x, y) * distance(x, y))
, lo que se simplifica1/d(x,y)^2
, es decird(x,y)^-2
).Tome la suma de cada fila en la matriz.
Obtenga el índice del valor más pequeño, es decir, el urinario óptimo. En el caso de múltiples valores más pequeños, se devuelve el primero (es decir, el más a la izquierda).
Y voilà, tenemos el índice del urinario óptimo. Reemplazamos el valor en este índice
x
con1
. En el caso de1111
como entrada, no importa cuál reemplacemos, todavía tendremos una salida válida.Devuelve la entrada modificada.
fuente
PHP, 135 bytes
Estoy seguro de que hay una manera considerablemente más rápida de hacerlo, ¡pero tengo la cabeza confusa y no puedo pensar en una!
Código antiguo
El código sin minificación:
fuente
Python 3
223222165 BytesEstá bien, sé que esta no es la respuesta más bonita que existe, y estoy seguro de que se puede jugar un poco, pero estaba jugando y viendo lo que podía hacer.
Grite a mbomb007 por los consejos sobre espacios en blanco y comparadores Además, vi que mi contador de personajes en línea estaba tomando todas las pestañas y convirtiéndolas en espacios, por lo que el recuento es mucho menor de lo que originalmente tenía
Mostrando espacios en blanco revisados:
Original:
Esto espera que se le pase una cadena de 1 y 0 como
"10001"
y devuelve una cadena"10101"
Editar: cambiado
1/float((j-i)**2)
afloat((j-i)**-2)
fuente
!='1'
puede ser<'1'
y=='1'
puede ser>'0'
. Además, considere este consejoPython 3,
574471347 bytesProbablemente trabajaré en esto un poco más, considerando que la otra solución de Python es como una quinta parte de esta: [.
Bueno, eso es mucho mejor ahora que he aprendido que puedes usar espacios individuales.
fuente
Python,
165163158147141140139 bytesfuente
if"1"*len(p)==p:return p
para guardar un byte