রক, পেপার, কাঁচি, টিকটিকি, স্পক খেলা কে জিতবে?


24

আছে এই গেমটি সংক্রান্ত বেশ কয়েকটি প্রশ্ন , এমনকি একটি প্রতিযোগিতা এখানে । তবে আমি মনে করি এই সমস্ত চ্যালেঞ্জ এবং প্রতিযোগিতার একটি গেমের বিজয়ী স্বয়ংক্রিয়ভাবে নির্ধারণের জন্য একটি উপায় প্রয়োজন। তাই:

চ্যালেঞ্জ

["rock", "paper", "scissors", "lizard", "spock"]খেলোয়াড় 1 এবং প্লেয়ার 2 এর নির্বাচনের প্রতিনিধিত্ব করে এমন পরিসরে দুটি ইনপুট দেওয়া , ম্যাচের বিজয়ী নির্ধারণ করুন।

বিধি

[Winner] [action]    [loser]
-----------------------------
scissors cut         paper
paper    covers      rock
rock     crushes     lizard
lizard   poisons     spock
spock    smashes     scissors
scissors decapitates lizard
lizard   eats        paper
paper    disproves   spock
spock    vaporizes   rock
rock     crushes     scissors

বিধিনিষেধ

  • ইনপুট প্রদত্ত পরিসরে স্ট্রিংগুলির একটি জুটি হবে (অন্য কোনও স্ট্রিং ব্যবহার করা যাবে না)। আপনি যদি চান তবে আপনি অক্ষরের অ্যারে ব্যবহার করতে পারেন, যতক্ষণ না তারা উল্লিখিত মানগুলির মধ্যে প্রতিনিধিত্ব করে।
  • আপনি ইনপুট স্ট্রিংয়ের জন্য ছোট হাতের অক্ষর, বড় হাতের ( "ROCK") বা উটের কেস ( "Rock") ব্যবহার করবেন কিনা তা চয়ন করতে পারেন , যতক্ষণ না নির্বাচিত কেস সমস্ত ইনপুটগুলির ক্ষেত্রে একই থাকে।
  • আউটপুটটি মানগুলির একটি ত্রয়ী হবে যা বিজয়ী নির্ধারণ করে, যা উত্তরগুলির সাথে সামঞ্জস্য হওয়া অবধি আপনি যে কোনও কিছু করতে পারেন। উদাহরণ: 1যদি প্রথম ইনপুট জয়ী হয়, 2যদি দ্বিতীয় ইনপুট জিতে থাকে, 0যদি টাই থাকে। অথবা হতে পারে Aযদি প্রথম ইনপুট জিতে, Bদ্বিতীয় ইনপুট জিতলে, <empty string>যদি টাই থাকে।

লক্ষ্য

এটি , তাই প্রতিটি ভাষার জন্য সংক্ষিপ্ততম প্রোগ্রাম / পদ্ধতি / ফাংশন / ল্যাম্বদা জয়লাভ করতে পারে!

টেস্ট

[Input 1] [Input 2] [Output: 1/2/0]
-----------------------------------
 rock      paper     2
 rock      scissors  1
 lizard    spock     1
 spock     rock      1
 spock     paper     2
 rock      rock      0

এটি স্যান্ডবক্স থেকে আসে ।
চার্লি


আমি এটি সংযুক্ত প্রশ্নের সদৃশ হিসাবে বন্ধ করেছি কারণ এটি 2 টি নতুন মান এবং আইওতে সামান্য প্রকরণের সাথে একই প্রশ্ন।
গম উইজার্ড

4
@ ওয়েট উইজার্ড মাঝে মধ্যে ইনপুটটিতে সামান্য পরিবর্তন খুব আলাদা আউটপুট উত্পাদন করে। প্রশ্নগুলি বেশ একই রকম হতে পারে তবে দুটি নতুন মান বিবেচনার জন্য আরও কেস তৈরি করে, সুতরাং এখানে ব্যবহৃত অ্যালগরিদমগুলি মানুষকে আবার চিন্তা করতে পারে ( cakeকৌশলটির উত্তরগুলি দেখুন ) enough
চার্লি

4
আমি সম্মত হয়েছি এবং আবার খুলতে ভোট দিয়েছি।
জিবি

উত্তর:


25

পাইথন 3 , 68 50 48 বাইট

