উম্পাসকে শিকার করুন


39

যখন আমি ছেলে ছিলাম, বাচ্চারা কম্পিউটার স্টোরগুলিতে ঘুরে বেড়াত এবং স্টাফরা আমাদের লাথি মেরে না দেওয়া পর্যন্ত হান্ট উইম্পাস খেলত। এটি একটি সাধারণ খেলা ছিল, ১৯ 1970০ এর দশকের মাঝামাঝি হোম কম্পিউটারগুলিতে প্রোগ্রামযোগ্য, মেশিনগুলি এতটাই প্রাথমিক যে মুরগির আকারের মাইক্রোপ্রসেসরের পরিবর্তে, আমি মনে করি তাদের মধ্যে সম্ভবত সেখানে সত্যিকারের ছানা ছিল।

আসুন আধুনিক হার্ডওয়্যারটিতে গেমটি পুনরায় উত্পাদনের মাধ্যমে সেই আগের যুগটি শুরু করা যাক।

  1. প্লেয়ারটি আইকোসহেড্রাল মানচিত্রে একটি এলোমেলো ঘরে শুরু হয় (এইভাবে মোট 20 টি কক্ষ রয়েছে, একে অপরের সাথে আইকোস্যাড্রনের মুখের মতো সংযুক্ত এবং প্রতিটি ঘরে একেবারে তিনটি প্রস্থান থাকে)।

  2. এলোমেলোভাবে এলোমেলোভাবে নির্বাচিত বিভিন্ন ঘরে শুরু হয় ump পাম্প দুর্গন্ধযুক্ত, এবং এর গন্ধটি তার অবস্থান সংলগ্ন তিনটি কক্ষে যে কোনওটিতে সনাক্ত করা যায়, যদিও গন্ধের দিকটি নির্ধারণ করা খেলোয়াড়ের পক্ষে অসম্ভব। গেমটি কেবলমাত্র "আপনার একটি গন্ধযুক্ত গন্ধ" প্রতিবেদন করেছে।

  3. প্লেয়ারটি একটি ধনুক এবং অসীম সংখ্যক তীর বহন করে, যে কোনও সময় যে কোনও সময় তার সামনের ঘরে shootুকতে পারে। যদি উইম্পাস সেই ঘরে থাকে তবে তা মারা যায় এবং প্লেয়ার জেতে। যদি উম্পাসটি সেই ঘরে না থাকে তবে এটি চমকে যায় এবং তার বর্তমান অবস্থানের সাথে সংযুক্ত তিনটি কক্ষে যেকোনও এলোমেলোভাবে সরানো হয়।

  4. একটি, এলোমেলোভাবে নির্বাচিত ঘরটিতে (প্লেয়ারটি যে রুমে শুরু হবে সেই রুমে না হওয়ার গ্যারান্টিযুক্ত) একটি বিবিধ পিট রয়েছে contains খেলোয়াড় যদি পিট সংলগ্ন যে কোনও ঘরে থাকে তবে সে বাতাস অনুভব করে তবে বাতাসটি কোন দরজা দিয়ে এসেছিল সে সম্পর্কে কোনও ধারণা পাওয়া যায়নি। যদি সে পিট দিয়ে ঘরে যায় তবে সে মারা যায় এবং উইম্পাস জিতল। গর্ত দ্বারা গলা ফেলা অবিচ্ছিন্ন।

  5. প্লেয়ার যদি উইম্পাসের ঘরে চলে যায়, বা যদি উইম্পাস প্লেয়ারের ঘরে চলে যায় তবে উইম্পাস জিতবে।

  6. খেলোয়াড় একটি সংখ্যার (1 = ডান, 2 = বাম, 3 = পিছনে) তার সাথে যে দিকটিমুখী হচ্ছে তা সুনির্দিষ্ট করে এবং তারপরে একটি ক্রিয়া (4 = একটি তীর অঙ্কুর করে, 5 = নির্দিষ্ট দিকে হাঁটুন)।

  7. স্কোর করার স্বার্থে, প্রতিটি গেমের স্ট্রিং ("আপনি বাতাস অনুভব করছেন," "আপনি একটি গলিত গন্ধ পান," "আপনার তীরটি কোনও আঘাত করেনি" ইত্যাদি) একটি বাইট হিসাবে বিবেচনা করা যেতে পারে। গেম কোডটি পাঠ্যে লুকিয়ে রাখতে কোনও আপত্তিজনক আচরণ নেই; এটি কেবল প্লেয়ারের সাথে কথোপকথনের জন্য।

  8. আপনার মেগাব্যাট প্রয়োগের জন্য 10% বাইট গণনা হ্রাস করুন, যা প্লেয়ারের চেয়ে আলাদা এলোমেলো রুমে শুরু হয় (যদিও তারা ডোবা এবং / বা পিট দিয়ে একটি রুম ভাগ করতে পারে)। খেলোয়াড় যদি বাদুড়ের সাথে ঘরে intoুকেন, বাদুড়গুলি খেলোয়াড়কে এলোমেলোভাবে বাছাইকৃত একটি কক্ষে নিয়ে যাবে (গর্তের মধ্যে পিট বা উল্পাসহ রুম না হওয়ার গ্যারান্টিযুক্ত), তাদের নিজস্ব, নতুন এলোমেলো জায়গায় যাওয়ার আগে। বাদুড় সংলগ্ন তিনটি কক্ষে তাদের আওয়াজ শোনা যায়, তবে শব্দটি কোন ঘর থেকে আসে সে সম্পর্কে খেলোয়াড়কে কোনও তথ্য দেওয়া হয় না।

  9. আপনার গ্রাফিক্যাল ইন্টারফেস প্রয়োগের জন্য 35% বাইট গণনা হ্রাস করুন যা আইকোসেইড্রাল মানচিত্র এবং খেলোয়াড়ের পিট, উইম্পাস এবং বাদুড়গুলির অবস্থান (যদি প্রযোজ্য) সম্পর্কিত আপেক্ষিক সম্পর্কিত কিছু কিছু ইঙ্গিত দেয় তবে খেলোয়াড়. স্পষ্টতই, যদি উইম্পাস সরানো হয় বা খেলোয়াড় বাদুড় দ্বারা চালিত হয়, সেই অনুযায়ী মানচিত্রটি পুনরায় সেট করা দরকার।

  10. সমন্বিত হিসাবে সর্বনিম্ন বাইট গণনা, জিতেছে।

