Escriba un programa que se ejecute indefinidamente y que informe cuántas instancias de sí mismo se están ejecutando actualmente. Cada instancia del programa también debe informar el orden en que se abrió de todas las demás instancias actualmente en ejecución.
Ejemplo
El usuario inicia el programa por primera vez; llamaremos a esta instancia 1. Se muestra la instancia 1 1/1
, porque es la primera instancia que se inicia de un total de 1 instancias actualmente en ejecución.
Mientras se ejecuta la Instancia 1, el usuario inicia el programa por segunda vez para convertirse en la Instancia 2. Ahora se muestra la Instancia 1 1/2
, siendo la primera instancia de un total de 2 instancias actualmente en ejecución. Se muestra la instancia 2 2/2
, porque es la segunda instancia de un total de 2 instancias actualmente en ejecución.
Digamos que el usuario continúa generando más instancias hasta que haya 5 de ellas. Con el fin de lanzamiento, sus salidas son: 1/5
2/5
3/5
4/5
5/5
.
Ahora, digamos que el usuario decide terminar la Instancia 3. La Instancia 4 se convierte en la nueva Instancia 3 y la Instancia 5 en la nueva Instancia 4, porque son respectivamente la tercera y cuarta instancias que se han lanzado de lo que ahora es un total de 4 instancias. Entonces, el cambio de salida de cada instancia sería el siguiente:
1/5
→1/4
2/5
→2/4
3/5
→ (Terminado)4/5
→3/4
5/5
→4/4
Reglas
- Puede generar los dos números (número de instancia, instancias totales) en cualquier formato razonable.
- Cada vez que se inicia o finaliza una instancia, todas las demás instancias deben actualizar sus salidas respectivas dentro de los 100 milisegundos.
- Si elige actualizar la salida imprimiendo en una nueva línea (u otro formato de salida "anexado"; en lugar de reemplazarla), debe imprimir solo cuando cambie el número de instancias, y no en cualquier otro momento.
- Este es el código de golf. El programa más corto en bytes gana.
- En su respuesta, se le recomienda que especifique qué debe hacer el usuario para abrir más de una instancia y / o grabar un screencast para demostrarlo.
Respuestas:
APL (Dyalog Unicode) , SBCS de 39 bytes
Función de prefijo anónimo. Llame generando el argumento ficticio
⍬
(vector numérico vacío), es decirf&⍬
. Consulte los hilos que se ejecutan actualmente⎕TNUMS
y elimine uno o más hilos con⎕TKILL n
. Los subprocesos generan cambios en [número propio, número total] tan pronto como obtienen el tiempo del procesador, es decir, casi al instante.Pruébalo en línea!
{
...}
lambda anónimo donde⍵
está el argumento (inicialmente⍬
, el vector numérico vacío)n[
…]
Índicen
(por definir) con:⎕TNUMS~0
todo T HRead Num fibras excepto el número0
(de la réplica)n←
almacenar comon
⍋
permutación que ordenaría ascendenteahora tenemos los hilos activos en orden
⍵≡
si el argumento es idéntico a eso ...:
luego:∇⍵
cola recurse en el argumento⋄
más:⊢/n
el número de hilo más a la derecha⎕TID,
esta camiseta de HRead ID (número de hilo) antepone al quen⍳
encuentra el ɩ nices de esos dos⎕←
imprima eso en STDOUTn⊣
descartar eso a favor den
∇
recurse en esofuente
Python 3,
694691 bytesmain.py
s (abreviatura de server.py)
¿Por qué es tan largo?
Desafortunadamente, esta funcionalidad no parece estar integrada en Python. Tuve la tentación de usar el multiprocesamiento, pero eso no parecía ser el adecuado para lo que estamos haciendo (dejar que un usuario abra un programa desde cualquier lugar).
Entonces, tomé el consejo de una publicación de StackOverflow que vi (extravié el enlace) y la implementé usando
bottle
. (Estoy abierto a nuevas sugerencias).Usé la biblioteca Bottle para ejecutar mi propio mini servidor http para que todas las diferentes instancias puedan comunicarse entre sí. Supongo que podría haber usado un zócalo, aunque no estoy convencido de que hubiera reducido el recuento de bytes.
Tengo dos archivos separados
s
ymain.py
.s
es corto de servidor y debido a que aparece en el código, pensé que debería hacer el nombre lo más corto posible.API del servidor web de comunicación
El servidor web solo acepta solicitudes POST y solo responde a las entradas dentro del cuerpo de la POST.
Todas las solicitudes pasan por
/
(olocalhost/
).Entrada válida:
*
en el cuerpo de la publicación solicitará que el servidor devuelva una nueva identificación para asignar el cliente.-<id>
en el cuerpo de la publicación eliminará la identificación de la lista activa de identificaciones, disminuyendo todas las identificaciones relevantes y el recuento total.Cerrando el programa
Implementé múltiples subprocesos, por lo que cerrar el programa es tan simple como presionar enter.
Abriendo el programa
Si no tiene la configuración de Python correctamente dentro de sus variables de entorno, simplemente cree un
.bat
archivo y colóquelo en la misma carpetamain.py
ys
con el siguiente código (si instaló Python para todos los usuarios, puede estar en una ubicación diferente):Créditos
De 694 a 691 bytes Adám .
fuente
:8080/
?/
.Herramientas sh + linux / unix, 128 bytes
si el sueño admite números de coma flotante
de lo contrario, 159 bytes
o el sueño se puede reemplazar con
:
(no-op), pero hará que la espera sea activa.fuente
Java 8, (199 + 301 =) 500 bytes
M.jar: (el programa principal)
S.jar: (el servidor para controlar el flujo del programa)
Explicación del código:
Explicación general:
Todos los programas mantendrán un registro de su propia identificación; el número total de instancias restantes; si ocurrió un retiro; y qué programas han cerrado.
El servidor es solo una clase de contenedor para iniciar y detener programas. Cuando un usuario ingresa
0
, iniciará un nuevo programa. Cuando el usado ingresa un entero positivo (es decir2
), cerrará el programa con esa identificación. (Nota: S.jar tiene M.jar como biblioteca para acceder a ella).Gif para verlo en acción:
Pensamientos para jugar más al golf:
Al escribir la explicación, me di cuenta de que solo utilizo
ObservableList
para agregar / quitarListChangeListener
, y no uso su contenido en absoluto. Eliminar esto y usar otro tipo de escucha estática podría ser más corto.fuente