いくつのインスタンスが実行されていますか?


13

現在実行されている自身のインスタンスの数を報告する無期限に実行するプログラムを作成します。プログラムの各インスタンスは、現在実行中の他のすべてのインスタンスから開かれた順序も報告する必要があります。

ユーザーが起動初めてプログラムは-私たちは、このインスタンス1インスタンス1のディスプレイと呼ぶことにします1/1、それがあるので、最初の合計のうち発足するインスタンス1、現在実行中のインスタンスが。

インスタンス1の実行中に、ユーザーは2回目のプログラムを起動してインスタンス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/51/4
  • 2/52/4
  • 3/5 →(終了)
  • 4/53/4
  • 5/54/4

ルール

  • 2つの数値(インスタンス番号、合計インスタンス)を適切な形式で出力できます。
  • インスタンスが起動または終了するたびに、他のすべてのインスタンスはそれぞれの出力を100ミリ秒以内に更新する必要があります。
  • 新しい行(または置換ではなく他の「追加」出力形式)に印刷して出力を更新する場合、インスタンスの数が変更された場合にのみ印刷し、それ以外の時間には印刷しないでください。
  • これはコードゴルフです。バイト単位の最短プログラムが優先されます。
  • 回答では、ユーザーが複数のインスタンスを開くために何をする必要があるかを指定すること、および/またはデモのためにスクリーンキャストを記録することをお勧めします。

タグを含める提案はありますか?
darrylyeo

このようなプログラムはOS固有です。
user202729

「インスタンスを起動または終了するたびに、他のすべてのインスタンスは100ミリ秒以内にそれぞれの出力を更新する必要があります」。 tヘルプ)?
ジョナサンアラン

@Ourosプロセスの相互運用はOSから独立させることはできません
edc65

回答:


3

APL(Dyalog Unicode)、39バイトSBCS

匿名プレフィックス関数。ダミー引数(空の数値ベクトル)で生成することにより呼び出しますf&⍬。で現在実行中のスレッドを照会し⎕TNUMS、で1つ以上のスレッドを強制終了し⎕TKILL nます。スレッドは、プロセッサ時間を取得するとすぐに、つまりほぼ瞬時に[own number、total number]の変化を出力します。

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

オンラインでお試しください!

{} 匿名のラムダは引数です(最初は、空の数値ベクトル)

n[] インデックスn(定義される):

  ⎕TNUMS~0 すべてのTは HREAD 民の数以外のBERを0(REPL)

   n← として保存 n

    昇順で並べ替える順列

  これで順番にアクティブなスレッドができました

  ⍵≡ 引数がそれと同じ場合...

  : その後:

   ∇⍵ 引数の末尾再帰

   そうしないと:

   ⊢/n 右端のスレッド番号

   ⎕TID, このT hreadのID(スレッド番号)が先頭に追加されます

   n⍳これらの2つのdic ndicesを 見つける

   ⎕← STDOUTに出力します

   n⊣ それを捨てて捨てる n

    その上で再帰


2

Python 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")

なぜそんなに長いのですか?

残念ながら、この機能はPythonに組み込まれていないようです。マルチプロセッシングを使用したいと思いましたが、それは私たちがやっていること(ユーザーにプログラムをどこからでも開かせること)にぴったりとは思えませんでした。

そこで、私が見たStackOverflowの投稿のアドバイスを受け(リンクを置き忘れました)、を使用して実装しましたbottle。(私は新しい提案を受け入れています)。

Bottleライブラリを使用して独自のミニHTTPサーバーを実行し、すべての異なるインスタンスが相互に通信できるようにしました。ソケットを使用できたと思いますが、バイトカウントが削減されるとは思いません。

2つの個別のファイルがsありmain.pyます。 sサーバーが不足しており、コードに表示されるため、名前をできるだけ短くする必要があると考えました。

通信WebサーバーのAPI

WebサーバーはPOST要求のみを受け入れ、POSTの本文内の入力にのみ応答します。

すべてのリクエストが通過します/(またはlocalhost/)。

有効な入力:

  • * 投稿本文では、サーバーがクライアントを割り当てるために新しいIDを返すよう要求します。
  • -<id> 投稿本文では、アクティブなIDリストからIDが削除され、関連するすべてのIDと合計数が減少します。
  • 投稿本文の空のリクエストは、単に空の文字列を返します。これは、サーバーがオンラインであるかどうかをテストするために使用されるものです。

プログラムを閉じる

マルチスレッドを実装したので、プログラムを閉じるのはエンターを押すのと同じくらい簡単です。

プログラムを開く

環境変数内にPythonが正しくセットアップされていない場合は、.batファイルを作成し、次のコードmain.pyと同じフォルダーに配置しsます(すべてのユーザーにPythonをインストールした場合、別の場所にある可能性があります)。

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

クレジット

694〜691バイトAdám


削除できません:8080/か?
アダム

ポートをポート80に割り当てる場合、はい。それ以外の場合、いいえ。Webブラウザー(およびリクエスト)のデフォルトポートはポート80ですが、を削除でき/ます。
ニール

@Adámポートを変更して更新し、1バイト節約しました。
ニール

1

sh + linux / unixツール、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

またはsleepは:(no-op)に置き換えることができますが、アクティブな待機状態になります。


これは非常に近いです-「インスタンスの数が変更された場合にのみ印刷し、それ以外の時間には印刷しないでください。」
darrylyeo

ただ修正を@darrylyeoが、睡眠の100msにも、短いソリューションを探していましたが、時間を持っていなかった、私は長いソリューションを持っていますが
ナウエル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:

ここに画像の説明を入力してください

さらにゴルフをすることへの考え:

説明を書いているObservableListときにListChangeListener、add / remove-のためだけに使用し、そのコンテンツをまったく使用しないことに気付きました。これを削除して、別のタイプの静的リスナーを使用すると、短くなる場合があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.