Có bao nhiêu trường hợp đang chạy?


13

Viết chương trình chạy vô thời hạn báo cáo có bao nhiêu phiên bản hiện đang chạy. Mỗi phiên bản của chương trình cũng phải báo cáo thứ tự được mở ra khỏi tất cả các phiên bản hiện đang chạy khác.

Thí dụ

Người dùng khởi chạy chương trình lần đầu tiên - chúng tôi sẽ gọi Instance 1. Instance 1 hiển thị 1/1, vì đây là phiên bản đầu tiên được khởi chạy trong tổng số 1 phiên bản hiện đang chạy.

Trong khi Instance 1 đang chạy, người dùng khởi chạy chương trình lần thứ hai để trở thành Instance 2. Instance 1 hiện hiển thị 1/2, là phiên bản đầu tiên trong tổng số 2 phiên bản hiện đang chạy. Trường hợp 2 hiển thị 2/2, vì đây là phiên bản thứ hai trong tổng số 2 phiên bản hiện đang chạy.

Giả sử người dùng tiếp tục sinh ra nhiều phiên bản hơn cho đến khi có 5 người trong số họ. Theo thứ tự khởi chạy, đầu ra của chúng là : 1/5 2/5 3/5 4/5 5/5.

Bây giờ, giả sử người dùng quyết định chấm dứt Instance 3. Instance 4 sau đó trở thành Instance 3 mới và Instance 5, Instance 4 mới, bởi vì chúng lần lượt là các phiên bản thứ bathứ tư đã được đưa ra trong tổng số 4 trường hợp. Vì vậy, thay đổi đầu ra của mỗi trường hợp sẽ như sau:

  • 1/51/4
  • 2/52/4
  • 3/5 → (Chấm dứt)
  • 4/53/4
  • 5/54/4

Quy tắc

  • Bạn có thể xuất hai số (số thể hiện, tổng số thể hiện) ở bất kỳ định dạng hợp lý nào.
  • Bất cứ khi nào một phiên bản được khởi chạy hoặc kết thúc, tất cả các phiên bản khác phải cập nhật kết quả đầu ra tương ứng của chúng trong vòng 100 mili giây.
  • Nếu bạn chọn cập nhật đầu ra bằng cách in sang một dòng mới (hoặc định dạng đầu ra "nối thêm" khác, thay vì thay thế), bạn phải chỉ in khi số lượng phiên bản thay đổi, và không phải lúc nào khác.
  • Đây là mã golf. Chương trình ngắn nhất trong byte thắng.
  • Trong câu trả lời của bạn, bạn được khuyến khích chỉ định những gì người dùng phải làm để mở nhiều hơn một thể hiện và / hoặc ghi lại một đoạn ghi hình để chứng minh.

Bất cứ ai có đề xuất cho các thẻ để bao gồm?
darrylyeo

Một chương trình như vậy sẽ dành riêng cho hệ điều hành.
dùng202729

