पुलिस और लुटेरे


11

हर कोई हमेशा कॉनवे के गेम ऑफ लाइफ को लागू करना चाहता है। यह ऊबाऊ है! चलो बजाय पुलिस और लुटेरों!

आपके पास दो टीमें होंगी: पुलिस और लुटेरे। प्रत्येक टीम में 50 स्वास्थ्य के साथ 5 सदस्य हैं। कार्यक्रम लगातार लूप होगा। प्रत्येक पुनरावृत्ति, निम्नलिखित घटित होगी:

  • प्रत्येक टीम के लिए, (पहले अक्षर मुद्रित Cपुलिस के लिए, Rलुटेरों के लिए), एक जगह है, सदस्यों की हिमाचल प्रदेश के एक अंतरिक्ष अलग की गई सूची, और एक नई पंक्ति। यह टीमों की स्थिति है। दोनों हो जाने के बाद, एक और नई लाइन प्रिंट करें। उदाहरण के लिए, यहाँ यह पहले दौर की तरह लग सकता है:

    C 50 50 50 50 50
    R 50 50 50 50 50
    
  • 1 से 10 तक यादृच्छिक संख्या चुनें (दोनों 1 और 10 सहित)। हम नंबर पर कॉल करेंगे N। अगर Nहै भी, तो लुटेरे इस चक्कर में हार जाते हैं; यदि विषम है, तो पुलिस खो जाती है।

  • हारने वाली टीम का एक यादृच्छिक सदस्य चुनें जिसका एचपी 0 से अधिक हो और Nएचपी को घटाएं । सदस्यों के एचपी को स्थिति पर 0 से नीचे कभी नहीं जाना चाहिए।

  • लूप को पुनरारंभ करें।

खेल तब समाप्त होता है जब एक टीम के सभी सदस्य अपने सभी एचपी को खो देते हैं। यदि पुलिस जीत जाती है, तो निम्नलिखित को मुद्रित किया जाएगा:

C+
R-

और अगर लुटेरे जीत जाते हैं:

R+
C-

यह कोड गोल्फ है, इसलिए सबसे कम संख्या में पात्र जीतते हैं।

यहाँ अजगर 2 में एक नमूना कार्यान्वयन है:

import random

cops = [50]*5
robbers = [50]*5

while any(cops) and any(robbers):
    # print the status
    print 'C', ' '.join(map(str, cops))
    print 'R', ' '.join(map(str, robbers))
    print
    # pick N
    N = random.randint(1, 10)
    # pick the losing team (robbers if N is even, else cops)
    losers = robbers if N % 2 == 0 else cops
    # pick a member whose HP is greater than 0
    losing_member = random.choice([i for i in range(len(losers)) if losers[i]])
    losers[losing_member] -= N
    # make sure the HP doesn't visibly drop below 0
    if losers[losing_member] < 0: losers[losing_member] = 0

if any(cops):
    # robbers lost
    print 'C+'
    print 'R-'
elif any(robbers):
    # cops lost
    print 'C-'
    print 'R+'

लघु विडंबना: इस साइट पर 3176+ प्रश्नों में से 11 से अधिक टैग नहीं हैं game-of-life
Sanchises

3
@sanchises विस्तारित विडंबना: और 14 टैग किए गए हैं cops-and-robbers!
रनर ११२

@sanchises मैं काफी हद तक सामान्य रूप से प्रोग्रामिंग का उल्लेख कर रहा था (उदाहरण के लिए "मेरी मदद करो! मैं कॉनवे के जीवन के खेल को लागू करने की कोशिश कर रहा हूं!") ... लेकिन यह अभी भी बहुत विडंबना है।
kirbyfan64sos 20

@ kirbyfan64sos मुझे पता है (वहाँ किया गया था, वह), लेकिन यह ठीक उसी तरह की साइट है जहाँ लोग जाने के बाद वे GoL को लागू करते हैं और अधिक चाहते हैं ... वैसे भी, शायद मैं इस पर जाऊंगा> <> अगर मैं ऐसा कर सकता हूँ देखते हैं।
सांचेस

