ট্র্যাক
/
R
R
/
অনুশীলনী
/
ব্ল্যাকজ্যাক
ব্ল্যাকজ্যাক

ব্ল্যাকজ্যাক

লার্নিং অনুশীলনী

ভূমিকা

switch() ফাংশনটি if ... else if টেস্টের দীর্ঘ সিরিজের একটি সংক্ষিপ্ত বিকল্প হতে পারে। যে ভ্যারিয়েবলটির উপর switch করা হয় সেটি সাধারণত একটি স্ট্রিং, আর সেক্ষেত্রে সিলেক্টর থেকে কোটেশন চিহ্নগুলো বাদ দেওয়া যায়।

star <- function(type) {
  switch(type,
    M = , # will "fall through" if no value given
    K = "red dwarf",
    G = "Earth-like",
    "bigger star" # only correct for O,B,A,F
  )
}

> star("M")
[1] "red dwarf"

লক্ষ্য করুন, মানটি ফাঁকা রাখলে কেবল তখনই অপশনটি পরের অপশনে গিয়ে পড়ে, উপরের উদাহরণের M-এর মতো। অন্য কিছু ভাষার মতো এখানে break স্টেটমেন্ট যোগ করার দরকার নেই।

character টাইপের উপর switch করার সময় শেষ মানটি একটি ডিফল্ট, যেমন এখানে। ইন্টিজার টাইপের ক্ষেত্রে কোনো ডিফল্ট দেওয়া যায় না।

dplyr-এর ফাংশন

বেস R-এর switch বেশ সীমিত: এটি কেবল একটি ইনপুটের সাথে হুবহু মিল করতে পারে। R প্রথম ১৯৯৩ সালে প্রকাশিত হওয়ার সময় এটি যুক্তিসঙ্গত মনে হয়েছিল, তবে আধুনিক ব্যবহারের জন্য এর উন্নতি দরকার।

Note

যেমন Conditionals কনসেপ্টে উল্লেখ করা হয়েছে, tidyverse প্যাকেজ-সংগ্রহটি বেস R-এর কার্যকারিতার পরিপূরক (এবং মাঝে মাঝে প্রতিস্থাপক) হিসেবে তৈরি, যা পূর্ববর্তী সংস্করণের সাথে সামঞ্জস্য নষ্ট করে না।

আপনার কোডের শুরুতে হয় library(dplyr) (একক প্যাকেজটির জন্য), নয়তো library(tidyverse) (সম্পূর্ণ সংগ্রহের জন্য) যোগ করে dplyr প্যাকেজটি কাজের আওতায় আনা যায়।

dplyr লাইব্রেরি switch-এর সাথে সম্পর্কিত দুটি অতিরিক্ত ফাংশন দেয়।

recode_values ও replace_values ফাংশন

এই দুটি সম্পর্কিত ফাংশন পুরোনো মান থেকে নতুন মানে ভেক্টরাইজড, switch-এর মতো ম্যাপিং করতে দেয়।

এদের মধ্যে মূল পার্থক্য হলো recode_values() সম্পূর্ণ নতুন একটি ভেক্টর তৈরি করে, আর replace_values() একটি বিদ্যমান ভেক্টরের আংশিক পরিবর্তন করতে দেয়।

মিল এখনও হুবহু, তবে:

  • বাম দিকের অপশনগুলো ভেক্টর হতে পারে, আর কোনো একটি এলিমেন্ট মিললেই ইনপুটটি মিলে যায়।
  • বাম দিকের অপশন ও ডান দিকের ফলাফল =-এর বদলে টিল্ডা ~ দিয়ে যুক্ত করা হয়।
  • সব ক্ষেত্রেই একটি ডিফল্ট নির্দিষ্ট করা যায়।
library(dplyr)

x <- c("a", "b", "a", "d", "b", NA, "c", "e", "z")
recode_values(
  x,
  "a" ~ 1,
  "b" ~ 2,
  "c" ~ 3,
  c("d", "e") ~ 4, # either "d' or "e" will match
  NA ~ 0,          # matches missing values
  default = 100   # note the different syntax for the default
)
#> [1]   1   2   1   4   2   0   3   4 100

case_when ফাংশন

case_when case_match সিনট্যাক্সকে আরও এক ধাপ এগিয়ে নেয়, কারণ এটি ~-এর বাম দিকে যেকোনো লজিক্যাল এক্সপ্রেশন ব্যবহার করতে দেয়।

