भेड़ियों और मुर्गियों


15

नदी है और नदी के एक तरफ भेड़िये और मुर्गियां हैं। उनके पास एक बेड़ा है और उन्हें सभी को दूसरी तरफ लाने की आवश्यकता है। हालाँकि, बेड़ा अपने आप यात्रा नहीं कर सकता है। अगर दो से अधिक जानवर उस पर हैं, तो यह दरार डूब जाएगी। कोई भी जानवर गीला नहीं होना चाहता क्योंकि नदी की ठंड और गंदी है। कोई भी जानवर नदी पर कूद या उड़ नहीं सकता है। इसके अलावा, अगर एक तरफ मुर्गियां हैं, तो उस तरफ अधिक भेड़िये नहीं हो सकते हैं, उस तरफ मुर्गियां हैं - फिर भेड़िये मुर्गियों को खाने का फैसला करेंगे। इसका मतलब है कि आप एक मुर्गी के साथ दो भेड़ियों को एक तरफ नहीं उठा सकते।

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

W if a wolf crosses the river on its own
C if a chicken crosses the river on its own
CW if a chicken and a wolf cross the river -- WC is also fine
CC if two chickens cross the river
WW if two wolves cross the river

जैसा कि आप कटौती कर सकते हैं, बेड़ा स्वचालित रूप से बारी-बारी से दिशाओं में आगे बढ़ेगा (बाएं और दाएं, बाएं से दाएं शुरू होता है क्योंकि पहले एक या दो जानवर नदी पार करते हैं)। यह आउटपुट / वापस करने की आवश्यकता नहीं है। आउटपुट में 'W', 'C', 'CW', 'CC' या 'WW' को निम्न में से कम से कम एक से अलग किया जा सकता है:

spaces (' ')
commas (',')
newlines

वैकल्पिक रूप से, आप निर्देशों को एक सूची में आइटम के रूप में संग्रहीत कर सकते हैं (एक खाली सूची का अर्थ है कोई समाधान नहीं)।

परीक्षण के मामले (कॉमा द्वारा अलग किए गए आउटपुट - इनपुट रूप लेता है wolves,chickens):

1,1 -> CW

2,2 -> CW,C,CC,C,CW

1,2 -> CW,W,CW

0,10 -> CC,C,CC,C,CC,C,CC,C,CC,C,CC,C,CC,C,CC,C,CC

3,2 -> no solution

अपने कोड को यथासंभव बाइट्स में छोटा करने का प्रयास करें।


(3,2) के लिए समाधान?
मैजिक ऑक्टोपस Urn

@carusocomputing यह काम नहीं करता है, क्योंकि मुर्गियों की तुलना में अधिक भेड़िये हैं। तो कोई उपाय नहीं है।
0WJYxW9FMN

आह ... शायद इनपुट को डब्ल्यू = 3, सी = 2 या कुछ और के रूप में लेबल करें; एक बालक था जो प्रक्रिया से भ्रमित था, इसके अलावा यह अच्छा लग रहा था।
मैजिक ऑक्टोपस Urn

@carusocomputing मैं करूंगा, लेकिन मुझे लगता है कि यह अधिक भ्रामक होगा क्योंकि इनपुट 3,2 है और डब्ल्यू = 3, सी = 2 नहीं है।
0WJYxW9FMN

जवाबों:


5

पर्ल, 179 165 164 163 157 156 बाइट्स

के लिए +4 शामिल है -p

भेड़िये के बाद STDIN पर मुर्गियाँ दें

river.pl <<< "2 3"

प्रति पंक्ति नाव सामग्री को आउटपुट करता है। इस उदाहरण के लिए यह देता है:

WC
C
CC
C
CC
W
WW

river.pl:

