কিংকর্তব্যবিমূঢ়
ভূমিকা
লিও জুজু খেলা উপভোগ করে তবে টেক ইনক। এ তার চাকরিটি কীভাবে ভাল খেলতে হয় তা শেখার জন্য তার কাছে খুব দাবি। লিও, একজন কম্পিউটার বিজ্ঞানী হওয়ায় নিরুৎসাহিত হন না। তিনি ঠিক করেন যে কেবল জুজু শিখতে যে পরিমাণ সময় লাগবে তার থেকে বেশি সময় নেওয়ার সিদ্ধান্ত নিয়েছে এবং তাকে আরও ভাল খেলতে সহায়তা করার জন্য পোকার বট লেখার জন্য এটি ব্যবহার করুন use তবে এখন লিওর একটি সমস্যা রয়েছে: কীভাবে কিছুটা আরও ভাল খেলতে হয় তা বোঝার জন্য, লিওকে একাধিক "লোক" এর একাধিক গেমগুলি পর্যবেক্ষণ করা দরকার, তবে গেমের গুণমান এবং বাস্তবতা উন্নত করতে "মানুষ" বিভিন্ন খেলার শৈলীর প্রয়োজন।
চ্যালেঞ্জ
লিও স্মরণ করিয়ে দেয় যে আসলে প্রোগ্রামিং চ্যালেঞ্জগুলির জন্য উত্সর্গীকৃত একটি ওয়েবসাইট রয়েছে এবং আপনার সহায়তা তালিকাভুক্ত করছে! আপনার কাজ হ'ল একটি প্রোগ্রাম লিখুন যা "পোকারফেস" 5-কার্ডের জুজুর সংশোধিত সংস্করণ খেলবে। আপনার ইচ্ছামতো বিন্যাসে প্রোগ্রামটি 5-কার্ডের হাত হিসাবে ইনপুট নেবে, তার পরে প্রোগ্রামটি আউটপুট দেবে:
- হুবহু (কেস-সংবেদনশীল) "সত্য" "1" বা "টি" যদি প্লেয়ার কার্ড বিনিময় করতে চান, অন্য কোনও খালি খালি আউটপুট।
- যদি সত্য হয়, কার্ড এবং / অথবা কার্ডের নাম সূচকের তালিকা প্লেয়ার বিনিময় করতে ইচ্ছুক।
- 0 এবং 3 এর মধ্যে একটি একক সংখ্যা, যা খেলোয়াড় কত অতিরিক্ত কার্ড চায় তা নির্দিষ্ট করে।
- খেলোয়াড়টি যে হাতটি ব্যবহার করতে চান তা মুদ্রণ করুন।
(নীচে বিন্যাস দেখুন)
পোকারফেস বিধি
- পোকারফেস যেহেতু একটি পাঠ্য-ভিত্তিক অ্যাডভেঞ্চার গেম, তাই কার্ডগুলি অবশ্যই একটি ধারাবাহিক উপায়ে উপস্থাপন করতে হবে। কার্ড দুটি চরিত্রের কোড দ্বারা প্রতিনিধিত্ব করা হয়, প্রথম অক্ষরটি স্যুট এবং দ্বিতীয়টি কার্ডটির নাম।
- তাস:
- 2-9 = 2-9
- 10 = টি
- জ্যাক = জে
- রানী = প্রশ্ন
- রাজা = কে
- এস = এ
- স্যুট:
- স্পেডস = এস
- ক্লাব = সি
- হৃদয় = এইচ
- হীরা = D
- তাস:
সুতরাং কোদালগুলির টেক্কাটি এসএ হবে, হৃদয়ের 10 টি এইচটি, হীরার চতুর্থটি ডি 4 ইত্যাদি etc.
- পোকারফেসের একক রাউন্ডে চারটি ধাপ রয়েছে:
- ডেকটি রদবদল করা হয়েছে এবং প্রতিটি খেলোয়াড়ের জন্য একটি পাঁচ কার্ড হাতে দেওয়া হয়।
- প্রতিটি খেলোয়াড়কে যতটা কার্ড আকাঙ্ক্ষিত হয় তার বিনিময়ের সুযোগ দেওয়া হয়।
- প্রতিটি খেলোয়াড়কে আরও তিনটি কার্ড অর্জনের সুযোগ দেওয়া হয়।
- প্রতিটি খেলোয়াড় অবশ্যই তাদের সেরা হাত প্রকাশ করতে হবে।
- সেরা হাত জয় করে এবং সেই প্লেয়ারকে একটি পয়েন্ট দেয়। টাই হওয়ার সময়ে উভয় খেলোয়াড়ই পয়েন্ট পান।
- একটি একক খেলায়, দশ রাউন্ড খেলা হয় এবং সর্বাধিক পয়েন্টের খেলোয়াড় জয়লাভ করে এবং একক "উইন পয়েন্ট" অর্জন করে। টাই হওয়ার সময়ে উভয় খেলোয়াড়ই জয় পয়েন্ট অর্জন করে।
- লিওর কাছে আসলে প্রচুর পরিমাণে অর্থ নেই, তাই আপনার বট ধরে নিতে পারে যে এটি কোনও বাজি ছাড়াই নিখুঁত বিশ্ব।
হাত
- হাতগুলি দৈর্ঘ্যে হুবহু 5 টি কার্ড (প্রাথমিক ইনপুট এবং চূড়ান্ত আউটপুট)।
- হাত এখানে বর্ণিত নিয়মের সাথে সামঞ্জস্যপূর্ণ হয় ।
ইনপুট আউটপুট
- লিও কেবল জাভা জানে তাই আপনার প্রোগ্রামটি অবশ্যই প্রসেস এপিআই (কমান্ড লাইন) এর মাধ্যমে এক্সিকিউটেবল হতে হবে এবং যথাক্রমে ইনপুট এবং আউটপুট জন্য STDIN এবং STDOUT ব্যবহার করুন।
- উপরের বিস্তারিত ইনপুট এবং আউটপুট প্রতিটি পদক্ষেপের জন্য, ইনপুট এবং আউটপুট প্রতিটি এক লাইনে উপস্থিত থাকতে হবে।
- চূড়ান্ত আউটপুট পরে কমপক্ষে একটি ট্রেলিং নতুন লাইন থাকতে হবে। (এসটিডিআইএন থেকে ইনপুট পড়ার উপায়ের কারণে এটি ঘটে)
- ট্রেলিং এবং শীর্ষস্থানীয় স্থান ছাড়া অন্য কোনও বহিরাগত ইনপুট / আউটপুট অনুমোদিত নয়। পার্সারটি সহজভাবে
final_hand=...
বা এর মতো জিনিসগুলি বুঝতে পারে নাdraw 0
। - অঙ্কন করার সময়, আউটপুট একটি একক পূর্ণসংখ্যার, আউটপুট বিনিময় করার সময় নীচে সংজ্ঞায়িত পূর্ণসংখ্যার এবং / অথবা কার্ডগুলির একটি তালিকা থাকে এবং যখন মূল হাতের সাথে ডিল করা হয়, আউটপুট নীচে সংজ্ঞায়িত কার্ডগুলির একটি তালিকা।
- সমস্ত ইনপুট / আউটপুট নম্বরগুলি বেস 10 তে অবশ্যই ইতিবাচক পূর্ণসংখ্যার হতে হবে।
- আপনি কার্ড ইনপুট জন্য ফর্ম্যাট সংজ্ঞায়িত করতে পারেন (নীচে পোস্ট ফর্ম্যাট দেখুন)।
- সত্যকে হুবহু "সত্য", "" 1 "বা" টি "হিসাবে সংজ্ঞায়িত করা হয় এবং মিথ্যা অন্য কোনও খালি খালি মান।
- বিনিময় পদক্ষেপের সময়:
- কার্ড সূচকগুলি অবশ্যই তাদের মধ্যে কমপক্ষে একটি স্থানের সাথে আউটপুট থাকতে হবে (উদাঃ
3 4 0
) - কার্ডের নামগুলি অবশ্যই তাদের মধ্যে কমপক্ষে একটি স্থানের সাথে আউটপুট থাকতে হবে (উদাঃ
H4 S8
) - কার্ডের নাম এবং সূচকগুলি আউটপুটে মিশ্রিত হতে পারে (উদাঃ
0 H7 3 D3
) - ট্রেলিং এবং নেতৃস্থানীয় স্থান অনুমোদিত।
- উপরের আউটপুট প্লেয়ারের ফলস্বরূপ ইনপুটটি
bot.jlsc
অনুরোধ অনুযায়ী একই ক্রমে ফাইল দ্বারা নির্দিষ্ট হিসাবে বিন্যাস করা হবে
- কার্ড সূচকগুলি অবশ্যই তাদের মধ্যে কমপক্ষে একটি স্থানের সাথে আউটপুট থাকতে হবে (উদাঃ
- কোনও খেলোয়াড় তাদের হাতে যে কার্ড যুক্ত করতে চায় তার নেতৃত্বাধীন এবং পিছনের স্থানগুলি থাকতে পারে।
- হাতগুলির মধ্যে কমপক্ষে একটি স্থানের সাথে আউটপুট হওয়া আবশ্যক (উদাঃ
H4 D5 CA
), পিছনের স্থান এবং শীর্ষস্থানীয় স্পেসগুলি অনুমোদিত। - হাতগুলি যথাযথ ক্রমে আউটপুট হওয়ার দরকার নেই (উদাঃ
H4 D4 C4 DA SA
এবংH4 DA D4 SA C4
উভয়ই 4, 4, 4, এস, এস, যা একটি সম্পূর্ণ বাড়ি represent - আপনি যদি বিরোধীদের হাত বিশ্লেষণ করে কৌশল তৈরি করতে চান তবে আপনি কোনও
<botname>/data
ডিরেক্টরিতে ডেটা সঞ্চয় করতে পারেন ।- প্রতিযোগিতামূলক বটগুলি তাদের হাত প্রদর্শন করার পরে, তাদের প্রতিটি বট ডেটা ডিরেক্টরিতে লেখা হবে হ্যান্ডস টেক্সটে, প্রতিটি হাত একটি নতুন লাইনে (by n দ্বারা পৃথক) with ফাইলটি US_ASCII এ এনকোড করা হবে।
- আপনার বট নতুন কার্ড বা এক্সচেঞ্জ কার্ডের জন্য অনুরোধ করার পরে, আপনি
bot.jlsc
ফাইলটিতে কোন ফর্ম্যাটটি নির্দিষ্ট করেছেন তার উপর ভিত্তি করে কার্ডগুলি ইনপুট হবে ।
পোস্ট ফর্ম্যাট
- প্রতিটি পোস্টে অবশ্যই দুটি জিনিস অন্তর্ভুক্ত করতে হবে:
- আপনার বটের উত্স কোড, বা কোনও জনসাধারণের মুখোমুখি ভাণ্ডারের লিঙ্ক।
- একটি জিপ ফাইল রয়েছে:
- আপনার বটের সংকলিত / এক্সিকিউটেবল সংস্করণ (যদি ফাইলটি .exe বা অন্য নন-কম-ফাইলযোগ্য ফাইল হয় তবে দয়া করে আপনার পোস্টে সংকলনের নির্দেশাবলী অন্তর্ভুক্ত করুন)।
- একটি
bot.jlsc
ফাইল, নীচে দেখুন (পার্শ্ব দ্রষ্টব্য: .jlsc এক্সটেনশনটি কেবল আমার এক পার্শ্ব প্রকল্পের কারণে, একটি কনফিগারেশন ফর্ম্যাট below নীচের ফাইলটি সঠিক সিনট্যাক্সের সাথে মেলে, তাই চিন্তা করবেন না)।
- .Zip ফাইলটিকে অবশ্যই আপনার বটের মতো নামকরণ করতে হবে।
- যদি আপনার উইন্ডোজ বা অন্য কোনও জিপিং ইউটিলিটি অ্যাক্সেস না থাকে বা যে কোনও কারণেই একটি .zip করতে না পারেন তবে কেবল আপনার পোস্টে bot.jlsc ফাইলটির পাঠ্য অন্তর্ভুক্ত করুন
bot.jlsc ফাইল:
name= "Botty"
link= "example.com"
cmd= "java -jar Botty.jar"
input_hand= "${0} ${1} ${2} ${3} ${4}"
input_1= "${0}"
input_2= "${0} ${1}"
input_3= "${0} ${1} ${2}"
input_4= "${0} ${1} ${2} ${3}"
কোথায়:
- আপনার বট চালানোর জন্য উইন্ডোজ কমান্ড লাইন কমান্ড হ'ল "সেন্টিমিডি" । নোট করুন যে আপনার বট ডিরেক্টরিতে থাকবে
<botname>
, সুতরাং সেই অনুযায়ী আদেশটি সামঞ্জস্য করুন। - "নাম" আপনার বটের নাম।
- "লিঙ্ক" হ'ল আপনার উত্তরের লিঙ্ক, পোস্ট করার পরে আপনাকে এটি সম্পাদনা করতে হবে।
- "ইনপুট_হ্যান্ড" হ'ল আপনি কীভাবে মূল ডিলিংটি ফর্ম্যাট করতে চান (-4 {# cards প্রতিনিধিত্বকারী কার্ড 0-4 সহ)।
- "ইনপুট_1" কীভাবে আপনি চান একটি অতিরিক্ত কার্ডের ইনপুট ফর্ম্যাট করা যায়।
- "ইনপুট_2" আপনি কীভাবে দুটি অতিরিক্ত কার্ডের ফর্ম্যাট করতে চান তা।
- "ইনপুট 14" কীভাবে আপনি তিনটি অতিরিক্ত কার্ডের ফর্ম্যাট করতে চান।
- "ইনপুট_4" কীভাবে আপনি চারটি অতিরিক্ত কার্ডের ফর্ম্যাট করতে চান।
সুনির্দিষ্ট
- এই ফাঁকগুলি অনুমোদিত নয় ('সাধারণ সমস্যাগুলি' দেখুন)
- আপনি কোনও বট লিখতে পারবেন না, নিয়ম সেটের মধ্যে সর্বদা যথাসম্ভব সেরা হাত আউটপুট দেবে। (উদাহরণস্বরূপ, দীর্ঘস্থায়ী কোনও ব্রুট-ফোর্স বট নেই, কিছুই লিওবটের মতো 'ভাল' হওয়া উচিত নয়)
- আপনার বটটি ১০০ এমএস বা তারও কম চলতে হবে (এই বিন্দুতে লেনিয়েন্ট, সর্বাধিক second 1 সেকেন্ড)
- বটটি তার নির্বাচিত হাতের পরে কোনও আউটপুট উপেক্ষা করা হবে।
- স্ট্যান্ডার্ড লুফোলগুলি অনুমোদিত নয়।
- হ্যাঁ, আমি জানি লিনাক্স আরও ভাল, তবে আমার উইন্ডোজ পিসি রয়েছে, তাই আপনার প্রোগ্রামটির সংকলিত / এক্সিকিউটেবল সংস্করণ উইন্ডোজ কমান্ড লাইন থেকে চালানো যেতে পারে তা নিশ্চিত হন।
- আমি ইতিমধ্যে আমার কম্পিউটারে পাইথন এবং জাভা ইনস্টল করেছি, তবে আমি নতুন সংস্করণে আপডেট করতে এবং অন্যান্য পরিবেশ ইনস্টল করতে ইচ্ছুক, সুতরাং দয়া করে আপনার প্রোগ্রামটি কী ধরণের পরিবেশ প্রয়োজন তা নির্দিষ্ট করুন।
- আপনি কোনও বট লিখতে পারবেন না যা প্রতিটি ক্ষেত্রে অন্য বটের মতো একই কাজ করে। স্প্যাম বট অনুমোদিত, কিন্তু নিরুৎসাহিত।
- আপনার বটটি কেবল এটির কার্ড ব্যবহার করতে পারে। এক্সচেঞ্জের মাধ্যমে হারিয়ে যাওয়া কার্ডগুলি যেগুলি দিয়ে শুরু করা হয়নি তা চূড়ান্ত হাতে অবৈধ আউটপুট।
- ইনপুট এবং আউটপুট কেবলমাত্র ASCII অক্ষর থাকতে পারে।
প্রতিযোগিতা
- আমি সময় পেলেই টুর্নামেন্টগুলি চালানো হবে (আমার সময়সূচিটি লিওর মতোই প্যাকড, সুতরাং এটি আমার একটু বিরল হবে be অসুবিধার জন্য দুঃখিত))
- চারটি ব্যক্তি গেমগুলিতে বটগুলি প্রতিটিের বিপরীতে থাকে এবং প্রতিটি সম্ভাব্য সাবসেটের জন্য একটি গেম থাকবে (অর্থাত্ প্রচুর গেমস)।
- এই প্রক্রিয়াটি পাঁচবার পুনরাবৃত্তি হবে।
- টুর্নামেন্টের হ্যান্ডলার যেভাবে বটের গোষ্ঠী তৈরি করে তার কারণে, বটের সংখ্যা ৪ দ্বারা বিভাজ্য করে তুলতে তিনটি পর্যন্ত ফিলার বট যুক্ত করা হবে These
- প্রতি রাউন্ড এবং গেমটি চালানোর পরে, তারা যে সংখ্যাটি গেম জিতেছে তার উপর ভিত্তি করে বটের স্কোরগুলি গণনা করা হবে।
- একাধিক বট একটি অবস্থান ভাগ করতে পারে (প্রথম পোস্ট দ্বারা প্রথম জয়ের জন্য সম্পর্ক)।
- একটি টুর্নামেন্ট শেষ হওয়ার পরে, স্কোরগুলি এই পোস্টের নীচে যুক্ত করা হবে।
স্কোরিং
সাধারণ কোথ বিধি। যে বট (গুলি) সর্বাধিক গেমস জিতেছে তারা চ্যালেঞ্জ জিতেছে।
LeoBot
লিওর বটটি বেশ স্মার্ট। এটি কোনও কার্ডের বিনিময় করে না, এটি খুব শক্ত, তবে এটি সর্বাধিক সংখ্যক অতিরিক্ত কার্ডের জন্য অনুরোধ করে এবং এটি যেটি তৈরি করতে পারে তার সর্বোত্তম হাতটি নির্ধারণ করে এবং সেই হাতটি খেলে। লিওবোটের মূল যুক্তিটি নীচে রয়েছে।
package com.gmail.socraticphoenix.pokerface.leobot;
import com.gmail.socraticphoenix.pokerface.lib.card.Card;
import com.gmail.socraticphoenix.pokerface.lib.card.Deck;
import com.gmail.socraticphoenix.pokerface.lib.rule.HandRegistry;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class LeoBot {
public static void main(String[] args) {
List<Card> hand = new ArrayList<>();
Scanner scanner = new Scanner(System.in);
hand.addAll(Card.parseHand(scanner.nextLine()));
System.out.println(false);
System.out.println(3);
hand.addAll(Card.parseHand(scanner.nextLine()));
List<List<Card>> possibleHands = LeoBot.getSubsets(hand, 5);
System.out.println(Deck.toString(possibleHands.stream().sorted((a, b) -> HandRegistry.determineWinner(b, a).comparable()).findFirst().get()));
}
private static <T> void getSubsets(List<T> superSet, int k, int idx, List<T> current, List<List<T>> solution) {
if (current.size() == k) {
solution.add(new ArrayList<>(current));
return;
}
if (idx == superSet.size()) return;
T x = superSet.get(idx);
if (!current.contains(x)) {
current.add(x);
}
getSubsets(superSet, k, idx + 1, current, solution);
current.remove(x);
getSubsets(superSet, k, idx + 1, current, solution);
}
public static <T> List<List<T>> getSubsets(List<T> superSet, int k) {
List<List<T>> res = new ArrayList<>();
getSubsets(superSet, k, 0, new ArrayList<T>(), res);
return res;
}
}
মনে রাখবেন যে যদি লিওবট ধারাবাহিকভাবে টুর্নামেন্টে জয়ী হয়, এবং সেখানে প্রচুর পরিমাণে এন্ট্রি রয়েছে, তবে আমি তাকে দৌড়াদৌলে অন্তর্ভুক্ত করে দেব।
গুরুত্বপূর্ণ লিঙ্ক
দাবি পরিত্যাগী
লিও এবং টেক ইনক। গল্পের উপাদান এবং বাস্তব জীবনের সংস্থাগুলি বা লোকদের সাথে কোনও সাদৃশ্য নিখুঁতভাবে অনিচ্ছাকৃত। (তবে, যখন লিওর 'পরিস্থিতি' প্রশ্ন থেকে শর্ত যুক্ত করে বা বিয়োগ করে, সেগুলি আসলে প্রশ্নের অংশ ...)
"f"q+
ন্যূনতম প্রয়োজনীয়তা পূরণ করে। যদি 10 জন প্রতিযোগিতায় থাকে তবে এটি সম্ভবত সমস্ত নন-বোবা এন্ট্রিগুলিকে মারবে (নন-বোবা এন্ট্রিতে সম্ভবত> 75 টি অক্ষর, 5 * 10 (বোবা বটের স্কোর, শেষ অবধি) = 50 <75 (খুব ছোট স্মার্ট বটের স্কোর) (প্রথম আসছে))। সুতরাং, আপনার সম্ভবত এই চ্যালেঞ্জটি থেকে কোডগলফটি সরিয়ে নেওয়া উচিত