มีอินสแตนซ์กำลังทำงานกี่อินสแตนซ์


13

เขียนโปรแกรมที่ทำงานอยู่เรื่อย ๆ เพื่อรายงานจำนวนอินสแตนซ์ของตัวเองที่กำลังทำงานอยู่ แต่ละอินสแตนซ์ของโปรแกรมควรรายงานลำดับที่เปิดจากอินสแตนซ์ที่กำลังทำงานอยู่ทั้งหมด

ตัวอย่าง

ผู้ใช้เปิดตัวโปรแกรมเป็นครั้งแรก - เราจะเรียกอินสแตนซ์นี้ว่า 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/51/4
  • 2/52/4
  • 3/5 → (ยกเลิก)
  • 4/53/4
  • 5/54/4

กฎระเบียบ

  • คุณสามารถส่งออกตัวเลขสองตัว (หมายเลขอินสแตนซ์, อินสแตนซ์รวม) ในรูปแบบที่เหมาะสม
  • เมื่อใดก็ตามที่มีการเปิดใช้งานหรือยกเลิกอินสแตนซ์อื่น ๆ ทั้งหมดจะต้องอัปเดตผลลัพธ์ที่เกี่ยวข้องภายใน 100 มิลลิวินาที
  • หากคุณเลือกที่จะอัปเดตผลลัพธ์โดยการพิมพ์เป็นบรรทัดใหม่ (หรือรูปแบบเอาต์พุต "ต่อท้าย" อื่น ๆ ที่ไม่ใช่การแทนที่) คุณต้องพิมพ์เฉพาะเมื่อจำนวนอินสแตนซ์เปลี่ยนแปลงและไม่ใช่เวลาอื่น
  • นี่คือรหัสกอล์ฟ โปรแกรมที่สั้นที่สุดเป็นไบต์ชนะ
  • ในคำตอบของคุณคุณควรระบุสิ่งที่ผู้ใช้ต้องทำเพื่อเปิดมากกว่าหนึ่งอินสแตนซ์และ / หรือบันทึก screencast เพื่อสาธิต

ใครมีคำแนะนำสำหรับแท็กที่จะรวม?
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~0T hread  ทั้งหมดNum bers ยกเว้นหมายเลข0(REPL)

   n← เก็บเป็น n

    การเรียงสับเปลี่ยนซึ่งจะเรียงลำดับจากน้อยไปมาก

  ตอนนี้เรามีเธรดที่ใช้งานอยู่ตามลำดับ

  ⍵≡ ถ้าข้อโต้แย้งนั้นเหมือนกันกับ ...

  : แล้ว:

   ∇⍵ หางเรียกคืนจากการโต้แย้ง

   อื่น:

   ⊢/n หมายเลขเธรดที่อยู่ขวาสุด

   ⎕TID, นี้T hread ของID (หมายเลขด้าย) ใช้ได้กับที่

   n⍳ หาสิ่งที่ɩ 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และฉันดำเนินการได้โดยใช้ (ฉันเปิดรับข้อเสนอแนะใหม่)

ฉันใช้ไลบรารีขวดเพื่อเรียกใช้เซิร์ฟเวอร์ mini http ของฉันเองเพื่อให้อินสแตนซ์ที่แตกต่างกันทั้งหมดสามารถสื่อสารกันได้ ฉันคิดว่าฉันสามารถใช้ซ็อกเก็ตได้แม้ว่าฉันจะไม่เชื่อว่าจะลดจำนวนไบต์ลง

ฉันมีสองไฟล์แยกและ s เซิร์ฟเวอร์สั้นและเนื่องจากปรากฏในรหัสฉันจึงคิดว่าฉันควรตั้งชื่อให้สั้นที่สุดmain.pys

API การสื่อสารของเว็บเซิร์ฟเวอร์

เว็บเซิร์ฟเวอร์ยอมรับเฉพาะคำขอ POST และตอบกลับอินพุตภายในเนื้อความของ POST เท่านั้น

