Kaç örnek çalışıyor?


13

Şu anda kaç örneğinin çalıştığını bildiren süresiz çalışan bir program yazın. Programın her bir vakası, o anda çalışan diğer tüm örneklerden açılma sırasını da rapor etmelidir.

Misal

Kullanıcı programı ilk kez başlatır - bu Örnek 1'i çağırırız. Örnek 1 görüntülenir 1/1, çünkü halihazırda çalışmakta olan toplam 1 örnekten başlatılacak ilk örnektir.

Örnek 1 çalışırken, kullanıcı Örnek 2 olmak için programı ikinci kez başlatır. Örnek 1 şimdi görüntülenir 1/2ve şu anda çalışan toplam 2 örneğin ilk örneğidir. Örnek 2 görüntülenir , çünkü şu anda çalışan toplam 2 örneğin ikinci örneğidir.2/2

Kullanıcının 5 tane olana kadar daha fazla örnek oluşturmaya devam ettiğini varsayalım . Lansman için, onların çıkışları şunlardır: 1/5 2/5 3/5 4/5 5/5.

Şimdi, kullanıcının Örnek 3'ü sonlandırmaya karar verdiğini varsayalım. Örnek 4 daha sonra yeni Örnek 3 ve Örnek 5 yeni Örnek 4 olur, çünkü bunlar şu anda toplam 4 olan sürümden başlatılan üçüncü ve dördüncü örneklerdir. örnekleri. Yani her bir örneğin çıktıdaki değişimi aşağıdaki gibi olacaktır:

  • 1/51/4
  • 2/52/4
  • 3/5 → (Sonlandırıldı)
  • 4/53/4
  • 5/54/4

kurallar

  • İki sayıyı (örnek numarası, toplam örnek) makul bir biçimde çıktılayabilirsiniz.
  • Bir örnek başlatıldığında veya sonlandırıldığında, diğer tüm örneklerin ilgili çıktılarını 100 milisaniye içinde güncellemesi gerekir.
  • Çıktıyı yeni bir satıra (veya başka bir "ekleyen" çıktı biçimine; değiştirmenin aksine) yazdırarak güncellemeyi seçerseniz, başka bir zaman değil, yalnızca örnek sayısı değiştiğinde yazdırmanız gerekir.
  • Bu kod golf. Bayt cinsinden en kısa program kazanır.
  • Yanıtınızda, kullanıcının birden fazla örneği açmak için ne yapması gerektiğini belirtmeniz ve / veya göstermek için bir ekran görüntüsü kaydetmeniz önerilir.

Herkes etiket eklemek için önerileriniz var mı?
darrylyeo

Böyle bir program işletim sistemine özgü olacaktır.
user202729

"Bir örnek başlatıldığında veya sonlandırıldığında, diğer tüm örnekler 100 milisaniye içinde ilgili çıktılarını güncellemelidir." yardım)?
Jonathan Allan

@Ouros süreç birlikte çalışması işletim sisteminden bağımsız olamaz
edc65

Yanıtlar:


3

APL (Dyalog Unicode) , 39 bayt SBCS

Anonim önek işlevi. Kukla argüman (boş sayısal vektör) üzerinde yumurtlayarak arayın , yani f&⍬. Şu anda iş parçacığı ile çalışan sorgu ⎕TNUMSve bir veya daha fazla iş parçacığı ile öldür ⎕TKILL n. İş parçacığı işlemci süresi alır almaz çıktı değişikliklerini [kendi numarası, toplam sayı] yani hemen alır.

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

Çevrimiçi deneyin!

{} Anonim lambda argüman nerede (başlangıçta boş sayısal vektör)

n[] Dizini n(tanımlanacak):

  ⎕TNUMS~0 Tüm T hread Num sayısı hariç yle 0(REPL)

   n← olarak depola n

    artan sıralamada permütasyon

  şimdi sırayla aktif iş parçacıkları var

  ⍵≡ eğer argüman bununla aynıysa ...

  : sonra:

   ∇⍵ tartışmada kuyruk çağı

   Başka:

   ⊢/n en sağdaki iplik numarası

   ⎕TID, Bu T hread en İD (iplik sayısı) edilene önüne

   n⍳ bulmak ɩ Bu ikisinden ndices

   ⎕← bunu STDOUT'a yazdır

   n⊣ lehine atın n

    bununla ilgili


2