গেমের একটি সংস্করণের জন্য বেসিক সোর্স কোড (অগত্যা উপরের নিয়মগুলি মেনে চলার প্রয়োজন নেই এবং, যে কোনও ক্ষেত্রে পুরোপুরি নিরপেক্ষ) এই ওয়েবসাইটে এবং সম্ভবত অন্যদেরও পাওয়া যাবে ।


কিছু স্পষ্টতা: ৩. যদি উইম্পাসটি সেই ঘরে না থাকে তবে এটি চমকে ওঠে এবং একটি তিনটি ঘরে চলে যায় .. সুতরাং আপনি যদি একটি তীর নিক্ষেপ করেন এবং মিস করেন তবে, ডুম্বু এসে আপনাকে হত্যা করতে পারে, তাই না? এবং চাবুকটি কেবল চমকে গেলেই চলবে, অন্যথায় এটি ঠিক রাখে? I. আমি বুঝতে পারি যে প্লেয়ারের শিরোনামটি সে আসল ঘর থেকেই নির্ধারিত। সুতরাং তিনি যদি দক্ষিণ থেকে আসেন তবে তার বিকল্পগুলি হবে 1. উত্তরপূর্ব ২.উত্তর পশ্চিম 3..মুখী এবং যদি তিনি উত্তর থেকে এসেছেন তবে এটি বিপরীত হবে। এছাড়াও আপনার বিধিগুলি রেফারেন্স প্রোগ্রামের চেয়ে সহজ / গল্ফিয়র বলে মনে হচ্ছে (যা আমি এখনও বিস্তারিতভাবে তদন্ত করে দেখিনি)) আমি কি সঠিক?
স্তর নদী সেন্ট

আহা! নেচে কোথাও কোনও আইকোশেড্রনের দ্বৈত গ্রাফের কোনও ছবি আমি পাই না ।
জ্যাক এম

1
@ স্টিভেরিলিল হ্যাঁ, আপনি যদি এটিকে বলে থাকেন তবে এটি এসে আপনাকে হত্যা করতে পারে। আপনি যদি এটিকে না বলেন, এটি সরবে না। গেমটিতে বিভিন্ন বৈচিত্র রয়েছে; উদাহরণস্বরূপ, অনেকগুলি সংস্করণ তীরগুলি চারদিকে ঘুরতে এবং হত্যা করতে দেয়। আমি এটা পেরেছি।
মাইকেল স্টারন

3
@ জ্যাকএম একটি আইকোসেহেড্রনের মুখের মানচিত্রটি একটি ডডকেহেড্রনের উল্লম্ব মানচিত্রের সমান এবং সেই চিত্রটি সহজেই পাওয়া যায়। উদাহরণস্বরূপ wolframalpha.com/input/?i=DodecahedralGraph+edgerules বা সমতুল্য ম্যাথমেটিকা ​​কমান্ড গ্রাফডাটা ["ডডেকাহেড্রালগ্রাফ", "এজজুলস"] চেষ্টা করুন। যেভাবেই আপনি you 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
@ জ্যাকএম নং, "পিছনে" বোঝানো হয়েছে আপনি যেদিকে এসেছিলেন সেদিকে ফিরে ঘুরে বেড়ানো। আপনি যদি "পিছনে" দুবার আঘাত করেন তবে আপনি যেখানে শুরু করেছিলেন সেখানেই শেষ করুন। আগের গেমের স্টেটগুলি সংরক্ষণ করার দরকার নেই।
মাইকেল স্টারন

উত্তর:


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. বাশ থেকে গল্ফস্ক্রিপ্টে অধ্যাপকফিশের উত্তর পোর্ট করা হয়েছে। স্কোর: 269

  2. অভিনীত পিটার টেলর এর মন্তব্য পরামর্শ। স্কোর: 250

  3. পিটার টেলর আমার সম্পূর্ণ কোডটি রিফ্যাক্ট করে এবং আমাকে সন্ধানের টেবিলটি সংক্ষেপ করতে সহায়তা করেছিল। স্কোর: 202

  4. গাণিতিক পদ্ধতির সাহায্যে সংলগ্ন কক্ষগুলির সন্ধানের টেবিলটি প্রতিস্থাপন করা হয়েছে। স্কোর: 182

  5. রিফ্যাক্টর ইনপুট, আউটপুট এবং গাণিতিক পদ্ধতির সমর্থনকারী ফাংশন। স্কোর: 163

একটি বড় "আপনাকে ধন্যবাদ!" তার সমস্ত সহায়তার জন্য পিটার টেলারের কাছে যায়।

কিভাবে এটা কাজ করে

20 টি কক্ষগুলি একটি ডডকেহেড্রনের শীর্ষস্থান হিসাবে প্রতিনিধিত্ব করা হয়েছে, যা নিম্নলিখিত ফ্যাশনে 0 থেকে 19 পর্যন্ত সংখ্যার জন্য নির্ধারিত হয়েছে:

ডোডেকহেড্রাল গ্রাফ

কক্ষ N এর সাথে সংলগ্ন কক্ষগুলি খুঁজতে এবং ঘড়ির কাঁটার দিক দিয়ে ফ্যাশনে অর্ডার দেওয়ার জন্য আমাদের চারটি কেস বিবেচনা করতে হবে:

  • যদি N ≡ 0 mod 4 (নীল ভার্টেক্সেস) হয় তবে সংলগ্ন ঘরটি 19 - N , N + 2 Mod 20 এবং N - 2 Mod 20 হয়

  • যদি N ≡ 1 মোড 4 (সবুজ মেরুদণ্ড), সংলগ্ন ঘরটি 19 - N , N - 4 Mod 20 এবং N + 4 Mod 20 হয়

  • যদি N ≡ 2 mod 4 (হলুদ ভার্টেক্সেস) হয় তবে সংলগ্ন ঘরটি 19 - N , N - 2 Mod 20 এবং N + 2 Mod 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