সম্পাদনা: নীলের 3 টি কৌশল এবং মিঃ এক্সকোডারের 2 টি ধন্যবাদ

প্রতিটি ইনপুট স্ট্রিংয়ের একটি পৃথক চতুর্থ অক্ষর থাকে, তাই আমি তাদের পার্থক্য করতে এটি ব্যবহার করছি। যদি আপনি চক্রের উপাদানগুলি (কাঁচি, কাগজ, শিলা, টিকটিকি, স্পোক) সাজিয়ে রাখেন, তবে প্রতিটি উপাদান তার পরে সরাসরি উপাদানটিকে মারধর করে এবং উপাদানটি চক্রাকারে ডানদিকে 3 স্পট করে। সুতরাং আমরা চক্রের ইনপুটগুলির অবস্থানগুলি বিয়োগ করি। যদি সংখ্যাটি 0 হয় তবে এটি টাই। যদি এটি 1 বা 3 হয় তবে এটি প্রথম প্লেয়ারের জন্য একটি জয়। আমার আসল সমাধানে, চক্রের পার্থক্য গেমের ফলাফলগুলিকে আলাদা করতে "210100" স্ট্রিংয়ের সাথে সূচি দেয়। নীল একরকম অনুগ্রহ করে এটি index যোগ করে এবং মডিউলটি ৩ যোগ করে সূচক ছাড়াই সম্পন্ন করা যায়: সম্পাদনা: মূলত আমি স্ট্রিংটি সনাক্ত করতে দ্বিতীয় চরিত্রটি ব্যবহার করেছি, তবে আপনি যদি চতুর্থটি ব্যবহার করেন এবং চক্রটি বিপরীত করেন, আপনি কেক পান। এবং আমরা সবাই আরও কেক ব্যবহার করতে পারি।

lambda x,y,z="cake".find:(7+z(y[3])-z(x[3]))%5%3

এটি অনলাইন চেষ্টা করুন!

পুরানো সংস্করণ:

lambda x,y,z="caoip".index:(7+z(y[1])-z(x[1]))%5%3

এটি অনলাইন চেষ্টা করুন!

মূল সংস্করণ:

b="caoip"
def r(x,y):return"210100"[(b.index(y[1])-b.index(x[1]))%5]

এটি অনলাইন চেষ্টা করুন!



6
পিপিসিজিতে আপনাকে স্বাগতম!
স্টেডিবক্স

1
49 বাইট: এটি অনলাইনে চেষ্টা করুন! (সুইচিং .indexকরতে .find)
জনাব Xcoder

1
48 বাইট: এটি অনলাইনে চেষ্টা করুন! (আপনি প্রয়োজন হবে না p, "chaoi"যথেষ্ট)
জনাব Xcoder

14

জাভাস্ক্রিপ্ট (ES6), 56 বাইট

বাক্য গঠন সিনট্যাক্সে ইনপুট নেয় (a)(b)। রিটার্নস 0যদি একটি জয়, 1যদি বি জয়ী বা falseটাই জন্য।

a=>b=>a!=b&&a>b^614>>((g=s=>parseInt(s,31)%9)(a)^g(b))&1

ডেমো

কিভাবে?

আমরা হ্যাশ ফাংশন এইচ () এরূপ হিসাবে সংজ্ঞা দিই :

H = s => parseInt(s, 31) % 9

এটি দেয়:

s          | H(s)
-----------+-----
"rock"     |  2
"paper"    |  8
"scissors" |  1
"lizard"   |  3
"spock"    |  4

একটি এবং দুটি ইনপুট দেওয়া , আমরা নিম্নলিখিত বিবৃতি বিবেচনা:

  1. আমাদের কি > বি আছে ? (অভিধানের ক্রমে)
  2. খেলা কি জিততে পারে ?
  3. এন = এইচ (ক) এক্সওর এইচ (খ) এর মান কত ?

(1) এবং (2) থেকে, আমরা > বি এর ফলাফলটি সঠিক বিজয়ী পেতে উল্টানো উচিত কিনা তা অনুমান করি এবং আমরা এই পতাকাটি একটি বিটমাস্কের N-th বিট মধ্যে সঞ্চয় করি ।