Python 3, 694 691 bayt

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 kısaltması)

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

Neden bu kadar uzun?

Ne yazık ki, bu işlevsellik Python'da yerleşik görünmüyor. Çok işlemciliği kullanmak için cazip davrandım, ancak yaptığımız şey için tam olarak uygun görünmüyordu (bir kullanıcının herhangi bir yerden bir program açmasına izin vermek).

Bu yüzden, gördüğüm (bağlantıyı yanlış yerleştirdim) bir StackOverflow yazısının tavsiyesini aldım ve kullanarak uyguladım bottle. (Yeni önerilere açığım).

Bottle kütüphanesini kendi mini http sunucumu çalıştırmak için kullandım, böylece tüm farklı örnekler birbirleriyle iletişim kurabilsin. Sanırım bir soket kullanabilirdim, ancak bayt sayısını azaltacağına ikna olmadım.

İki ayrı dosyam var sve main.py. ssunucu kısa ve kodda göründüğünden, adı olabildiğince kısa yapmalıyım diye düşündüm.

İletişim Web Sunucusu API'sı

Web sunucusu yalnızca POST isteklerini kabul eder ve yalnızca POST gövdesindeki girdilere yanıt verir.

Tüm istekler geçer /(veya localhost/).

Geçerli giriş:

  • * yazı gövdesinde, sunucunun istemciyi atamak için yeni bir kimlik döndürmesini isteyecektir.
  • -<id> gönderi gövdesinde kimliği, ilgili tüm kimlikler ve toplam sayıyı azaltarak etkin kimlik listesinden kaldıracaksınız.
  • Gönderi gövdesindeki boş bir istek, boş bir dize döndürür. Sunucunun çevrimiçi olup olmadığını test etmek için kullanılan budur.

Programın kapatılması

Çoklu iş parçacığını uyguladım, böylece programı kapatmak enter tuşuna basmak kadar basit.

Programın açılması

Eğer çevresel değişkenler içine doğru Python kurulumu yoksa sadece oluşturmak .batdosyası ve aynı klasöre koyun main.pyve s(farklı yerde olabilir, tüm kullanıcılar için Python yüklüyse) şu kodla:

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

Kredi

694-691 byte arası Adám .


Çıkaramaz mısın :8080/?
17'de

Bağlantı noktasını bağlantı noktası 80'e atayacak olsaydım, evet; aksi takdirde hayır. Webbrowsers (ve istekleri) için varsayılan bağlantı noktası 80 bağlantı noktasıdır, ancak /.
Neil

@ Adám Bu işlemi 1 bayt kaydederek port değişikliği ile güncelledim.
Neil

1

sh + linux / unix araçları, 128 bayt

uyku kayan nokta sayılarını destekliyorsa

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

aksi takdirde 159 bayt

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

veya uyku :(no-op) ile değiştirilebilir , ancak aktif bekleme yapar.


Bu gerçekten çok yakın - "Başka bir zaman değil, yalnızca örnek sayısı değiştiğinde yazdırmalısınız."
darrylyeo

@darrylyeo sadece düzeltmek, ama daha kısa bir çözüm arıyordu ama 100ms uyku için de zaman yoktu, bir çözüm var ama daha uzun
Nahuel Fouilleul 11:17 '

0

Java 8, (199 + 301 =) 500 bayt

M.jar: (ana program)

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: (program akışını kontrol eden sunucu)

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

Kodun açıklaması:

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

Genel açıklama:

Tüm programlar kendi kimliklerinin kaydını tutacaktır; kalan toplam örnek sayısı; kaldırmanın gerçekleşip gerçekleşmediği; ve hangi programların kapatıldığını.

Sunucu, programları başlatmak ve durdurmak için yalnızca bir sarıcı sınıfıdır. Bir kullanıcı girdiğinde 0, yeni bir program başlatır. Kullanılan pozitif bir tamsayı (yani 2) girdiğinde, programı bu kimlikle kapatır. (Not: S.jar'a erişmek için M.jar kütüphanesi vardır.)

Eylem görmek için Gif:

resim açıklamasını buraya girin

Daha da golf oynamak için düşünceler:

Ben sadece ObservableListonun add / remove- için kullandığım açıklamasını yazarken fark ettim ListChangeListenerve içeriğini hiç kullanmıyorum. Bunu kaldırmak ve başka bir tür statik dinleyici kullanmak daha kısa olabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.