मैंने CnR टैग को फिर से हटा दिया है। यहाँ के आसपास, इस टैग का एक बहुत ही विशिष्ट अर्थ है और उन चुनौतियों का वर्णन करता है जहाँ वास्तव में दो हैं (जरूरी नहीं कि असंतुष्ट) पार्टियां कुछ कार्यों पर एक दूसरे के खिलाफ प्रतिस्पर्धा कर रही हैं (उस टैग के साथ अन्य चुनौतियों के चारों ओर नज़र डालें)।
मार्टिन एंडर

जवाबों:


3

सीजेएम, 86 बाइट्स

मुझे पार्टी में थोड़ी देर हो गई है, लेकिन मैं CJam का उपहार ले आया हूँ! ... अरे रुकिए, आप कहां जा रहे हैं?

50aA*{"CR"1$+2/zSf*Nf+oNoAmr{_AmrE&+:P2$=:H!}gPH@)-Ue>t_2/z::+0#:L)!}g;'CL'+'-?N'R2$6^

इसे ऑनलाइन आज़माएं।

व्याख्या

जैसा कि सवाल एक सीधी प्रक्रिया का अनुकरण करने के लिए कहता है, यह एक अपेक्षाकृत सीधा जवाब है। शायद मेरे द्वारा बनाई गई एक दिलचस्प पसंद दोनों टीमों के स्वास्थ्य को एक ही सूची में वर्गीकृत करना था। यह दो अलग-अलग सूचियों में बदलने के लिए 3 बाइट्स का खर्च होता है, जो किसी टीम के हारने पर स्वास्थ्य प्रदर्शन और जाँच दोनों के लिए आवश्यक है। लेकिन (मुझे लगता है) यह 2 बाइट्स द्वारा इनिशियलाइज़ेशन में बचाए गए और बहुत सरल नुकसान से निपटने वाले लॉजिक के लिए बना है।

50aA*           "Initialize the health list to 10 copies of 50. Even indices
                 hold the health of cops and odd indices hold the health of
                 robbers.";
{               "Do:";
  "CR"1$+2/z      "Split the health list into the two teams for output, adding
                   the corresponding team letter to the start of each.
                       [a b c d e f g h i j]
                    -> [['C a c e g i] ['R b d f h j]]";
  Sf*Nf+          "Insert a space between each element in each team health list
                   and append a newline to the end of each team health list.";
  oNo             "Print the health status for each team and an extra newline.";
  Amr             "Generate the damage amount minus one. If the damage amount is
                   even (robbers lose), then this is odd and aligns with robbers
                   being at odd indices in the health list, and vice versa.";
  {               "Do:";
    _AmrE&+:P       "Add a random even number from [0, 10) to the damage amount
                     minus one. This value modulo the size of the health list
                     (10) selects a person on the losing team to be damaged.";
    2$=:H!
  }g              "... While the selected person's health is zero.";
  PH@)-Ue>t       "Set the damaged person's new health to the maximum of their
                   current health minus the damage amount and zero.";
  _2/z::+0#:L     "Split the health list into the two teams, sum each team's
                   health, and search for a team's health equal to zero.";
  )!
}g              "... While no team's health was found equal to zero.";
;               "Discard the health list.";
'C              "Produce a 'C'.";
L'+'-?          "Produce a '+' if team 1 (robbers) lost, or '-' otherwise.";
N               "Produce a newline.";
'R              "Produce an 'R'.";
2$6^            "Produce the opposite of the sign produced before.";
                "Implicitly print these final results.";

3

आर - 201

