몇 개의 인스턴스가 실행되고 있습니까?


13

현재 실행중인 인스턴스 수를보고하는 무기한 실행 프로그램을 작성하십시오. 또한 프로그램의 각 인스턴스는 현재 실행중인 다른 모든 인스턴스에서 프로그램이 열린 순서를보고해야합니다.

사용자는 처음으로 프로그램을 시작합니다.이 인스턴스 1을 호출합니다. 인스턴스 1 1/1은 현재 실행중인 총 1 개의 인스턴스 중 첫 번째 인스턴스 이기 때문에을 표시 합니다.

인스턴스 1이 실행되는 동안 사용자는 두 번째로 프로그램을 시작하여 인스턴스 2가됩니다 1/2. 이제 인스턴스 1이 현재 실행중인 총 2 개의 인스턴스 중 첫 번째 인스턴스 인을 표시 합니다. 인스턴스 2 개를 표시 ,이 때문에 두 번째 인스턴스의 총에서 현재 실행중인 인스턴스.2/2

사용자가 5 개가 될 때까지 더 많은 인스턴스를 생성한다고 가정 해 봅시다 . 실행 순서는 다음과 같습니다 1/5 2/5 3/5 4/5 5/5..

이제 사용자가 인스턴스 3을 종료하기로 결정했다고 가정합니다. 인스턴스 4는 이제 새 인스턴스 3이되고 인스턴스 5는 새 인스턴스 4가됩니다. 각각 인스턴스 4 는 현재 총 4 개 에서 시작된 세 번째네 번째 인스턴스 이기 때문 입니다. 인스턴스. 따라서 각 인스턴스의 출력 변경은 다음과 같습니다.

  • 1/51/4
  • 2/52/4
  • 3/5 → (종료)
  • 4/53/4
  • 5/54/4

규칙

  • 두 가지 숫자 (인스턴스 수, 총 인스턴스 수)를 적절한 형식으로 출력 할 수 있습니다.
  • 인스턴스가 시작되거나 종료 될 때마다 다른 모든 인스턴스는 100 밀리 초 이내에 해당 출력을 업데이트해야합니다.
  • 새 줄 (또는 다른 "추가"출력 형식 (대체와 달리)로 인쇄하여 출력을 업데이트하기로 선택한 경우, 다른 시간이 아니라 인스턴스 수가 변경 될 때만 인쇄해야합니다.
  • 이것은 코드 골프입니다. 바이트 단위의 최단 프로그램이 이깁니다.
  • 귀하의 답변에 따르면, 사용자가 둘 이상의 인스턴스를 열거 나 시연을 위해 스크린 캐스트를 기록하기 위해 수행해야하는 작업을 지정하는 것이 좋습니다.

누구든지 태그를 포함시킬 제안이 있습니까?
darrylyeo

이러한 프로그램은 운영 체제에 따라 다릅니다.
user202729

"인스턴스가 시작되거나 종료 될 때마다 모든 다른 인스턴스는 100 밀리 초 이내에 각각의 출력을 업데이트해야합니다." 도와주세요)?
Jonathan Allan

@Ouros 프로세스 상호 운용은 OS와 독립적 일 수 없습니다
edc65

답변:


3

APL (Dyalog Unicode) , 39 바이트 SBCS

익명 접두사 기능. 더미 인수 (빈 숫자 벡터) 를 생성하여 호출합니다 f&⍬. 현재 실행중인 스레드를 쿼리하고로 ⎕TNUMS하나 이상의 스레드를 종료하십시오 ⎕TKILL n. 쓰레드 출력은 프로세서 시간을 얻 자마자 즉, 즉각 즉시 [자신의 번호, 총 수]로 변경됩니다.

{⍵≡nn[⍋n←⎕TNUMS~0]:∇n⋄∇n⊣⎕←n⍳⎕TID,⊢/n}

온라인으로 사용해보십시오!

{} 익명 람다 어디 인수입니다 (처음에는 빈 숫자 벡터)

n[… 다음과 함께 ] 색인 n(정의) :

  ⎕TNUMS~0 모든 T는 hread 민의 수를 제외하고의 BER을 0합니다 (REPL)

   n← 로 저장 n

    오름차순으로 정렬 순열

  이제 우리는 활성 스레드를 순서대로 가지고 있습니다.

  ⍵≡ 그 주장이 그것과 같다면…

  : 그때:

   ∇⍵ 논쟁에 꼬리 재귀

   그밖에:

   ⊢/n 가장 오른쪽의 스레드 번호

   ⎕TID, 이 T의 트레드 ID (스레드 번호)가 앞에 붙습니다.

   n⍳그 두 가지  의 ndi을 찾아라

   ⎕← STDOUT에 인쇄

   n⊣ 찬성하다 n

    그것에 재귀