#!/usr/bin/perl -p
/ /;@F=w x$`.c x$'."\xaf\n";$a{$`x/\n/}++||grep(y/c//<y/w//&/c/,$_,~$_)or$\||=$' x/^\w*\n|(\w?)(.*)(c|w)(.+)\n(?{push@F,$1.$3.~"$`$2$4\xf5".uc"$'$1$3\n"})^/ for@F}{

दिखाए गए अनुसार काम करता है, लेकिन प्रतिस्थापित करें \xhhऔर\n उनके शाब्दिक संस्करणों द्वारा दावा अंक प्राप्त करने के।

यह संभवतः एक ऐसे प्रोग्राम द्वारा पीटा जाएगा जो सामान्य मामले को हल करता है (C> W> 0)

* output `WC W WC C` until there is only one wolf left on the left bank (--w, --c)
* output `CC C` until there is only one chicken left on the left bank (--c)
* output `WC`

केवल भेड़ियों और केवल मुर्गियों और एक हार्डकोड विशेष मामले के लिए तुच्छ समाधान जोड़ें 2 2और 3 3(4 4 और उच्चतर के पास कोई समाधान नहीं है)। लेकिन यह एक उबाऊ कार्यक्रम होगा।

व्याख्या

फ़ील्ड की वर्तमान स्थिति को एकल स्ट्रिंग के रूप में संग्रहीत किया जाता है:

  • w नाव के साथ एक भेड़िया के लिए
  • c नाव के साथ एक चिकन बैंक के लिए
  • \x88 (थोड़ा उलट w ) एक भेड़िये के लिए दूसरे बैंक पर
  • \x9c(थोड़ा उलट c) दूसरे बैंक पर एक चिकन के लिए
  • एक चरित्र जो Pदायीं ओर नाव को दर्शाता है , दाएं किनारे के लिए \xaf(थोड़ा उल्टा P) बाएं किनारे के लिए (शुरुआती तरफ)
  • एक नई पंक्ति \n
  • अब तक किए गए सभी कदमों को नई सीमाओं के साथ समाप्त किया गया है, जैसे कुछ WC\nW\nWC\nC\n(नोटिस Wएस और Cअपरकेस यहां हैं)

सरणी @F में सभी पहुंच वाले राज्य होंगे। यह प्रारंभिक स्ट्रिंग द्वारा प्रारंभ किया जाता हैwolves times "w", chickens times "c", \xaf \n

इस कार्यक्रम के बाद @Fलूपिंग बढ़ जाती है, जिससे लूपिंग के दौरान नए राज्य भी संसाधित हो जाते हैं। प्रत्येक तत्व के लिए यह तब होता है:

  • पहले के बायें भाग को देखें \n जो जानवरों और नाव की वर्तमान स्थिति को दर्शाता है। अगर वह स्किप करने से पहले देखा गया है$a{$`x/\n/}++
  • जाँच करें कि क्या किसी भी तरफ एक साथ अधिक भेड़ियों के साथ मुर्गियां हैं। अगर ऐसा है तो छोड़ देंgrep(y/c//<y/w//&/c/,$_,~$_)
  • जांचें कि क्या नाव सभी जानवरों के साथ एक साथ दूर है। यदि ऐसा है तो हमारे पास एक समाधान है। स्टोर करें $\और उसे रखें क्योंकि पहला समाधान सबसे छोटा है$\||=$' x/^\w*\n/
  • अन्यथा नाव के साथ किनारे पर 1 या 2 जानवरों को चुनने के सभी तरीकों का प्रयास करें। ये वर्ण cऔर wवर्ण हैं। (दूसरी तरफ के जानवर मेल नहीं खाते \w) /(\w?)(.*)(c|w)(.+)\n(?{code})^/। फिर \nनाव के लिए चुने गए जानवरों को छोड़कर पूरे स्ट्रिंग को थोड़ा उल्टा कर दें push@F,$1.$3.~"$`$2$4\xf5"। चयनित जानवरों को ऊपर ले जाकर उन्हें जोड़ दें:uc"$'$1$3\n"

पशु चयन प्रक्रिया प्रभावी ढंग से कई तरीकों से उनका प्रतिनिधित्व करने वाले स्ट्रिंग भाग को बदल देती है। तो उदाहरण के लिए wcwcऔर wwccदोनों 2 भेड़ियों और 2 मुर्गियों का प्रतिनिधित्व करने के लिए प्राप्त कर सकते हैं। राज्य की जांच $a{$`x/\n/}++इन दोनों को अलग-अलग रूप से अलग करेगी और आवश्यकता से अधिक राज्यों को उत्पन्न और जाँच की जाएगी। इसलिए जैसे ही विभिन्न जानवरों की संख्या बड़ी होती है, कार्यक्रम स्मृति और समय से बाहर हो जाएगा। यह केवल इस तथ्य से थोड़ा कम किया जाता है कि समाधान मिलते ही वर्तमान संस्करण नए राज्यों को जोड़ना बंद कर देगा


जब तक मैं गलत नहीं समझ लेता कि आप 4 4 कह रहे हैं और उच्चतर समान गणनाओं के समाधान हैं, (4,4) = WC, C, WC, W, WC, W, WW, WC, WC, W, WW, W, WC

@Phaeze: WC,C,WCदाहिने किनारे पर 2 भेड़िये और 1 मुर्गी हैं। गेम ओवर
टन हास्पेल

हाँ मेरा बुरा मैं समस्या का हिस्सा गलत समझा।

4

जावास्क्रिप्ट (ईएस 6), 251 264 ... 244 240 बाइट्स

भेड़ियों और मुर्गियों की संख्या लेता है और (w, c)इष्टतम समाधानों में से एक को लौटाता है, या undefinedयदि कोई समाधान नहीं है।

(w,c,v={},B=1/0,S)=>(r=(s,w,c,W=0,C=0,d=1,N=0,k=w+'|'+c+d)=>v[k]|c*w>c*c|C*W>C*C|w<0|c<0|W<0|C<0?0:w|c?[v[k]=1,2,4,8,5].map(n=>r(s+'C'.repeat(b=n>>2)+'W'.repeat(a=n&3)+' ',w-d*a,c-d*b,W+d*a,C+d*b,-d,N+1))&(v[k]=0):N<B&&(B=N,S=s))('',w,c)||S

प्रारूपित और टिप्पणी की गई

आवरण समारोह:

(                                    // given:
  w,                                 // - w : # of wolves
  c,                                 // - c : # of chickens
  v = {},                            // - v : object keeping track of visited nodes
  B = 1 / 0,                         // - B : length of best solution
  S                                  // - S : best solution
) => (                               //
r = (...) => ...                     // process recursive calls (see below)
)('', w, c) || S                     // return the best solution

मुख्य पुनरावर्ती कार्य:

r = (                                // given:
  s,                                 // - s : current solution (as text)
  w, c,                              // - w/c : # of chickens/wolves on the left side
  W = 0, C = 0,                      // - W/C : # of chickens/wolves on the right side
  d = 1,                             // - d : direction (1:left to right, -1:right to left)
  N = 0,                             // - N : length of current solution
  k = w + '|' + c + d                // - k : key identifying the current node
) =>                                 //
v[k] |                               // abort if this node was already visited
c * w > c * c | C * W > C * C |      // or there are more wolves than chickens somewhere
w < 0 | c < 0 | W < 0 | C < 0 ?      // or we have created antimatter animals 
  0                                  //
:                                    // else:
  w | c ?                            //   if there are still animals on the left side:
    [v[k] = 1, 2, 4, 8, 5].map(n =>  //     set node as visited and do a recursive call
      r(                             //     for each combination: W, WW, C, CC and CW
        s + 'C'.repeat(b = n >> 2) + //     append used combination to current solution
        'W'.repeat(a = n & 3) + ' ', //     wolves = bits 0-1 of n / chickens = bits 2-3
        w - d * a,                   //     update wolves on the left side
        c - d * b,                   //     update chickens on the left side
        W + d * a,                   //     update wolves on the right side
        C + d * b,                   //     update chickens on the right side
        -d,                          //     use opposite direction for the next turn
        N + 1                        //     increment length of current solution
      )                              //
    ) &                              //     once we're done,
    (v[k] = 0)                       //     set this node back to 'not visited'
  :                                  //   else:
    N < B &&                         //     save this solution if it's shorter than the
    (B = N, S = s)                   //     best solution encountered so far

परीक्षण के मामलों


चुनौती कहती है and finds the smallest number of times the raft has to move across the river.। इसलिए मुझे नहीं लगता कि यह एक वैध समाधान है
टन हास्पेल

@ अरण्युल ओपी को क्या जवाब देना है ? मुझे लगता है कि यह स्पष्ट है कि आपको केवल सबसे छोटे समाधान का उत्पादन करना होगा, दूसरों को नहीं।
को आउटगोल्फर

@ अर्नुलद टन हास्पेल सही है।
0WJYxW9FMN

@ अर्नुलड यदि आप इसे बनाते हैं ताकि यह अन्य समाधानों का प्रिंट आउट न करे - बस सबसे छोटा समाधान, तो यह ठीक होना चाहिए।
0WJYxW9FMN

@ J843136028 उम्मीद है कि मुझे इस बार यह सही लगा। ^ ^
अरनौल्ड

2

सीजेएम, 133

q~[0_]]_0+a:A;a{{28e3Zb2/{[YT2*(f*_Wf*]X..+:Bs'-&B2<{~_@<*},+{B2<T!+a:CA&{AC+:A;BY"WC".*a+}|}|}fY}fX]T!:T;__!\{0=:+!},e|:R!}g;R0=2>S*

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

स्पष्टीकरण:

मूल रूप से कार्यक्रम एक बीएफएस करता है और अनंत चक्रों से बचने के लिए हर राज्य को याद रखता है। कार्यशील अवस्थाओं का प्रतिनिधित्व किया जाता है जैसे [[Wl Cl] [Wr Cr] M1 M2… Mn] जहां W = भेड़िये, C = मुर्गियां, l = बाईं ओर, r = दाईं ओर, M = चालें अब तक बनी (शुरू में कोई नहीं), और चाल "सी", "डब्ल्यूसी" या "डब्ल्यूडब्ल्यू" आदि (व्यावहारिक रूप से ["" सी "], [" डब्ल्यू "" सी "], [" डब्ल्यूडब्ल्यू "" "] की तरह हैं, लेकिन यह समान है जब मुद्रण)। याद किए गए राज्यों का प्रतिनिधित्व किया जाता है जैसे [[Wl Cl] [Wr Cr] S] जहां S नाव के साथ (0 = बाएं, 1 = दाएं) है।

q~                 read and evaluate the input ([Wl Cl] array)
[0_]               push [0 0] as the initial [Wr Cr] array
]_                 wrap both in an array (initial working state) and duplicate it
0+a                append 0 (representing left side) and wrap in an array
:A;                store in A and pop; this is the array of remembered states
a                  wrap the working state in an array
{…}g               do … while
  {…}fX            for each working state X
    28e3Zb2/       convert 28000 to base 3 and group the digits into pairs
                    this generates [[1 1] [0 2] [1 0] [2 0] [0 1]]
                    which are all possible moves represented as [Wb Cb] (b=boat)
    {…}fY          for each "numeric move" pair Y
      […]          make an array of…
        YT2*(f*    Y negated if T=0 (T is the current boat side, initially 0)
        _Wf*       and the (arithmetic) negation of the previous pair
      X..+         add the 2 pairs to X, element by element
                    this performs the move by adding & subtracting the numbers
                    from the appropriate sides, determined by T
      :Bs          store the updated state in B, then convert to string
      '-&          intersect with "-" to see if there was any negative number
      B2<          also get just the animal counts from B (first 2 pairs)
      {…},         filter the 2 sides by checking…
        ~_@<*      if W>C>0 (it calculates (C<W)*C)
      +            concatenate the results from the negative test and eating test
      {…}|         if it comes up empty (valid state)…
        B2<        get the animal counts from B (first 2 pairs)
        T!+        append !T (opposite side)
        a:C        wrap in an array and store in C
        A&         intersect with A to see if we already reached that state
        {…}|       if not, then…
          AC+:A;   append C to A
          BY       push B and Y (updated state and numeric move)
          "WC".*   repeat "W" and "C" the corresponding numbers of times from Y
                    to generate the alphabetic move
          a+       wrap in array and append to B (adding the current move)
  ]                collect all the derived states in an array
  T!:T;            reverse the side with the boat
  __!              make 2 copies of the state array, and check if it's empty
  \{…},            filter another copy of it, checking for each state…
    0=:+!          if the left side adds up to 0
  e|:R             logical "or" the two and store the result in R
  !                (logically) negate R, using it as a do-while condition
                    the loop ends when there are no more working states
                    or there are states with the left side empty
;                  after the loop, pop the last state array
R0=2>S*            if the problem is solved, R has solution states,
                    and this extracts the moves from the first state
                    and joins them with space
                   if there's no solution, R=1
                    and this repeats a space 0 times, resulting in empty string

0

पर्ल 6 , 268 बाइट्स

->*@a {(
[X](0 X..@a)[1..*-2]
.grep({![>](|$_,0)&![>](|(@a Z-$_),0)})
.combinations(2)
.combinations
.map(|*.permutations)
.map({.map(|*)»[*]})
.map({((|$_,(0,0)ZZ-@a,|$_)ZX*|(-1,1)xx*)»[*]})
.grep({.all.&{.all>=0&&3>.sum>0}})
.map({.map:{[~](<W C>Zx$_)}})
if [<=] @a
)[0]//()}

(wolf count, chicken count)बाएं बैंक के लिए राज्यों की अधिक लंबी श्रृंखला बनाता है , और सभी नियमों से मेल खाने वाला पहला रिटर्न देता है।

यह दृष्टिकोण न तो कुशल है और न ही बहुत संक्षिप्त है, लेकिन कम से कम यह लिखने में मजेदार था।
मुझे नहीं लगता कि मैंने Z(जिप) और X(क्रॉस) मेटा-ऑपरेटर्स को पहले कभी भी स्टैक नहीं किया है , जैसे ZZ-और ZX*यहाँ - थोड़े आश्चर्यचकित थे कि वास्तव में काम किया है।

(नई रूपरेखाएँ केवल प्रदर्शन उद्देश्यों के लिए जोड़ी गई हैं, और बाइट गिनती का हिस्सा नहीं हैं।)


0

जावास्क्रिप्ट (ईएस 6), 227 237

मूल रूप से यह एक बीएफएस करता है और अनंत चक्रों से बचने के लिए हर राज्य को याद रखता है। @ Aditsu के विपरीत, मुझे नहीं लगता कि गोल्फ के लिए कोई जगह है

v=>g=>eval("o=[],s=[[v,g,0,k=[]]];for(i=0;y=s[i++];k[y]=k[y]||['WW','C','CC','W','CW'].map((u,j)=>(r=w-(j?j/3|0:2),q=c-j%3,d=g-q,e=v-r,r<0|q<0|!!q&r>q|!!d&e>d)||s.push([e,d,!z,[...p,u]])))o=([w,c,z,p]=y,y[3]=!z|c-g|w-v)?o:i=p")

कम गोल्फ वाला

(v,g) => {
  o = []; // output
  k = []; // hashtable to check states already seen
  s=[[v, g, 0, []]]; // states list: each element is wolves,chickens,side,path
  for(i = 0; 
      y = s[i++]; // exit loop when there are no more states to expand
     )
  {
    [w, c, z, p] = x; // wolves on this side, chickens on this side, side, path
    if (z && c==g && w==v) // if all chicken and wolves on the other side
      o = p, // the current path is the output
      i = p  // this will force the loop to terminate
    y[3] = 0; // forget the path, now I can use y as the key to check state and avoid cycles
    if (! k[y]) // it's a new state
    {
       k[y] = 1; // remember it
       ['WW','C','CC','W','CW'].map( (u,j)=> (
          a = j ? j/3|0 : 2, // wolves to move
          b = j % 3, // chicken to move  
          r = w - a, // new number of wolves on this side 
          q = c - b, // new number of chickens on this side
          e = v - r, // new number of wolves on other side
          d = g - q, // new number of chickens on other side
          // check condition about the number of animals together
          // if ok, push a new state
          r<0 |q<0 | !!q&r>q | !!d&e>d || 
            s.push([e, d, !z, [...p,u]) 
       )
    }
  }
  return o
}

परीक्षा

F=
v=>g=>eval("o=[],s=[[v,g,0,k=[]]];for(i=0;y=s[i++];k[y]=k[y]||['WW','C','CC','W','CW'].map((u,j)=>(r=w-(j?j/3|0:2),q=c-j%3,d=g-q,e=v-r,r<0|q<0|!!q&r>q|!!d&e>d)||s.push([e,d,!z,[...p,u]])))o=([w,c,z,p]=y,y[3]=!z|c-g|w-v)?o:i=p")

function update() {
  var c=+C.value, w=+W.value
  O.textContent=F(w)(c)
}

update()
input { width: 4em }
Chickens <input id=C value=2 type=number min=0 oninput='update()'>
Wolves <input id=W value=2 type=number min=0 oninput='update()'>
<pre id=O></pre>

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