वंपस का शिकार करें


39

जब मैं एक बालक था, बच्चे कंप्यूटर स्टोर में घूमते थे और हंट द वंपस खेलते थे, जब तक कि स्टाफ ने हमें लात नहीं मारी। यह एक साधारण खेल था, जो 1970 के दशक के मध्य के कंप्यूटरों पर प्रोग्राम करने योग्य था, मशीनों की इतनी अशिष्टता थी कि चिकलेट के आकार के माइक्रोप्रोसेसरों के बजाय, मुझे लगता है कि उनमें से कुछ में शायद असली छर्रों थे।

आइए आधुनिक हार्डवेयर पर गेम को पुन: पेश करके उस युग को जन्म दें।

  1. खिलाड़ी एक icosahedral मानचित्र पर एक यादृच्छिक कमरे में शुरू होता है (इस प्रकार कुल 20 कमरे हैं, एक-दूसरे से icosahedron के चेहरे की तरह जुड़े हुए हैं, और हर कमरे में ठीक तीन निकास हैं)।

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

  3. खिलाड़ी धनुष और अनंत संख्या में तीर चलाता है, जिसे वह किसी भी समय उसके सामने कमरे में शूट कर सकता है। अगर उस कमरे में वैंपस है, तो वह मर जाता है और खिलाड़ी जीत जाता है। यदि वंपस उस कमरे में नहीं था, तो यह चौंका और अपने वर्तमान स्थान से जुड़े तीन कमरों में से किसी में भी बेतरतीब ढंग से चलता है।

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

  5. यदि खिलाड़ी वम्पस के कमरे में चलता है, या यदि वम्पस खिलाड़ी के कमरे में चलता है, तो वम्पस जीत जाता है।

  6. खिलाड़ी उस दिशा को निर्दिष्ट करता है जो वह एक संख्या (1 = दाएं, 2 = बाएं, 3 = पीछे) के साथ सामना कर रहा है, और फिर एक क्रिया (4 = एक तीर मारना, निर्दिष्ट दिशा में 5 = चलना)।

  7. स्कोरिंग के लिए, प्रत्येक गेम स्ट्रिंग ("आप एक हवा महसूस करते हैं," "आप एक वैंपस को सूंघते हैं," "आपका तीर कुछ भी नहीं मारा", आदि) को एक बाइट माना जा सकता है। पाठ में गेम कोड को छिपाने के लिए कोई गाली नहीं; यह सिर्फ खिलाड़ी के साथ बातचीत करने के लिए है।

  8. मेगाबेट्स को लागू करने के लिए अपने बाइट की संख्या का 10% घटाएं, जो कि खिलाड़ी से अलग एक यादृच्छिक कमरे में शुरू होता है (हालांकि वे एक कमरे को वैंपस और / या गड्ढे के साथ साझा कर सकते हैं)। यदि खिलाड़ी चमगादड़ के साथ कमरे में चलता है, तो चमगादड़ खिलाड़ी को दूसरे बेतरतीब ढंग से चुने गए कमरे (गड्ढे या उसमें मौजूद वैंपस के साथ कमरा न होने की गारंटी), अपने स्वयं के, नए यादृच्छिक स्थान पर उड़ान भरने से पहले ले जाएगा। चमगादड़ से सटे तीन कमरों में उन्हें चीखते हुए सुना जा सकता है, लेकिन खिलाड़ी को इस बात की कोई जानकारी नहीं दी जाती है कि आवाज़ किस कमरे से आती है।

  9. एक ग्राफिकल इंटरफ़ेस को लागू करने के लिए अपने बाइट की संख्या का 35% डिडक्ट करें जो कि आईसीओसहेड्रल मानचित्र और खिलाड़ी के गड्ढे के स्थान, वम्पस और चमगादड़ (यदि लागू हो, के स्थान के बारे में अब तक की जानकारी के किसी प्रकार के संकेत को दर्शाता है। खिलाड़ी। जाहिर है, अगर वुडस चलता है या खिलाड़ी चमगादड़ों द्वारा स्थानांतरित हो जाता है, तो नक्शे को तदनुसार रीसेट करने की आवश्यकता होती है।

  10. सबसे कम बाइट गिनती, समायोजित के रूप में, जीतती है।

खेल के एक संस्करण के लिए बुनियादी स्रोत कोड (जरूरी नहीं कि ऊपर के नियमों के अनुरूप हो और, किसी भी मामले में, पूरी तरह से अनियंत्रित) इस वेबसाइट पर पाया जा सकता है और शायद अन्य।


: और वंपस केवल तभी हिलेंगे अगर चौंका दिया जाए, नहीं तो यह बस लगा रहता है? 6. मैं समझता हूं कि खिलाड़ी की हेडिंग उस कमरे से निर्धारित होती है जहां से वह आया था। इसलिए यदि वह दक्षिण से आया तो उसके विकल्प 1.northeast 2.northwest 3.south होंगे और यदि वह उत्तर से आया तो यह विपरीत होगा। संदर्भ कार्यक्रम की तुलना में भी आपके नियम सरल / गोल्फर लगते हैं (जिनकी मैंने अभी तक विस्तार से जांच नहीं की है।) क्या मैं सही हूं?
लेवल रिवर सेंट

अरे! मुझे नेट पर कहीं भी एक icosahedron के दोहरे ग्राफ़ की कोई भी तस्वीर नहीं मिल सकती है ।
जैक एम

1
@steveverrill हाँ, अगर आपने इसे हिलाया, तो यह आकर आपको मार सकता है। यदि आप इसे नहीं हिलाते हैं, तो यह हिलता नहीं है। खेल पर कई विविधताएं हैं; कई संस्करण उदाहरण के लिए तीरों को घेरने और आपको मारने की अनुमति देते हैं। मैंने उसे बाहर निकाल दिया है।
माइकल स्टर्न

3
@JackM एक आइकोसैहेड्रोन के चेहरों का मानचित्र डोडेकाहेड्रोन के कोने के नक्शे के समान है, और यह ग्राफ आसानी से मिल जाता है। उदाहरण के लिए प्रयास करें wolframalpha.com/input/?i=DodecahedralGraph+edgerules या समकक्ष Mathematica कमांड GraphData ["DodecahedralGraph", "EdgeRules"]। किसी भी तरह से आपको {1 -> 14, 1 -> 15, 1 -> 16, 2 -> 5, 2 -> 6, 2 -> 13, 3 -> 7, 3 -> 14, 3 -> 19,> 4 -> 8, 4 -> 15, 4 -> 20, 5 -> 11, 5 -> 19, 6 -> 12, 6 -> 20, 7 -> 11, 7 -> 16, 8 -> 12 8 -> 16, 9 -> 10, 9 -> 14, 9 -> 17, 10 -> 15, 10 -> 18, 11 -> 12, 13 -> 17, 13 -> 18, 17 -> 19 18 -> 20}
माइकल स्टर्न

2
@JackM नहीं, "बैक" से तात्पर्य है कि आप जिस तरह से आए थे उसी तरह से घूमना और वापस आना। यदि आप दो बार "बैक" मारते हैं, तो आप समाप्त हो जाते हैं जहां आपने शुरू किया था। पहले गेम स्टेट्स को स्टोर करने की आवश्यकता नहीं है।
माइकल स्टर्न

जवाबों:


21

गोल्फक्राफ्ट, 163

:n;:`"You shot the wumpus.
""The wumpus ate you.
""The pit swallowed you.
"{19:|rand}2*0|{[:,~,4%"ftvh"=.,+,@-]{20%}%}:^{;.^.+.3$?>"You feel a breeze.
"1$6"You smell a wumpus.
"4$8{$?-1>*p}2*'"#{'|):|';`head -1`}"'++~{3%}/={=3$=|{"Your shot missed.
"p@^3rand=@@}if}{=@;}if.[|4$6$]?.)!}do])=

स्कोर को बाइट काउंट (290) लेने से प्राप्त होता है, उपयोगकर्ता (6) के साथ बातचीत के लिए उपयोग किए जाने वाले तार की संख्या को जोड़कर और उन तारों की संयुक्त लंबाई (133) को घटाकर। लाइनफीड स्ट्रिंग्स का हिस्सा हैं और बाइट काउंट में योगदान करते हैं।

मील के पत्थर

  1. पोर्टेड professorfish के जवाब बैश से GolfScript करने के लिए। स्कोर: 269

  2. टिप्पणी में पीटर टेलर के सुझावों पर काम किया । स्कोर: 250

  3. पीटर टेलर ने मेरे पूरे कोड को रीक्रिएट किया और लुकअप टेबल को कंप्रेस करने में मेरी मदद की। स्कोर: 202

  4. एक गणितीय दृष्टिकोण के साथ आसन्न कमरों की देखने की मेज को बदल दिया। स्कोर: 182

  5. Refactored इनपुट, आउटपुट और गणितीय दृष्टिकोण का समर्थन करने वाले फ़ंक्शन। स्कोर: 163

एक बड़ा "धन्यवाद!" उसकी सारी मदद के लिए पीटर टेलर के पास जाता है।

यह काम किस प्रकार करता है

20 कमरों को डोडेकाहेड्रोन के शीर्ष के रूप में दर्शाया गया है, जिन्हें निम्नलिखित फैशन में 0 से 19 तक की संख्या दी गई है:

डोडेकाथेड्रल ग्राफ

उन कमरों को खोजने के लिए जो कमरा N के समीप हैं और उन्हें दक्षिणावर्त फैशन में व्यवस्थित करते हैं, हमें चार मामलों पर विचार करना होगा:

  • यदि N, 0 mod 4 (नीला शीर्ष), निकटवर्ती कमरा 19 - N , N + 2 mod 20 और N - 2 mod 20 हैं

  • यदि एन, 1 मॉड 4 (ग्रीन वर्टेक्स), आसन्न कमरा 19 - एन , एन - 4 मॉड 20 और एन + 4 मॉड 20 हैं

  • यदि एन, 2 मॉड 4 (पीला वर्टेक्स), आसन्न कमरा 19 - एन , एन - 2 मॉड 20 और एन + 2 मॉड 20 हैं

  • यदि N, 3 mod 4 (लाल शीर्ष), समीपवर्ती कमरा 19 , N , N + 4 mod 20 और N - 4 mod 20 हैं

# The function “p” is implemented as “{`print n print}”. By storing an empty string in 
# “n” and nullifying “`”, “p” becomes an alias for “print”.