2

파이썬 3, 694 691 바이트

main.py

from requests import post as u
from _thread import*
import os
os.system("start cmd /C python s")
def l():
 def p(q):
  while 1:print(u(*q).text,end="\r")
 q=['http://localhost']
 q+=[u(q[0],'*').text]
 start_new_thread(p,(q,))
 input()
 u(q[0],'-'+q[1])
while 1:
 try:l();break
 except:0

s (server.py의 줄임말)

from bottle import*
from requests import post as q
try:
 q("http://localhost")
except:
 ids=["0"]
 @post('/')
 def _():
  content = request.body.read().decode('utf-8')
  if len(content)==0:return""
  if content[0]=="*":ids.append(str(int(ids[-1])+1));return str(ids[-1])
  elif content[0]=="-":del ids[ids.index(content[1:])]
  else:return str(ids.index(content)) + "/" + str(len(ids)-1)
 run(port="80")

왜 이렇게 길어요?

불행히도이 기능은 파이썬에 내장되어 있지 않은 것 같습니다. 멀티 프로세싱을 사용하고 싶었지만 우리가하고있는 일에 적합하지 않은 것 같습니다 (사용자가 어디에서나 프로그램을 열도록하십시오).

그래서, 내가 본 (스택 링크를 잘못 놓았습니다) StackOverflow 게시물의 조언을 받아을 사용하여 구현했습니다 bottle. (나는 새로운 제안에 개방적이다).

나는 병 라이브러리를 사용하여 자신의 미니 http 서버를 실행하여 서로 다른 모든 인스턴스가 서로 통신 할 수 있도록했습니다. 바이트 수를 줄 였다고 확신하지는 않지만 소켓을 사용할 수 있다고 가정합니다.

나는 두 개의 별도 파일을 가지고 smain.py. s서버에 부족하고 코드에 나타나기 때문에 가능한 한 이름을 짧게 만들어야한다고 생각했습니다.

커뮤니케이션 웹 서버의 API

웹 서버는 POST 요청 만 수락하고 POST 본문 내부의 입력에만 응답합니다.

모든 요청은 /(또는 localhost/)를 거칩니다 .

유효한 입력 :

  • * 포스트 본문에서 서버는 클라이언트를 할당하기 위해 새 ID를 반환하도록 요청합니다.
  • -<id> 게시물 본문에서 ID의 활성 목록에서 ID를 제거하여 모든 관련 ID와 총 수를 줄입니다.
  • 포스트 본문의 빈 요청은 단순히 빈 문자열을 반환합니다. 서버가 온라인 상태인지 테스트하기 위해 사용됩니다.

프로그램 닫기

멀티 스레딩을 구현 했으므로 Enter 키를 누르는 것만 큼 프로그램을 닫는 것이 간단합니다.

프로그램 열기

당신이 당신의 환경 변수 안에 제대로 파이썬 설정하지 않은 경우 간단하게 만들 .bat파일과 같은 폴더에 넣어 main.pys(이 다른 위치에있을 수 있습니다, 모든 사용자에 대해 파이썬을 설치 한 경우) 다음 코드 :

set PATH=%userprofile%\AppData\Local\Programs\Python\Python36
python main.py

크레딧

694 바이트에서 691 바이트까지의 Adám .


제거 할 수 없습니까 :8080/?
Adám

포트를 포트 80에 할당한다면, 그렇습니다. 그렇지 않으면 아닙니다. 웹 브라우저 (및 요청)의 기본 포트는 포트 80이지만을 제거 할 수 있습니다 /.
Neil

@ Adám 포트 변경으로 업데이트하여 1 바이트를 절약했습니다.
Neil

1

sh + 리눅스 / 유닉스 도구, 128 바이트

수면이 부동 소수점 숫자를 지원하는 경우

trap '(flock 9;grep -vw $$ p>t;mv t p)9>l' exit;(flock 9;echo $$>>p)9>l;f(){ echo $(sed -n /^$$\$/= p)/$(wc -l<p);sleep .1;f;};f

그렇지 않으면 159 바이트

trap '(flock 9;grep -vw $$ p>t;mv t p)9>l' exit;(flock 9;echo $$>>p)9>l;perl -MTime::HiRes=usleep -nE/^$$'$/&&say("$./",$.+(@a=<>)),usleep 1e5,$.=-(@ARGV=p)' p

