Encontrar el punto muerto
Al programar una aplicación de subprocesos múltiples, se debe tener mucho cuidado para evitar interbloquear los diversos subprocesos al acceder a recursos compartidos. Un punto muerto se produce cuando un hilo intenta acceder a un recurso que está bloqueado en otro hilo al mismo tiempo que el otro hilo intenta acceder a un recurso bloqueado por el primero. Este es el caso simple, pero puede volverse más complejo con cadenas de recursos más largas.
El reto
Debe escribir un programa o función que pueda detectar una posible situación de punto muerto en una lista de los recursos a los que accede cada subproceso. Este es el código de golf, por lo que la respuesta más corta en bytes gana.
Cada subproceso se inicia al mismo tiempo, pero después de eso pueden ejecutarse en cualquier combinación de intercalado. Si hay 2 hilos con 4 acciones cada una, que podría ser ejecutado como (donde cada número es una acción tomada por el hilo con que id) 1,1,1,1,2,2,2,2
, 2,2,2,2,1,1,1,1
, 1,2,1,2,1,2,1,2
, 1,1,2,2,2,2,1,1
, o cualquier otra combinación posible.
Entrada
Recibirá, a través de STDIN, el parámetro de función o la alternativa más cercana, una lista de cadenas. Cada cadena estará en el formato +a
-b
. Cada una de estas cadenas representa el bloqueo ( +
) / desbloqueo ( -
) de un recurso por el hilo. Entre cada hilo habrá un ---
separador. Se garantiza que un hilo no intentará bloquear un recurso que ya ha bloqueado, y que todos los hilos desbloquearán explícitamente todos los recursos que han bloqueado antes de salir. El siguiente es un ejemplo para demostrar:
+a # Lock resource a
+b # Lock resource b
-a # Unlock resource a
-b # Unlock resource b
--- # Thread separator
+b # Lock resource b
-b # Unlock resource b
Salida
La salida será falsa si la entrada no contiene ninguna posibilidad de punto muerto, y verdadera si contiene una posible situación de punto muerto. Por ejemplo:
true
false
1
0
son todas las salidas válidas, pero se aceptará cualquier cosa claramente definida como verdadero / falso.
Ejemplos
+a
-a
---
+a
-a
Salida: false
+a
+b
-b
-a
---
+b
+a
-a
-b
Salida true
Punto muerto al intentar adquirir b,a
respectivamente hilos1,2
+a
+b
-a
-b
---
+a
+b
-b
-a
Salida false
+a
+b
-b
-a
---
+b
+c
-c
-b
---
+c
+a
-a
-c
Salida: true
Punto muerto en hilos 1,2,3 al intentar adquirir b,c,a
respectivamente.
Salida false
Salida true
Punto muerto en hilos 1,2,3 al intentar adquirir b,d,a
respectivamente.
Por supuesto, esto podría ser mucho más complejo, con más hilos, más recursos para cada uno, etc., pero creo que estas pruebas cubren los conceptos básicos.
Prima
Dado que es muy muy triste cuando encuentras situaciones de punto muerto cuando escribes un programa, hay un bono de -8 bytes para las respuestas que salen :(
y :)
como verdadero / falso respectivamente.
d
hasta más tarde.:)
que no debería ser falso ni:(
verdadero?Respuestas:
Python 2 - 227
Básicamente se asegura de que no haya bucles de 'precedencia'. Por ejemplo, en la segunda prueba, el primer subproceso tiene
a(b)
prioridad y el segundo subproceso tieneb(a)
prioridad.Estaba pensando en reescribir esto en Pyth, ya que creo que funcionaría bien con todas las operaciones de itertools, pero convertir la expresión regular tomará algo de trabajo, por lo que por ahora publicaré esto y tal vez intente convertirlo y publique otra respuesta más tarde.
fuente
Python -
586539524501485 bytes - 8 = 477Niveles de sangría:
-
fuente
;
para combinar líneas con sangría para guardar caracteres. Del mismo modo, haga sus afirmaciones una línea.for r in sys.stdin
lugar defor r in sys.stdin.readlines()
sys.stdin
osys.stdin.readlines()
, así que lo he cambiado, gracias de nuevo.print
y':)'