:n;:`

# Push the messages corresponding to the three possible outcomes of the game.

"You shot the wumpus.\n""The wumpus ate you.\n""The pit swallowed you.\n"

# Place the wumpus and the pit in randomly selected rooms different from room 19; place 
# the player in room 19, with his back to room 0.

{19:|rand}2*0|

# Function “^” takes a single number as its argument and returns an array of all the
# adjacent rooms to the room that number corresponds to.

{

  [

    :,~       # Store the room number in “,” and negate it ( ~N ≡ 19 - N mod 20 )

    ,4%       # Push the room number modulus 4.

    "ftvh"=   # If it is equal to 0|1|2|3, push 102|116|118|104 ≡ 2|-4|-2|4 mod 20.

    .,+,@-    # Determine the room number plus and minus the integer from above.

  ]{20%}%     # Take all three room numbers modulus 20.

 }:^

{             # STACK: Strings Pit Wumpus Previous Current Function|Index

  ;           # STACK: Strings Pit Wumpus Previous Current

  # Find the adjacent rooms to the current room, duplicate them and remove the rooms 
  # before the first occurrence of the previous room. Since the rooms are ordered in
  # clockwise fashion, the array of adjacent rooms will begin with the rooms 
  # corresponding to the following directions: “Back Left Right”

  .^.+.3$?>   # STACK: Strings Pit Wumpus Previous Current Adjacent

  # Push two more messages and their respective triggers.

  "You feel a breeze.\n"1$6"You smell a wumpus.\n"4$8

  # STACK: ... Pit Wumpus Previous Current Adjacent String Adjacent 6 String Adjacent 8

  # Do the following twice: Duplicate the nth stack element and check if it's present in 
  # the array of adjacent rooms. If so, print the string below it.

  {$?-1>*p}2*

  # Read one line (direction, action, LF) from STDIN. The counter “|” is needed so the 
  # result won't get cached.

  '"#{'|):|';`head -1`}"'++~

  {3%}/       # Replace 1|2|3|4|5|LF with their character codes modulus 3 (1|2|0|1|2|1).

  ={          # If the player shoots an arrow:

    =3$=      # Determine the specified room and check if it corresponds to the wumpus.

      |       # If it does, push and invalid room number ( | > 19 ).

      # If it does not, say so and move the wumpus to a randomly selected adjacent room.

      {"Your shot missed."p@^3rand=@@}

    if

  }{           # If the player moves:

    =@;        # Place him into the selected room.

  }if

  # STACK: Pit Wumpus Previous Current Invalid?

  # Determine if the player's current room number is either invalid, the wumpus's room
  # number or the pit's room number (first match).

  .[|4$6$]?

  # If there is no match, the index is -1 and incrementing and negating it yields “true”.

  # STACK: Strings Pit Wumpus Precious Current Invalid? Index Boolean

# Repeat loop is the boolean is falsy. If repeated, the first instruction of the loop 
# will pop the index.

}do      

# Consolidate the entire stack into an array. And pop its last element: the index.
# Replace the array with the element corresponding to that index.

])=

# GolfScript will execute “print n print”.

1
आप में 1 को बचा सकता है Qके साथ 19rand 97+; 2 के @साथ 97%3*&>..., एक और 1 के Qरूप में inlining {19rand 97+}2*:,\:H, कुछ के |साथ बदलकर *, जो अक्सर एक करने का सबसे अच्छा तरीका है ifBकोई उद्देश्य नहीं है, और मुझे लगता है कि स्टैक का उपयोग करके कुछ और चर समाप्त किए जा सकते हैं।
पीटर टेलर

1
एक और लगातार चाल का उल्लेख करना भूल गए: लुकअप तालिकाओं के लिए आधार रूपांतरण। आप आसन्न सूची के लिए 62 वर्णों को 33-वर्ण स्ट्रिंग के साथ प्रतिस्थापित कर सकते हैं 256base 20base(और संभवतः कुछ +/- 97 को भी समाप्त कर सकते हैं)। केवल नकारात्मक पक्ष यह है कि इसे गैर-मुद्रण योग्य वर्णों की आवश्यकता होगी।
पीटर टेलर

1
मैंने अधिक मुहावरेदार जीएस (मुख्य रूप से वैरिएबल के बजाय स्टैक का उपयोग करने के लिए) को रिफैक्टिंग करके एक और 13 को बचाया है ; और आउटपुट को कम सुंदर बनाने की कीमत पर अतिरिक्त 10 है। यह मेरी पिछली टिप्पणी में उल्लिखित लुकअप टेबल संपीड़न के अलावा है।
पीटर टेलर

1
बिल्कुल नहीं, मैंने इसका आनंद लिया है। मैं बस निराश हूं कि लुकअप टेबल का तरीका इतना अधिक बेहतर है कि जितना मैं उपयोग करना चाह रहा हूं उतना गणितीय नहीं है। BTW मुझे लगता है कि आपके वर्तमान संस्करण में एक छोटा सा बग है, क्योंकि यदि आप एक तीर से फायर करते हैं, मिस करते हैं, और अपने कमरे में वॉम्पस को शुरू करते हैं तो यह केवल You were killed by the wumpusतीर के लापता होने का कोई उल्लेख नहीं करता है। इसलिए मैं गैर-सुंदर संस्करण में शामिल हो रहा था।
पीटर टेलर


15

REV0 C ++ (विंडोज पर विजुअल स्टूडियो) 405

#include"stdafx.h"
#include<stdlib.h>
#include<time.h>
int main(){srand(time(NULL));char i,h=rand()%19,w=rand()%19,p=19,d=0,q,e,m[]="e@LwQMQOSOLT";while(p-h&&p-w){for(i=3;i--;){q=(p+m[p%4*3+i])%20;if(q==w)puts("you smell a wumpus");if(q==h)puts("you feel a breeze");}scanf_s("%d",&i);e=(d+i/10)*m[p%4]%3;q=(p+m[p%4*3+e])%20;if(i%5){if(q==w){puts("YOU KILLED THE WUMPUS!");h=p;}else{puts("arrow missed");w=(w+m[w%4*3+rand()%3])%20;}}else{p=q;d=e;if(p==h)puts("YOU FELL IN A HOLE!");}if(p==w)puts("THE WUMPUS GOT YOU!");}}

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

अगर वह दूसरे तरीके से लूप कर लेता तो उसे जल्दी ही वह वपस मिल जाता और यह पता चल जाता कि वह उसी दिशा में है।

यहाँ छवि विवरण दर्ज करें

REV1 C (Cygwin पर GCC), 431-35% बोनस = 280.15

#define u(t,s,c) if(t){puts(s);c;}
i,d,e,a,b;main(){srand(time(0));char q,p=19,h=rand()%p,w=rand()%p,*m="e@LwQMQOSOLT-\\/\n \v ";  
while(p-h&&p-w){
  for(i=3;i--;){q=(p+m[p%4*3+i])%20;u(q==w,"you smell a wumpus",a|=2<<p)u(q==h,"you feel a breeze",b|=1<<p)}
  for(i=20;i--;)printf("%c%c",i==p?m[d+12]:48+(a>>i&2)+(b>>i&1),m[i%4+15]);
  scanf("%d",&i);e=(d+i/10)*m[p%4]%3;q=(p+m[p%4*3+e])%20;
  if(i%5){u(q-w,"arrow missed",w=(w+m[w%4*3+rand()%3])%20;a=0)else u(1,"YOU KILLED THE WUMPUS!",h=p)}
  else{p=q;d=e;u(p==h,"YOU FELL IN A HOLE!",)}
  u(p==w,"THE WUMPUS GOT YOU!",)}}

स्पष्टता के लिए Newlines जोड़ा गया। Rev 0 से परिवर्तन निम्नानुसार हैं:

विंडोज के लिए सिग्विन लिनक्स एमुलेटर पर जीसीसी संकलक की सिफारिश करने के लिए @ डेनिस के लिए एक बड़ा थैंक्यू। इस कंपाइलर includeको रेव 0 प्रोग्राम में एस की आवश्यकता नहीं होती है , और यह intचर के लिए डिफ़ॉल्ट प्रकार की अनुमति देता है और main.यह एक जीवन-परिवर्तित गोल्फिंग टिप है!

इसके अतिरिक्त लिनक्स में चलने का मतलब है कि \fगाड़ी का रिटर्न किए बिना कर्सर नीचे चला जाए (विंडोज में इसके विपरीत जहां यह सिर्फ एक प्रिंट करने योग्य प्रतीक का उत्पादन करता है।) इसने बोर्ड को प्रिंट करने वाले प्रिंटफ स्टेटमेंट को काफी छोटा कर दिया है।

टिप्पणियों में डेनिस से कई अतिरिक्त युक्तियां, और मेरे अपने में से एक: स्थिति की परिवर्तन जब जाँच कर रही है कि क्या तीर ने वम्पस को मारा: if(q==w)> if(q-w)(..) .. उल्टा है)

जानकारी प्रदर्शित करने वाले ग्राफिक प्रदर्शन को जोड़ने से खिलाड़ी को पता चल जाता है कि 35% बोनस का दावा करने के लिए एक वैंपस को कहां से पिघलाया जाता है। (मैंने इस के पुराने डिबग संस्करण को हटा दिया, जिसमें वम्पस और छेद की सटीक स्थिति दिखाई दी। इसे संपादित इतिहास में देखा जा सकता है।)

REV2 C (सिगविन पर GCC), 389-35% बोनस = 252.85

#define Q(N) (N+"QTLOQMQOSOLT"[N%4*3+e])%20
#define P printf(
i,d,e,a,b;main(){int p=19,q=srand(&p),h=rand()%p,w=rand()%p;
while(p-h&&p-w){
  for(e=3;e--;){q=Q(p);q-w||P"You smell a wumpus\n",a|=2<<p);q-h||P"You feel a breeze\n",b|=1<<p);}
  for(i=20;i--;)P"%c%c",i-p?48+(a>>i&2)+(b>>i&1):"-\\/"[d],"\n \v "[i%4]);
  scanf("%d",&i);e=(d+i/9)*"edde"[p%4]%3;q=Q(p);
  if(i%5){e=rand()%3;w=q-w?P"Your arrow didn't hit anything\n",a=0)&Q(w):(p=20);}
  else p=q,d=e;
}
P p-20?p-w?"YOU FELL IN A HOLE!\n":"THE WUMPUS GOT YOU!\n":"YOU KILLED THE WUMPUS!\n");}

मेरा कोड फिर से दर्शाने के लिए डेनिस के लिए फिर से धन्यवाद:

चार स्थिरांक m[]को शाब्दिक के साथ प्रतिस्थापित किया गया (मुझे नहीं पता था कि आप शाब्दिक रूप से अनुक्रमित कर सकते हैं।)

स्टैक चर के साथ यादृच्छिक संख्याओं का सीडिंग (सिस्टम आश्रित, कुछ सिस्टम एक सुरक्षा उपाय के रूप में मेमोरी आवंटन को यादृच्छिक करते हैं।)

मैक्रो को putsमैक्रो के साथ printfऔर अतिरिक्त कोड से बदल दिया जाता है, जिसे तब निष्पादित किया जाना चाहिए जब संदेश को printfतर्कों के अंदर प्रदर्शित किया जाता है (लाभ चेहरे से लिया गया है जो प्रिंट स्ट्रिंग में पिछले कुछ तर्कों को प्रिंट नहीं करता है यदि प्रारूप स्ट्रिंग में पर्याप्त प्रारूप सट्टेबाज नहीं हैं।) ifद्वारा प्रतिस्थापित||

नए मैक्रो के अंदर रखे गए प्लेयर / वंपस की नई स्थिति की गणना।

whileलूप के बाहर रखे संदेशों को जीतना / खोना । ifसशर्त ऑपरेटर द्वारा प्रतिस्थापित किया गया।

शूटिंग तीर के लिए लाइन में सशर्त ऑपरेटर का उपयोग। यदि खिलाड़ी चूक जाता है, तो इसके लिए संदेश को प्रिंट करना और वैंपस स्थिति को समायोजित करना दोनों आवश्यक है। डेनिस ने संयोजन के कुछ तरीके printfऔर एक ही अभिव्यक्ति में वम्पस स्थिति की गणना की पेशकश की, लेकिन मैं अपने स्वयं के एक के साथ चला गया हूं। printfमुद्रित वर्णों की संख्या लौटाता है, जो Your arrow didn't hit anything\nकि 31 (11111 बाइनरी) है 31&Q(w)==Q(w)

इस संपादन में मेरा अन्य योगदान कुछ अनावश्यक कोष्ठकों का उन्मूलन है।

उत्पादन

यहां खिलाड़ी पहले ही पता लगा चुका है कि वम्पस कहां है, लेकिन यह पता लगाने के लिए पूरी तरह से पता लगाने का विकल्प चुनता है कि गड्ढे कहां हैं। मेरे पुराने डिबग संस्करण के विपरीत, जिसमें दिखाया गया था कि पूरे खेल में जहां वम्पस और गड्ढे थे, यह केवल उन कमरों को दिखाता है जहां खिलाड़ी ने दौरा किया है और एक हवा महसूस की है (1) वम्पस (2) या दोनों (3) को गलाना। (यदि खिलाड़ी एक तीर मारता है और छूट जाता है, aतो वैम्पस स्थिति की जानकारी वाला चर रीसेट हो जाता है।)

यहाँ छवि विवरण दर्ज करें

ICOSAHEDRON रिप्रेजेंटेशन

नोट: यह खंड Rev 1 पर आधारित है

मेरा स्टार फीचर! मेरे कोड में कोई ग्राफ़ नहीं है। यह कैसे काम करता है, यह समझाने के लिए, दुनिया का नक्शा नीचे देखें। Icosahedron के किसी भी बिंदु को अक्षांश 0-3 और देशांतर 0-4 (या एकल संख्या long*4+lat।) द्वारा दर्शाया जा सकता है , मानचित्र पर अंकित देशांतर रेखा देशांतर शून्य वाले उन चेहरों से होकर गुजरती है, और अक्षांश रेखा गुजरती है। अक्षांश शून्य के साथ चेहरों का केंद्र।

खिलाड़ी को 3 संभावित अक्षों पर उन्मुख किया जा सकता है, जो कि प्रतीकों द्वारा दर्शाए गए हैं: उत्तर-दक्षिण -पूर्व-दक्षिण-पश्चिम \वायव्य-दक्षिण-पूर्व /। किसी भी दिए गए कमरे में उसके पास उपलब्ध प्रत्येक कुल्हाड़ी पर उसके पास एक निकास है। प्रदर्शित डिस्प्ले में खिलाड़ी पूरी तरह से दक्षिणावर्त लूप बनाता है। आम तौर पर यह चिन्हित करना आसान होता है कि खिलाड़ी कहाँ से आया है, और इसलिए जहाँ उसे जाने की अनुमति है।

एक मामला जो बिना आंख के थोड़ा मुश्किल है, वह चौथा है। जब आप इन ध्रुवीय पंक्तियों में से एक में तिरछा देखते हैं, तो खिलाड़ी तिरछे छोर के निकटतम छोर से ध्रुवीय सेल से आया है और भूमध्य रेखा की ओर आम तौर पर सामना कर रहा है। इस प्रकार खिलाड़ी दक्षिण-पूर्व का सामना कर रहा है और उसके विकल्प हैं: 15 (SOUTH, दाईं ओर की सेल) 25 (नॉर्थएस्ट, ऊपर की सेल) या 35 (नॉर्थवेस्ट, नीचे की सेल)।

इसलिए, मूल रूप से मैं icosahedron को 5x4 ग्रिड में मैप करता हूं, जिसमें वे मुद्रित किए गए क्रम में 19 से 0 की संख्या वाले सेल होते हैं। नीचे दी गई तालिका के अनुसार खिलाड़ी की अक्षांश और दिशा के आधार पर, चालन को वर्तमान स्थिति से जोड़कर या घटाकर किया जाता है।

यदि खिलाड़ी बोर्ड के नीचे (पश्चिम) से बाहर चला जाता है, तो वह शीर्ष (पूर्व) की तरफ वापस आ जाता है और इसके विपरीत, इसलिए उसकी स्थिति को मोडुलो 20 लिया जाता है। आम तौर पर चालों को कोडित किया जाता है []] एससीआई 80 जोड़कर ( P) नीचे दिखाए गए पात्रों को देने वाले कच्चे मूल्य के लिए, लेकिन सिद्धांत 20 के किसी भी एकाधिक को ऑपरेशन को प्रभावित किए बिना जोड़ा जा सकता है।

Table of addition values for moves

Direction Symbol Latitude 0  1  2  3     Latitude 0 1 2 3

0, N-S      -             1 -1  1 -1              Q O Q O  
1, NE-SW    \            -4  1 -1  4              L Q O T
2, NW-SE    /             4 -3  3 -4              T M S L

खिलाड़ी का इनपुट (दूसरे अंक को हटाने के लिए 10 से विभाजित) उसकी वर्तमान दिशा में जोड़ा जाता है और अपनी नई दिशा प्राप्त करने के लिए modulo 3 लिया जाता है। यह अधिकांश मामलों में ठीक काम करता है। हालांकि एक मुद्दा है जब वह एक ध्रुवीय कमरे में है और ध्रुव की ओर बढ़ता है। नीचे दिए गए नक्शे को मोड़ते समय यह स्पष्ट होगा कि यदि वह "उत्तर-पूर्व" का सामना करने वाले कमरे को छोड़ देता है, तो वह "दक्षिण-पूर्व" का सामना करते हुए नए वर्ग में प्रवेश करेगा, इसलिए एक सुधार किया जाना चाहिए। यह e=(d+i/10)*m[p%4]%3;गुणा द्वारा लाइन में किया जाता है m[p%4]। M [] के पहले चार मान ऐसे चुने गए हैं, जो ऊपर दिए गए उनके कार्य के अलावा, उनकी विशेषता m[1]%3==m[2]%3==1और भी हैं m[0]%3==m[3]%3==2। यह भूमध्यरेखीय कमरों के लिए दिशा को अकेला छोड़ देता है और ध्रुवीय कमरों के लिए आवश्यक सुधार लागू करता है।

सुधार करने का तार्किक समय इस कदम के बाद होगा। हालांकि पात्रों को बचाने के लिए यह कदम से पहले किया जाता है। इसलिए एम [] में कुछ मूल्यों को स्थानांतरित किया जाना चाहिए। इसलिए पिछले 2 अक्षर उदाहरण के लिए ऊपर दी गई तालिका LTके TLअनुसार हैं।

यहाँ छवि विवरण दर्ज करें

अनजाने कोड

यह Rev 1 कोड है, जो Rev 2 की तुलना में कम बाधित है।

यह जीसीसी / लिनक्स पर चलेगा। मैंने टिप्पणी में शामिल किया है कि विजुअल स्टूडियो / विंडोज पर इसे चलाने के लिए आवश्यक अतिरिक्त कोड। यह एक बड़ा अंतर है!

//Runs on gcc/linux. For visual studio / windows, change printf(...) 
//to printf(" %c%c%c",9*(i%4==1),i==p?m[d+12]:48+(a>>i&2)+(b>>i&1),10*!(i%2)) and uncomment the following lines
//#include"stdafx.h"
//#include<stdlib.h>
//#include<time.h>
//#pragma warning(once:996;once:430) //allow the use of scanf instead of scanf_s, allow default type=int. 
//Though rather than using the pragma, it is shorter to follow compiler recommendation and use scanf_s and int.

#define u(t,s,c) if(t){puts(s);c;}  //if(test){puts(string);additional code;}

i,     //player input, loop counter
d,e,   //current and proposed direction
a,b;   //bit flags for where wumpus smelt / breeze felt

main(){
    srand(time(0));
    char q,p=19,h=rand()%p,w=rand()%p,  //Initialise player, hole and wumpus. q stores proposed player position.
    *m="e@LwQMQOSOLT-\\/\n \f ";        //Chars 0-11: movetable. Chars 12-14:symbol for player. Chars 15-18: graphics format.   

    while(p-h&&p-w){

        // Print warnings
        for(i=3;i--;){q=(p+m[p%4*3+i])%20;u(q==w,"you smell a wumpus",a|=2<<p)u(q==h,"you feel a breeze",b|=1<<p)}

        // graphic display 
        for(i=20;i--;)printf("%c%c",i==p?m[d+12]:48+(a>>i&2)+(b>>i&1),m[i%4+15]);

        // Get player input and work out direction and room 
        scanf("%d",&i);
        e=(d+i/10)*m[p%4]%3;
        q=(p+m[p%4*3+e])%20;

        // i%5 is false if player inputs 5 (move player) otherwise true (shoot arrow) 
        if(i%5)
        {u(q-w,"arrow missed",w=(w+m[w%4*3+rand()%3])%20;a=0)else u(1,"YOU KILLED THE WUMPUS!",h=p)}
        else{p=q;d=e;u(p==h,"YOU FELL IN A HOLE!",)}
        u(p==w,"THE WUMPUS GOT YOU!",)
    }

}

ISSUES और CURIOISITIES

मैंने @professorfish द्वारा बताए गए बिंदु का लाभ उठाया है, अगर रैंडम स्थानों में वम्पस और गड्ढे शुरू होते हैं, तो खिलाड़ी को यादृच्छिक स्थान पर शुरू करने की कोई आवश्यकता नहीं है। खिलाड़ी हमेशा कक्ष 19 में उत्तर की ओर मुंह करके शुरू होता है।

मैं समझता हूं कि जैसा कि वम्पस "गड्ढे से अप्रभावित" होता है, वंपस उस कमरे में शुरू हो सकता है, या उस कमरे में प्रवेश कर सकता है जहां गड्ढा है। सामान्य तौर पर यह एक बिंदु को छोड़कर चीजों को सरल करता है। खेल खत्म होने का संकेत देने के लिए मेरे पास कोई विशिष्ट चर नहीं है; यह तब खत्म हो जाता है जब खिलाड़ी वैंपस या गड्ढे से मेल खाता है। इसलिए जब खिलाड़ी जीतता है तो मैं विजयी संदेश प्रदर्शित करता हूं लेकिन खिलाड़ी को लूप से बाहर निकालने के लिए गड्ढे में ले जाता हूं! मैं खिलाड़ी को गड्ढे में नहीं डाल सकता हूँ क्योंकि वहाँ पर वंपस हो सकता है और मुझे वम्पस के बारे में एक संदेश मिलेगा जो मुझे नहीं चाहिए।

Rev0program ने पूरी तरह से विजुअल स्टूडियो में काम किया, लेकिन IDE ने कहा "एक्स्टेक्ट के आसपास भ्रष्ट भ्रष्ट"। इसका कारण यह है कि स्कैनफ ने इसकी वजह से अपने लिनक्स मशीन पर intएक char.डेनिस रिपोर्ट किए गए गलत व्यवहार में डालने की कोशिश कर रहा है । वैसे भी यह सही प्रकार के प्रयोग से ठीक होता है।

रेव 0 में बोर्ड प्रदर्शित करने की रेखा अनाड़ी है और अन्य प्लेटफार्मों पर थोड़ी अलग दिखाई देती है। में printf(" %c%c%c")मध्य% c प्रिंट करने योग्य चरित्र दिखाया गया है। अंतिम% c या तो ASCII 0 है या ASCII 10 (\ n, विंडोज लाइन में गाड़ी वापसी के साथ नई लाइन है।) विंडोज में ऐसा कोई चरित्र नहीं प्रतीत होता है जो कंसोल में काम करता है, जो गाड़ी का रिटर्न दिए बिना एक पंक्ति में नीचे चला जाएगा। अगर वहाँ था तो मुझे पहले c% (ASCII 0, या ASCII 9 टैब को अक्षांश 1 वर्ण से पहले की आवश्यकता नहीं होगी। टैब उनके व्यवहार में बेहद अपरिभाषित हैं।) प्रमुख स्थान स्वरूपण में सुधार करता है (अक्षांश 3 और 2 अक्षांश अक्षांश 1 वर्ण के आसपास रखता है)। ।) Rev 1 में इस लाइन का एक रिविजन होता है जो a \ f फॉर्मफीड कैरेक्टर का उपयोग करता है और इसलिए प्रिंटफ की शुरुआत में फॉर्मेट कैरेक्टर की जरूरत नहीं होती है। यह इसे छोटा बनाता है, लेकिन \ f विंडोज में काम नहीं करता है।


1
मुझे राइटअप बहुत पसंद है।
माइकल स्टर्न

मुझे यकीन नहीं है कि अगर यह संशोधनों के कारण मुझे इसे लिनक्स पर जीसीसी के साथ संकलित करना था (पहले शामिल करें, के scanf_sसाथ बदलें scanfऔर शामिल करें stdio.hअगर मैं सी + + के रूप में सी के रूप में संकलन करता हूं), लेकिन यह काफी काम नहीं करता है मुझे। उदाहरण के लिए, अगर मैं बाएं जाता हूं, तो शुरुआत में दाएं वापस ( 15 35), मैं जिस कमरे में शुरू करता हूं, उससे अलग कमरे में हूं।
डेनिस

@ डेनिस मैंने बाहर निकलने पर त्रुटि के स्रोत को ट्रैक किया है। यह scanf_s (माना जाता है कि सुरक्षित है!) जो "वैरिएबल के चारों ओर स्टैक को दूषित करता है" जब यह मुझे लगाता है कि मैं एक बिट में एक 32 बिट पूर्णांक है। तो पहली चीज़ जो मैं सुझाऊँगा वह उस प्रकार की जाँच करेगा जो कि स्कैनफ "% d" के लिए उपयोग करता है और चर को उस प्रकार में बदलता है। मुझे char के लिए सही उत्तर w / बाहर निकलने की त्रुटि, int के लिए सही उत्तर w / o निकास त्रुटि, और Microsoft प्रकार __int64 के साथ गलत उत्तर मिला (बराबर लंबे समय तक, जब तक मैं "% lld" नहीं डाल देता।) आपके पास भी है। ungolfed संस्करण और क्या आपको डिस्प्ले में कोई समस्या है?
लेवल रिवर सेंट।

@steveverrill: हां, मैंने दोनों संस्करणों की कोशिश की थी। का प्रकार iवास्तव में समस्या है। आदमी पेज कहते हैं: " एक वैकल्पिक हस्ताक्षर किए दशमलव पूर्णांक मेल, अगले सूचक के लिए सूचक होना चाहिए पूर्णांक ।" प्रकार बदलने से यह ठीक काम करता है।
डेनिस

@steveverrill: मुझे नहीं पता कि वीएस चीजों को कैसे संभालता है, लेकिन यदि आप जीसीसी (सी, सी ++ नहीं) के साथ संकलन करते हैं, तो आप बहुत सारे चार्ट बचा सकते हैं। शामिल की जरूरत है अगर आप की जगह में से कोई भी NULLसाथ 0और scanf_sसाथ scanf, आप की जरूरत नहीं है intइससे पहले कि mainऔर आप ले जा सकते हैं iऔर dमुख्य के बाहर (वे के लिए डिफ़ॉल्ट intऔर के लिए शुरू कर रहे हैं 0)। इसके अलावा, आप परिभाषित कर सकते हैं p=19,h=rand()%p,w=rand()%p, के m[]साथ बदल सकते हैं *mऔर यह संभव हो सकता है सभी उदाहरणों के लिए एक मैक्रो को परिभाषित करने के लिए if(...==...)puts(...);
डेनिस

9

गोल्फस्क्रिप्ट, 269 वर्ण

{puts}:|;20,{;9{rand}:r~}$3<(:>"B:%d`w85>2n+Fup`y/>@D-=J7ldnx/W5XsLAb8~"{32-}%"`\24"{base}/3/{[.[~@].[~@]]}%:A=3r=0=:F;~:W;:P;{>A={0=F=}?:^P&!!{"You feel a breeze"|}*^W&!!{"You smell a wumpus"|}*'"#{'9.?r';STDIN.gets()}"'++~);(3%^=\4`={W={"Your arrow hit the wumpus"|0}{"Your arrow didn't hit anything"|W A=0=3r=:W>=.!\{"The wumpus catches you"|}*}if}{>:F;:>W=.!\{"You ran into the wumpus"|}*>P=.!\{"You fell into the pit"|}*&}if}do