a        | H(a) | b        | H(b) | N  | a > b | b wins | invert
---------+------+----------+------+----+-------+--------+-------
rock     |   2  | paper    |   8  | 10 | Yes   | Yes    | No
rock     |   2  | scissors |   1  |  3 | No    | No     | No
rock     |   2  | lizard   |   3  |  1 | Yes   | No     | Yes
rock     |   2  | spock    |   4  |  6 | No    | Yes    | Yes
paper    |   8  | rock     |   2  | 10 | No    | No     | No
paper    |   8  | scissors |   1  |  9 | No    | Yes    | Yes
paper    |   8  | lizard   |   3  | 11 | Yes   | Yes    | No
paper    |   8  | spock    |   4  | 12 | No    | No     | No
scissors |   1  | rock     |   2  |  3 | Yes   | Yes    | No
scissors |   1  | paper    |   8  |  9 | Yes   | No     | Yes
scissors |   1  | lizard   |   3  |  2 | Yes   | No     | Yes
scissors |   1  | spock    |   4  |  5 | No    | Yes    | Yes
lizard   |   3  | rock     |   2  |  1 | No    | Yes    | Yes
lizard   |   3  | paper    |   8  | 11 | No    | No     | No
lizard   |   3  | scissors |   1  |  2 | No    | Yes    | Yes
lizard   |   3  | spock    |   4  |  7 | No    | No     | No
spock    |   4  | rock     |   2  |  6 | Yes   | No     | Yes
spock    |   4  | paper    |   8  | 12 | Yes   | Yes    | No
spock    |   4  | scissors |   1  |  5 | Yes   | No     | Yes
spock    |   4  | lizard   |   3  |  7 | Yes   | Yes    | No

বিটস:

bit | value
----+-----------
 0  | 0 (unused)
 1  | 1
 2  | 1
 3  | 0
 4  | 0 (unused)
 5  | 1
 6  | 1
 7  | 0
 8  | 0 (unused)
 9  | 1
10  | 0
11  | 0
12  | 0

নীচে থেকে শীর্ষে এটি পড়া এবং নেতৃস্থানীয় শূন্যগুলি উপেক্ষা করা, এটি 1001100110 বা দশমিক দশমিক 614 দেয় ।


6

05 এ বি 1 ই , 16 বাইট

ε'³²s3èk}Æ7+5%3%

এটি অনলাইন চেষ্টা করুন! বা টেস্ট স্যুট হিসাবে

ব্যাখ্যা

ব্যবহারকারী 507295cake থেকে খুব সুন্দর-কৌশল ব্যবহার করুন

ε       }          # apply to each in the input pair
    s3è            # get the 4th letter
 '³²   k           # get its cake-index
         Æ         # reduce by subtraction
          7+       # add 7
            5%3%   # mod by 5 and then 3

4

রুবি , 36 বাইট

->a,b{(2+a.sum%88%6-b.sum%88%6)%5%3}

রিটার্নস 0যদি 1 ম প্লেয়ার ধিক্কার জানাই, 1যদি 2nd প্লেয়ার ধিক্কার জানাই, এবং 2ড্র জন্য।

ব্যবহারকারী 507295 এর উত্তরের ভিত্তিতে তবে হ্যাশ সঞ্চালনের জন্য গাণিতিক সূত্র ব্যবহার করে। a.sumস্ট্রিংয়ের সমস্ত এএসসিআইআই কোডের যোগফল a, মোড 1<<16এবং একটি প্রাথমিক চেকসাম হিসাবে উদ্দিষ্ট। নিম্নলিখিত কোডটি ব্যবহার করে হ্যাশটি পাওয়া গেছে:

1.upto(99){|j|p j,["scissors","paper","rock","lizard","spock"].map{|i|i.sum%j%6}}

এটি এর দুটি মান তৈরি করেছে jযা 88 এবং 80 নামক ছোট ছোট অক্ষরের জন্য উপযুক্ত হ্যাশ দিয়েছে, উভয়ই উত্থিত ক্রম দিয়েছে [3,2,1,0,4](অথবা [4,3,2,1,0]যদি স্পোক শুরুতে চক্রাকার হয় তবে))

যেমন অন্যান্য উত্তরে ব্যাখ্যা করা হয়েছে, উপরের ক্রমটিতে ধারাবাহিক উপাদানগুলির জন্য একটি ধ্রুবক পার্থক্য মডুলো 5 দেয় এমন একটি হ্যাশ (h[a]-h[b])%5সূত্রটি কাজ করার জন্য প্রয়োজন । প্রতিটি উপাদান উপাদানটিকে ডানদিকে 1 বা 3 টি স্থানে আঘাত করে এবং উপাদানটি 2 বা 4 টি জায়গায় ডানদিকে হারায়।