Là "Bất cứ khi nào một phiên bản được khởi chạy hoặc kết thúc, tất cả các phiên bản khác phải cập nhật kết quả đầu ra tương ứng trong vòng 100 mili giây" ngay cả trong tầm kiểm soát của chúng tôi, chúng tôi phải dựa vào HĐH để giao tiếp (và thực tế là chúng tôi có thể sinh ra nhiều, nhiều quá trình có thể ' t giúp)?
Jonathan Allan

Quá trình tương tác @Ouros không thể độc lập với HĐH
edc65

Câu trả lời:


3

APL (Dyalog Unicode) , 39 byte SBCS

Hàm tiền tố ẩn danh. Gọi bằng cách sinh ra trên đối số giả (vectơ số trống), nghĩa là f&⍬. Truy vấn hiện đang chạy các chủ đề với ⎕TNUMSvà giết một hoặc nhiều chủ đề với ⎕TKILL n. Đầu ra của chủ đề thay đổi theo [số riêng, tổng số] ngay khi chúng nhận được thời gian xử lý, tức là khá nhiều ngay lập tức.

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

Hãy thử trực tuyến!

{... } lambda anonymous nơi là lập luận (ban đầu , vector số trống)

n[... ] chỉ số n(được xác định) với:

  ⎕TNUMS~0 tất cả T hread Num bers trừ số 0(REPL)

   n← lưu trữ như n

    hoán vị sẽ sắp xếp tăng dần

  bây giờ chúng ta có các chủ đề hoạt động theo thứ tự

  ⍵≡ nếu đối số giống hệt với điều đó

  : sau đó:

   ∇⍵ đuôi tái diễn trên đối số

   khác:

   ⊢/n số luồng ngoài cùng bên phải

   ⎕TID, này T hread của ID (số thread) thêm vào phía trước mà

   n⍳ tìm ra ɩ ndices của hai

   ⎕← in nó ra STDOUT

   n⊣ loại bỏ mà ủng hộ n

    tái diễn về điều đó


2

Python 3, 694 691 byte

chính

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 (viết tắt của 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")

Tại sao nó quá dài?

Thật không may, chức năng này dường như không được tích hợp vào Python. Tôi đã cố gắng sử dụng đa xử lý, nhưng điều đó dường như không phù hợp với những gì chúng tôi đang làm (cho phép người dùng mở một chương trình từ bất cứ đâu).

Vì vậy, tôi đã lấy lời khuyên của một bài đăng StackOverflow mà tôi thấy (tôi đã đặt nhầm liên kết) và tôi đã triển khai nó bằng cách sử dụng bottle. (Tôi đang mở để đề xuất mới).

Tôi đã sử dụng thư viện Chai để chạy máy chủ http nhỏ của riêng mình để tất cả các phiên bản khác nhau có thể giao tiếp với nhau. Tôi cho rằng tôi có thể đã sử dụng một ổ cắm, mặc dù tôi không tin rằng điều đó sẽ làm giảm số lượng byte.

Tôi có hai tập tin riêng biệt, smain.py. sthiếu máy chủ và vì nó xuất hiện trong mã, tôi nghĩ rằng tôi nên đặt tên càng ngắn càng tốt.

API của máy chủ web truyền thông

Máy chủ web chỉ chấp nhận các yêu cầu POST và chỉ phản hồi đầu vào bên trong cơ thể của POST.

Tất cả các yêu cầu đi qua /(hoặc localhost/).

Đầu vào hợp lệ:

  • * trong phần thân bài sẽ yêu cầu máy chủ trả về id mới để gán máy khách.
  • -<id> trong phần thân bài sẽ xóa id khỏi danh sách id đang hoạt động, giảm tất cả id có liên quan và tổng số.
  • Một yêu cầu trống trong phần thân bài sẽ chỉ trả về một chuỗi rỗng. Đây là những gì được sử dụng để thử nghiệm để xem máy chủ có trực tuyến không.

Kết thúc chương trình

Tôi đã triển khai đa luồng nên việc đóng chương trình cũng đơn giản như nhấn enter.

Khai mạc chương trình

Nếu bạn không có thiết lập một cách chính xác Python bên trong biến môi trường của bạn chỉ cần tạo một .battập tin và đặt nó trong cùng thư mục với main.pysvới đoạn mã sau (nếu bạn cài đặt Python cho tất cả người sử dụng, nó có thể là tại một địa điểm khác nhau):

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

Tín dụng

Từ 694 đến 691 byte Adám .


Bạn không thể loại bỏ :8080/?
Adám

Nếu tôi chỉ định cổng cho cổng 80, thì có; mặt khác, không Cổng mặc định cho webbrowsers (và yêu cầu) là cổng 80, nhưng tôi có thể xóa /.
Neil

@ Adám Tôi đã cập nhật nó với thay đổi cổng, lưu 1 byte theo cách đó.
Neil

1

công cụ sh + linux / unix, 128 byte

nếu giấc ngủ hỗ trợ số dấu phẩy động

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

mặt khác, 159 byte

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

hoặc giấc ngủ có thể được thay thế bằng :(no-op), nhưng nó sẽ khiến hoạt động chờ đợi.


Điều này thực sự rất gần - "Bạn phải in chỉ khi số lượng phiên bản thay đổi, và không phải bất kỳ lúc nào khác."
darrylyeo

@darrylyeo chỉ sửa, nhưng đang tìm giải pháp ngắn hơn nhưng không có thời gian, cũng để ngủ 100ms, tôi có giải pháp nhưng lâu hơn
Nahuel Fouilleul 11/12/17

0

Java 8, (199 + 301 =) 500 byte

M.jar: (chương trình chính)

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: (máy chủ để điều khiển luồng chương trình)

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);}}}}

Giải thích về mã:

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

Giải thích chung:

Tất cả các chương trình sẽ giữ một bản ghi id riêng của họ; tổng số trường hợp còn lại; liệu một loại bỏ xảy ra; và những chương trình đã đóng cửa.

Máy chủ chỉ là một lớp bao bọc để bắt đầu và dừng chương trình. Khi người dùng nhập vào 0, nó sẽ khởi động một chương trình mới. Khi sử dụng đầu vào một số nguyên dương (nghĩa là2 ), nó sẽ đóng chương trình với id đó. (Lưu ý: S.jar có M.jar là thư viện để truy cập nó.)

Gif để xem nó trong hành động:

nhập mô tả hình ảnh ở đây

Suy nghĩ để chơi golf hơn nữa:

Tôi vừa nhận thấy trong khi viết lời giải thích rằng tôi chỉ sử dụng ObservableListcho nó thêm / xóa- ListChangeListenervà hoàn toàn không sử dụng nội dung của nó. Loại bỏ cái này và sử dụng một loại Listener tĩnh khác có thể ngắn hơn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.