Napisz nieskończenie działający program, który informuje, ile instancji jest aktualnie uruchomionych. Każde wystąpienie programu powinno również zgłaszać kolejność otwierania go ze wszystkich innych aktualnie uruchomionych wystąpień.
Przykład
Użytkownik uruchamia program po raz pierwszy - wywołamy to wystąpienie 1. Wyświetla się wystąpienie 1 1/1
, ponieważ jest to pierwsze wystąpienie z łącznie 1 aktualnie działających wystąpień.
Gdy instancja 1 jest uruchomiona, użytkownik uruchamia program po raz drugi, aby stać się instancją 2. Instancja 1 jest teraz wyświetlana 1/2
, będąc pierwszą instancją spośród 2 aktualnie uruchomionych instancji. Zostanie wyświetlona instancja 2 2/2
, ponieważ jest to druga instancja spośród 2 aktualnie uruchomionych instancji.
Załóżmy, że użytkownik kontynuuje tworzenie kolejnych instancji, dopóki nie będzie ich 5 . W celu wprowadzenia na rynek, ich wyjścia są: 1/5
2/5
3/5
4/5
5/5
.
Powiedzmy, że użytkownik decyduje się na zakończenie wystąpienia 3. Wystąpienie 4 staje się wówczas nowym wystąpieniem 3, a wystąpienie 5 nowym wystąpieniem 4, ponieważ są one odpowiednio trzecim i czwartym wystąpieniem, które zostało uruchomione z łącznej liczby 4 instancje. Zatem zmiana danych wyjściowych każdej instancji wyglądałaby następująco:
1/5
→1/4
2/5
→2/4
3/5
→ (zakończone)4/5
→3/4
5/5
→4/4
Zasady
- Możesz wyprowadzić dwie liczby (liczbę instancji, całkowitą liczbę instancji) w dowolnym rozsądnym formacie.
- Za każdym razem, gdy instancja zostanie uruchomiona lub zakończona, wszystkie pozostałe instancje muszą zaktualizować swoje dane wyjściowe w ciągu 100 milisekund.
- Jeśli zdecydujesz się zaktualizować dane wyjściowe, drukując w nowym wierszu (lub w innym „dołączającym” formacie wyjściowym; w przeciwieństwie do zastępowania), musisz drukować tylko wtedy, gdy zmienia się liczba wystąpień, a nie w żadnym innym momencie.
- To jest kod golfowy. Najkrótszy program w bajtach wygrywa.
- W swojej odpowiedzi zachęcamy do określenia, co użytkownik musi zrobić, aby otworzyć więcej niż jedną instancję i / lub nagrać screencast, aby zademonstrować.
Odpowiedzi:
APL (Dyalog Unicode) , 39 bajtów SBCS
Anonimowa funkcja prefiksu. Wywołaj przez spawnowanie na fikcyjnym argumencie
⍬
(pusty wektor numeryczny), tjf&⍬
. Zapytaj aktualnie uruchomione wątki za pomocą⎕TNUMS
i zabij jeden lub więcej wątków za pomocą⎕TKILL n
. Wątki wyprowadzają zmiany w [liczba własna, liczba całkowita], gdy tylko otrzymają czas procesora, tj. Prawie natychmiast.Wypróbuj online!
{
…}
Anonimowa lambda gdzie⍵
jest argument (początkowo⍬
pusty wektor numeryczny)n[
…]
Indeksn
(do zdefiniowania) z:⎕TNUMS~0
Wszystko T hread Num BERS wyjątkiem numeru0
(the REPL)n←
przechowywać jakon
⍋
permutacja sortująca rosnącoteraz mamy aktywne wątki w kolejności
⍵≡
jeśli argument jest identyczny z tym…:
następnie:∇⍵
ogon powraca do argumentu⋄
jeszcze:⊢/n
numer prawej nici⎕TID,
ten T hread jest ID (liczba nici) dołączany don⍳
znaleźć ɩ ndices tych dwóch⎕←
wydrukuj to do STDOUTn⊣
odrzucić to na korzyśćn
∇
powrócić do tegoźródło
Python 3,
694691 bajtówmain.py
s (skrót od server.py)
Dlaczego to tak długo?
Niestety, ta funkcjonalność nie wydaje się być wbudowana w Pythona. Kusiło mnie, aby używać przetwarzania wieloprocesorowego, ale nie do końca pasowało to do tego, co robimy (pozwalanie użytkownikowi otwierać program z dowolnego miejsca).
Więc skorzystałem z porady, którą zobaczyłem w StackOverflow (zgubiłem link) i zaimplementowałem go za pomocą
bottle
. (Jestem otwarty na nowe sugestie).Użyłem biblioteki Bottle do uruchomienia własnego mini serwera http, aby wszystkie różne instancje mogły się ze sobą komunikować. Przypuszczam, że mógłbym użyć gniazda, chociaż nie jestem przekonany, czy zmniejszyłoby to liczbę bajtów.
Mam dwa osobne pliki
s
imain.py
.s
brakuje serwera i ponieważ pojawia się w kodzie, pomyślałem, że powinienem skrócić nazwę tak krótko, jak to możliwe.Komunikacja API serwera WWW
Serwer WWW przyjmuje tylko żądania POST i odpowiada tylko na dane wejściowe wewnątrz ciała POST.
Wszystkie żądania przechodzą
/
(lublocalhost/
).Prawidłowe dane wejściowe:
*
w treści postu poprosi serwer o zwrócenie nowego identyfikatora w celu przypisania klienta.-<id>
w treści postu usunie identyfikator z aktywnej listy identyfikatorów, zmniejszając wszystkie odpowiednie identyfikatory i całkowitą liczbę.Zamknięcie programu
Zaimplementowałem wielowątkowość, więc zamknięcie programu jest tak proste, jak naciśnięcie Enter.
Otwieranie programu
Jeśli nie masz instalację Pythona prawidłowo wewnątrz zmiennych środowiskowych wystarczy utworzyć
.bat
plik i umieścić go w tym samym folderze,main.py
as
z kodem Następujące (jeśli zainstalowany Python dla wszystkich użytkowników, może być w innym miejscu):Kredyty
Od 694 do 691 bajtów Adám .
źródło
:8080/
?/
.Narzędzia sh + linux / unix, 128 bajtów
jeśli sen obsługuje liczby zmiennoprzecinkowe
w przeciwnym razie 159 bajtów
lub sen może zostać zastąpiony przez
:
(no-op), ale spowoduje aktywne czekanie.źródło
Java 8, (199 + 301 =) 500 bajtów
M.jar: (program główny)
S.jar: (serwer do sterowania przebiegiem programu)
Objaśnienie kodu:
Ogólne wyjaśnienie:
Wszystkie programy będą prowadzić rejestr własnego identyfikatora; całkowita liczba pozostałych wystąpień; czy nastąpiło usunięcie; i które programy zostały zamknięte.
Serwer jest tylko klasą opakowania do uruchamiania i zatrzymywania programów. Gdy użytkownik wprowadzi dane
0
, uruchomi nowy program. Kiedy użyte wprowadzi dodatnią liczbę całkowitą (tj.2
), Zamknie program o tym identyfikatorze. (Uwaga: S.jar ma M.jar jako bibliotekę, aby uzyskać do niego dostęp).Gif, aby zobaczyć to w akcji:
Myśli o dalszym golfie:
Właśnie zauważyłem, pisząc wyjaśnienie, że używam go tylko
ObservableList
do dodawania / usuwania-ListChangeListener
i wcale nie używam jego zawartości. Usunięcie tego i użycie innego rodzaju statycznego Listenera może być krótsze.źródło