S=sum
Z=sample
C=R=rep(50,5)
while(S(R)*S(C)){cat("C",C,"\nR",R,"\n\n")
N=Z(10,1)
F=function(x,i=Z(rep(which(x>0),2),1)){x[i]=max(0,x[i]-N);x}
if(N%%2)R=F(R)else C=F(C)}
cat(c("R+\nC-\n","C+\nR-\n")[1+!S(R)])

साथ ही rep(which(x>0),2)सिर्फ विरोध क्यों which(x>0)?
मिकी टीटी

1) मैं ईओएल वर्णों की गिनती कर रहा हूं, हालांकि पिछले एक नहीं। 2) sum(R*C)और sum(R)*sum(C)एक ही चीज नहीं हैं। उदाहरण के लिए, यदि आप C = c (0,0,0,10,10) और R = c (10, 10, 10, 0, 0) से बाहर नहीं निकलना चाहेंगे। उस स्थिति में, मैं असाइन करके सेव करता हूं S=sum। 3) के साथ समस्या यह sampleहै कि अगर पहले तर्क एक संख्या है, जैसे है sample(5, 1), तो यह कर के रूप में ही किया जाएगा sample(1:5, 1)हमेशा लौटने के बजाय: 5, इसे से किसी भी संख्या वापस आ जाएगी 1करने के लिए 5। तो sample(rep(x, 2), 1)मेरी चाल हमेशा के लिए xजब भी मामले में एक नंबर लेने के लिए length(x)है 1
फ्लोडेल

माफ़ कीजियेगा मेरी बुर… जाहिर सी बात है कॉफ़ी नहीं। प्रतिनिधि () चाल पर स्पष्टीकरण के लिए धन्यवाद। मैंने सोचा कि एक कारण होना चाहिए, बस इसे देख नहीं सका
मिकटी

2

APL (Dyalog) (101)

∇K
S←2 5⍴50
→6/⍨~∧/J←∨/S>0
⎕←3↑'CR',0⌈S
S[L;M[?⍴M←(0<S[L←1+~2⊤N;])/⍳5]]-←N←?10
→2
⎕←'CR',⍪'+-'⌽⍨J⍳0
∇

स्पष्टीकरण:

  • S←2 5⍴50: शुरुआत में, S5-बाय -2 मैट्रिक्स पर सेट करें जहाँ प्रत्येक मान 50 है। मैट्रिक्स की शीर्ष पंक्ति पुलिस का प्रतिनिधित्व करती है, दूसरी पंक्ति लुटेरों का प्रतिनिधित्व करती है।
  • J←∨/S>0: मैट्रिक्स की प्रत्येक पंक्ति के लिए, Jयह सुनिश्चित करें कि कोई भी HP शून्य से बड़ा है या नहीं।
  • →6/⍨~∧/J: यदि दोनों टीमों में जीवित सदस्य नहीं हैं, तो लाइन 6. पर जाएं (अंत)
  • ⎕←3↑'CR',0⌈S: मैट्रिक्स में प्रत्येक मान के लिए, इसका अधिकतम उत्पादन करें और 0, पहली पंक्ति के लिए एक 'C' और दूसरी के लिए एक 'R', और एक तीसरी (खाली) लाइन जोड़ें।
  • N←?10: अंतराल [1,10] में एक यादृच्छिक संख्या प्राप्त करें और इसे स्टोर करें N
  • L←1+~2⊤N: सेट L(खोने वाली टीम) 1यदि संख्या विषम थी और 2यदि यह थी भी।
  • M←(0<S[L... ;])/⍳5: उस टीम के जीवित सदस्यों के संकेत प्राप्त करें, और उन्हें स्टोर करेंM
  • M[?⍴M... ]: से एक यादृच्छिक मान चुनेंM
  • S[L;M... ]-←N: Nचयनित टीम के सदस्य के मूल्य से घटाएं
  • →2: लाइन 2 पर जाएं (जीवित सदस्यों के लिए परीक्षा)
  • ⎕←'CR',⍪'+-'⌽⍨J⍳0: अंतिम स्थिति का उत्पादन, +जीतने वाली टीम के -सामने और हारने वाली टीम के सामने रखना।