আপনি এর Qসাথে 1 টি সঞ্চয় করতে পারবেন 19rand 97+; 2 @সঙ্গে 97%3*&>..., আরও 1 ইনলাইনিং দ্বারা Qহিসাবে {19rand 97+}2*:,\:Hপ্রতিস্থাপন কয়েকটি |সঙ্গে *, যা প্রায়ই একটি করতে ভাল উপায় ifBকোনও উদ্দেশ্য করে না, এবং আমি মনে করি স্ট্যাকটি ব্যবহার করে আরও কয়েকটি পরিবর্তনশীল নির্মূল করা যেতে পারে।
পিটার টেলর

1
আর একটি ঘন ঘন ট্রিক উল্লেখ করতে ভুলে গেছেন: সারণী অনুসন্ধানের জন্য বেস রূপান্তর। আপনি সংলগ্ন তালিকার জন্য 62 টি অক্ষর প্রতিস্থাপন করতে পারেন 33-চর স্ট্রিং এর পরে 256base 20base(এবং সম্ভবত কয়েকটি +/- 97ও মুছে ফেলবেন)। একমাত্র নেতিবাচক দিকটি এটির জন্য প্রিন্টযোগ্য অক্ষরগুলির প্রয়োজন হবে।
পিটার টেলর

1
আমি আরও 13 টি বাঁচিয়েছি আরও প্রতিচ্ছবিযুক্ত জিএস হিসাবে সংশোধন করে (মূলত ভেরিয়েবলের চেয়ে স্ট্যাকটি ব্যবহার করছি); এবং আউটপুট কম সুন্দর করার ব্যয়ে অতিরিক্ত 10 টি রয়েছে। এটি আমার আগের মন্তব্যে বর্ণিত সারণী সংক্ষেপণের চেয়ে পৃথক।
পিটার টেলর

1
মোটেও নয়, আমি এটি উপভোগ করেছি। আমি কেবল হতাশ হয়েছি যে আরও বেশি গাণিতিক যেটি আমি ব্যবহার করতে চেয়েছিলাম তার চেয়ে দেখার টেবিলের পদ্ধতিটি এত বেশি ভাল। বিটিডাব্লু আমি মনে করি যে আপনার বর্তমান সংস্করণটিতে একটি ছোট ত্রুটি রয়েছে কারণ আপনি যদি একটি তীর চালান, মিস করেন এবং আপনার ঘরের মধ্যে ডাবিতাকে চমকে দেন তবে এটি কেবল 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 টি পদক্ষেপ নেওয়া লাগে, তিনি তার ডানদিকে গর্তটি জানেন এবং যথাসম্ভব দূরে যান gets একইভাবে, যখন সে ডাবিত বা বাম হয় তা জেনে না, যখন মোড়কে দুর্গন্ধযুক্ত করে, তখন সে পিছনে ফিরে ঘড়ির কাঁটার দিকের লুপ করে। তাকে আবার চাবুকের ঘ্রাণ নিতে 5 টি পদক্ষেপ লাগে, তাই তিনি জানেন যে এটি বাম দিকে এবং নিশ্চিতভাবে অঙ্কুরিত।

যদি সে অন্যভাবে লুপ করে ফেলেছিল তবে তিনি খুব শীঘ্রই উইম্পাসকে খুঁজে পেতেন এবং জানতেন যে এটি যেদিকে ঘুরিয়েছে সেদিকেই এটি ছিল।

এখানে চিত্র বর্ণনা লিখুন

আরইভি 1 সি (সাইগউইনের উপর জিসিসি), 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!",)}}

স্পষ্টতার জন্য নিউলাইনগুলি যুক্ত হয়েছে। রেভ 0 থেকে পরিবর্তনগুলি নিম্নরূপ:

উইন্ডোজের জন্য সাইগউইন লিনাক্স এমুলেটরটিতে জিসিসি সংকলক সুপারিশ করার জন্য @ ডেনিসকে একটি বড় থানকিউ। এই includeসংকলকটিকে রেভ 0 প্রোগ্রামের প্রয়োজন নেই, এবং এটি intভেরিয়েবলগুলির জন্য ডিফল্ট ধরণের অনুমতি দেয় এবং main.এটি একটি জীবন পরিবর্তনকারী গল্ফিং টিপ!

অতিরিক্তভাবে লিনাক্সে চলার অর্থ \fকার্স রিটার্ন না করে কার্সারটি নামিয়ে আনে (উইন্ডোতে এটি কেবল প্রিন্টযোগ্য প্রতীক তৈরি করে তার বিপরীতে) এই বোর্ডটি মুদ্রণকারী প্রিন্টফ স্টেটমেন্টের যথেষ্ট সংক্ষিপ্তকরণের অনুমতি দিয়েছে

মন্তব্যে ডেনিসের বেশ কয়েকটি অতিরিক্ত টিপস এবং আমার নিজস্ব একটি: তীরটি ডোবাটিকে আঘাত করেছে কিনা তা পরীক্ষা করার সময় শর্ত পরিবর্তন করা: if(q==w)> if(q-w)(..এছাড়া .. বিপরীত)

গ্রাফিক ডিসপ্লে যোগ করার সাথে সাথে প্লেয়ারটি জানেন যে কোথা থেকে কোথাও কোলে ডুবে যায় / বাতাসকে 35% বোনাস দাবি করা যায় তা সম্পর্কে তথ্য প্রদর্শন করা হয়। (আমি এটির পুরানো ডিবাগ সংস্করণটি মুছলাম যা ডাম্প এবং গর্তের সঠিক অবস্থান দেখায় It এটি সম্পাদনা ইতিহাসে দেখা যায়))

