Напишите бессрочно работающую программу, которая сообщает, сколько экземпляров себя в данный момент запущено. Каждый экземпляр программы должен также сообщать порядок, в котором она была открыта из всех других запущенных в данный момент экземпляров.
пример
Пользователь запускает программу в первый раз - мы назовем этот экземпляр 1. Экземпляр 1 отображается 1/1
, потому что это первый экземпляр, который будет запущен из 1 запущенных в данный момент экземпляров.
Во время работы Экземпляра 1 пользователь запускает программу второй раз, чтобы стать Экземпляром 2. Теперь отображается Экземпляр 1 1/2
, являющийся первым экземпляром из 2 запущенных в данный момент экземпляров. Экземпляр 2 отображается 2/2
, потому что это второй экземпляр из 2 запущенных в данный момент экземпляров.
Допустим, пользователь продолжает порождать больше экземпляров, пока их не станет 5 . Для запуска, их выходы: 1/5
2/5
3/5
4/5
5/5
.
Теперь, скажем, пользователь решает прекратить Экземпляр 3. Затем Экземпляр 4 становится новым Экземпляром 3, а Экземпляр 5 - новым Экземпляром 4, потому что они соответственно являются третьим и четвертым экземплярами, которые были запущены из того, что сейчас составляет 4. экземпляров. Таким образом, изменение каждого экземпляра в выводе будет следующим:
1/5
→1/4
2/5
→2/4
3/5
→ (прекращено)4/5
→3/4
5/5
→4/4
правила
- Вы можете вывести два числа (номер экземпляра, общее количество экземпляров) в любом приемлемом формате.
- Каждый раз, когда экземпляр запускается или завершается, все остальные экземпляры должны обновить свои соответствующие выходные данные в течение 100 миллисекунд.
- Если вы решите обновить вывод, печатая на новую строку (или другой «добавляющий» формат вывода; в отличие от замены), вы должны печатать только при изменении количества экземпляров, а не в любое другое время.
- Это код гольф. Самая короткая программа в байтах побеждает.
- В своем ответе вам предлагается указать, что пользователь должен сделать, чтобы открыть более одного экземпляра, и / или записать скринкаст для демонстрации.
Ответы:
APL (Dyalog Unicode) , 39 байтов SBCS
Функция анонимного префикса. Вызов порождая на фиктивный аргумент
⍬
(пустой числовой вектор), то естьf&⍬
. Запросить текущие потоки с⎕TNUMS
и убить один или несколько потоков с⎕TKILL n
. Потоки выводят изменения в [свое число, общее число], как только они получают процессорное время, то есть в значительной степени мгновенно.Попробуйте онлайн!
{
…}
Анонимная лямбда где⍵
аргумент (изначально⍬
пустой числовой вектор)n[
…]
Индексn
(подлежит определению) с:⎕TNUMS~0
все Т hread Num Берс кроме номера0
(The РЕПЛ)n←
хранить какn
⍋
перестановка, которая будет сортировать по возрастаниютеперь у нас есть активные темы в порядке
⍵≡
если аргумент идентичен этому ...:
тогда:∇⍵
Хвост рекурс на аргумент⋄
еще:⊢/n
самый правый номер резьбы⎕TID,
в этом T hread в ID (номер нити) предваряется , чтоn⍳
найти ɩ ndices тех , два⎕←
распечатать это в STDOUTn⊣
отказаться от этого в пользуn
∇
отреагировать на этоисточник
Python 3,
694691 байтmain.py
s (сокращение от server.py)
Почему это так долго?
К сожалению, эта функциональность, похоже, не встроена в Python. У меня было искушение использовать многопроцессорность, но это не совсем подходило для того, что мы делаем (позволяя пользователю открывать программу из любого места).
Итак, я воспользовался советом поста StackOverflow, который я видел (я не поместил ссылку), и я реализовал его, используя
bottle
. (Я открыт для новых предложений).Я использовал библиотеку Bottle для запуска своего собственного мини-http-сервера, чтобы все разные экземпляры могли общаться друг с другом. Я полагаю, что мог бы использовать сокет, хотя я не уверен, что это уменьшило бы количество байтов.
У меня есть два отдельных файла,
s
иmain.py
.s
не хватает сервера и, поскольку он появляется в коде, я решил, что имя должно быть как можно короче.API коммуникационного веб-сервера
Веб-сервер принимает только запросы POST и отвечает только на ввод внутри тела POST.
Все запросы проходят
/
(илиlocalhost/
).Допустимый ввод:
*
в теле сообщения будет запрашиваться у сервера возврат нового идентификатора для назначения клиенту.-<id>
в теле поста удалит идентификатор из активного списка идентификаторов, уменьшив все соответствующие идентификаторы и общее количество.Закрытие программы
Я реализовал многопоточность, поэтому закрыть программу так же просто, как нажать Enter.
Открытие программы
Если у вас неправильно настроен Python внутри переменных среды, просто создайте
.bat
файл и поместите его в ту же папку, чтоmain.py
иs
следующий код (если вы установили Python для всех пользователей, он может находиться в другом месте):кредиты
От 694 до 691 байтов Adám .
источник
:8080/
?/
.инструменты sh + linux / unix, 128 байт
если сон поддерживает числа с плавающей запятой
в противном случае 159 байтов
или сон может быть заменен на
:
(без операции), но это сделает активное ожидание.источник
Java 8, (199 + 301 =) 500 байт
М.jar: (основная программа)
S.jar: (сервер для управления потоком программ)
Пояснение к коду:
Общее объяснение:
Все программы будут вести учет своего собственного идентификатора; общее количество оставшихся экземпляров; произошло ли удаление; и какие программы закрылись.
Сервер - это просто класс-оболочка для запуска и остановки программ. Когда пользователь вводит
0
, он запускает новую программу. Когда используемый вводит положительное целое число (т.е.2
), он закроет программу с этим идентификатором. (Примечание: у S.jar есть библиотека M.jar для доступа к ней.)Gif, чтобы увидеть это в действии:
Мысли о гольфе это дальше:
Я только заметил, когда писал объяснение, что я использую только
ObservableList
для его добавления / удаленияListChangeListener
, и не использую его содержание вообще. Удаление этого и использование другого типа статического прослушивателя может быть короче.источник