또는 절전 모드를 :(no-op) 로 바꿀 수 있지만 대기 상태가됩니다.


이것은 정말 가깝습니다. "인스턴스 수가 변경 될 때만 인쇄해야하며 다른 시간에는 인쇄하지 않아야합니다."
darrylyeo

@darrylyeo 그냥 수정하지만 짧은 솔루션을 찾고 있었지만 시간이 없었고, 또한 100ms를 자고, 해결책이 있지만 더 오래되었습니다
Nahuel Fouilleul

0

Java 8, (199 + 301 =) 500 바이트

M.jar : (메인 프로그램)

import javafx.collections.*;class M{static ObservableList o=FXCollections.observableArrayList();static int j,F;int i,f;{F=0;ListChangeListener e=(ListChangeListener.Change c)->{if(f<1)System.out.println((F>0&i>F?--i:i)+"/"+j);};o.addListener(e);o.add(i=++j);}public void f(){F=f=i;j--;o.remove(--i);}}

S.jar : (프로그램 흐름을 제어하는 ​​서버)

import java.util.*;interface S{static void main(String[]a){List<M>l=new Stack();for(Scanner s=new Scanner(System.in);;){Float n=s.nextFloat();if(n%1==0)l.add(new M());else{int t=(int)(n*10-1);l.get(t).f();l.remove(t);}}}}

코드 설명 :

import javafx.collections.*;
                  // Required import for ObservableList, FXCollections, and ListChangeListener
class M{          // Program-class
  static ObservableList o=FXCollections.observableArrayList(); 
                  //  Static list to keep record of all instances
  static int j,   //  Static integer (total number of instances)
             F;   //  Static flag (remove occurred?)
  int i,          //  Non-static integer (id of this instance)
      f;          //  Non-static flag (has been removed)
  {               //  Non-static initializer-block (shorter than constructor)
    F=0;          //   Reset the static flag remove_occurred, because we add a new instance
    o.addListener((ListChangeListener.Change c)->{
                  //   Add a change listener for the ObservableList
                  //   This will monitor any additions or removes on the List
       if(f<1)    //    If this instance is not removed yet:
         System.out.println(
                  //     Print:
           (F>0&i>F?
                  //      If a removed occurred and this id is larger than the removed instance
             --i  //       Decrease its id by 1 before printing it
            :     //      Else:
             i)   //       Just print its id
           +"/"+j);
                  //      Plus the total number of instances left
    });
    o.add(        //   Add anything to the Observable list to trigger the listener
     i=++j);      //    Increase the total amount of instances, and set the id of this instance to the last one
  }               //  End of non-static initializer-block
  public void f(){//  Finalize-method
    F=f=i;        //   Set both flags to the current id
    j--;          //   Decrease the total amount of instances
    o.remove(--i);//   Remove the current instance from the list to trigger the listener
  }               //  End of Finalize-method
}                 // End of Program-class

import java.util.*;
                  // Required import for List, Stack and Scanner
interface S{      // Server-class
  static void main(String[]a){
                  //  Mandatory main-method
    List<M>l=new Stack();
                  //   List of programs
    for(Scanner s=new Scanner(System.in);
                  //   Create a STDIN-listener for user input
        ;){       //   Loop indefinitely
      int t=s.nextInt();
                  //    Get the next integer inputted
      if(t<1)     //    If it's 0:
        l.add(new M());
                  //     Startup a new program, and add its instance to the list
      else{       //    Else:
        l.get(t).f();
                  //     Close the program with this integer as id
        l.remove(t);}
                  //     And remove it from the list of programs
    }             //   End of loop
  }               //  End of main-method
}                 // End of Server-class

일반적인 설명 :

모든 프로그램은 자신의 ID를 기록합니다. 남은 총 인스턴스 수; 제거가 발생했는지 여부; 그리고 어떤 프로그램이 닫혔습니까?

서버는 프로그램을 시작하고 중지하는 래퍼 클래스입니다. 사용자가 입력 0하면 새 프로그램이 시작됩니다. 사용 된 입력이 양의 정수 (예 :)를 입력하면 2해당 ID로 프로그램을 닫습니다. (참고 : S.jar에는 M.jar이 라이브러리로 액세스되어 있습니다.)

그것을 실제로 보려면 GIF :

여기에 이미지 설명을 입력하십시오

더 골프를 생각 :

방금 ObservableListadd / remove- 용으로 만 ListChangeListener사용하고 내용을 전혀 사용하지 않는다는 설명을 쓰는 동안 방금 주목 했습니다 . 이것을 제거하고 다른 유형의 정적 리스너를 사용하는 것이 더 짧을 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.