Schreiben Sie ein Programm, das auf unbestimmte Zeit ausgeführt wird und angibt, wie viele Instanzen von ihm gerade ausgeführt werden. Jede Instanz des Programms sollte auch die Reihenfolge angeben, in der es von allen anderen derzeit ausgeführten Instanzen geöffnet wurde.
Beispiel
Der Benutzer startet das Programm zum ersten Mal - wir nennen dies Instanz 1. Instanz 1 wird angezeigt 1/1
, da es die erste Instanz von insgesamt 1 derzeit ausgeführten Instanzen ist.
Während Instanz 1 ausgeführt wird, startet der Benutzer das Programm ein zweites Mal, um Instanz 2 zu werden. Instanz 1 wird nun angezeigt 1/2
und ist die erste von insgesamt 2 derzeit ausgeführten Instanzen. Instanz 2 wird angezeigt 2/2
, da es sich um die zweite Instanz von insgesamt 2 derzeit ausgeführten Instanzen handelt.
Nehmen wir an, der Benutzer spawnt so lange mehr Instanzen, bis es 5 davon gibt. Um die Markteinführung, ihre Ausgänge sind: 1/5
2/5
3/5
4/5
5/5
.
Angenommen, der Benutzer entscheidet sich, Instanz 3 zu beenden. Instanz 4 wird dann zur neuen Instanz 3 und Instanz 5 zur neuen Instanz 4, da dies die dritte bzw. vierte Instanz ist, die von insgesamt 4 gestartet wurde Instanzen. Die Ausgabe jeder Instanz würde sich also wie folgt ändern:
1/5
→1/4
2/5
→2/4
3/5
→ (Abgebrochen)4/5
→3/4
5/5
→4/4
Regeln
- Sie können die beiden Zahlen (Instanznummer, Gesamtzahl der Instanzen) in jedem vernünftigen Format ausgeben.
- Jedes Mal, wenn eine Instanz gestartet oder beendet wird, müssen alle anderen Instanzen ihre jeweiligen Ausgaben innerhalb von 100 Millisekunden aktualisieren.
- Wenn Sie die Ausgabe aktualisieren möchten, indem Sie in eine neue Zeile drucken (oder ein anderes Ausgabeformat "Anhängen"; im Gegensatz zum Ersetzen), müssen Sie nur drucken, wenn sich die Anzahl der Instanzen ändert, und nicht zu einem anderen Zeitpunkt.
- Das ist Code Golf. Kürzestes Programm in Bytes gewinnt.
- In Ihrer Antwort werden Sie aufgefordert, anzugeben, was der Benutzer tun muss, um mehr als eine Instanz zu öffnen, und / oder einen Screencast aufzuzeichnen, um dies zu demonstrieren.
Antworten:
APL (Dyalog Unicode) , 39 Byte SBCS
Anonyme Präfixfunktion. Rufen Sie auf, indem Sie das Dummy-Argument
⍬
(leerer numerischer Vektor) aufrufen, dhf&⍬
. Fragen Sie derzeit laufende Threads mit ab⎕TNUMS
und beenden Sie einen oder mehrere Threads mit⎕TKILL n
. Threads geben Änderungen in [eigene Nummer, Gesamtzahl] aus, sobald sie Prozessorzeit erhalten, dh ziemlich sofort.Probieren Sie es online!
{
…}
Anonymes Lambda wo⍵
ist das Argument (anfangs⍬
der leere numerische Vektor)n[
…]
Indexn
(zu definieren) mit:⎕TNUMS~0
alle T hread Num mern außer Nummer0
(die REPL)n←
speichern alsn
⍋
Permutation, die aufsteigend sortieren würdeJetzt haben wir die aktiven Threads in Ordnung
⍵≡
wenn das Argument damit identisch ist ...:
dann:∇⍵
Schwanz rekursieren auf das Argument⋄
sonst:⊢/n
die am weitesten rechts stehende Thread-Nummer⎕TID,
Diese T der hread ID (Garnnummer) vorangestellt , dassn⍳
Finde die Geheimnisse dieser beiden⎕←
Drucken Sie das zu STDOUTn⊣
verwerfe das zugunsten vonn
∇
darauf zurückgreifenquelle
Python 3,
694691 Bytesmain.py
s (kurz für server.py)
Warum ist es so lang?
Leider scheint diese Funktionalität nicht in Python integriert zu sein. Ich war versucht, Multiprocessing zu verwenden, aber das schien nicht ganz das Richtige für das zu sein, was wir tun (einen Benutzer von überall aus ein Programm öffnen zu lassen).
Also nahm ich den Rat eines StackOverflow-Posts an, den ich gesehen hatte (ich habe den Link verlegt) und implementierte ihn mit
bottle
. (Ich bin offen für neue Vorschläge).Ich habe die Flaschenbibliothek verwendet, um meinen eigenen Mini-HTTP-Server zu betreiben, damit alle verschiedenen Instanzen miteinander kommunizieren können. Ich nehme an, ich hätte einen Socket verwenden können, obwohl ich nicht überzeugt bin, dass dies die Byteanzahl verringert hätte.
Ich habe zwei separate Dateien
s
undmain.py
.s
Der Server ist knapp und da er im Code enthalten ist, habe ich mir vorgenommen, den Namen so kurz wie möglich zu halten.API des Kommunikationswebservers
Der Webserver akzeptiert nur POST-Anfragen und antwortet nur auf Eingaben innerhalb des POST-Körpers.
Alle Anfragen gehen durch
/
(oderlocalhost/
).Gültige Eingabe:
*
Im Post-Body wird der Server aufgefordert, eine neue ID zurückzugeben, um den Client zuzuweisen.-<id>
im Beitragskörper wird die ID aus der aktiven Liste der IDs entfernt, wobei alle relevanten IDs und die Gesamtanzahl verringert werden.Programm schließen
Ich habe Multithreading implementiert, sodass das Schließen des Programms so einfach wie das Drücken der Eingabetaste ist.
Programm öffnen
Wenn Sie das Python-Setup in Ihren Umgebungsvariablen nicht korrekt eingerichtet haben, erstellen Sie einfach eine
.bat
Datei und legen Sie sie in demselben Ordner wiemain.py
unds
mit dem folgenden Code ab (wenn Sie Python für alle Benutzer installiert haben, befindet es sich möglicherweise an einem anderen Speicherort):Credits
Von 694 bis 691 Bytes Adám .
quelle
:8080/
?/
.sh + Linux / Unix-Tools, 128 Bytes
wenn sleep Gleitkommazahlen unterstützt
ansonsten 159 Bytes
oder Schlaf kann durch
:
(no-op) ersetzt werden, aber es wird das Warten aktiv.quelle
Java 8, (199 + 301 =) 500 Bytes
M.jar: (das Hauptprogramm)
S.jar: (der Server zur Steuerung des Programmflusses)
Erklärung des Codes:
Allgemeine Erklärung:
Alle Programme zeichnen ihre eigene ID auf. die Gesamtzahl der verbleibenden Instanzen; ob eine Entfernung stattgefunden hat; und welche Programme haben geschlossen.
Der Server ist nur eine Wrapper-Klasse zum Starten und Beenden von Programmen. Wenn ein Benutzer eingibt
0
, wird ein neues Programm gestartet. Wenn der verwendete eine positive Ganzzahl eingibt (dh2
), wird das Programm mit dieser ID geschlossen. (Hinweis: S.jar hat M.jar als Bibliothek, um darauf zuzugreifen.)Gif um es in Aktion zu sehen:
Gedanken, es weiter zu golfen:
Beim Schreiben der Erklärung ist mir gerade aufgefallen, dass ich das nur
ObservableList
für das Hinzufügen / Entfernen verwendeListChangeListener
und den Inhalt überhaupt nicht verwende. Wenn Sie dies entfernen und einen anderen statischen Listener verwenden, ist dies möglicherweise kürzer.quelle