এটি অনলাইন চেষ্টা করুন!


4

জাভাস্ক্রিপ্ট (ES6), 63 54 53 49 বাইট

f=
(l,r,g=s=>"cake".search(s[3]))=>(7+g(r)-g(l))%5%3
<div onchange=o.textContent=`RLT`[f(a.selectedOptions[0].value,b.selectedOptions[0].value)]>L: <select id=a><option>Rock<option>Paper<option>Scissors<option>Lizard<option>Spock</select> R: <select id=b><option>Rock<option>Paper<option>Scissors<option>Lizard<option>Spock</select> Winner: <span id=o>T

আমার গল্ফের বন্দর @ হোয়াটটোডো এর উত্তরে। দ্রষ্টব্য: স্নিপেট সংখ্যার ফলাফলটিকে কিছুটা কম অপঠনযোগ্য কিছুতে ডিকোড করে। সম্পাদনা: @ আরনাউল্ডকে ধন্যবাদ 1 বাইট সংরক্ষিত @Ovs এর জন্য 4 টি বাইট সংরক্ষণ করা হয়েছে


@ ওভস উগ, আমি আমার গল্ফকে কি যথেষ্ট কঠিনভাবে হোয়াটডোর উত্তর দিয়েছিলাম না ...
নিল

3

সি, 53 বাইটস

a="FÈ..J..ÁE";
z=*++y==*++x?0:a[*y&47>>1]>>*++x&7&1+1;

আমি এই সমস্যাটিকে একটি রাষ্ট্রীয় মেশিন হিসাবে বিবেচনা করেছি, যার মধ্যে দুটি, পাঁচটি রাষ্ট্রীয় ইনপুট দ্বারা সংজ্ঞায়িত 25 টি রাজ্য রয়েছে।

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

অন্যান্য সমাধানগুলিতে উল্লিখিত হিসাবে, 2, 3 এবং 4 অক্ষরগুলি সম্ভাব্য ইনপুটগুলির মধ্যে স্বতন্ত্র। আমি 2 এবং 3 অক্ষরগুলিতে কেন্দ্রীভূত ব্যবহার করেছি যা আমি আমার উত্তর অ্যারের মধ্যে উপযুক্ত বিটটি নির্বাচন করতে ব্যবহার করি।

অক্ষর 2 এর মধ্যে, 1 টি 4 এর মাধ্যমে বিটগুলি ইনপুটটি স্পষ্টভাবে সনাক্ত করে। এই বিটগুলি মাস্কিং করে এবং যথাযথভাবে স্থানান্তরিত করে [এটি "* y & 47 >> 1"], ইনপুটটি 0, 1, 4, 7 বা 8 হিসাবে উল্লেখ করা যেতে পারে তাই আমার উত্তর স্ট্রিংটিতে 9 টি অক্ষর রয়েছে। (আকর্ষণীয় বিট পৃথক)

character 2:
a 61   011 0000 1
c 63   011 0001 1
i 69   011 0100 1
p 70   011 1000 0
o 6f   011 0111 1

3 অক্ষরের মধ্যে বিট 0, 1 এবং 2 স্পষ্টভাবে ইনপুট সনাক্ত করে। এই বিটগুলি মাস্কিং করে (স্থানান্তরকরণের প্রয়োজন হয় না) [এটি "* x & 7"], ইনপুটটি 0, 1, 2, 3 বা 7 হিসাবে উল্লেখ করা যেতে পারে। (আকর্ষণীয় বিট পৃথক)

character 3
p 70   01110 000
i 69   01101 001
z 7a   01111 010
o 6f   01101 111
c 63   01100 011

উত্তরের স্ট্রিংটি উপযুক্ত অক্ষরের জন্য কেবল বিটগুলি পূরণ করে গণনা করা যেতে পারে।

0th char represents X=paper
1st char represents X=scissors
4th char represents X=Lizard
7th char represents X=Rock
8th char represents X=Spock

0th bit represents Y=Paper
1st bit represents Y=Scissors
2nd bit represents Y=Lizard
3rd bit represents Y=Rock
7th bit represents Y=Spock

সুতরাং, যেখানে জিতেছে সেখানে চরটি বিট করুন