আরইভি 2 সি (সাইগউইনের উপর জিসিসি), 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লুপের বাইরে রাখা বার্তা জয় / হারাতে হবে lose ifশর্তসাপেক্ষ অপারেটর দ্বারা প্রতিস্থাপিত।

শুটিং তীরের জন্য লাইনে কন্ডিশনাল অপারেটরের ব্যবহার। যদি প্লেয়ারটি মিস না করে তবে এর জন্য একটি বার্তা মুদ্রণ করা এবং মোড়কের অবস্থান সামঞ্জস্য করা উভয়ই প্রয়োজন। ডেনিস একত্রিত করার কয়েকটি উপায় printfএবং ডাব্পাসের অবস্থান গণনার একক অভিব্যক্তিতে অফার করেছিল, তবে আমি নিজের একটির সাথে চলেছি। printfমুদ্রিত অক্ষরের সংখ্যা প্রদান করে, যা Your arrow didn't hit anything\n31 (11111 বাইনারি।) এর জন্য 31&Q(w)==Q(w)

এই সম্পাদনায় আমার অন্যান্য অবদানটি কিছু অপ্রয়োজনীয় বন্ধনীগুলি মুছে ফেলা হয়েছে।

আউটপুট

এখানে খেলোয়াড়টি ইতিমধ্যে উইম্পাস কোথায় রয়েছে তা খুঁজে পেয়েছেন, তবে পিটটিও ঠিক কোথায়, তা অনুসন্ধান করার জন্য পুরোপুরি অন্বেষণ করতে বেছে নিয়েছেন। আমার পুরানো ডিবাগ সংস্করণটির বিপরীতে যা দেখায় যে ডাব্পাস এবং পিট পুরো খেলা জুড়ে ছিল, এটি কেবলমাত্র সেই কক্ষগুলি দেখায় যেখানে খেলোয়াড়টি ঘুরে দেখেছে এবং একটি বায়ু অনুভূত করেছে (1) উইম্পাস (2) বা উভয় (3) গলিয়েছে। (যদি প্লেয়ার একটি তীর অঙ্কুর করে মিস করে aতবে উইম্পাস পজিশনের তথ্য সম্বলিত ভেরিয়েবলটি পুনরায় সেট করা হয়))

এখানে চিত্র বর্ণনা লিখুন

আইসিওএসএডরন প্রেরণ

দ্রষ্টব্য: এই বিভাগটি রেভ 1 এর উপর ভিত্তি করে

আমার তারকা বৈশিষ্ট্য! আমার কোডটিতে কোনও গ্রাফ নেই। এটি কীভাবে কাজ করে তা বোঝাতে নীচের বিশ্বের মানচিত্র দেখুন। আইকোসহেড্রনের যে কোনও বিন্দু 0-00 অক্ষাংশ এবং দ্রাঘিমাংশ 0-4 (বা একক সংখ্যা, দ্বারা প্রতিনিধিত্ব করা যেতে পারে long*4+lat) মানচিত্রে চিহ্নিত দ্রাঘিমাংশ রেখাটি কেবল দ্রাঘিমাংশের শূন্যযুক্ত মুখগুলির মধ্য দিয়ে যায় এবং অক্ষাংশ রেখাটি অতিক্রম করে অক্ষাংশ শূন্য সহ মুখগুলির কেন্দ্র।

খেলোয়াড়টি 3 টি সম্ভাব্য অক্ষের উপর ভিত্তি করে তৈরি করা যেতে পারে, যা প্রতীকগুলি দ্বারা নিম্নরূপ উপস্থাপন করা হয়: উত্তর-দক্ষিণ -- \উত্তর-পূর্বে-দক্ষিণ -পশ্চিম উত্তর-দক্ষিণ-পূর্বাঞ্চল /। যে কোনও ঘরে তার কাছে উপলব্ধ এই অক্ষগুলির প্রতিটিটিতে তার ঠিক একটি প্রস্থান রয়েছে। প্রদর্শিত ডিসপ্লেতে প্লেয়ার একটি সম্পূর্ণ ঘড়ির কাঁটার লুপ তৈরি করে। খেলোয়াড়টি কোথা থেকে এসেছেন এবং সেইজন্য তাকে কোথায় যেতে দেওয়া হচ্ছে তা চিহ্নিত করে সাধারণত সনাক্ত করা সহজ।

অবিচ্ছিন্ন চোখের জন্য যে সমস্যাটি একটু কঠিন, তা হ'ল চতুর্থটি। আপনি যখন এই মেরু সারিগুলির মধ্যে একটি স্লেণ্ট দেখতে পান, প্লেয়ারটি স্লেন্টের বাইরের প্রান্তের নিকটবর্তী মেরু কোষ থেকে এসেছেন এবং সাধারণত নিরক্ষীয় অঞ্চলের দিকে মুখ করে থাকেন। সুতরাং খেলোয়াড় দক্ষিণপূর্বের মুখোমুখি হচ্ছে এবং তার বিকল্পগুলি হ'ল: 15 (দক্ষিণ, ডানদিকে ঘর) 25 (উত্তর পশ্চিম, উপরের ঘর) বা 35 (উত্তর পশ্চিম, নীচের ঘর))

সুতরাং, মূলত আমি আইকোসহেড্রনকে 5x4 গ্রিডে ম্যাপ করি, যেখানে কক্ষগুলি প্রিন্ট করা হয় তার ক্রমে 19 থেকে 0 নম্বর রয়েছে। নীচের টেবিল অনুযায়ী প্লেয়ারের অক্ষাংশ এবং দিকের উপর নির্ভর করে বর্তমান অবস্থান থেকে যোগ বা বিয়োগ করে সরানো হয়েছে।