ध्यान दें कि हार्ड-कोडिंग स्ट्रिंग्स के लिए कैरेक्टर काउंट से 163 को घटाया गया था। यदि आप चाहते हैं कि डिबग आउटपुट कमरे की संख्या को इंगित करता है तो पहली घटना के ठीक बाद निम्न पंक्ति जोड़ें ^:

'  YOU 'F'->'>+++puts'  DIRECTIONS [BRL] '^`+puts'  PIT 'P+puts'  WUMPUS 'W+puts 

एक उदाहरण सत्र (अतिरिक्त डिबग आउटपुट के साथ):

  YOU 6->11
  DIRECTIONS [BRL] [6 7 16]
  PIT 7
  WUMPUS 5
You feel a breeze
25
  YOU 11->16
  DIRECTIONS [BRL] [11 17 15]
  PIT 7
  WUMPUS 5
35
  YOU 16->11
  DIRECTIONS [BRL] [16 6 7]
  PIT 7
  WUMPUS 5
You feel a breeze
15
  YOU 11->6
  DIRECTIONS [BRL] [11 10 1]
  PIT 7
  WUMPUS 5
15
  YOU 6->10
  DIRECTIONS [BRL] [6 15 5]
  PIT 7
  WUMPUS 5
You smell a wumpus
14
Your arrow didn't hit anything
  YOU 6->10
  DIRECTIONS [BRL] [6 15 5]
  PIT 7
  WUMPUS 0
25
  YOU 10->5
  DIRECTIONS [BRL] [10 14 0]
  PIT 7
  WUMPUS 0
You smell a wumpus
24
Your arrow hit the wumpus

यहाँ पहला काम कोड है। कुछ और गोल्फिंग के लिए बाद में वापस आ रहा हूं।
हावर्ड

मेरा कोड वर्तमान में 1 वर्ण लंबा है। मैं आगे गोल्फ के लिए किसी भी संभावित रास्ते की तलाश कर रहा हूँ!
तैमेक

ऐसा नहीं है कि आप मेरी मदद की जरूरत है, लेकिन आप को परिभाषित करते हुए 14 वर्ण बचा सकता है {puts}:|;की जगह, 5 वर्ण Rऔर Wसाथ -और >और छोड़कर 9 वर्ण (आसपास के रिक्त स्थान को खत्म करने की अनुमति देता है) '> 'print(प्रश्न के लिए आवश्यक हो प्रतीत नहीं होता है)।
डेनिस

@ डेनिस धन्यवाद। मैं निश्चित रूप से आपके कुछ सुझावों पर अमल करूंगा।
हावर्ड

9

जावास्क्रिप्ट (ECMAScript 6) - 2197 1759 -45% = 967.45 वर्ण

लगभग पूरा गोल्फ इस ...

पूर्ण बोनस के लिए एक इकोसाहेड्रल मैप और मेगा-बैट के साथ जीयूआई शामिल है।

वम्पस जीयूआई

  • प्रत्येक कमरे में 4 बटन हैं: X(गड्ढे); B(द मेगा-बैट); W(द वम्पस); और P(आप)।
  • आपका वर्तमान स्थान नीले रंग का है।
  • बटन लाल रंग के होते हैं यदि यह जिस वस्तु का प्रतिनिधित्व करता है वह उस स्थान पर हो सकता है और यदि यह निश्चित रूप से उस स्थान पर नहीं है तो हरा हो सकता है।
  • Wऔर Pबटन केवल अपने वर्तमान स्थान से सटे क्षेत्रों में क्लिक किया जा सकता।
  • यदि आप जीतते हैं तो पृष्ठभूमि हरे रंग की हो जाती है और यदि आप मर जाते हैं तो पृष्ठभूमि लाल हो जाती है।

कोड:

P=x=>parseInt(x,36);Q=(y,a=4)=>[P(x)<<a for(x of y)];e=Q("def45c6di7ej1ai1bj2af3bf9dg8eh46b57a1gh0280390678ci9cj24g35h",0);X=Q("o6fl6afnik27bloscfaf");Y=Q("icp8i8t4jej4encjjan6");A='appendChild';C='createElement';W='width';H='height';G='background-color';L='disabled';I='innerHTML';N='className';D=document;R=Math.random;B=D.body;E=[];F=1<0;T=!F;Z="XBWP";s=D[C]('style');s.type='text/css';t='.A{position:absolute;left:25px;top:25px}.D{'+W+':50px;'+H+':50px}.D button{'+W+':25px;'+H+':25px;float:left}.R{'+G+':red}.G{'+G+':green}.B{'+G+':blue}';for(i in X)t+='#D'+i+'{left:'+X[i]+'px;top:'+Y[i]+'px}';s[A](D.createTextNode(t));D.head[A](s);c=D[C]('canvas');c[N]='A';c[W]=c[H]=500;B[A](c);x=c.getContext('2d');x.beginPath();d=(i,b,v)=>{for(j=0;j<3;j++){E[e[3*i+j]][b][L]=v}};a=(i,l,v)=>{t=F;for(j=0;j<3;j++)t=e[3*i+j]==l?T:t;if(t)M[v]++;b=E[i][v];b.c=-1;for(j=0;j<3;j++)E[e[3*i+j]][v].c+=t?1:-1;for(j of E)j[v][N]=j[v].c==M[v]?'R':'G';};M=[0,0,0];S=v=>{M[v]=0;for(i of E){i[v][N]='';i[v].c=0}};for(i in X){for(j=3*i;j<3*i+3;j++)x.moveTo(X[i],Y[i])|x.lineTo(X[e[j]],Y[e[j]]);B[A](v=D[C]('div'));v[N]='A D';v.id='D'+i;E[i]=[];for(j in Z){b=E[i][j]=v[A](D[C]('button'));b[L]=T;b.i=i;b.c=0;b[I]=Z[j];}E[i][4][O='onclick']=function(){d(P,2,T);d(P,3,T);if(this.i==W)c[N]+=' G';else{S(2);W=e[3*W+R()*3|0];if(W==P)c[N]+=' R';else{a(P,W,2);d(P,2,F);d(P,3,F)}}};E[i][3][O]=function(){d(P,2,T);d(P,3,T);E[P][3][N]='';P=this.i;if(W==P||Q==P){c[N]+=' R';return}else if(Z==P){j=P;do{P=R()*20|0}while(P==W||P==Q||P==j);do{Z=R()*20|0}while(Z==j||Z==P);S(1)}d(P,2,F);d(P,3,F);E[P][3][N]='B';a(P,Q,0);a(P,Z,1);a(P,W,2)}}x.stroke();P=R()*20|0;do{W=R()*20|0}while(W==P);do{Q=R()*20|0}while(Q==P);do{Z=R()*20|0}while(Z==P);E[P][3][N]='B';a(P,Q,0);a(P,Z,1);a(P,W,2);d(P,2,F);d(P,3,F)

क्लोजर कंपाइलर का उपयोग करके आप ईसीएमए 6 के बिना 1066 प्राप्त करें।
AMK

मैं सोच रहा था कि चीजों को घटाने में मदद करने के लिए एक ग्राफिकल निरूपण करने पर यह कितना आसान होगा। 1+ लेकिन यह थोड़ा बहुत आसान है :)
सिल्वेस्टर

9

बैश, 365 (पहला वर्किंग वर्जन 726!)

GOLFSCRIPT के साथ यूपी को कैच करना

@ डेनिस ने मूल रूप से मेरे लिए सभी गोल्फिंग की है। धन्यवाद!

कार्यक्रम मान्य इनपुट मानता है। वैध इनपुट वह दिशा है जिसे आप चुनते हैं (1 के लिए दाएं, बाएं के लिए 2, पीछे के लिए 3) आपकी कार्रवाई के बाद (4 को शूट करने के लिए, चलने के लिए 5)।

कुछ स्पष्टीकरण

मैं आम तौर पर बड़ी क्रिया स्पष्टीकरण करता हूं, लेकिन यह शायद मेरे लिए थोड़ा परेशान करने वाला है।

डोडेकेहेड्रोन ग्राफ पर प्रत्येक शीर्ष को एक अक्षर (a = 1, b = 2, ... t = 20) के रूप में एन्कोड किया गया है।

खिलाड़ी की शुरुआती स्थिति हमेशा 20 होती है (और वे 18 से अपनी पीठ के साथ खड़े होते हैं), क्योंकि यह अपने आप में मायने नहीं रखता है, केवल खिलाड़ी के सापेक्ष स्थान, गड्ढे और वंपस पदार्थ।

चर $pखिलाड़ी के स्थान को संग्रहीत करता है। $rखिलाड़ी के पिछले स्थान को संग्रहीत करता है। $wwumpus है और $h(H for hole) गड्ढा है।

कोड

p=t
r=r
j=echo
Z=npoemfsgnohtksblbtpckdpljqnriogelfhkbqrcaiadjhagimsmjtqecrdf
q(){ $j ${Z:RANDOM%19*3:1};}
C(){ [[ ${!1} =~ ${!2} ]];}
d(){ s=${Z:30#$1*3-30:3};}
w=`q`
h=`q`
for((;;));{
b=$p
d $p
u=u${s#*$r}$s
C w p&&$j The wumpus ate you&&exit
C h p&&$j You fell in the pit&&exit
C u w&&$j You smell the wumpus
C u h&&$j You feel a breeze from a pit
read i
F=5
y=${u:i/10:1};C i F&&p=$y&&r=$b||{ d $w;C y w&&$j You killed the wumpus&&exit;$j You missed;w=${s:RANDOM%3:1};};}

संस्करण इतिहास

  1. प्रारंभिक रिलीज, 698 वर्ण
  2. फिक्स्ड बग जहां "आप एक हवा महसूस करते हैं" और "आप बदबूदार गंध करते हैं" एक ही समय में प्रदर्शित नहीं कर सकते हैं; यादृच्छिक संख्या पीढ़ी को एक समारोह बनाकर 39 वर्णों को बचाया।
  3. याद है कि अगर आप गोली मारते हैं और याद करते हैं तो वंपस चलता है। 726 चरस।
  4. grep -oEएक चर बना दिया । 5 चरस बचाई।
  5. [a-z]{3}एक चर बना दिया । 3 चरों को बचाया।
  6. echoएक चर बना दिया । 5 चरस बचाई।
  7. ज्यादातर @ डेनिस के सुझावों पर काम किया। 72 चरों को बचाया।
  8. शेष सभी सुझावों को जोड़ा गया। 68 चरस बचाई।
  9. @DigitalTrauma के सुझाव से 2 चार्ट सहेजे गए।
  10. एक प्रमुख बग फिक्स्ड जहां आप केवल वंपस को शूट कर सकते हैं यदि यह दाईं ओर है। एक ही वर्ण गणना।
  11. उपयोग किए गए पैरामीटर विस्तार का उपयोग करते हुए 2 वर्णों को बंद करें $m
  12. खाई grepऔर थोड़ा और अधिक समझदार होने के द्वारा बहुत सारे आकर्षण काट दिए ।
  13. Cबयान में उपयोग करने के लिए एक regexp खोज फ़ंक्शन के रूप में परिभाषित किया गया है, और Eएक फ़ंक्शन प्रिंटिंग के रूप में "आपने वम्पस को मार डाला" और बाहर निकल रहा है।
  14. "यदि कथन" पुनर्व्यवस्था द्वारा 1 चार्ट सहेजा गया।
  15. से छुटकारा पाने के लिए बहुत सारे चार्ट सहेजे dऔर अनावश्यक कोष्ठक हटा दिए।
  16. ठीक हो गया। जोड़े गए बहुत सारे वर्ण :(
  17. MOARR SAVINGS ( http://xkcd.com/1296/ )
  18. @ डेनिस के विचारों में से एक (कुछ वर्णों की बचत), और मेरी चालाक (एबी) अप्रत्यक्ष उपयोग (1 चार्ट की बचत)।
  19. Q () के लिए स्टाइल फिक्स।
  20. फिर से जोड़ा उचित उत्पादन

नमूना चला

"इन:" इनपुट है, "आउट: आउटपुट है"।

खिलाड़ी थोड़ा सा इधर-उधर भटकता है, वैंपस को सूंघ कर गोली मार देता है। वे याद करते हैं, और वेम्पस उनके कमरे में आते हैं और उन्हें खाते हैं।

में: १५

में: १५

में: 25

में: 25

में: १५

बाहर: आप wumpus गंध

में: 14

आउट: आप चूक गए

आउट: वम्पस ने आपको खा लिया


1
मुझे लगता है कि आप अपने कोड को कम से कम 100 बाइट्स कम कर सकते हैं। 1. exitकेवल एक बाइट से अधिक लंबा है g=1और यह गैर-शून्य gऔर कुछ elifबयानों के लिए परीक्षण करने की आवश्यकता को समाप्त करता है । 2. आप के ((i==35))बजाय [ $i = 35 ]और के ...&&...बजाय का उपयोग कर सकते हैं if ... then ... fi। 3. q(){ L=({a..s});$j ${L[RANDOM%19]};}और n=`$k $w$m<<<$d`;w=${n:RANDOM%2+1:1}दोनों कुछ बाइट्स बचाते हैं।
डेनिस

1
बदलें while :;do... के doneसाथ for((;;);{... }एक 3 चार जतन के लिए
डिजिटल ट्रामा

1
@professorfish: मुझे लगता है कि वर्तमान स्ट्रिंग-जीआरपी-कट दृष्टिकोण की तुलना में एक फ़ंक्शन बेहतर काम करेगा। उदाहरण के लिए, d(){ x=npoemfgnshtoksblbtckpdpljqniorelgfhkbqraicadjaghimsmjtqecrdf;s=${x:3*30#$1-30:3};}आपको sऔर के nसाथ d $pऔर की परिभाषाओं को बदलने की अनुमति देगा d $w। यदि आप इसके अलावा परिभाषित u=${s#*$r}$s(और की परिभाषा को समायोजित lऔर fतदनुसार), तो आप की जरूरत नहीं होगी $kऔर $mअब। मुझे लगता है कि 83 बाइट्स बचती हैं। इसके अलावा, अंतरिक्ष में q ()आवश्यक नहीं है।
डेनिस

1
@professorfish: और आप 3 अतिरिक्त बाइट्स को परिभाषित c(){ [[ $1 =~ $2 ]];}और प्रतिस्थापित करके बचा सकते हैं , उदाहरण के लिए, दूसरी अंतिम पंक्ति के साथ c $r $b||{ $j You missed;d $w;w=${s:RANDOM%2+1:1};}
डेनिस

1
@professorfish: मेरे द्वारा सुझाए गए फ़ंक्शन का उपयोग करके 3 बाइट्स छोटे होने चाहिए। आप के बाद चार लाइनों की जगह से 106 अतिरिक्त बाइट्स बचा सकता है b=$pके साथ d $p;u=u${s#*$r}$s, के बाद लाइनों read iके साथ y=${u:i/10:1};C $i 5&&{ p=$y;r=$b;}||{ d $w;C $y $w&&$j You killed the wumpus&&exit;$j You missed;w=${s:RANDOM%2:1};}और से छुटकारा पाने के E()
डेनिस

6

गोल्फस्क्रिप्ट ( 206 198)

[5:C,]{{.{[~@]}:>~.{-1%}:<~}%.&}8*({[.<><.<><]}:F~-{99rand}$~5,{.<{>.'You smell a wumpus.\n'4{$F@?~!!*}:Q~{print}:,~}3*{>.'You feel a breeze.\n'5Q,}3*'"#{'C):C';STDIN.gets()}"'++~~:&9/{>}*&5%{'You killed the wumpus.'3Q{\<{>}3rand*\"Your arrow didn't hit anything.\n",0}or}{\;.'You fell into the pit.'4Q}if\.'You were killed by the wumpus.'4Q@or:n!}do];

अंत में डेनिस के लुकअप टेबल संस्करण के साथ पकड़ा गया, जिससे यह काफी उधार लेता है। इस संस्करण के बारे में दिलचस्प बात यह है कि इसमें कमरे के लेआउट के लिए लुकअप टेबल नहीं है।

एक आईकोसह्ड्रोन के 60 घूर्णी समानताएं 5 पत्र, A_5 पर बारी समूह isomorphic को कर रहे हैं। समूह का प्रतिनिधित्व करने के लिए सभी प्रकार के दृष्टिकोणों की कोशिश करने के बाद, मैं सबसे सरल एक पर वापस आया हूं: प्रत्येक तत्व समता का क्रमचय है। समूह को दो जनरेटर से एक से अधिक तरीकों से उत्पन्न किया जा सकता है: मैं जो दृष्टिकोण ले रहा हूं वह जनरेटर का उपयोग करता है 3और 3 1। ये हमें उत्पन्न करने के लिए अनुमति देते हैं 1 = 3 3 1, 2 = 3 3 1 3 1और 3 = 3

उस दिशा का निरीक्षण करें जो 3आदेश 2 के एक तत्व से मेल खाती है, क्योंकि आपके पीछे के दरवाजे से गुजरने के बाद, वह दरवाजा फिर से आपके पीछे है। दिशा 1आदेश 5 के एक तत्व से मेल खाती है, इकोसैहेड्रोन के एक शीर्ष पर घूमना। (इसी प्रकार 2)। और संयोजन 3 1क्रम 3 का है, क्योंकि यह आपके आस-पास से निकलने वाले कमरों के आस-पास के चक्रों को गोल करता है।

हम आदेश 2 दिशा का प्रतिनिधित्व करने का क्रमपरिवर्तन के लिए देख रहे तो 3और आदेश 5 दिशा का प्रतिनिधित्व करने का क्रमपरिवर्तन 1ऐसी है कि 3 1आदेश 3 की है।

A_5 में आदेश 2 के 15 क्रमोन्नति हैं, और प्रत्येक के लिए 1(और इसलिए 3 1) के लिए 8 उम्मीदवार क्रमोन्नति हैं । वहाँ एक स्पष्ट आकर्षण है [4 3 2 1 0]के लिए 3एक सरणी पीछे सिर्फ यह है: -1%। इसके संभावित साथी क्रमपरिवर्तन में से 3 1मैंने चुना है [0 1 3 4 2], जो कि काफी कम कार्यान्वयन को स्वीकार करता है [~@]

Ungolfed

# Generate the 60 permutations by repeated application of `3 1` and `3`
[5:C,]{{.{[~@]}:>~.{-1%}:<~}%.&}8*
# Remove [0 1 2 3 4] and its equivalence class (apply 3 (3 1)^n 3 for n in 0,1,2)
({[.<><.<><]}:F~-
# Shuffle the remaining 57 options to select random starting points for wumpus and pit
# Note that this introduces a slight bias against them being in the same room,
# but it's still possible.
{99rand}$~
# Start player at [0 1 2 3 4]
5,
{
    # Stack: Pit Wumpus Player
    .<
    # The adjacent rooms to the player are Player<> , Player<>> , and Player<>>>
    # If the wumpus is in one of those rooms, say so.
    {
        >."You smell a wumpus.\n"4
        {
            # ... X str off
            $F@?~!!*
            # ... str off$F X ?~!! *
            # Which means that we leave either str (if off$ and X are equivalent)
            # or the empty string on the stack
        }:Q~
        {print}:,~
    }3*
    # Ditto for the pit
    {>."You feel a breeze.\n"5Q,}3*
    # Read one line from STDIN.
    '"#{'C):C';STDIN.gets()}"'++~~
    # Stack: Pit Wumpus Player Player< Input
    # Find the room corresponding to the specified direction.
    :&9/{>}*&
    # Stack: Pit Wumpus Player TargetRoom Input
    5%{
        # Shoots:
        "You killed the wumpus."3Q
        {
            \<{>}3rand*\ # Move the wumpus to an adjacent room
            "Your arrow didn't hit anything.\n", # Inform
            0 # Continue
        }
        or
    }{
        # Moves:
        \;
        # If player and pit share a room, say so.
        ."You fell into the pit."4Q
    }if
    # If player and wumpus share a room, say so.
    # NB If the player walks into a room with the pit and the wumpus,
    # the `or` favours the pit death.
    \."You were killed by the wumpus."4Q@or
    # Save the topmost element of the stack for output if we break the loop. Loop if it's falsy.
    :n!
}do
# Ditch the junk.
];

अच्छा बीजीय दृष्टिकोण! हालांकि एक मामूली बग है: 10/@3%=इनपुट है, तो लंबाई 3 की एक सरणी के चौथे तत्व तक पहुंचने की कोशिश करता है 35
डेनिस

@ डेनिस, हाँ, मुझे एहसास हुआ कि मैं बिस्तर पर जाने के बाद। मैं इसे ठीक करने के विभिन्न तरीकों के बारे में सोच सकता हूं, सभी की लागत 2.
पीटर टेलर

तुम एक चार के साथ वापस मिल सकता है 9/3%@3%=
डेनिस

मैं वर्तमान में कुछ अधिक कठोर पुनर्गठन के साथ 7 चार्ट अप कर रहा हूं। लेकिन फिर भी काम 9/करने के बजाय 1 चर 10/, इसलिए धन्यवाद।
पीटर टेलर

5

वम्पस , 384 - 129 (स्ट्रिंग्स) = 255 बाइट्स

1SDL2vSD70L?.;;3AL1a!?,9)".supmuw a llems uoY"99+1.
II5x?,&WC2.           L2a!?,9)".ezeerb a leef uoY"93*2.
L1a!,FCFC[&WCL1a!?,"!supm",AW#16#[(=]?.;;l(&o1.
    ?,".uoy eta ",".gnih","uw eht dellik uoY"#22&oN@
     #15#L2a!?. ,"supmu","tyna tih t'ndid worra ruoY"#31&oND";"4L1a!?.;;L1xSUL1xSD=F-#81~4~?.;;;CCWC=F-#97~4~?.;;;2.
 ,"nto the pit."|       "w ehT"l&oN@
 |"i llef uoY"l2-&oN@

इसे ऑनलाइन आज़माएं! (बेशक, TIO बहुत मायने नहीं रखता है, क्योंकि आप कार्यक्रम का उपयोग अंतःक्रियात्मक रूप से नहीं कर सकते हैं, और एक बार कार्यक्रम STDIN पर निर्देशों से बाहर हो जाएगा , तो यह पढ़ा जाएगा 0 0, जो इसके बराबर है 3 4, इसलिए आप समाप्त करेंगे तीर चलाने की शूटिंग तब तक होती है जब तक कि वम्पस वहां से चला जाता है या आपको मार देता है।)

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

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

व्याख्या

पहला डिस्क्लेमर: भाषा के नाम के बावजूद, हंट द वम्पस को विशेष रूप से आसान बनाने के लिए इसे डिज़ाइन नहीं किया गया था । इसके बजाय, मैंने पहली बार त्रिभुजों के विषय के आसपास की भाषा को डिज़ाइन किया, एक इकोसाहेड्रल डेटा संरचना के साथ समाप्त हुआ, और उसके कारण इसे वम्पस कहने का फैसला किया।

तो हाँ, जबकि वम्पस मुख्य रूप से स्टैक-आधारित है, इसमें 20 रजिस्टर भी हैं जो एक आइसोसाह्रोन के चेहरे के आसपास व्यवस्थित होते हैं। इसका मतलब है, हमें मुफ्त में मानचित्र का प्रतिनिधित्व करने के लिए एक डेटा संरचना मिलती है। केवल एक चीज जो हम आसानी से नहीं कर सकते हैं वह इकोसैड्रोन पर विशिष्ट चेहरे पाती है, इसलिए उन्हें खोजने के लिए, हमें "डी 20 रोल" करने की आवश्यकता है जब तक कि हम उस चेहरे पर समाप्त नहीं हो जाते हैं जिसे हम खोज रहे हैं। (यह एक नियतात्मक तरीके से करना संभव है, लेकिन यह बहुत अधिक बाइट्स ले जाएगा।) इस तरह के चेहरे की खोज लगभग निश्चित रूप से समाप्त हो जाती है (यानी संभावना 1 के साथ), इसलिए हमेशा चलने वाली खोज अभ्यास में चिंता का विषय नहीं है)।

उपरोक्त कोड इस तरह के पहले कार्यान्वयन का एक संक्षिप्त संस्करण है, जिसमें एक सेर लेआउट है:

1SDL2vSD70L?.;;2.  < Setup; jumps to third line which starts the main loop

3AL1a! ?,".supmuw a llems uoY"#19&oN03.          < This section checks the player's surroundings.
        L2a!?,".ezeerb a leef uoY"#18&oN04.
             AW(=12[?.;;7.

    }&WC#11.                                     < This section reads the input. The top branch moves, the bottom branch shoots
II5x^                                              and kills or moves the wumpus.
     {FCFC[&WCL1a !?,"!supmuw eht dellik uoY"#22&oN@
                    ".gnihtyna tih t'ndid worra ruoY"#31&oND#59 9L1a!?.;;L1xSUL1xSD=F-#82~9~?.;;;CCWC=F-#98~9~?.;;;#11.

L1a!?,".uoy eta supmuw ehT"#19&oN@               < This section checks whether the player dies.
     L2a!?,".tip eht otni llef uoY"#22&oN@         Otherwise, we return back to the third line.
          2.

चूंकि गोल्फिंग में ज्यादातर लेआउट को संपीड़ित करना शामिल है, इसलिए मैं अभी इस संस्करण को समझाऊंगा (जब तक कि मैं किसी भी गोल्फिंग ट्रिक्स को जोड़ न दूं जो कोड को पुनर्गठन से परे हो)।

आइए सेटअप कोड से शुरू करें:

1SDL2vSD70L?.;;2.

प्रारंभ में, सभी चेहरे 0 पर सेट हैं । हम संबंधित चेहरे के 1-बिट और 2-बिट को सेट करके गड्ढे को एनकोड करेंगे। इस तरह, वे दोनों एक ही कमरे में हो सकते हैं। खिलाड़ी की स्थिति icosahedron पर बिल्कुल भी दर्ज नहीं की जाएगी, इसके बजाय यह हमेशा सक्रिय चेहरा होगा (एक समय में 20 रजिस्टर में से केवल एक सक्रिय है)।

1S     Store a 1 in the initially active face to put the wumpus there.
D      Roll the d20. Applies a uniformly random rotation to the icosahedron.
L2vS   Load the value of that face (in case it's the wumpus's), set the 2-bit
       and store the result back on that face.

अब हमें खिलाड़ी को लगाने के लिए एक यादृच्छिक खाली चेहरा खोजने की आवश्यकता है।

D      Roll the D20.
70     Push 7 and 0 which are the coordinates of the D in the program.
L      Load the value of the current face.
?.     If that value is non-zero (i.e. the active face has either the
       wumpus or the pit), jump back to the D to reroll the die.
;;2.   Otherwise, discard the 0 and the 7 and jump to (0, 2), which is
       the beginning of the main loop.

यह अगला भाग खिलाड़ी के परिवेश की जाँच करता है और उपयुक्त चेतावनी देता है:

3AL1a! ?,".supmuw a llems uoY"#19&oN03.
        L2a!?,".ezeerb a leef uoY"#18&oN04.
             AW(=12[?.;;7.

यह एक लूप है जिसे हम 3 बार चलाते हैं। हर बार, हम सही पड़ोसी को देखते हैं, यदि कोई खतरा है तो उपयुक्त स्ट्रिंग (ओं) को प्रिंट करें और फिर icosahedron को 120 ° से घुमाएं।

3    Push a 3 as a loop counter.
A    Tip the icosahedron onto the NW neighbour of the active face, which
     will be used to represent the right-hand room.
L1a  Extract the 1-bit of the value on that face.
!?,  If that value is zero, strafe to the next line, otherwise continue.

  ".supmuw a llems uoY"#19&oN03.
     Print "You smell a wumpus.", a linefeed and then jump to the next line.

L2a  Extract the 2-bit of the value on that face.
!?,  If that value is zero, strafe to the next line, otherwise continue.

  ".ezeerb a leef uoY"#18&oN04.
     Print "You feel a breeze.", a linefeed and then jump to the next line.
A    Tip back to the original active room (where the player is).
W    Rotate the icosahedron by 120°, so that the next iteration checks
     another neighbour.
(=   Decrement the loop counter and duplicate it.
12   Push 1, 2, the coordinates of the cell after the 3 (the loop counter).
[    Pull up one copy of the loop counter.
?.   If it's non-zero, jump to the beginning of the loop, otherwise continue.
;;7. Discard the 2 and the 1 and jump to (0, 7), which reads the player's
     input for this turn.

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

    }&WC#11.
II5x^
     {FCFC[&WCL1a !?,"!supmuw eht dellik uoY"#22&oN@
                    ".gnihtyna tih t'ndid worra ruoY"#31&oND#59 9L1a!?.;;L1xSUL1xSD=F-#82~9~?.;;;CCWC=F-#98~9~?.;;;#11.

इस भाग का प्रवेश बिंदु Iबाईं ओर है।

II   Read the integers from STDIN.
5x   XOR the second one with 5.
^    Turn either left or right, depending on the previous result. If the
     second input is 4, XORing with 5 gives 1 and the IP turns right.
     Otherwise, we get 0 and the IP turns left.

If the player entered 5, move:

}    Turn right so that the IP moves east again.
&W   If the room indicator is X, rotate the icosahedron by X*120°. This
     puts the target room south of the active face (where the back room
     normally is).
C    Tip the icosahedron onto the southern face. This moves the player there.
     Due to the way tipping works, the formerly active face will now be
     the southern neighbour, i.e. correctly at the back of the player.
#11. Jump to (0, 11), the final section which checks whether the player
     stepped into the pit or onto the wumpus.

If the player entered 4, move:

{    Turn left so that the IP moves east again.
F    Store the active face index (the player's position) on the stack.
CFC  Also store the face index of the southern neighbour (the back room)
     on the stack, so that we can recover the correct orientation if
     we need to.
[    Pull up the player's room choice.
&WC  Tip the icosahedron onto the corresponding face (same as for the move action)
L1a  Extract the 1-bit of the value on that face to check whether the arrow
     hit the wumpus.
!?,  If that value is zero, strafe to the next line, otherwise continue.

  "!supmuw eht dellik uoY"#22&oN@
     Print "You killed the wumpus.", a linefeed, and terminate the program.

".gnihtyna tih t'ndid worra ruoY"#31&oN
     Print "Your arrow didn't hit anything." and a linefeed.

This next bit is a loop which searches for the wumpus:

D    Roll the d20. The easiest way to search for the wumpus is to look at
     random faces.
#59 9
     Push 59 and 9, the coordinates of the beginning of this loop.
L1a  Extract the 1-bit of the value on the current face.
!?.  If that value is zero, jump back to the beginning of this loop to
     try another face, otherwise continue.
;;   Discard the 9 and the 59.
L1xS Unset the 1-bit of the current face to remove the wumpus there.
U    Tip the icosahedron onto a random neighbouring face. This moves us
     to a random adjacent room.
L1xS Set the 1-bit of the current face to put the wumpus there.

This next bit contains two loops which get us back to the player's room
with the correct orientation. We do this by first searching for the room
at the player's back, and then looking through its neighbours to find the
player's room.

D    Roll the d20.
=F-  Duplicate the back room index and subtract the current face index.
#82~9~
     Push 82 and 9 and pull up the difference we just computed.
?.   If the difference is non-zero (we've got the wrong room), jump back
     to the D to try again. Otherwise continue.
;;;  We've found the back room. Discard the 9, the 82 and the back room index.
C    Tip the icosahedron onto the southern face (one of the candidate
     neighbours which might be the player's room).
CWC  This begins the loop that searches for the player's room. Tip onto
     the back room, rotate by 120°, tip back. This cycles through the
     neighbours of the back room, while keeping the active face on those
     neighbours.
=F-  Duplicate the player's room index and subtract the current face index.
#98~9~
     Push 98 and 9 and pull up the difference we just computed.
?.   If the difference is non-zero (we've got the wrong room), jump back
     to the CWC to try again. Otherwise continue.
;;;  We've found the player's room and since we entered from the back room
     via C, we've also got the correct orientation. Discard the 9, the 98
     and the player's room index.
#11. Jump to (0, 11), the final section which checks whether the player
     stepped into the pit or onto the wumpus.

पे, वह कठिन हिस्सा था। अब हमें बस यह जाँचने की आवश्यकता है कि क्या खिलाड़ी मर जाता है और अन्यथा मुख्य लूप से शुरू होता है:

L1a!?,".uoy eta supmuw ehT"#19&oN@
     L2a!?,".tip eht otni llef uoY"#22&oN@
          2.

इस खंड की संरचना अनिवार्य रूप से उस संरचना के समान है जिसका उपयोग हमने खिलाड़ी के परिवेश की जांच करते समय किया था: हम वर्तमान चेहरे (खिलाड़ी के कमरे) के 1-बिट की जांच करते हैं और यदि यह सेट है तो हम प्रिंट करते हैं The wumpus ate you.और कार्यक्रम को समाप्त करते हैं। अन्यथा, हम 2-बिट की जांच करते हैं और यह सेट है कि हम प्रिंट करते हैं You fell into the pit.और प्रोग्राम को समाप्त करते हैं। अन्यथा हम उस तक पहुंचते हैं 2.जो मुख्य लूप की शुरुआत में (निर्देशांक पर (0, 2)) कूदता है ।


1

awk - बड़ा

यह उतना छोटा नहीं था जितना मैंने उम्मीद की थी, लेकिन मैंने ग्राफ़ से निपटने के लिए थोड़ा अलग दृष्टिकोण लिया, इसलिए मैं वैसे भी अनऑर्गनाइज्ड संस्करण पोस्ट कर रहा हूं।

मैंने इस तथ्य का लाभ उठाया कि अभिविन्यासों को संरक्षित करने वाले घुमावों के तहत एक आइकोसैहेड्रोन (20 पक्षीय पॉलीहेड्रॉन) को 5 के प्रत्यावर्ती समूह में आइसोमोर्फिक है (5 तत्व क्रमपरिवर्तन एक समान लंबाई वाले चक्र भी हैं)। फिर मैं "लंबाई" और "दाएं" के रूप में चक्र की लंबाई 5 के साथ दो क्रमपरिवर्तन चुनता हूं, और मैं चक्र की लंबाई 2 के रूप में "पीछे" के साथ एक क्रमचय चुनता हूं। इनका उपयोग करते हुए, मैं हैमिल्टनियन पथ (2xRRRLLLRLRL, प्रत्येक कमरे में 3xRB का उपयोग करके 3 संभावित दिशाओं को पकड़ने के लिए) का उपयोग करके एक कमरे से ग्राफ का निर्माण करता हूं।

function meta(z,a,b,c,d) {
    if(z==COMPOSE) {
        split(a,c,"");
        split(b,d,"");
        return c[d[1]]c[d[2]]c[d[3]]c[d[4]]c[d[5]];
    }
    if(z==WALK) {
        split(R" "R" "R" "L" "L" "L" "R" "L" "R" "L,c);
        for(b = 1; b <= 20; b++) {
            map[a] = b;
            a = meta(COMPOSE,meta(COMPOSE,a,R),B);
            map[a] = b;
            a = meta(COMPOSE,meta(COMPOSE,a,R),B);
            map[a] = b;
            a = meta(COMPOSE,meta(COMPOSE,a,R),B);
            a = meta(COMPOSE, a, c[b % 10 + 1]);
        }
    }
    if(z==TEST) {
        a = map[meta(COMPOSE,U,L)];
        b = map[meta(COMPOSE,U,R)];
        c = map[meta(COMPOSE,U,B)];
        if(a==W||b==W||c==W) print "You smell the wumpus";
        if(a==P||b==P||c==P) print "You feel a breeze";
        if(map[U]==W) {
            print "You have been eaten by the wumpus";
            exit;
        }
        if(map[U]==P) {
            print "You have fallen into a bottomless pit";
            exit;
        }
    }
    if(z==ARROWTEST) {
        if(A==W) {
            print "You have slain the wumpus!";
            exit;
        } else {
            for(a in p) if(map[a]==W) break;
            W=map[meta(COMPOSE,a,v[int(rand()*3)+1])];
        }
    }
}

BEGIN {
    COMPOSE = 0;
    WALK = 1;
    TEST = 2;
    ARROWTEST = 3;
    L = 35214;
    R = 35421;
    B = 35142;
    split(R" "L" "B,V);
    meta(WALK,L);
    W = int(rand()*19)+2;
    P = int(rand()*19)+2;
    U = L;
    meta(TEST);
}

{
    d=int($0/10);
    m=$0%10;
    if(m==5) U = meta(COMPOSE,U,V[d]);
    else if(m==4) {
        A = map[meta(COMPOSE,U,V[d])];
        meta(ARROWTEST);
    }
    meta(TEST);
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.