char  7654 3210   in hex    in ascii
0     0100 0110    46         F
1     1100 1000    c8         È
2     0100 0000    d/c        .
3     0100 0000    d/c        .
4     0100 1010    4a         J
5     0100 0000    d/c        .
6     0100 0000    d/c        .
7     1100 0001    c1         Á
8     0100 0101    45         E

তারপরে যুক্তিটি সহজভাবে: দ্বিতীয় চরটি যদি একই হয় তবে আঁকুন, অন্যথায়, y এর দ্বিতীয় চরিত্রের ভিত্তিতে এসকি চর পাবেন এবং এক্স এর তৃতীয় অক্ষর দ্বারা বিট শিফট করুন এবং একটি যুক্ত করুন। এটি উত্তরগুলি ড্র করার জন্য 0, এক্স জয়ের জন্য 1 এবং y জয়ের জন্য 2 টি করে।


পিপিসিজিতে আপনাকে স্বাগতম! এটি একটি দুর্দান্ত, সুচিন্তিত উত্তর।
ফ্যানটাসি

1

ক্লোজার, 130 118 বাইট

আমার অদ্ভুত ব্যবহারের থেকে মুক্তি পেয়ে -12 বাইটস comp

(fn[& m](let[[p q](map #(apply +(map int(take 2 %)))m)d(- p q)](cond(= d 0)0(#{5 -16 12 -14 13 1 4 -18 2 11}d)1 1 2)))

আমি ভেবেছিলাম আমি চালাক হয়ে উঠছি, তবে এটি অন্যান্য উত্তরগুলির তুলনায় নিখুঁত হওয়া এবং অনেক বেশি দীর্ঘ।

প্রতিটি সরানো স্ট্রিংয়ের প্রথম 2 টি অক্ষর নেয়, চর কোডগুলি পেয়ে যায় এবং তাদের যোগফল দেয়। এটি তখন যোগফলগুলি বিয়োগ করে d। যদি d0 হয়, এটি একটি টাই (0), যদি এটি সেট থাকে #{5 -16 12 -14 13 1 4 -18 2 11}, পি 1 জিতে (1), অন্যথায়, পি 2 জিতে (2)।

(defn decide [& moves] ; Using varargs so I don't need to duplicate the steps.
  ; Pop the first 2 chars of each string, convert them to their ASCII code, and sum them.
  (let [[p1 p2] (map #(apply + (map int (take 2 %))) moves)
        d (- p1 p2)]

    (cond
      (= d 0) ; A tie
      0

      (#{5 -16 12 -14 13
         1 4 -18 2 11} d) ; P1 Wins
      1

      :else ; P2 Wins
      2)))

"ম্যাজিক নম্বরগুলি" পেতে যে P1 জিতলে সংজ্ঞায়িত হয়, আমি দৌড়ে এসেছি

(let [ms ["rock", "paper", "scissors", "lizard", "spock"]]
  (for [p1 ms
        p2 ms]

    ; Same as above
    (let [[p q] (map #(apply + (map int (take 2 %))) [p1 p2])
          d (- p q)]

      [p1 p2 d])))

যা dপ্রতিটি সম্ভাব্য দৃশ্যের জন্য মানগুলির তালিকা তৈরি করে :

(["rock" "rock" 0]
 ["rock" "paper" 16]
 ["rock" "scissors" 11]
 ["rock" "lizard" 12]
 ["rock" "spock" -2]
 ["paper" "rock" -16]
 ["paper" "paper" 0]
 ["paper" "scissors" -5]
 ["paper" "lizard" -4]
 ["paper" "spock" -18]
 ["scissors" "rock" -11]
 ["scissors" "paper" 5]
 ["scissors" "scissors" 0]
 ["scissors" "lizard" 1]
 ["scissors" "spock" -13]
 ["lizard" "rock" -12]
 ["lizard" "paper" 4]
 ["lizard" "scissors" -1]
 ["lizard" "lizard" 0]
 ["lizard" "spock" -14]
 ["spock" "rock" 2]
 ["spock" "paper" 18]
 ["spock" "scissors" 13]
 ["spock" "lizard" 14]
 ["spock" "spock" 0])

তারপরে আমি বিজয় চার্টটিকে এই আউটপুটটির সাথে তুলনা করেছি। ভাগ্যক্রমে 0 ছাড়া অন্য কোনও "সংঘর্ষ" ছিল না।

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