คำขอทั้งหมดดำเนินการผ่าน/(หรือlocalhost/)

อินพุตที่ถูกต้อง:

  • * ในโพสต์เนื้อความจะขอให้เซิร์ฟเวอร์ส่งคืนรหัสใหม่เพื่อกำหนดไคลเอ็นต์
  • -<id> ในส่วนของโพสต์จะลบรหัสออกจากรายการที่ใช้งานอยู่ของ ID ลดรหัสที่เกี่ยวข้องทั้งหมดและจำนวนรวม
  • คำขอที่ว่างเปล่าในส่วนของการโพสต์จะส่งคืนสตริงว่างเปล่า นี่คือสิ่งที่ใช้สำหรับการทดสอบเพื่อดูว่าเซิร์ฟเวอร์ออนไลน์

ปิดโปรแกรม

ฉันใช้หลายเธรดเพื่อให้การปิดโปรแกรมนั้นง่ายเหมือนการกด Enter

กำลังเปิดโปรแกรม

หากคุณไม่ได้ติดตั้ง Python อย่างถูกต้องภายในตัวแปรสภาพแวดล้อมของคุณเพียงแค่สร้าง.batไฟล์และวางไว้ในโฟลเดอร์เดียวกับmain.pyและsด้วยรหัสต่อไปนี้ (ถ้าคุณติดตั้ง Python สำหรับผู้ใช้ทั้งหมดอาจเป็นตำแหน่งอื่น):

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

เครดิต

จาก 694-691 ไบต์อดัม


คุณลบ:8080/ไม่ได้ใช่ไหม
อดัม

ถ้าฉันจะกำหนดพอร์ตให้พอร์ต 80 แล้วใช่ ไม่เช่นนั้น พอร์ตเริ่มต้นสำหรับ webbrowsers (และการร้องขอ) เป็นพอร์ต 80 /แต่ฉันสามารถลบ
Neil

@ Adam ฉันได้ทำการอัพเดตด้วยการเปลี่ยนแปลงพอร์ตบันทึก 1 ไบต์ด้วยวิธีนี้
Neil

1

sh + linux / unix tools, 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

หรือสลีปสามารถถูกแทนที่ด้วย:(ไม่ใช้) แต่มันจะทำให้การรอคอย


นี่ใกล้มาก - "คุณจะต้องพิมพ์เฉพาะเมื่อจำนวนครั้งที่มีการเปลี่ยนแปลงเท่านั้นและไม่ใช่เวลาอื่น"
darrylyeo

@Darrylyeo เพิ่งแก้ไขได้ แต่กำลังมองหาวิธีแก้ปัญหาที่สั้นกว่า แต่ไม่มีเวลานอน 100 มิลลิวินาทีฉันมีวิธีแก้ปัญหา แต่นานกว่า
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 ของตนเอง จำนวนรวมของอินสแตนซ์ที่เหลือ; ไม่ว่าจะเป็นการลบที่เกิดขึ้น; และโปรแกรมใดได้ปิด

เซิร์ฟเวอร์เป็นเพียง wrapper-class เพื่อเริ่มและหยุดโปรแกรม เมื่อผู้ใช้ป้อนข้อมูล0ก็จะเริ่มต้นโปรแกรมใหม่ เมื่อใช้แล้วป้อนจำนวนเต็มบวก (เช่น2) มันจะปิดโปรแกรมด้วยรหัสนั้น (หมายเหตุ: S.jar มี M.jar เป็นไลบรารีเพื่อเข้าถึง)

Gif เพื่อดูการทำงาน:

ป้อนคำอธิบายรูปภาพที่นี่

ความคิดที่จะตีกอล์ฟต่อไป:

ฉันเพิ่งสังเกตุในขณะที่เขียนคำอธิบายว่าฉันใช้เพียงObservableListเพื่อเพิ่ม / ลบListChangeListener- และไม่ใช้เนื้อหาของมันเลย การลบสิ่งนี้และการใช้ฟังแบบคงที่ชนิดอื่นอาจสั้นกว่า

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.