যদি প্লেয়ার বোর্ডের নীচে (পশ্চিম) থেকে যায় তবে সে আবার উপরে (পূর্ব) দিকে ফিরে আসে এবং তদ্বিপরীত হয়, তাই তার অবস্থানটি মডুলো ২০-এ নেওয়া হয় General 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 দ্বারা বিভক্ত) তার বর্তমান দিকটিতে যুক্ত করা হয় এবং তার নতুন দিকনির্দেশ পেতে মডুলো 3 নেওয়া হয়। এটি বেশিরভাগ ক্ষেত্রেই সূক্ষ্মভাবে কাজ করে। তবে একটি সমস্যা আছে যখন সে একটি মেরু ঘরে থাকে এবং খুঁটির দিকে এগিয়ে যায়। নীচের মানচিত্রটি ভাঁজ করার সময় এটি স্পষ্ট হবে যে তিনি "উত্তর-পূর্ব" মুখী ঘরটি ছেড়ে দিলে তিনি "দক্ষিণ-পূর্ব" মুখী নতুন স্কোয়ারে প্রবেশ করবেন সুতরাং একটি সংশোধন করা আবশ্যক। এটি রেখায় e=(d+i/10)*m[p%4]%3;দ্বারা দ্বারা গুণ দ্বারা সম্পন্ন হয় m[p%4]। মি প্রথম চার মান [] যে এই ধরনের নির্বাচন করা হয় উপরে তাদের ফাংশন ছাড়াও, তারা বৈশিষ্ট আছে m[1]%3==m[2]%3==1এবং m[0]%3==m[3]%3==2। এটি নিরক্ষীয় ঘরের জন্য একা দিক ছেড়ে দেয় এবং মেরু কক্ষগুলির জন্য প্রয়োজনীয় সংশোধন প্রযোজ্য।

সংশোধন করার যৌক্তিক সময়টি পদক্ষেপের পরে হবে। তবে অক্ষর সংরক্ষণ করতে সরানোর আগে এটি সম্পন্ন করা হয়। সুতরাং মি [নির্দিষ্ট কিছু মান অবশ্যই স্থানান্তর করতে হবে। সুতরাং শেষ 2 টি অক্ষর উদাহরণস্বরূপ উপরের টেবিলের LTপরিবর্তে TL

এখানে চিত্র বর্ণনা লিখুন

UNGOLFED CODE

এটি রেভ 1 কোড, যা রেভ 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!",)
    }

}

সমস্যা এবং কুরিয়সিটিস

আমি @ প্রোফেসরফিশ দ্বারা উল্লিখিত পয়েন্টটির সদ্ব্যবহার করেছি, যদি উইম্পাস এবং পিটটি এলোমেলো জায়গায় শুরু হয়, তবে এলোমেলো জায়গায় প্লেয়ারটি শুরু করার দরকার নেই। প্লেয়ার সর্বদা উত্তর দিকে মুখ করে 19 ঘরে শুরু হয় starts

আমি বুঝতে পারি যে, উইম্পাসটি "গর্তের দ্বারা প্রভাবিত না হওয়ায়", উইম্পাস শুরু করতে পারে, বা যেখানে পিট রয়েছে সেখানে প্রবেশ করতে পারে। সাধারণভাবে এটি এক বিন্দু বাদে বিষয়গুলিকে সরল করে। গেমটি শেষ হয়েছে তা বোঝাতে আমার কোনও নির্দিষ্ট পরিবর্তনশীল নেই; খেলোয়াড়টি উইম্পাস বা পিটের সাথে একত্রিত হলে এটি শেষ হয়। সুতরাং প্লেয়ার জিতলে আমি বিজয়ী বার্তাটি প্রদর্শন করি তবে গর্তটি প্লেয়ারের কাছে লুপ থেকে দূরে সরে যাই! আমি প্লেয়ারটিকে গর্তের মধ্যে রাখতে পারি না কারণ উইম্পাস থাকতে পারে এবং আমি চাই না এমন উইম্পাস সম্পর্কে একটি বার্তা পাব।

রেভ0 প্রোগ্রামটি ভিজ্যুয়াল স্টুডিওতে পুরোপুরি কাজ করেছিল, তবে আইডিই বলেছিল প্রস্থান করার সময় "ভেরিয়েবলের চারপাশে স্ট্যাকটি দূষিত হয়েছে"। এটি কারণ স্ক্যানফ তার লিনাক্স মেশিনে intকোনও char.ডেনিসের ভুল আচরণের রিপোর্ট করার চেষ্টা করছে of যাইহোক এটি রেভ 1 এ সঠিক ধরণের ব্যবহার দ্বারা স্থির করা হয়েছে।

রেভ 0 তে বোর্ডটি প্রদর্শনের জন্য লাইনটি আনাড়ি এবং অন্য প্ল্যাটফর্মগুলিতে কিছুটা আলাদা দেখা যায়। ইন printf(" %c%c%c")মধ্যম% গ মুদ্রণযোগ্য অক্ষর প্রদর্শন করা হয়। শেষ% c হয় হয় ASCII 0 বা ASCII 10 (\ n, উইন্ডোজে ক্য্যারিজ রিটার্ন সহ নতুন লাইন) সেখানে যদি আমার প্রথম সি% (ASCII 0, বা অ্যাসিটিআই 0, অক্ষাংশ 1 অক্ষরের আগে 9 টি ট্যাব প্রয়োজন হত না Tab ট্যাবগুলি তাদের আচরণে কুখ্যাতভাবে সংজ্ঞায়িত হয়)) শীর্ষস্থানীয় স্থান বিন্যাসকে উন্নত করে (অক্ষাংশ 3 এবং 2 অক্ষরের নিকটতর অক্ষাংশ 1 অক্ষর রাখে ।) রেভ 1 এ এই লাইনের একটি পুনর্বিবেচনা রয়েছে যা একটি \ f ফর্মফিড অক্ষর ব্যবহার করে এবং তাই প্রিন্টফের শুরুতে কোনও বিন্যাসের অক্ষরের প্রয়োজন নেই। এটি এটিকে খাটো করে তোলে তবে উইন্ডোজে work চ কাজ করে না।


1
আমি লেখার ভালবাসা।
মাইকেল স্টারন