नमूना उत्पादन


1

रूबी, 184

c,r=[p,p].map{('50 '*5).split}
puts([?C,*c]*' ',[?R,*r]*' ')while (u,v=[r,c].map{|a|a.shuffle.find{|x|x>?0}}).all?&&[u,v][rand(1..10)%2].sub!(/.+/){eval"#$&-1"}
puts u ?'R+
C-':'C+
R-'

1

गणितज्ञ, 246 241 बाइट्स

शायद आगे गोल्फ हो सकता है ...

a=ConstantArray[50,{2,5}];b=Or@@(#<1&)/@#&;c=Print;d=StringJoin@Riffle[IntegerString/@#," "]&;e=RandomInteger;Label@f;Which[b@a[[1]],c@"R+\nC-",b@a[[2]],c@"C+\nR-",True,c["C "<>d@a[[1]]<>"\nR "<>d@a[[2]]];a[[Mod[g=e@9+1,2]+1,e@4+1]]-=g;Goto@f]

1

PHP - 416 बाइट्स

मैं गोल्फ के लिए नया हूं और हालांकि यह चुनौती काफी आसान होगी। तो यहाँ है क्या मैं के साथ आया था।

<?$c=[50,50,50,50,50];$r=[50,50,50,50,50];while((array_sum($c)!=0)&&(array_sum($r)!=0)){$a="C ".join(" ",$c)."\n";$b="R ".join(" ",$r)."\n";echo$a,$b;$n=rand(1,10);$m=rand(0,4);if($n %2==0){while($r[$m]==0){$m=rand(0,4);}$r[$m]=$r[$m]-$n;if($r[$m]<0){$r[$m]=0;}}else{while($c[$m]==0){$m=rand(0,4);}$c[$m]=$c[$m]-$n;if($c[$m]<0){$c[$m]=0;}}if(array_sum($r)==0){echo"C+\nR-\n";}if(array_sum($c)==0){echo"R+\nC-\n";}}?>

स्पष्टीकरण के साथ:

<? 
$c=[50,50,50,50,50];$r=[50,50,50,50,50];                       populate Arrays
while((array_sum($c) != 0) && (array_sum($r) != 0)){           loop until on array sums up to 0
    $a="C ".join(" ",$c)."\n";                                 set cops health to a
    $b="R ".join(" ",$r)."\n";                                 set robbers health to b
    echo$a,$b;                                                 print cop and robber health
    $n=rand(1,10);                                             chose random n
    $m=rand(0,4);                                              chose random member
    if($n % 2 == 0){                                           check if n is even
        while($r[$m] == 0){ $m=rand(0,4); }                    loop until value m of array r is not 0
        $r[$m]=$r[$m]-$n;                                      lower health of member m
        if($r[$m] < 0){ $r[$m]=0; }                            if health goes below 0 set it to 0
    }else{
        while($c[$m] == 0){ $m=rand(0,4); }                    same as above
        $c[$m]=$c[$m] - $n;
        if($c[$m] < 0){$c[$m]=0;}
    }
    if(array_sum($r) == 0){ echo"C+\nR-\n"; }                  check if r array sums up to 0 and print that cops won
    if(array_sum($c) == 0){ echo"R+\nC-\n"; }                  check if c array sums up to 0 and print that robbers won
}
?>

मैं एक PHP उपयोगकर्ता नहीं हूं, लेकिन मुझे लगता है कि शायद आप != 0ऑपरेटर को हटाकर शून्य के बराबर होने के लिए चेक को हटाकर और बदलकर कुछ चार्ट काट देंगे !array_sum($r)
kirbyfan64sos

@ kirbyfan64sos काम नहीं करता है कि
टीमो

ओह। अधिकांश भाषाओं में, यह होगा।
kirbyfan64sos

1

सी, 390 384 371 बाइट्स

मेरा पहला गोल्फ, यदि कोई संभावित सुधार हैं, तो मुझे बताएं :)

