Écrivez un programme à durée indéterminée qui indique le nombre d'instances de lui-même en cours d'exécution. Chaque instance du programme doit également signaler l'ordre dans lequel il a été ouvert par rapport à toutes les autres instances en cours d'exécution.
Exemple
L'utilisateur lance le programme pour la première fois - nous appellerons cette instance 1. L'instance 1 s'affiche 1/1
, car il s'agit de la première instance à être lancée sur un total de 1 instances en cours d'exécution.
Pendant que l'instance 1 est en cours d'exécution, l'utilisateur lance le programme une deuxième fois pour devenir l'instance 2. L'instance 1 s'affiche maintenant 1/2
, étant la première instance sur un total de 2 instances en cours d'exécution. L'instance 2 s'affiche 2/2
, car il s'agit de la deuxième instance sur un total de 2 instances en cours d'exécution.
Supposons que l'utilisateur continue de générer plus d'instances jusqu'à ce qu'il y en ait 5 . Afin de lancement, leurs sorties sont: 1/5
2/5
3/5
4/5
5/5
.
Supposons maintenant que l'utilisateur décide de mettre fin à l'instance 3. L'instance 4 devient alors la nouvelle instance 3 et l'instance 5 la nouvelle instance 4, car ce sont respectivement les troisième et quatrième instances à avoir été lancées à partir de ce qui est maintenant un total de 4. instances. Ainsi, le changement de sortie de chaque instance serait le suivant:
1/5
→1/4
2/5
→2/4
3/5
→ (Terminé)4/5
→3/4
5/5
→4/4
Règles
- Vous pouvez sortir les deux nombres (numéro d'instance, nombre total d'instances) dans n'importe quel format raisonnable.
- Chaque fois qu'une instance est lancée ou arrêtée, toutes les autres instances doivent mettre à jour leurs sorties respectives dans un délai de 100 millisecondes.
- Si vous choisissez de mettre à jour la sortie en imprimant sur une nouvelle ligne (ou un autre format de sortie "en ajout", par opposition au remplacement), vous devez imprimer uniquement lorsque le nombre d'instances change, et pas à tout autre moment.
- C'est le golf de code. Le programme le plus court en octets gagne.
- Dans votre réponse, nous vous encourageons à spécifier ce que l'utilisateur doit faire pour ouvrir plusieurs instances et / ou enregistrer une capture d'écran à démontrer.
Réponses:
APL (Dyalog Unicode) , 39 octets SBCS
Fonction de préfixe anonyme. Appelez en faisant apparaître l'argument factice
⍬
(vecteur numérique vide), c'est-à-diref&⍬
. Recherchez les threads en cours d'exécution avec⎕TNUMS
et tuez un ou plusieurs threads avec⎕TKILL n
. La sortie des threads change en [nombre propre, nombre total] dès qu'ils obtiennent du temps processeur, c'est-à-dire pratiquement instantanément.Essayez-le en ligne!
{
…}
Lambda anonyme où⍵
est l'argument (initialement⍬
, le vecteur numérique vide)n[
…]
Indexn
(à définir) avec:⎕TNUMS~0
tous les T HLit Num bres sauf le nombre0
(REPL)n←
stocker sousn
⍋
permutation qui trierait par ordre croissantnous avons maintenant les fils actifs afin
⍵≡
si l'argument est identique à celui…:
ensuite:∇⍵
queue recurse sur l'argument⋄
autre:⊢/n
le numéro de fil le plus à droite⎕TID,
ce T de HLit ID (numéro de fil) préfixé quen⍳
trouver le ɩ ndices de ces deux⎕←
l'imprimer sur STDOUTn⊣
jeter cela en faveur den
∇
recurse sur cela source
Python 3,
694691 octetsmain.py
s (abréviation de server.py)
Pourquoi est-ce si long?
Malheureusement, cette fonctionnalité ne semble pas être intégrée à Python. J'ai été tenté d'utiliser le multitraitement, mais cela ne semblait pas tout à fait adapté à ce que nous faisons (laisser un utilisateur ouvrir un programme de n'importe où).
J'ai donc suivi les conseils d'un post StackOverflow que j'ai vu (j'ai égaré le lien) et je l'ai implémenté en utilisant
bottle
. (Je suis ouvert à de nouvelles suggestions).J'ai utilisé la bibliothèque Bottle pour exécuter mon propre mini serveur http afin que toutes les différentes instances puissent communiquer entre elles. Je suppose que j'aurais pu utiliser un socket, même si je ne suis pas convaincu que cela aurait réduit le nombre d'octets.
J'ai deux fichiers séparés,
s
etmain.py
.s
est à court de serveur et parce qu'il apparaît dans le code, j'ai pensé que je devrais rendre le nom aussi court que possible.API du serveur Web de communication
Le serveur Web accepte uniquement les demandes POST et ne répond qu'aux entrées dans le corps du POST.
Toutes les demandes passent par
/
(oulocalhost/
).Entrée valide:
*
dans le corps du message demandera au serveur de renvoyer un nouvel identifiant pour affecter le client.-<id>
dans le corps du message supprimera l'identifiant de la liste active des identifiants, diminuant tous les identifiants pertinents et le nombre total.Clôture du programme
J'ai implémenté le multi-threading, donc fermer le programme est aussi simple que d'appuyer sur Entrée.
Ouverture du programme
Si vous n'avez pas configuré correctement Python dans vos variables d'environnement, créez simplement un
.bat
fichier et placez-le dans le même dossier quemain.py
ets
avec le code suivant (si vous avez installé Python pour tous les utilisateurs, il peut se trouver à un emplacement différent):Crédits
De 694 à 691 octets Adám .
la source
:8080/
?/
.outils sh + linux / unix, 128 octets
si le sommeil prend en charge les nombres à virgule flottante
sinon, 159 octets
ou le sommeil peut être remplacé par
:
(no-op), mais cela rendra l'attente active.la source
Java 8, (199 + 301 =) 500 octets
M.jar: (le programme principal)
S.jar: (le serveur pour contrôler le déroulement du programme)
Explication du code:
Explication générale:
Tous les programmes garderont une trace de leur propre identifiant; le nombre total d'instances restantes; si une suppression s'est produite; et quels programmes ont fermé.
Le serveur est juste une classe wrapper pour démarrer et arrêter des programmes. Lorsqu'un utilisateur entre
0
, il démarre un nouveau programme. Lorsque l'utilisateur saisit un entier positif (c'est-à-dire2
), il fermera le programme avec cet id. (Remarque: S.jar a M.jar comme bibliothèque pour y accéder.)Gif pour le voir en action:
Réflexions pour jouer au golf plus loin:
Je viens de remarquer en écrivant l'explication que je n'utilise que
ObservableList
pour son ajout / suppressionListChangeListener
, et que je n'utilise pas du tout son contenu. La suppression et l'utilisation d'un autre type d'écouteur statique peuvent être plus courtes.la source