আমি নিশ্চিত যদি এটা কারণ পরিবর্তন আমি লিনাক্স জিসিসি সঙ্গে এটি কম্পাইল (অপসারণ প্রথম অন্তর্ভুক্ত প্রতিস্থাপন করা ছিল নই scanf_sসঙ্গে scanfঅন্তর্ভুক্ত stdio.hযদি আমি সি চেয়ে সি ++ রেট প্রদানকারী হিসাবে কম্পাইল), কিন্তু এটা বেশ জন্য কাজ করে না আমাকে. উদাহরণস্বরূপ, আমি যদি বাম দিকে যাই, তবে প্রথম দিকে ( 15 35) শুরুতে ডানদিকে ফিরে আসি , আমি যে ঘরে শুরু করেছি তার চেয়ে আলাদা ঘরে আছি
ডেনিস

@ ডেনিস আমি প্রস্থান করার সময় ত্রুটির উত্স খুঁজে পেয়েছি। এটি স্ক্যানফ_স (ধারণা করা যায় নিরাপদ!) যা "ভেরিয়েবলের চারপাশে স্ট্যাকটিকে দূষিত করে" যখন এটি আমি যা অনুমান করি তা একটি চরে 32 বিট পূর্ণসংখ্যা হিসাবে রাখার চেষ্টা করে। সুতরাং আমি প্রথমে যা প্রস্তাব করব তা হ'ল স্ক্যানফ "% d" এর জন্য যে ধরণের ব্যবহার করে তা পরীক্ষা করে দেখুন এবং আমি সেই ভেরিয়েবলটি পরিবর্তন করতে পারি। আমি চরের জন্য সঠিক উত্তর ডাব্লু / প্রস্থান ত্রুটি, সঠিক উত্তর ডাব্লু / ও প্রস্থানের জন্য প্রস্থান ত্রুটি এবং মাইক্রোসফ্ট টাইপ __int64 (সমতুল্য দীর্ঘ দীর্ঘ, যদি না আমি "% এলএলডি" রাখি।) এর সাথে ভুল উত্তর পেয়েছি উজ্জীবিত সংস্করণ এবং ডিসপ্লেতে আপনার কোনও সমস্যা আছে?
লেভেল রিভার সেন্ট

@ স্টিভেভারিল: হ্যাঁ, আমি উভয় সংস্করণ চেষ্টা করেছিলাম। ধরণ iপ্রকৃতপক্ষে সমস্যা। Man পৃষ্ঠা বলছে: " একটি ঐচ্ছিকরূপে স্বাক্ষরিত দশমিক পূর্ণসংখ্যা মিলবে পরবর্তী পয়েন্টার একটি পয়েন্টার হতে হবে int- এ ।" ধরণ পরিবর্তন করা ঠিক কাজ করে।
ডেনিস

@ স্টিভেভারিল: আমি জানি না কীভাবে ভিএস জিনিসগুলি পরিচালনা করে তবে আপনি যদি জিসিসির সাথে সংকলন করেন (সি হিসাবে, সি ++ নয়) তবে আপনি প্রচুর অক্ষর সংরক্ষণ করতে পারেন। আপনি যদি এর 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 অক্ষর

প্রায় গল্ফ করা এই সমাপ্ত ...

সম্পূর্ণ বোনাসের জন্য একটি আইসিএইজেড্রাল মানচিত্র এবং মেগা-ব্যাটস সহ একটি জিইউআই অন্তর্ভুক্ত।

Wumpus GUI

  • প্রতিটি ঘরে 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 পান।
এএমকে

আমি ভাবছিলাম যখন আপনার গ্রাফিকাল প্রতিনিধিত্ব আছে যেখানে জিনিসগুলি কমাতে সহায়তা করতে পারেন। 1+ কিন্তু এটা সামান্য খুব সহজে :)
Sylwester

9

বাশ, 365 (প্রথম কার্যকারী সংস্করণ 726!)

গল্ফসক্রিপ্টের সাথে ক্যাচিং?

@ ডেনিস মূলত আমার জন্য সমস্ত গল্ফিং করেছেন। ধন্যবাদ!

প্রোগ্রামটি বৈধ ইনপুট ধরেছে। বৈধ ইনপুটটি আপনি যে দিকটি পছন্দ করেন (ডানদিকে 1, বাম দিকে 2, পিছনে 3) আপনার ক্রিয়া অনুসরণ করে (4 অঙ্কুর করতে, 5 হাঁটার জন্য)।

কিছু ব্যাখ্যা

আমি সাধারণত বড় আকারের ভারবোজের ব্যাখ্যা করি তবে আমার বিরক্ত করার পক্ষে এটি সম্ভবত কিছুটা জটিল।

ডোডেকহেড্রন গ্রাফের প্রতিটি শিখর একটি অক্ষর হিসাবে এনকোড করা হয়েছে (a = 1, খ = 2, ... টি = 20)।

প্লেয়ারের প্রারম্ভিক অবস্থানটি সর্বদা 20 (এবং তারা 18 এর পিছনে দাঁড়িয়ে থাকে), যেহেতু এটি নিজেরাই বিবেচনা করে না, কেবল প্লেয়ারের আপেক্ষিক অবস্থান, পিট এবং উইম্পাস বিষয়।

পরিবর্তনশীল $pপ্লেয়ারের অবস্থান সঞ্চয় করে। $rপ্লেয়ারের আগের অবস্থান সঞ্চয় করে। $wহ'ল উম্পাস এবং $h(হোলের জন্য এইচ) হ'ল গর্ত।