ইনপুট ভেক্টরটি (নিচের উদাহরণে x) আর্গুমেন্ট হিসেবে দেওয়া হয় না, এটি আগে থেকেই ডিফাইন করা থাকলেই হয়।

x <- 1:10
case_when(
  x < 3 ~ "low",
  between(x, 3, 5) ~ "mid",
  between(x, 6, 8) ~ "high",
  .default = "what?"
)
#>  [1] "low"   "low"   "mid"   "mid"   "mid"   "high"  "high"  "high"  "what?" "what?"

between() ফাংশনটিও dplyr-এর অংশ।

নির্দেশনা

এই অনুশীলনীতে আমরা একটি Blackjack গেমের প্রথম পালা সিমুলেট করব।

আপনি দুটি কার্ড পাবেন এবং ডিলারের খোলা কার্ডটি দেখতে পাবেন। সব কার্ডই একটি স্ট্রিং দিয়ে প্রকাশ করা হয়, যেমন "ace", "king", "three", "two" ইত্যাদি। প্রতিটি কার্ডের মান হলো:

কার্ড মান কার্ড মান
ace ১১ eight ৮
two ২ nine ৯
three ৩ ten ১০
four ৪ jack ১০
five ৫ queen ১০
six ৬ king ১০
seven ৭ other ০

নোট: সাধারণত ace-এর মান ১ বা ১১ হতে পারে, কিন্তু সরলতার জন্য আমরা ধরে নেব এর মান কেবল ১১-ই হতে পারে।

আপনার দুইটি কার্ড আর ডিলারের কার্ডের উপর নির্ভর করে খেলার প্রথম পালার জন্য একটি কৌশল আছে, যেখানে আপনার হাতে নিচের অপশনগুলো থাকে:

  • স্ট্যান্ড (S)
  • হিট (H)
  • স্প্লিট (P)
  • স্বয়ংক্রিয়ভাবে জয় (W)

যদিও এটি এখনো সেরা কৌশল নয়, তবুও আপনি আপনার বন্ধু Alex-এর তৈরি করা কৌশলটি অনুসরণ করবেন, যা নিচে দেওয়া হলো:

  • আপনার হাতে যদি জোড়া ace থাকে, তবে সবসময় সেগুলো স্প্লিট করবেন।
  • আপনার যদি Blackjack থাকে (এমন দুইটি কার্ড যাদের যোগফল ২১), আর ডিলারের কাছে ace, figure বা ten না থাকে, তাহলে আপনি স্বয়ংক্রিয়ভাবে জিতে যাবেন। ডিলারের কাছে এগুলোর যেকোনো একটি থাকলে আপনাকে স্ট্যান্ড করতে হবে এবং অন্য কার্ডটি খোলার জন্য অপেক্ষা করতে হবে।
  • আপনার কার্ডগুলোর যোগফল যদি [১৭, ২০] সীমার মধ্যে হয়, তবে সবসময় স্ট্যান্ড করবেন।
  • আপনার কার্ডগুলোর যোগফল যদি [১২, ১৬] সীমার মধ্যে হয়, তবে সবসময় স্ট্যান্ড করবেন, যদি না ডিলারের কাছে ৭ বা তার চেয়ে বেশি থাকে; সেক্ষেত্রে সবসময় হিট করবেন।
  • আপনার কার্ডগুলোর যোগফল যদি ১১ বা তার কম হয়, তবে সবসময় হিট করবেন।

1. যেকোনো কার্ডের মান নির্ণয় করুন।

একটি কার্ডের সংখ্যাগত মান নির্ণয়ের জন্য parse_card নামের একটি ফাংশন তৈরি করুন:

parse_card("ace")
# => 11

2. প্রথম পালার সিদ্ধান্তের লজিক তৈরি করুন।

উপরে বর্ণিত সিদ্ধান্তের লজিকটি বাস্তবায়ন করে এমন একটি first_turn ফাংশন লিখুন:

first_turn(card1, card2, dealer_card)

প্রত্যাশিত ফলাফলের কিছু উদাহরণ এখানে দেওয়া হলো:

first_turn("ace", "ace", "jack") == "P"
first_turn("ace", "king", "ace") == "S"
first_turn("five", "queen", "ace") == "H"
GitHub-এর মাধ্যমে সম্পাদনা করুন লিংকটি একটি নতুন উইন্ডো বা ট্যাবে খোলে
R Exercism

ব্ল্যাকজ্যাক শুরু করতে প্রস্তুত?

Exercism-এ সাইন আপ করুন, R ট্র্যাকের 21টি কনসেপ্ট111টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।