गोल्फ संस्करण:

#include <time.h>
#include <stdio.h>
int p[10],j,r,c,w,N,x;int s(){r=c=0;for(j=5;j--;){c+=p[5+j];r+=p[j];}return !!r-!!c;}void t(){for(j=10;j--;)printf("%s %d",j-4?j-9?"":"\n\nC":"\nR",p[j]*=p[j]>0);}main(){srand(time(0));for(j=10;j--;)p[j]=50;t();while(!(w=s())){N=rand()%10+1;while(!p[x=N%2*5+rand()%5]);p[x]-=N;t();}N=(x=w<1?'C':'R')-w*15;printf("\n\n%c+\n%c-",x,N);}

कुछ असम्बद्ध संस्करण:

#include <time.h>
#include <stdio.h>
int p[10],j,r,c,w,N,x;

int s(){
    r=c=0;
    for(j=5;j--;){
        c+=p[5+j];
        r+=p[j];
    }
    return !!r-!!c;
}

void t(){
    for(j=10;j--;)printf("%s %d",j-4?j-9?"":"\n\nC":"\nR",p[j]*=p[j]>0);
}

main(){
    srand(time(0));
    for(j=10;j--;)p[j]=50;
    t();
    while(!(w=s())){
        N=rand()%10+1;
        while(!p[x=N%2*5+rand()%5]);
        p[x]-=N;
        t();
    }
    //w=-1 if cops won, w=1 if robbers won
    N=(x=w<1?'C':'R')-w*15;
    printf("\n\n%c+\n%c-",x,N);
}

संपादित करें: मुझे इसे थोड़ा छोटा करने और एक छोटा बग तय करने का एक तरीका मिला


एक छोटा सुधार: आप for(j=0;j<10;j++)एक छोटे संस्करण ( for(j=10;--j;)) के साथ छोरों (जैसे ) को बदल सकते हैं ।
kirbyfan64sos

आप पूरी तरह से सही हैं, "निश्चित" यह और कुछ मामूली अन्य चीजें, धन्यवाद।
मेटाफ़ोर्स

0

बैच - 396 बाइट्स

मुझे नहीं पता कि यह तकनीकी रूप से मायने रखता है - क्योंकि यह वास्तव में उस टीम के यादृच्छिक सदस्य का चयन नहीं करता है जिसका स्वास्थ्य 0 से अधिक है । यह सिर्फ एक यादृच्छिक सदस्य का चयन करता है, और यदि स्वास्थ्य घटाव 0 से कम संख्या उत्पन्न करता है, तो संख्या 0 हो जाती है।

@echo off&setLocal enableDelayedExpansion&for %%a in (C R)do for %%b in (1 2 3 4 5)do set %%a%%b=50
:a
set/aN=%RANDOM%*10/32768+1
set/ac=%N%/2*2
if %c%==%N% (set T=C&set L=R)else set T=R&set L=C
set/aG=%RANDOM%*5/32768+1
set/a%T%%G%-=%N%
for %%a in (C R)do set %%a=0&for %%b in (1 2 3 4 5)do (if !%%a%%b! LEQ 0 set %%a%%b=0
set/a%%a+=!%%a%%b!)
if %C% NEQ 0 if %R% NEQ 0 goto :a
echo !T!+&echo !L!-

आवश्यकता यह है कि मूल्य मुद्रित स्थिति पर 0 से नीचे कभी नहीं दिखाता है। मैंने जो उदाहरण दिखाया, मैंने वही किया।
kirbyfan64sos

0

जावास्क्रिप्ट: 410