কোড

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. @ ডিজিটালট্রামার পরামর্শ থেকে 2 টি অক্ষর সংরক্ষণ করা হয়েছে।
  10. একটি বড় বাগ ঠিক করা হয়েছে যেখানে ডানদিকে থাকলে আপনি কেবল উইম্পাসকে গুলি করতে পারেন। একই চরিত্র গণনা।
  11. ব্যবহার করে 2 টি অক্ষর শেভ করতে প্যারামিটার সম্প্রসারণ ব্যবহৃত হয়েছে $m
  12. খনন করে grepকিছুটা বুদ্ধিমান হয়ে প্রচুর অক্ষর ছাঁটাই ।
  13. Cযদি বিবৃতিগুলিতে ব্যবহার করার জন্য একটি রেজিএক্সপ্যাক অনুসন্ধান ফাংশন হিসাবে সংজ্ঞায়িত করা হয়, এবং Eএকটি ফাংশন মুদ্রণ হিসাবে "আপনি উইম্পাসকে হত্যা করেছেন" এবং প্রস্থান করছেন।
  14. পুনরায় সাজানো "if স্টেটমেন্ট" দ্বারা 1 চর সংরক্ষণ করা হয়েছে।
  15. পরিত্রাণ পেয়ে প্রচুর অক্ষর সংরক্ষণ করেছেন dএবং অপ্রয়োজনীয় বন্ধনীগুলি সরান।
  16. স্থির বাগ। প্রচুর অক্ষর যুক্ত হয়েছে :(
  17. মোয়ার রক্ষা ( http://xkcd.com/1296/ )
  18. @ ডেনিসের আর একটি আইডিয়া (কয়েকটি অক্ষর সংরক্ষণ করা), এবং আমার কৌতুক (আব) দিকনির্দেশের ব্যবহার (1 চর সংরক্ষণ করা)।
  19. Q () এর জন্য স্টাইল ফিক্স।
  20. যথাযথ আউটপুট পুনরায় যুক্ত

নমুনা রান

"ইন:" ইনপুট, "আউট: আউটপুট"।

প্লেয়ারটি কিছুটা ঘোরাঘুরি করে, পিশা এবং কান্ডের ঘ্রাণ নেয়। তারা মিস করে, এবং গলদা তাদের ঘরে এসে খায়।

ইন: 15

ইন: 15

ইন: 25

ইন: 25

ইন: 15

আউট: আপনি গর্ভাশক গন্ধ

ইন: 14

আউট: আপনি মিস করেছেন

আউট: উইম্পাস আপনাকে খেয়েছে


1
আমি মনে করি আপনি আপনার কোডটি কমপক্ষে 100 বাইট সংক্ষিপ্ত করতে পারেন। 1. এটির exitতুলনায় কেবলমাত্র একটি বাইট দীর্ঘ g=1এবং এটি শূন্য gএবং কিছু elifবিবৃতিতে পরীক্ষা করার প্রয়োজনকে দূর করে । ২. আপনি ((i==35))পরিবর্তে [ $i = 35 ]এবং ...&&...পরিবর্তে ব্যবহার করতে পারেন if ... then ... fi। ৩. q(){ L=({a..s});$j ${L[RANDOM%19]};}এবং n=`$k $w$m<<<$d`;w=${n:RANDOM%2+1:1}উভয়ই কয়েকটি বাইট সংরক্ষণ করে।
ডেনিস

1
3 টি চর সঞ্চয় করার জন্য while :;do... এর doneসাথে for((;;);{... প্রতিস্থাপন করুন}
ডিজিটাল ট্রমা

1
@ প্রফেসরফিশ: আমি মনে করি যে কোনও ফাংশন বর্তমান স্ট্রিং-গ্রেপ-কাট পদ্ধতির চেয়ে ভাল কাজ করবে। উদাহরণস্বরূপ, 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
@ প্রফেসরফিশ: এবং আপনি সংজ্ঞা c(){ [[ $1 =~ $2 ]];}এবং প্রতিস্থাপনের মাধ্যমে 3 টি অতিরিক্ত বাইট সংরক্ষণ করতে পারেন , উদাহরণস্বরূপ, দ্বিতীয় থেকে শেষ লাইনের সাথে c $r $b||{ $j You missed;d $w;w=${s:RANDOM%2+1:1};}
ডেনিস

1
@ প্রফেসরফিশ: আমার প্রস্তাবিত ফাংশনটি ব্যবহার করে 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];

অবশেষে ডেনিসের লুকিং টেবিল সংস্করণটি ধরা পড়ে, যা থেকে এটি বেশ খানিকটা orrowণ নেয়। এই সংস্করণটি সম্পর্কে আকর্ষণীয় বিষয় হ'ল এটির সাথে রুম বিন্যাসের জন্য কোনও সারণী নেই।

একটি icosahedron 60 আবর্তনশীল symmetries 5 অক্ষর, A_5 উপর পর্যায়ক্রমে গ্রুপে isomorphic হয়। গোষ্ঠীটিকে নিখুঁতভাবে প্রতিনিধিত্ব করার জন্য সমস্ত ধরণের পদ্ধতির চেষ্টা করার পরে, আমি আবার সহজতমটিতে ফিরে এসেছি: প্রতিটি উপাদানটি সমতার সমষ্টি utation গ্রুপটি একাধিক উপায়ে দুটি জেনারেটর থেকে তৈরি করা যেতে পারে: আমি যে পদ্ধতি গ্রহণ করছি তা জেনারেটর 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 ক্রমবিধি রয়েছে এবং প্রত্যেকটির জন্য 8 1(এবং তাই 3 1) এর জন্য 8 প্রার্থীর অনুমতি রয়েছে । সেখানে একটি সুস্পষ্ট আকর্ষণ এর [4 3 2 1 0]জন্য 3একটি অ্যারে reversing ঠিক হয়: -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 টি চার্স আপ করছি। কিন্তু 1 টি 9/পরিবর্তে 10/এখনও কাজ করে, তাই ধন্যবাদ।
পিটার টেলর

5

Wumpus , 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@

এটি অনলাইন চেষ্টা করুন! (অবশ্যই, টিআইও খুব একটা অর্থবোধ করে না, কারণ আপনি সেখানে প্রোগ্রামটি ইন্টারেক্টিভভাবে ব্যবহার করতে পারবেন না, এবং প্রোগ্রামটি এসটিডিআইএন-এর নির্দেশাবলীর বাইরে চলে গেলে এটি পড়বে 0 0যা সমান 3 4, তাই আপনি শেষ করবেন) যতক্ষণ না উইম্পাস সেখানে না চলে বা আপনাকে মেরে না দেয় ততক্ষণে তীর চালাবেন))

