লিডারবোর্ড
154 Calculator
144 Taxman
138 Statistician
137 Solver
137 RandoAggroLawyer
136 Gambler
134 Turncoat
119 Lawyer
119 BloodyMurder
113 Bandit
79 Challenger
74 Mask
64 Random
লগ এবং সমস্ত আউটপুট ফাইল সহ সর্বশেষতম ম্যাচের একটি সংরক্ষণাগার উপলব্ধ।
ব্রিল্যান্ডের ক্যালকুলেটর, বিজয়ী! তার উত্তর গৃহীত হয়েছে, তবে এর অর্থ এই নয় যে চ্যালেঞ্জ শেষ হয়েছে। নতুন এন্ট্রি জমা দিতে বা আপনার বর্তমানের সম্পাদনা করতে নির্দ্বিধায় এবং তাকে তাঁর সিংহাসন থেকে ছিটকে দেওয়ার চেষ্টা করুন। আমি মাসের শেষে নেতাকে একটি অনুদান প্রদান করব।
খেলার নিয়ম
অভ্যুত্থান 2-6 খেলোয়াড়দের জন্য ডিজাইন করা একটি কার্ড গেম, যা আমরা দু'জনের সাথে খেলব। এটিতে মুদ্রার কোষাগার (আমাদের উদ্দেশ্যে অসীম) এবং 15 টি কার্ডের একটি ডেক রয়েছে, যার মধ্যে 3 টি নিম্নলিখিত ধরণের রয়েছে: অ্যাম্বাসেডর, অ্যাসাসিন, ক্যাপ্টেন, কনটেসা, ডিউক। গেমের শুরুতে, প্রতিটি খেলোয়াড়কে একটি মুদ্রা দেওয়া হয় এবং এলোমেলোভাবে দুটি কার্ড ডিল করা হয়, যা তারা প্রয়োজন অবধি গোপন রাখে। আপনার হাতে কার্ড যুক্ত জিনিসটি হ'ল শেষ খেলোয়াড়।
তাদের পালা, কোনও প্লেয়ার তাদের কার্ড নির্বিশেষে নিম্নলিখিত ক্রিয়াকলাপ গ্রহণ করতে পারে:
- আয়: কোষাগার থেকে 1 মুদ্রা নিন। অবরুদ্ধযোগ্য এবং অপ্রয়োজনীয় able
- বিদেশী সহায়তা: কোষাগার থেকে 2 টি কয়েন নিন। একজন ডিউক সহ খেলোয়াড় দ্বারা অবরুদ্ধ করা যেতে পারে। অপরিবর্তনীয়।
- অভ্যুত্থান: খেলা থেকে আপনার পছন্দের প্রতিপক্ষের একটি কার্ড সরান। 7 কয়েন ব্যয়। ভুক্তভোগী কোন কার্ডটি ফেলে দিতে হবে তা চয়ন করতে পারেন। যদি কোনও খেলোয়াড়ের পালা শুরুতে 10 বা ততোধিক মুদ্রা থাকে তবে তাদের অবশ্যই অভ্যুত্থান করতে হবে । অবরুদ্ধযোগ্য এবং অপরিবর্তনীয়।
তাদের কার্ডের উপর নির্ভর করে, খেলোয়াড়রা তাদের পালা হিসাবে নিম্নলিখিত ক্রিয়াকলাপগুলি গ্রহণ করতে পারে:
- এক্সচেঞ্জ: একজন রাষ্ট্রদূত সহ কোনও খেলোয়াড় ডেক থেকে দুটি কার্ড নিতে পারে। তারপরে তারা তাদের হাত থেকে এবং টানা কার্ডগুলি যতটা কার্ড তাদের কাছে থাকতে পারে তা চয়ন করতে পারে। (এটি হ'ল, যদি তাদের কেবল একটি কার্ড থাকে তবে তারা এটি আঁকা কার্ডগুলির মধ্যে একটির জন্য বিনিময় করতে পারে বা এটি রাখতে পারে এবং যদি তাদের দুটি কার্ড থাকে তবে তারা চারটি কার্ডের মধ্যে দুটি বেছে নিতে পারে)) দুটি অনাকাঙ্ক্ষিত কার্ড ডেকে ফেরত দেওয়া হবে । অবরুদ্ধযোগ্য, তবে চ্যালেঞ্জযোগ্য।
- হত্যাকাণ্ড: একজন খুনি সহ খেলোয়াড় খেলা থেকে প্রতিপক্ষের কার্ড সরাতে 3 টি মুদ্রা ব্যয় করতে পারে। ভুক্তভোগী কোন কার্ডটি ফেলে দিতে হবে তা চয়ন করতে পারেন। কোনও কন্টেসার সাথে কোনও খেলোয়াড় দ্বারা অবরুদ্ধ করা যেতে পারে, সেক্ষেত্রে কয়েনগুলি ফেরত দেওয়া হয় না। Challengeable, যে ক্ষেত্রে কয়েন হয় ফিরে আসেন।
- চুরি: ক্যাপ্টেন সহ একজন খেলোয়াড় তাদের প্রতিপক্ষের কাছ থেকে দুটি কয়েন নিতে পারেন। যদি প্রতিপক্ষের একটি মুদ্রা থাকে তবে তারা সেই মুদ্রাটি নেবে। প্রতিপক্ষের শূন্য কয়েন থাকলে তারা চুরি করতে পারে না। একজন রাষ্ট্রদূত বা ক্যাপ্টেন সহ কোনও খেলোয়াড় দ্বারা অবরুদ্ধ হতে পারে। Challengeable।
- কর: ডিউকের সাথে একজন খেলোয়াড় কোষাগার থেকে 3 টি মুদ্রা নিতে পারেন। অবরুদ্ধযোগ্য, তবে চ্যালেঞ্জযোগ্য।
অভ্যুত্থানের জটিল অংশটি হ'ল খেলোয়াড়দের কী কার্ড রয়েছে সে সম্পর্কে মিথ্যা বলতে দেওয়া হয়! ক্রিয়াকলাপ সম্পাদন করার চেষ্টা করার সাথে কারও সাথে কার্ড যুক্ত হওয়া বা এর সাথে জড়িত ব্লক থাকা দরকার না।
যখন কোনও খেলোয়াড় কোনও কার্ডের ক্রিয়া সম্পাদন করেন, তখন যে কোনও প্রতিপক্ষ (এমনকি সেই ক্রিয়াকলাপের দ্বারা ক্ষতিগ্রস্থ নয় এমনও) অভিনেতাকে চ্যালেঞ্জ জানাতে পারে এবং বলে যে তারা বিশ্বাস করে না যে এই ক্রিয়াটির জন্য তাদের কার্ড রয়েছে have যদি চ্যালেঞ্জারটি সঠিক হয় তবে ক্রিয়াটি বাতিল হয়ে গেছে এবং অভিনেতাকে অবশ্যই তাদের পছন্দের একটি কার্ড বাতিল করতে হবে (প্রযোজ্য ক্ষেত্রে তারা যে কোনও মুদ্রা ব্যয় করেছেন) ফিরে পেতে হবে। যদি তা না হয় তবে পদক্ষেপ নেওয়া হয়, অভিনেতা সেই কার্ডটি ফিরিয়ে দেন যেটিকে তারা ডেকে নিয়ে চ্যালেঞ্জ জানায় এবং একটি নতুন অঙ্কন করে, এবং চ্যালেঞ্জারকে অবশ্যই তাদের একটি কার্ড বাতিল করে দিতে হবে। খেলোয়াড়দের চ্যালেঞ্জ জানাতে হবে যে তারা কী কার্ড ধারণ করবে সে সম্পর্কে অবশ্যই সত্যবাদী হতে হবে।
হত্যাকাণ্ড, অভ্যুত্থান, এবং পরাজিত চ্যালেঞ্জগুলির সাথে খেলা থেকে বাদ দেওয়া কার্ডগুলি ডেকে ফেরানো হয় না, তবে জয়ের চ্যালেঞ্জের অংশ হিসাবে প্রকাশিত কার্ডগুলি ডেকে ফিরে আসে।
কর্মের মতোই ব্লকগুলি চ্যালেঞ্জ করা যেতে পারে। উদাহরণস্বরূপ, প্লেয়ার এ যদি বিদেশী সহায়তা দাবি করে এবং প্লেয়ার বি "আমার একটি ডিউক আছে এবং আমি আপনার বিদেশী সহায়তা ব্লক করি" বলে মন্তব্য করতে পারে তবে এ বলতে পারে "আমি বিশ্বাস করি না আপনার একটি ডিউক আছে।" যদি এই দাবিটি সঠিক হয়, বি মিথ্যা বলে ধরা পড়ার জন্য একটি কার্ড হারায় এবং এ 2 মুদ্রা নেয়; যদি এটি না হয় তবে ক একটি কার্ড হারিয়েছে এবং কোনও মুদ্রাও পায় না, এবং বি অবশ্যই তাদের ডিউকে ডেকে ফিরিয়ে একটি নতুন কার্ড আঁকবে।
হত্যার সাথে ব্লক এবং চ্যালেঞ্জগুলি যেভাবে কাজ করে তা অবশ্যই বের করে দেওয়া উচিত। ধরুন প্লেয়ার এ বলছেন "আমার একটি হত্যাকারী আছে এবং আমি প্লেয়ার বিকে হত্যা করি"। বি যদি চ্যালেঞ্জের চেষ্টা বা এটিকে অবরুদ্ধ করার চেষ্টা না করে, তবে হত্যাকাণ্ডটি ঘটে: বি একটি কার্ড হারায় এবং এ 3 টি মুদ্রা দেয়।
বিকল্পভাবে, বি "আপনার বিশ্বাসঘাতক আছে বলে আমি বিশ্বাস করি না" বলে চ্যালেঞ্জ জানাতে পারেন। যদি এটি সত্য হয়, তবে A একটি কার্ড ত্যাগ করে এবং তাদের কয়েনগুলি ফিরিয়ে দেওয়া হবে, যখন বি প্রভাবিত হবে না এবং এটির পালা শেষ হবে। যদি বি এর বিশ্বাসটি ভুল হয় এবং ক একটি হত্যাকারীকে ধরে রাখে, তবে বি তাদের কার্ড এবং ব্যর্থতা উভয়ই হারাবে, একটি ভুল চ্যালেঞ্জের জন্য একটি এবং হত্যাকাণ্ডের একটি।
চ্যালেঞ্জিংয়ের পরিবর্তে বি বলতে পারেন "আমার কাছে একটি কনটেসা আছে, এবং আমি খুনিটিকে ব্লক করছি"। যদি এ বি বিশ্বাস করে, তবে এ এর পালা শেষ হবে এবং তাদের কয়েনগুলি ফেরত দেওয়া হবে না। তবে এ ব্লকটিকে চ্যালেঞ্জ জানাতে পারে এবং বলে "আমি বিশ্বাস করি না আপনার কোনও কনটেসা আছে।" বি যদি আসলে কনটেসাকে ধরে রাখে, তবে এ ভুল চ্যালেঞ্জের জন্য একটি কার্ড হারায়। তবে বি যদি তা না করে তবে বি মিথ্যাতে ধরা পড়ার জন্য একটি কার্ড এবং অন্যটি হত্যার হাত থেকে হারিয়ে যায়
উপরোক্ত ব্যাখ্যার অনুরূপ যুক্তি ক্যাপ্টেনের স্টিল সক্ষমতার ক্ষেত্রে প্রযোজ্য, যেখানে অ্যাকশন বা ব্লককে চ্যালেঞ্জ দেওয়া যেতে পারে।
আপনার দু'টি কার্ডই হারাতে এবং একাই পাল্টে মুছে ফেলা সম্ভব, যদি আপনি কোনও অসিজনকে অসমর্থিতভাবে চ্যালেঞ্জ করেন বা আপনি কোনও মিথ্যা দাবি করে ধরা পড়ে যে কোনও হত্যাকাণ্ড ব্লক করার জন্য আপনার কাছে কোন কনটেসা রয়েছে। আপনি চ্যালেঞ্জ থেকে একটি কার্ড এবং হত্যা থেকে একটি কার্ড হারিয়েছেন।
চ্যালেঞ্জ
আপনার কাজটি এমন একটি প্রোগ্রাম লিখতে হবে যা কুপ খেলবে। এটির কমান্ড লাইন আর্গুমেন্ট হিসাবে দেওয়া হবে:
- এখন পর্যন্ত তার এবং এর বিরোধীদের ক্রিয়াকলাপের তালিকা সহ একটি ফাইলের নাম।
- প্রতিপক্ষের মুদ্রার গণনা নির্দেশ করে 0 থেকে 12 অবধি পূর্ণসংখ্যা।
- 0 থেকে 12 এর পূর্ণসংখ্যা যা এর মুদ্রার গণনা নির্দেশ করে।
- এক থেকে চার অক্ষরের স্ট্রিং এর কার্ডগুলি ইঙ্গিত করে। সাধারণত এটি আপনার প্রোগ্রামের এক বা দুটি কার্ডের মধ্যে সহজেই হতে পারে তবে আপনার প্রোগ্রামটি যদি কেবলমাত্র একটি এক্সচেঞ্জে সাফল্য অর্জন করে তবে এটি n + 2 অক্ষর দীর্ঘ হবে, যেখানে এন আপনার কার্ডের সংখ্যা বাকি। আপনার প্রোগ্রামটি অবশ্যই STDOUT এ রাখতে চায় এমন এন কার্ডগুলি আউটপুট করতে হবে। (প্রোগ্রামগুলি অবশ্যই এই উদ্দেশ্য ব্যতীত অন্য কোনও STDOUT পড়তে বা অ্যাক্সেস করতে হবে না - আপনি যদি ডিবাগ আউটপুট উত্পাদন করতে চান তবে দয়া করে STDERR এ লিখুন))
- এটি তৈরি করতে পারে এমন আইনী পদক্ষেপের ইঙ্গিত দেয় এক বা একাধিক যুক্তি।
(অনুরোধের উদাহরণ: yourprogram file.txt 1 7 '~!' a c p q
অর্থ "আপনার প্রতিপক্ষের 1 টি মুদ্রা রয়েছে You আপনার কাছে 7 টি মুদ্রা, একজন রাষ্ট্রদূত এবং একটি কনটেসা রয়েছে file গেমের ইতিহাস এবং বর্তমান গেমের স্থিতি দেওয়া আপনার a, c, p, অথবা q এর পছন্দ হিসাবে file.txt লিখুন। ")
আপনার প্রোগ্রামটি অবশ্যই একটি বা (দুটি নির্দিষ্ট পরিস্থিতিতে) দুটি অক্ষর সরবরাহ করা ফাইলে এর ক্রিয়াকে নির্দেশ করে app এটি অন্যথায় ফাইলের বিদ্যমান বিষয়বস্তুগুলি পরিবর্তন করতে হবে না। এটি ইচ্ছে করলে যে কোনও নতুন ফাইল তৈরি করতে পারে তবে কেবল যে ডিরেক্টরিটি এটি চালিত হয় তার মধ্যেই। আপনার প্রোগ্রামটি সংকলন এবং চালনার জন্য দয়া করে সমস্ত প্রয়োজনীয় কমান্ড সরবরাহ করুন।
আমি নীচে দুটি উদাহরণ প্রতিযোগী সরবরাহ করেছি, গোতে লিখিত।
আউটপুট বিন্যাসটি হ'ল:
I\n
: আয়। আইনী প্রতিক্রিয়া: যে কোনও পালা ক্রিয়া (ধরে নেওয়া / কাউপের অভ্যুত্থানের জন্য মুদ্রা রয়েছে বলে ধরে নেওয়া)।F
: বিদেশী সহায়তা। আইনী প্রতিক্রিয়া:d
(ডিউক হিসাবে ব্লক করুন),p
(এটি পাস হতে দিন)।C
: অভ্যুত্থান। আইনগত প্রতিক্রিয়া: যেটা এর_
,'
,<
,=
,0
আপনার হাতে নেই।E
: এক্সচেঞ্জ আইনী প্রতিক্রিয়া:q
(চ্যালেঞ্জ, খেলোয়াড়ের একজন রাষ্ট্রদূত রয়েছে তা বিশ্বাস না করে)p
,।T
: কর। আইনী প্রতিক্রিয়া:q
(চ্যালেঞ্জ, প্লেয়ারকে বিশ্বাস না করে তার ডিউক থাকে)p
,।A
: হত্যার। আইনগত প্রতিক্রিয়া:s
(ক Contessa যেমন ব্লক),q
(চ্যালেঞ্জ), এবং যেটা এর_
,'
,<
,=
,0
আপনার হাতে নেই।S
: চুরি। আইনী প্রতিক্রিয়া:a
(রাষ্ট্রদূত হিসাবে ব্লক),c
(ক্যাপ্টেন হিসাবে ব্লক),q
(চ্যালেঞ্জ, খেলোয়াড়ের ক্যাপ্টেন বিশ্বাস না করে)p
,।d
: ডিউক হিসাবে বিদেশী সহায়তা ব্লক। আইনী প্রতিক্রিয়া:\n
(ব্লকটি গ্রহণ করুন),q
(চ্যালেঞ্জ, প্লেয়ারকে বিশ্বাস না করা ডিউক আছে)।a
: রাষ্ট্রদূত হিসাবে একটি চুরি আটকা। আইনী প্রতিক্রিয়া:\n
(ব্লকটি গ্রহণ করুন),q
(চ্যালেঞ্জ, প্লেয়ারের বিশ্বাস নেই যে রাষ্ট্রদূত রয়েছে)।c
: ক্যাপ্টেন হিসাবে একটি স্টিল ব্লক।\n
(ব্লকটি গ্রহণ করুন),q
(চ্যালেঞ্জ, খেলোয়াড়ের ক্যাপ্টেন বিশ্বাস না করে)।s
: একটি কনটেসার হিসাবে একটি হত্যার ব্লক। আইনী প্রতিক্রিয়া:\n
(ব্লকটি গ্রহণ করুন),q
(চ্যালেঞ্জ, খেলোয়াড়ের একটি কনটেসা আছে বিশ্বাস না করা)।p
: যখন আপনার পালা না হয় তখন কোনও এক্সচেঞ্জ / কর / চুরিকে চ্যালেঞ্জ জানিয়ে পাস করুন। সঙ্গে ব্যবহার করা হয় নাA
; একটি হত্যার চ্যালেঞ্জ প্রত্যাখ্যান একটি লিখুন_'<=0
। আইনী প্রতিক্রিয়া:\n
(আপনার পালা শেষ করুন), এবং আপনি যদি সবেমাত্র কোনও এক্সচেঞ্জে সাফল্য অর্জন করেছেন, আপনি চতুর্থ কমান্ড লাইন যুক্তি থেকে STDOUT এ রাখতে চান এমন কার্ডগুলি লিখেছেন।q
: সাম্প্রতিকতম ক্রিয়া বা ব্লককে চ্যালেঞ্জ করুন। আইনী প্রতিক্রিয়া: যদি আপনার যে ক্রিয়াটি চ্যালেঞ্জ করা হয়েছিল তার জন্য কার্ড যদি থাকে তবে তার মধ্যে যেটিই হোক~^*!$
। যদি আপনি তা না করেন, তবে_'<=0
আপনার হাত থেকে যেটি আপনি ছেড়ে দিতে চান, তারপরে একটি নতুন লাইন অনুসরণ করুন এবং যদি কেবলমাত্র আপনার পালা হয়।~
,^
,*
,!
,$
: প্রকাশ করে যে আপনি একটি এক্সচেঞ্জে অধিষ্ঠিত যথাক্রমে, একটি রাষ্ট্রদূত একটি গুপ্তঘাতক, একটি ক্যাপ্টেন, একটি Contessa, এবং একটি ডিউক (এছাড়াও কমান্ড লাইন আর্গুমেন্ট মধ্যে এই কার্ড প্রতিনিধিত্ব করতে ব্যবহৃত, এবং stdout- এ আউটপুট সম্পর্কে সত্য কহন হয় )। আইনগত প্রতিক্রিয়া: যেটা এর_
,'
,<
,=
,0
আপনার হাতে আছে।_
,'
,<
,=
,0
: রূদ্ধ শাস্তি হিসেবে যথাক্রমে একটি রাষ্ট্রদূত এবং গুপ্তঘাতক, একটি ক্যাপ্টেন, একটি Contessa, এবং একটি ডিউক দিতে,, কারণ আপনি একটি চ্যালেঞ্জ হারিয়ে অথবা / Couped হত্যা করা হয়। আইনগত প্রতিক্রিয়া:\n
।\n
: আপনার পালা শেষ করুন, যদি প্রযোজ্য হয় তবে কোনও ব্লকে চ্যালেঞ্জ করতে অস্বীকার করে। আইনী প্রতিক্রিয়া: যে কোনও মূলধনী-পদক্ষেপের ক্রিয়া (ধরে নেওয়া যে একটিতে হত্যাকাণ্ড / অভ্যুত্থানের জন্য মুদ্রা রয়েছে এবং প্রতিপক্ষের কাছে চুরির জন্য মুদ্রা রয়েছে)।
ফর্ম্যাটটিতে নিম্নলিখিত দরকারী বৈশিষ্ট্য রয়েছে:
- বড় হাতের অক্ষর দিয়ে শুরু হয়।
- লাইনগুলি প্যাটার্নটি অনুসরণ করে: বড় হাতের অক্ষর, ছোট হাতের অক্ষর, allyচ্ছিক বিরামচিহ্ন চিহ্ন বা প্রকাশিত কার্ডের জন্য 0, নিউলাইন।
- একটি নিউলাইন বা একটি খালি ফাইলের সাথে শেষ হওয়া একটি ফাইল নির্দেশ করে যে এটি আপনার প্রোগ্রামের পালা শুরু এবং এটি অবশ্যই একটি মূলধন অক্ষরের ক্রিয়াটি চয়ন করতে পারে।
- আপনাকে অনুরোধ করার অনুমতি দেওয়া আইনী পদক্ষেপগুলি সাধারণত ফাইলের শেষ অক্ষর দ্বারা স্বতন্ত্রভাবে নির্ধারিত হয়। ব্যতিক্রমটি হ'ল এর
q
সাথে কিছু যুক্তি যুক্ত হবে। এটিget_legal_actions
বুঝতে সহায়তা করার জন্য সালিসে ফাংশনটি দেখুন । অথবা আপনি কেবলমাত্র কমান্ড লাইনে দেওয়া আইনী ক্রিয়াগুলি ব্যবহার করতে পারেন। - একটি লাইনের একটি এমনকি সংখ্যক অক্ষর ইঙ্গিত দেয় যে পালাটি আপনার এবং আপনার প্রোগ্রামটিকে কোনও ক্রিয়া বাছাই করতে, কোনও ব্লককে চ্যালেঞ্জ জানাতে বা তার পালা শেষ করতে বলা হয়।
- একটি লাইনের মধ্যে একটি অদ্ভুত সংখ্যক অক্ষর নির্দেশ করে যে মোড়টি আপনার নয় এবং আপনার প্রোগ্রামটি কোনও কার্ডকে ব্লক, চ্যালেঞ্জ, বা প্রকাশ / আত্মসমর্পণ করতে বলা হয়েছে।
আমি প্রতিটি কর্মের জন্য একটি উদাহরণ দেব।
I\n
বোঝা সহজ। একটি প্রোগ্রাম আয়ের এক মুদ্রা নেয়, তারপরে তার পালা শেষ হয়। এটি এমন দুটি ক্ষেত্রে একটি যেখানে প্রোগ্রামগুলি অবশ্যই দুটি অক্ষর মুদ্রণ করতে পারে, কারণ আয়ের একমাত্র ক্রিয়া যেখানে প্রতিপক্ষ উভয়ই ক্ষতিগ্রস্থ হয় না এবং প্রতিবন্ধক বা প্রতিরোধ করতে পারে না।
Fp\n
এর মানে হল যে একটি প্রোগ্রাম বিদেশী সহায়তা নিয়েছে, তার বিরোধী ( p
) অবরুদ্ধ করতে অস্বীকার করেছিল । এর পরবর্তী অনুরোধে প্রথম প্রোগ্রামটিতে উল্লেখ করা হয়েছিল যে চূড়ান্ত ছোট হাতের অক্ষর p
এবং / অথবা এই লাইনের অক্ষরগুলির সংখ্যা অনুসারে এটি এই মোড় নিয়েছে, যা এখনও শেষ হয়নি, সুতরাং এটি একটি নতুন লাইন মুদ্রণের মাধ্যমে তার বর্তমান পালাটি শেষ করতে জানে।
C=\n
মানে একটি প্রোগ্রাম একটি অভ্যুত্থান চালু করেছে। এর বিরোধী, জেনে যে এটি লাইনে বিজোড় সংখ্যক চিঠি দ্বারা প্রতিক্রিয়া জানানো হয়েছিল, একটি কনটেসাকে ছেড়ে দিল। আবার, প্রথম প্রোগ্রামটি জানত যে এটি লাইনটিতে থাকা অক্ষরের সমান সংখ্যার দ্বারা পরবর্তী অনুরোধের এটির অসম্পূর্ণ পালা, তাই এটি তার পালাটি শেষ করার জন্য একটি নতুন লাইন লিখেছিল।
Eq~<\n
এর অর্থ হ'ল যে একটি প্রোগ্রাম একটি এক্সচেঞ্জের চেষ্টা করেছে ( E
) এবং এর প্রতিপক্ষ চ্যালেঞ্জ করেছে ( q
)। এক্সচেঞ্জিং প্রোগ্রামে প্রকাশিত হয়েছিল যে এটিতে সত্যই একজন রাষ্ট্রদূত ছিলেন ( ~
) এবং চ্যালেঞ্জার একটি ক্যাপ্টেনকে শাস্তি হিসাবে ছেড়ে দিয়েছিলেন ( <
)। চ্যালেঞ্জারটি প্রস্থান করার পরে, এক্সচেঞ্জিং প্রোগ্রামটি আবার একটি চতুর্থ কমান্ড-লাইন আর্গুমেন্ট (বা তিনটি অক্ষর, যদি এর কেবল একটি কার্ড থাকে) হিসাবে চার অক্ষরের স্ট্রিং দিয়ে ডাকা হয়। এটি STDOUT এ রাখতে চাইলে কার্ডগুলিতে প্রতিনিধিত্ব করে এমন ফাইলগুলি এবং ফাইলটিতে একটি নতুন লাইন লিখেছে।
Tq'\n
এর মানে হল যে একটি প্রোগ্রামের অবিশ্বস্ত করের চেষ্টা করা হয়েছিল, তাকে চ্যালেঞ্জ জানানো হয়েছিল, এবং একটি হত্যাকারীকে ছেড়ে দেওয়া হয়েছিল। এটি অন্য ক্ষেত্রে যেখানে দুটি অক্ষর লেখা আছে তা চিত্রিত করে: যদি আপনার পালা হয় এবং আপনি কোনও কার্ড দিতে বাধ্য হন - তবে প্রতিপক্ষের সঠিক চ্যালেঞ্জ থেকে (যেমন এখানে) বা কোনও ব্লকের আপনার ভুল চ্যালেঞ্জ থেকে - তবে আপনাকে অবশ্যই দুটি লিখতে হবে আপনার দেওয়া কার্ডটি এবং আপনার পালা শেষ করার জন্য একটি নতুন লাইন।
Asq!'\n
এর অর্থ হ'ল প্লেয়ার বি প্লেয়ার এ ( A
) কে মেরে ফেলার চেষ্টা করেছিল , কিন্তু এটিকে এটি ব্লক করার জন্য একটি কনটেসা থাকার দাবি করেছে ( s
)। বি এ বিশ্বাস করেনি এবং চ্যালেঞ্জ করেছে ( q
)। একটি প্রকাশিত হয়েছিল যে তারা আসলে কন্টেসা ( !
) করেছে। বি তাদের একমাসিনকে শাস্তি হিসাবে ছেড়ে দিয়েছিল, তাদের মুদ্রা হারিয়েছিল এবং তাদের পালা ( '\n
) সমাপ্ত করেছিল , সেই বিশেষ ক্ষেত্রে দুটি চরিত্র লিখেছিল। (এ যদি অবরুদ্ধ বা চ্যালেঞ্জ না করার সিদ্ধান্ত নিয়েছিল, তবে এটি লিখতে পারত =
এবং তার বিরোধী তখন দেখতে পেত যে পালাটি শেষ হয়ে গিয়েছিল এবং একটি নতুন লাইন লিখেছিল The লাইনটি তখন A=\n
অভ্যুত্থানের উদাহরণের মতো পড়তে পারে))
Sq*0\n
এর অর্থ একটি প্রোগ্রাম চুরির চেষ্টা করে; প্রতিপক্ষকে চ্যালেঞ্জ জানানো, বিশ্বাস না করে চোরের একজন ক্যাপ্টেন রয়েছে; এবং মূল প্রোগ্রামটি একজন ক্যাপ্টেনকে প্রকাশ করে, তাই চ্যালেঞ্জটি ব্যর্থ হয়েছে এবং চ্যালেঞ্জার শাস্তি হিসাবে একটি ডিউক ছেড়ে দেয়। (তার প্রতিপক্ষের জন্য আরেকটি বিকল্প হ'ল লিখিতভাবে স্টিলকে গ্রহণ করা p
Its তার প্রতিপক্ষ তারপরে তার পালাটির শেষটি সনাক্ত করবে এবং লিখবে \n
, যার ফলস্বরূপ একটি লাইন থাকবে Sp\n
))
আরবিটার
এই পাইথন স্ক্রিপ্ট দ্বারা প্রোগ্রামগুলি শুরু করা হবে। এটি দশ রাউন্ড পরিচালনা করে, যেখানে প্রতিটি প্রতিযোগী প্রথম এবং দ্বিতীয় উভয় স্থানে যাওয়ার সময় প্রতিটি প্রতিযোগীর মুখোমুখি হয়। এটি কার্ড এবং মুদ্রা গণনা করে এবং প্রথম প্রোগ্রামের মাধ্যমে পরাজয়কারীকে দু'বার বিরাম চিহ্ন সহ একটি লাইন শেষ করতে নির্ধারণ করে। যে প্রোগ্রামগুলি একটি শূন্য-স্থিতি স্থিতি নিয়ে প্রস্থান করে, ফাইলটি সংশোধন করে, ফাইলটিতে একটি অবৈধ পদক্ষেপ লিখতে বা অবৈধ এক্সচেঞ্জের চেষ্টা করে তা স্বয়ংক্রিয়ভাবে বাজেয়াপ্ত হয়ে যায়। যদি কোনও খেলোয়াড় বিজয়ী না হয়ে ব্লক এবং চ্যালেঞ্জ সহ 100 টিরও বেশি ক্রিয়া করে তবে উভয় প্রোগ্রাম হেরে যাবে। একটি বিজয়ী একটি পয়েন্ট দেওয়া হয়। যার প্রোগ্রাম স্কোর সর্বাধিক পয়েন্ট জয়ী প্লেয়ার।
আমি আপনাকে আরবিটারের উত্স কোডটি পড়ার পরামর্শ দিচ্ছি, বিশেষত get_legal_actions
ফাংশনটি। এটি আপনাকে স্পেসিফিকেশন বুঝতে এবং আপনার নিজস্ব প্রোগ্রাম লিখতে সহায়তা করতে পারে।
import itertools
import os
import random
import subprocess
class Player:
def __init__(self, name, command):
self.name = name
self.command = command
self.score = 0
self.coins = 1
self.cards = ""
actions_dict = {
'E': '_', 'T': '0', 'A': "'", 'S': '<',
'd': '0', 'a': '_', 'c': '<', 's': '='
}
punishment_to_reveal = {'_': '~', "'": '^', '<': '*', '=': '!', '0': '$'}
reveal_to_punishment = {
punishment_to_reveal[k]: k for k in punishment_to_reveal
}
def get_legal_actions(history, player, opponent):
c = history[-1]
result = ""
# Our turn begins; choose an action.
if c == '\n':
if player.coins >= 10:
return ["C"]
ret = ['I\n'] + list("FET")
if player.coins >= 3:
ret.append("A")
if player.coins >= 7:
ret.append('C')
if opponent.coins > 0:
ret.append("S")
return ret
# Opponent attempted foreign aid; can pass or claim Duke to block.
elif c == 'F':
return list('dp')
# We have been Couped; must surrender a card.
elif c == 'C':
return player.cards
# We failed a challenge; must surrender a card and print a newline
# if it is our turn.
elif c in '~^*!$':
if history[-3] in 'acds':
return [card + '\n' for card in player.cards]
return player.cards
# Opponent attempted Exchange or Tax; can pass or challenge.
elif c == 'E' or c == 'T':
return list('pq')
# Opponent attempted an Assassination; can block, challenge, or give in.
elif c == 'A':
return list('sq') + player.cards
# Opponent attempted to Steal; can pass, block as Ambassador/Captain,
# or challenge.
elif c == 'S':
return list('acpq')
# Opponent blocked; can challenge or withdraw.
elif c in 'acds':
return list('q\n')
# Opponent passed on blocking Foreign Aid/Tax/Exchange or they gave up a
# card as punishment, must end turn.
elif c in "p_'<=0":
return ['\n']
# Opponent challenged us.
elif c == 'q':
challenged_action = history[-2]
# If we have the card they challenged us over, must reveal it.
necessary_card = actions_dict[challenged_action]
if necessary_card in player.cards:
return [punishment_to_reveal[necessary_card]]
# Otherwise, we can give up either of our cards, writing a newline
# if it is our turn.
if challenged_action in 'acds':
return list(player.cards)
else:
return [card + '\n' for card in player.cards]
else:
return None
deck = ['_', "'", '<', '=', '0'] * 3
random.shuffle(deck)
def determine_turn_effects(line, output, cards, current_player, opponent):
last_action = line[-2]
# Only operate if the opponent declined to challenge (p) or the
# program successfully challenged their block
if last_action in "p_'<=0":
primary_action = line[0]
# Foreign Aid
if primary_action == 'F':
print current_player.name, "received 2 coins of Foreign Aid"
current_player.coins += 2
# Tax
elif primary_action == 'T':
print current_player.name, "received 3 coins of Tax"
current_player.coins += 3
# Steal
elif primary_action == 'S':
stolen_coins = 1 if opponent.coins == 1 else 2
print current_player.name,\
"stole %d coins from %s" % (stolen_coins, opponent.name)
current_player.coins += stolen_coins
opponent.coins -= stolen_coins
# Exchange, store desired cards and replace undesired ones
elif primary_action == 'E':
print current_player.name, "tried to take %r" % output, "from", cards
legal_outputs = [''.join(p) for p in itertools.permutations(
cards, len(current_player.cards))]
if output not in legal_outputs:
print current_player.name, "forfeits by illegal exchange"
return opponent
current_player.cards = [
reveal_to_punishment[c] for c in output
]
undesired_cards = list(cards)
for c in output:
undesired_cards.remove(c)
for card in undesired_cards:
deck.append(reveal_to_punishment[card])
random.shuffle(deck)
# Coins are not returned from a successful Contessa block
elif last_action == 's':
print current_player.name, "lost 3 coins from a Contessa block"
current_player.coins -= 3
return None
def play_game(player1, player2, round_number, game_number):
outfilename = os.path.abspath(__file__)[:-len(__file__)] + '_'.join([
player1.name, player2.name, str(round_number), str(game_number)
]) + '.txt'
print outfilename
f = open(outfilename, 'w')
f.close()
players_list = [player1, player2]
player1.cards = [deck.pop(), deck.pop()]
player2.cards = [deck.pop(), deck.pop()]
current_player_index = 0
for i in range(200):
current_player = players_list[current_player_index]
opponent = players_list[(current_player_index+1) % 2]
legal_actions = []
original_contents = []
original_contents_joined = ""
with open(outfilename, 'r') as outfile:
original_contents = outfile.readlines()
original_contents_joined = ''.join(original_contents)
if len(original_contents) == 0:
legal_actions = ['I\n'] + list("FEST")
else:
legal_actions = get_legal_actions(
original_contents[-1], current_player, opponent)
if not legal_actions:
print "Error: file ended in invalid character"
return current_player
# Has the player completed an Exchange? Pass them new cards if so.
exchange_cards = ""
old_last_line = original_contents[-1] if len(original_contents) > 0 else '\n'
if old_last_line[-1] != '\n' and old_last_line[0] == 'E' and \
len(old_last_line) % 2 == 0 and old_last_line[-1] in "p_'<=0":
exchange_cards = punishment_to_reveal[deck.pop()] + \
punishment_to_reveal[deck.pop()]
cards = exchange_cards + ''.join(
punishment_to_reveal[card] for card in current_player.cards)
args = current_player.command + [
outfilename,
str(opponent.coins),
str(current_player.coins),
cards
] + legal_actions
print ' '.join(args)
output = ""
os.chdir(current_player.name)
try:
output = subprocess.check_output(args)
# Competitors that fail to execute must forfeit
except subprocess.CalledProcessError:
print current_player.name, "forfeits by non-zero exit status"
return opponent
finally:
os.chdir('..')
new_contents = []
new_contents_joined = ""
with open(outfilename, 'r') as outfile:
new_contents = outfile.readlines()
new_contents_joined = ''.join(new_contents)
if original_contents_joined != new_contents_joined[:-2] and \
original_contents_joined != new_contents_joined[:-1]:
print current_player.name, "forfeits by modifying the file"
print "old:", original_contents
print "new:", new_contents
return opponent
new_last_line = new_contents[-1]
the_move_made = ""
for action in legal_actions:
if new_last_line.endswith(action):
the_move_made = action
break
# Competitors that make an illegal move must forfeit
if not the_move_made:
print current_player.name, "forfeits with an illegal move,",\
"last line: %r" % new_last_line
print opponent.name, "wins!"
return opponent
print current_player.name, "played %r" % the_move_made
# Side effects of moves.
#
# Income, give the current player a coin.
if the_move_made == "I\n":
print current_player.name, "received 1 coin of income"
current_player.coins += 1
# The program surrendered a card on its turn; take it away.
elif len(the_move_made) == 2:
print current_player.name, "lost a card from being challenged"
current_player.cards.remove(the_move_made[0])
# Coins are not returned from a successful Contessa block
if new_last_line[-3] == '!':
print current_player.name, "lost 3 coins from a Contessa block"
current_player.coins -= 3
# The program surrendered a card when it was not its turn.
elif the_move_made in "_'<=0":
print current_player.name, "gave up a", the_move_made
current_player.cards.remove(the_move_made)
if new_last_line[0] == 'C':
opponent.coins -= 7
elif new_last_line[0] == 'A':
opponent.coins -= 3
# Did the program unsuccessfully challenge an Assassination
# (e.g. Aq^0\n)
# or get caught falsely blocking with a Contessa
# (e.g. Asq0\n)?
# If yes, it loses right away.
if new_last_line[0] == 'A' and new_last_line[1] in 'qs' and \
len(new_last_line) == 4:
print current_player.name, "lost both cards in the same turn."
print opponent.name, "wins!"
return opponent
elif the_move_made == 'S':
print current_player.name, "attempted Steal"
elif the_move_made == 'T':
print current_player.name, "attempted Tax"
elif the_move_made == 'A':
print current_player.name, "attempted Assassinate"
elif the_move_made == 'C':
print current_player.name, "launched a Coup"
elif the_move_made == 'F':
print current_player.name, "attempted Foreign Aid"
elif the_move_made == 'E':
print current_player.name, "attempted Exchange"
elif the_move_made == 'q':
print current_player.name, "challenged"
elif the_move_made == 'p':
print current_player.name, "passed"
elif the_move_made == 'a':
print current_player.name, "blocked with an Ambassador"
elif the_move_made == 'c':
print current_player.name, "blocked with a Captain"
elif the_move_made == 's':
print current_player.name, "blocked with a Contessa"
elif the_move_made == 'd':
print current_player.name, "blocked with a Duke"
# The program revealed a card from an opponent's unsuccessful challenge.
# Give it a new card.
# Special case: a program whose Exchange is unsuccessfully challenged
# may keep the Ambassador it revealed in the Exchange, so give a new
# card for a revealed Ambassador only if it was used to block a Steal.
elif the_move_made in '^*!$' or (the_move_made == '~' and
new_last_line[0] == 'S'):
p = reveal_to_punishment[the_move_made]
current_player.cards.remove(p)
current_player.cards.append(deck.pop())
deck.append(p)
random.shuffle(deck)
print current_player.name, "did have a", the_move_made
# The program ended its turn. We must examine the rest of the line to
# determine the side effects.
elif the_move_made == '\n':
potential_winner = determine_turn_effects(
new_last_line, output.strip(), cards, current_player,
opponent)
if potential_winner:
print potential_winner.name,\
"wins because their opponent made an illegal exchange!"
return potential_winner
# One player has lost all their cards. Victory for the opponent!
if current_player.cards == []:
print opponent.name, "wins by eliminating both opponent cards!"
return opponent
current_player_index += 1
current_player_index %= 2
return None
competitors = []
competitors.append(Player("Challenger", ["./challenger"]))
competitors.append(Player("Random", ["./random"]))
# ...More competitors here
for i in range(10):
print "-- Round", i
j = 0
for pairing in itertools.permutations(competitors, 2):
player1, player2 = pairing
print '--- Game', j, ':', player1.name, 'vs.', player2.name
winner = play_game(player1, player2, i, j)
if not winner:
j += 1
continue
winner.score += 1
player1.coins = 1
player1.cards = ""
player2.coins = 1
player2.cards = ""
deck = ['_', "'", '<', '=', '0'] * 3
random.shuffle(deck)
j += 1
competitors.sort(reverse=True, key=lambda player: player.score)
for player in competitors:
print '%5d %s' % (player.score, player.name)
বিবিধ
একটি প্রোগ্রামে অন্য প্রোগ্রামের জন্য কোড নির্দিষ্ট থাকতে পারে না এবং প্রোগ্রামগুলি একে অপরকে সহায়তা করতে পারে না। (আপনার কাছে একাধিক প্রোগ্রাম থাকতে পারে তবে তারা কোনওভাবেই একে অপরের সাথে ইন্টারঅ্যাক্ট করতে পারবেন না))
যদি আপনার প্রোগ্রাম একই কার্ডে এর দুটি কার্ড হারিয়ে ফেলে তবে এটি কেবল একটি লেখার প্রয়োজন। আরবিটার সনাক্ত করবে যে এটি নির্মূল হয়েছে।
প্রোগ্রামগুলিতে ফাইলের ইতিহাস পরীক্ষা করার জন্য এটি সম্ভব এবং উত্সাহিত, তবে প্রয়োজন হয় না। এটি করার মাধ্যমে তারা নির্ধারণ করতে পারে যে তাদের বিরোধী কোন কার্ড রয়েছে বলে দাবি করেছে এবং তাদের একটি মিথ্যা বলে ধরবে।
অভ্যুত্থানের আসল গেমটিতে আপনি কোনও ক্রিয়াকে চ্যালেঞ্জ করতে পারেন এবং তারপরে একই পাল্লায় আটকে দেওয়ার চেষ্টা করতে পারেন। আমি অনুমতি দিলে আমি স্পেসিফিকেশন কাজটি করতে পারিনি, সুতরাং আপনি হয় কোনও পদক্ষেপকে চ্যালেঞ্জ বা ব্লক করতে পারেন, তবে উভয়ই নয়।
@ পিটারটেলারের কাছে আমার ক্ষমা, যিনি আগের সময় আমি এটি পোস্ট করার পরামর্শ দিয়েছিলাম আমি এটি স্যান্ডবক্সে পোস্ট করেছি এবং প্রোটোকলটি পুনরায় আউটপুট পাইপ আউট করার জন্য STDOUT / STDIN এ পুনরায় কাজ করব। আমি চেষ্টা করেছিলাম, কাজটি করার জন্য এতটা কঠিন, এটিতে একটি পুরো দিন ব্যয় করা (যখন আমি ইতিমধ্যে মূল চ্যালেঞ্জটি লেখার জন্য একটি পুরো দিন ব্যয় করেছি)। তবে এক্সচেঞ্জগুলি সেভাবে বাস্তবায়ন করতে খুব জটিল প্রমাণিত হয়েছিল, প্লাস এটি তাদের নিজস্ব মুদ্রার গণনা ট্র্যাক করে রাখার জন্য প্রয়োজনীয়তা জমা দেওয়ার জটিলতা বাড়িয়ে তুলত। তাই আমি চ্যালেঞ্জটি কমবেশি পোস্ট করেছি কারণ এটি মূলত ছিল।
S
, প্রোগ্রাম বি ব্লকে লিখে লিখেছেন , একটি লিখে c
চ্যালেঞ্জ করতে অস্বীকার করেছে \n
। চুরির সফল চ্যালেঞ্জটি হবে: ক লিখেছেন S
, বি চ্যালেঞ্জ লিখেছেন , q
উদাহরণস্বরূপ চ্যালেঞ্জকে স্বীকার করেছেন _\n
, এক্সচেঞ্জ সহ আপনি পালা প্রতি মাত্র একটি পদক্ষেপ নিতে পারেন। এক্সচেঞ্জের আইনি প্রতিক্রিয়াগুলি হ'ল পাস এবং চ্যালেঞ্জ।