function x(l){var t=this,o=t.p={n:l||"C",h:[50,50,50,50,50],s:function(){return o.h.reduce(function(a,b){return a+b})},r:function(){console.log(o.n+' '+o.h.join(' '))},d:function(m){while(o.h[z=~~(Math.random()*5)]<1){}o.h[z]=m>o.h[z]?0:o.h[z]-m}};o.r()}q=[new x(),new x('R')];while((c=q[0].p.s()>0)&&q[1].p.s()>0){q[(z=~~(Math.random()*10))%2].p.d(z);q[0].p.r();q[1].p.r()}console.log(c?'C+\r\nR-':'R+\n\rC-')

0

ऑक्टेव, 182 177 158 145 बाइट्स

145:

t=repmat(50,5);while prod(any(t))d=ceil(rand*10);c=2-mod(d,2);r=ceil(rand*5);t(r,c)-=d;t.*=t>0;end;p=2*any(t,1);['C-';'R+';'C+';'R-'](1+p:2+p,:)

मैंने यह जांचना छोड़ दिया कि क्या चरित्र की शूटिंग शून्य से ऊपर है - यह केवल महत्वपूर्ण होगा यदि हमें प्रत्येक मोड़ में राज्य प्रदर्शित करने के लिए मजबूर किया गया था - यहां हम आरएनजी से केवल एक यादृच्छिक संख्या को छोड़ रहे हैं, इसे और अधिक यादृच्छिक बना रहे हैं।

भी, प्रतिस्थापित

t=max(0,t)

छोटे के साथ

t.*=t>0


[नोट - यह 'सी + आर-' को बिना नई पंक्ति के छाप रहा है - यह 145 बाइट संस्करण में तय किया गया है]

158:

t=repmat(50,5);while prod(any(t))d=ceil(rand*10);c=2-mod(d,2);do r=ceil(rand*5);until t(r,c);t(r,c)-=d;t=max(0,t);end;p=4*any(t,1);disp('C-R+C+R-'(1+p:4+p))

Degolfed:

t=repmat(50,5);               #only first two columns (cops, robbers) relevant
while prod(any(t))
    d=ceil(rand*10);
    c=2-mod(d,2);
    do r=ceil(rand*5);until t(r,c);
    t(r,c)-=d;
    t=max(0,t);
end;
p=4*any(t,1);
disp('C-R+C+R-'(1+p:4+p))

मैं बदल repmat(50,5,2)गया repmat(5)- इसलिए हमारे पास 5x2 के बजाय अब 5x5 मैट्रिक्स है (अतिरिक्त 3 कॉलम एल्गोरिदम को प्रभावित नहीं करते हैं)। मुझे आउटपुट को कंप्रेस करने का एक तरीका भी मिला।

177:

t=repmat(50,5,2);while prod(sum(t))d=ceil(rand*10);c=2-mod(d,2);do r=ceil(rand*5);until t(r,c);t(r,c)-=d;t=max(0,t);end;if sum(t)(1)printf "C+\nR-\n";else printf "C-\nR+\n";end

Degolfed:

t=repmat(50,5,2);
while prod(sum(t))
    d=ceil(rand*10);
    c=2-mod(d,2);                  #cops or robbers affected?
    do r=ceil(rand*5);until t(r,c);
    t(r,c)-=d;
    t=max(0,t);
end
if sum(t)(1)
    printf "C+\nR-\n"
else
    printf "C-\nR+\n"
end

असल में, हम एक 5x2 मैट्रिक्स बनाते हैं, जहां पहला कॉलम पुलिस और दूसरा कॉलम डाकू होते हैं:

t =
50     50
50     50
50     50
50     50
50     50
[cops] [robbers]

sumसमारोह जब एक तर्क लागू, स्तंभों के आधार पर राशि में आता है तो यह शुरू में बताया गया है:

250    250

जब उनमें से एक शून्य तक पहुंचता है, तो prod(sum(t))शून्य को लूप को तोड़ने का मूल्यांकन करता है। फिर हम जांच कर सकते हैं कि किसने चेकिंग जीती है जिसका कॉलम शून्य पर है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.