এটি স্থানীয়ভাবে চালানোর সময়, নিশ্চিত হয়ে নিন যে প্রতিটি ইনপুটের দ্বিতীয় সংখ্যার পরে লাইনফিডটি ফ্লাশ হয়ে গেছে (কারণ উইম্পাসের এটি সংখ্যাটি শেষ কিনা তা নির্ধারণের জন্য এটি প্রয়োজন)। পাওয়ারশেল-এ, কাজ করার জন্য লাইনফিডের পরে আমার একরকম আরও একটি চরিত্র প্রবেশ করা প্রয়োজন (কোন চরিত্রের ব্যাপার না, তবে আমি পরীক্ষার জন্য কেবল ডাবল লাইনফিড ব্যবহার করেছি)।

এটি আরও গল্ফ করার জন্য অনেক জায়গা রয়েছে তবে সম্পূর্ণ নতুন লেআউট চেষ্টা করে দেখতে কিছুটা সময় লাগে। চূড়ান্ত স্কোরটি আমি যে প্রকৃত স্ট্রিংগুলি ব্যবহার করি তার উপরও অনেকটা নির্ভর করে কারণ 2 ডি ভাষায় এন বাইটের একটি স্ট্রিং আপনাকে সোর্স কোডের এন বাইটের চেয়ে বেশি ব্যয় করতে পারে, কারণ এটি কোড লেআউটে উল্লেখযোগ্য বাধা দেয় এবং আপনি প্রায়শই এটিকে একাধিক বিভাগে বিভক্ত করতে হবে (অতিরিক্ত ডাবল উদ্ধৃতি সহ)। চূড়ান্ত শেষে, আমি যদি প্রতিটি স্ট্রিংকে একটি অক্ষর (এবং -129 থেকে -12) এর মধ্যে কমিয়ে দিয়ে থাকি তবে আমি সম্ভবত একটি টন বাইট সংরক্ষণ করতাম।

ব্যাখ্যা

প্রথম একটি দাবি পরিত্যাগ: ভাষা নাম সত্ত্বেও, এটা ছিল না বাস্তবায়নের তুলতে পরিকল্পিত হান্ট Wumpus বিশেষ করে সহজ। পরিবর্তে, আমি প্রথমে ভাষাটি ত্রিভুজগুলির থিমের চারপাশে ডিজাইন করেছি, একটি আইকোসেহেড্রাল ডেটা কাঠামো দিয়ে শেষ করেছি এবং এর কারণেই এটিকে Wumpus বলার সিদ্ধান্ত নিয়েছি।

হ্যাঁ, যখন উইম্পাস মূলত স্ট্যাক-ভিত্তিক, তবে এটিতে 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-বিট সেট করে পিটটি এনকোড করব। এইভাবে, তারা উভয়ই একই ঘরে থাকতে পারে। প্লেয়ারের অবস্থানটি আইকোস্যাড্রোন এ একেবারেই রেকর্ড করা হবে না, পরিবর্তে এটি সর্বদা সক্রিয় মুখ হবে (একসাথে 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.

প্লেয়ারটি toোকাতে এখন আমাদের এলোমেলো খালি মুখের সন্ধান করতে হবে।

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 বারের মধ্যে দিয়ে চলি। প্রতিবার, আমরা ডান প্রতিবেশীর দিকে নজর রাখি, যদি কোনও বিপত্তি থাকে তবে উপযুক্ত স্ট্রিংগুলি মুদ্রণ করুন এবং তারপরে 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.

পরবর্তী বিভাগটি প্লেয়ারের কাছ থেকে দুটি সংখ্যা পড়ে এবং তারপরে হয় প্লেয়ারটিকে সরিয়ে দেয় বা একটি তীর অঙ্কুর করে। পূর্ববর্তীটি তুচ্ছ, পরে কম তাই। তীরের শুটিংয়ের মূল সমস্যাটি হ'ল কেসটি মিস করে। সেক্ষেত্রে আমাদের ক) ডাব্পাসটি সরিয়ে নেওয়ার জন্য সন্ধান করতে হবে, এবং খ) প্লেয়ারের ঘরে এবং আইসোশেড্রনের সঠিক দিকনির্দেশনা (যাতে "পিছনে" "পিছনে" থেকে যায়) ফিরে আসা উচিত। এটি পুরো প্রোগ্রামটির সবচেয়ে ব্যয়বহুল অংশ।

    }&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

বাজে - বড়

এটি যেমনটি আশা করা হয়েছিল তেমন সংক্ষিপ্ত আকারে পরিণত হয়নি, তবে আমি গ্রাফের সাথে ডিল করার ক্ষেত্রে কিছুটা ভিন্ন পন্থা নিয়েছি, তাই আমি যেভাবেই নিরপেক্ষ সংস্করণটি পোস্ট করছি।

আমি এই সত্যটি গ্রহণ করেছি যে অভিমুখীকরণ সংরক্ষণের আবর্তনের অধীনে একটি আইকোস্যাড্রন (20 পার্শ্বযুক্ত পলিহেড্রন) ডিগ্রি 5 এর বিকল্প গোষ্ঠীর কাছে বিচ্ছিন্ন (5 দৈর্ঘ্যের চক্র এমনকি সংখ্যার 5 উপাদান ক্রম)। তারপরে আমি চক্রের দৈর্ঘ্য 5 দিয়ে "বাম" এবং "ডান" হিসাবে দুটি ক্রমচঞ্চল বেছে নিই এবং আমি চক্রের দৈর্ঘ্য 2 এর সাথে একটি "পিছনে" হিসাবে একটি অনুক্রম বেছে নিই। এগুলি ব্যবহার করে, আমি হ্যামিলটোনিয়ান পাথ (2xRRRLLLRLRL, প্রতিটি ঘরে 3 টি সম্ভাব্য দিকগুলি ক্যাপচার করতে 3xRB ব্যবহার করে) হেঁটে একটি ঘর থেকে গ্রাফটি তৈরি করি।

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);
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.