সেই তালিকায় কতটি ব্ল্যাকজ্যাক সিকোয়েন্স রয়েছে?


21

আপনার কাজটি 12 কার্ডের আদেশযুক্ত তালিকায় কতগুলি স্বতন্ত্র ব্ল্যাকজ্যাক সিকোয়েন্সগুলি পাওয়া যায় তা সন্ধান করা।

একটি ব্ল্যাকজ্যাক ক্রমটি ক্রমাগত কার্ডের ক্রম হিসাবে সংজ্ঞায়িত হয় যার পয়েন্টের যোগফল হুবহু 21। পয়েন্টগুলি নিম্নলিখিত টেবিল অনুসারে গণনা করা হয়:

Symbol | Name  | Points     Symbol | Name  | Points
-------+-------+--------    -------+-------+--------
   2   | Two   | 2             9   | Nine  | 9
   3   | Three | 3             T   | Ten   | 10
   4   | Four  | 4             J   | Jack  | 10
   5   | Five  | 5             Q   | Queen | 10
   6   | Six   | 6             K   | King  | 10
   7   | Seven | 7             A   | Ace   | 1 or 11
   8   | Eight | 8

ইনপুট

উপরে বর্ণিত চিহ্নগুলি ব্যবহার করে একটি 12-অক্ষরের স্ট্রিং। আমরা কার্ডগুলির রঙগুলি সম্পর্কে যত্ন নেই, তাই তাদের সরবরাহ করা হয় না।

উদাহরণ:

K6K6JA3Q4389

আউটপুট

ইনপুট স্ট্রিংয়ে পাওয়া যাবে এমন আলাদা আলাদা ব্ল্যাকজ্যাক সিকোয়েন্সের সংখ্যা।

উদাহরণ:

K6K6JA3Q4389 দুটি স্বতন্ত্র ব্ল্যাকজ্যাক ক্রম অন্তর্ভুক্ত:

উদাহরণ

  • JA, এসের সাথে 11 পয়েন্ট গণনা করা হচ্ছে (10 + 11 = 21)
  • A3Q43, এসের সাথে 1 পয়েন্ট হিসাবে গণনা করা হচ্ছে (1 + 3 + 10 + 4 + 3 = 21)

সুতরাং উত্তর হবে 2

বিধি

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

পরীক্ষার মামলা

ক্রমগুলি তথ্যের উদ্দেশ্যে সরবরাহ করা হয় তবে আপনাকে কেবলমাত্র তাদের সংখ্যা আউটপুট করতে হবে।

Input        | Output | Distinct sequences
-------------+--------+--------------------------------------------------------
3282486Q3362 | 0      | (none)
58A24JJ6TK67 | 1      | 8A2
Q745Q745Q745 | 1      | Q74
AAAAAAAAAAAA | 1      | AAAAAAAAAAA
T5AQ26T39QK6 | 2      | AQ, 26T3
JQ4A4427464K | 3      | A442, 44274, 7464
Q74Q74Q74Q74 | 3      | Q74, 74Q, 4Q7
37AQKA3A4758 | 7      | 37A, 37AQ, AQ, AQK, QKA, KA, A3A475
TAQA2JA7AJQA | 10     | TA, TAQ, AQ, QA, A2JA7, 2JA7A, JA, AJ, AJQ, JQA
TAJAQAKAT777 | 13     | TA, TAJ, AJ, JA, JAQ, AQ, QA, QAK, AK, KA, KAT, AT, 777

1
হুম, ক্রমগুলি 5 বা তার কম দৈর্ঘ্যের মধ্যে সীমাবদ্ধ হওয়া উচিত নয়?
জোনাথন অ্যালান

@ জোনাথান অ্যালান আমি মনে করি এটি একটি ক্যাসিনোতে প্রকৃতপক্ষে সীমাবদ্ধতা হবে। তবে এটি কোনও আসল ব্ল্যাকজ্যাক গেম নয়। পরিবর্তে, আমি ইনপুটটিকে 12 টি কার্ডের মধ্যে সীমাবদ্ধ করে বেছে নিয়েছি যাতে অনেক এসিকে খুব বেশি গণনার সময় প্রয়োজন হয় না। যে শব্দ ঠিক আছে?
আর্নল্ড

পরবর্তী চ্যালেঞ্জ: সর্বাধিক অনন্য ব্ল্যাকজ্যাক সিকোয়েন্স সহ 12-চর স্ট্রিংটি সন্ধান করুন: ডি
ইটিএইচ প্রোডাকশনগুলি

10 টি কার্ডে ইনপুট সীমাবদ্ধ করা এত সহজ হত ...
নীল

@ নীল ওয়েল, এটি 'এগারো এসেস' কেসকে অসম্ভব করে তুলত, তবে এর পিছনে কি সত্যই কোনও অপটিমাইজেশন রয়েছে? আমি মনে করি আপনার মনে অন্য কিছু থাকতে পারে।
আর্নৌল্ড

উত্তর:


6

জেলি , 30 29 বাইট

1e×5,⁵Ḥ‘
O_48«26%⁴µSeÇ
ẆÇÐfQL

এটি অনলাইন চেষ্টা করুন! বা পরীক্ষার স্যুটটি পরীক্ষা করে দেখুন

কিভাবে?

মনে রাখবেন যে, আমরা যদি সর্বদা একটিকে এস হিসাবে 1 হিসাবে মূল্য দিয়ে থাকি তবে কেবলমাত্র বৈধ পরিমাণগুলি 21 এবং 11 হয় , যদি কোনও এসের ক্রমটিতে উপস্থিত হয় তবে এটি গ্রহণযোগ্য হবে।

ẆÇÐfQL - Main link: string
Ẇ      - all non-empty contiguous sublists
  Ðf   - filter keep if...
 Ç     -     last link (2) as a monad ...is truthy
    Q  - unique results
     L - length

O_48«26%⁴µSeÇ - Link 2, isBlackjackSubtring: char array  e.g. ['A','2','8','Q']
O             - cast to ordinal values                        [ 65, 50, 56, 81]
 _48          - subtract 48                                   [ 17,  2,  8, 33]
     26       - 26
    «         - minimum (vectorises)                          [ 17,  2,  8, 26]
        ⁴     - 16
       %      - modulo                                        [  1,  2,  8, 10]
         µ    - monadic chain separation (call the result v)
          S   - sum(v)                                        21
            Ç - last link (1) as a monad link_1(v)            [11,21]
           e  - exists in?                                    1

1e×5,⁵Ḥ‘ - Link 1 validSums: value list (where A is 1, and {T,J,Q,K} are 10)
1e       - 1 exists in? (are there any aces? Yields 1 or 0)
  ×5     - multiply by 5 (5 or 0)
     ⁵   - 10
    ,    - pair ([5,10] or [0,10])
      Ḥ  - double ([10,20] or [0,20])
       ‘ - increment ([11,21] or [1,21])
         -                        ^
         -     note: if no ace is in the sequence it's sum can't be 1 anyway

7

পাইথন 2, 215 বাইট

def b(s,a=[],r=range):
 S=map(lambda x:":">x>"1"and int(x)or 10-(x=="A")*9,s)
 for i in r(12):
  for j in r(13):
   if 21in[x*10+sum(S[i:j])for x in r(S[i:j].count(1)+1)]and s[i:j]not in a:a+=s[i:j],
 return len(a)

মন্তব্য যুক্ত হয়েছে:

def b(s,a=[],r=range):                                      # Define the function b and a list, a, which holds all the blackjack sequences
 S=map(lambda x:":">x>"1"and int(x)or 10-(x=="A")*9,s)      # Set S to the score of each card in b
 for i in r(12):                                            # Loop with i from 0 to 11
  for j in r(13):                                           # Loop with j from 0 to 12
   if 21in[x*10+sum(S[i:j])for x in r(S[i:j].count(1)+1)]\  # If 21 is included in all the possible sums that the scores between i and j in S can be
           and s[i:j]not in a:                              # And that sequence is not already included,
               a+=s[i:j],                                   # Append that sequence to a
 return len(a)                                              # Return the amount of elements in a

3

পাইথন , 134 130 বাইট

lambda x:len({x[i:j]for i in range(12)for j in range(13)if sum(min(26,ord(c)-48)%16for c in x[i:j])in([11,21][~('A'in x[i:j]):])})

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

কিভাবে?

দৈর্ঘ্যের 12 টি স্ট্রিং গ্রহণ করে একটি নামহীন ফাংশন x

x[i:j]i + 1 তম থেকে j অক্ষরে স্ট্রিংয়ের একটি টুকরা ।

স্লাইস যেমন নেয়া হয় আমরা থেকে ঢোঁড়ন সকল sublists আছে i=0করার i=11সঙ্গে for i in range(12), প্রতিটি যা আমরা থেকে তর্ক জন্য j=0করতে j=12সঙ্গে for j in range(13)

(আমাদের কেবল প্রয়োজন j=i+1এবং উপরে, তবে স্লাইসগুলি j<=iকেবল খালি স্ট্রিং রয়েছে, তাই আমরা 4 বাইট থেকে গল্ফ করতে পারি for j in range(i+1,13))

এগুলি সঠিক যোগফলগুলির জন্য ফিল্টার করা হয় ...

কোনও টুকরোতে টেক্কা থাকলে বৈধ যোগফলগুলি 11 এবং 21, বা না হলে কেবল 21 হয় are 'A'in x[i:j]আমাদের এই তথ্য দেয় এবং ~(v)সম্পাদন করে -1-v, যা আমরা টুকরো টুকরো করে ব্যবহার করি [11,21]- এইভাবে যদি একটি টেক্কাটি আমরা পাই ক্রমটিতে থাকি [11,21][-2:]এবং যদি আমরা পাই না [11,21][-1:], ফলস্বরূপ [11,21]এবং [21]যথাক্রমে।

সমষ্টি নিজেই আচরণ করতে হবে A1, তাদের মান হিসাবে সংখ্যা, এবং T, J, Q, এবং K10. যেমন এই ম্যাপিং প্রথম ঢালাই দ্বারা ordinals করতে অর্জিত হয়:
" 2 3 4 5 6 7 8 9 T J Q K A"(শূণ্যস্থান বিনা) হয়ে
[50, 51, 52, 53, 54, 55, 56, 57, 84, 74, 81, 75, 65], 48 বিয়োগ পেতে
[ 2, 3, 4, 5, 6, 7, 8, 9, 36, 26, 33, 27, 17], গ্রহণ min26 উৎপাদনের সঙ্গে
[ 2, 3, 4, 5, 6, 7, 8, 9, 26, 26, 26, 26, 17], এবং মোড ( %) ষোলটি
[ 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10, 1], যোগফলের জন্য প্রয়োজনীয় হিসাবে sum(...),।

ফিল্টার করা ফলাফলগুলি একটি সেটে স্থানে রয়েছে {...}, সুতরাং কেবল অনন্য ফলাফলই থাকবে এবং দৈর্ঘ্যটিই len(...)গণনা


3

05AB1E , 39 38 37 বাইট

'A1:vTy‚ydè})ŒvyO¸y1åiDT+ì}21å})¹ŒÏÙg

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

ব্যাখ্যা

'A1:                  # replace A with 1 in input

v      }              # for each card
 Ty‚                  # pair 10 and the card
    yd                # check if the card is a digit
      è               # use this to index into the pair, giving 10 for JQK
        )             # wrap in list
                      # we now have a list of cards as numbers in range [1 ... 10]

Œv               }    # for each sublist
  yO¸                 # create a list with the sum of the sublist
     y1åi    }        # if the sublist contain 1
         DT+ì         # add sum+10 to the list
              21å     # check if 21 is in that list
                  )   # wrap in list
                      # we now have a list with 1 where the sublist sums to 21 and
                      # 0 otherwise

¹Œ                    # get sublists of the input
  Ï                   # keep only those which sum to 21
   Ù                  # remove duplicates
    g                 # count the number of lists

3

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

f=
t=>eval("for(s=new Set,i=0;t[i];i++)for(a=0,b=21,j=i;c=t[j++];b&&b-a*10||s.add(t.slice(i,j)))b-=+c||(c>'A'?10:a=1);s.size")
<input oninput=o.textContent=/[^2-9TJQKA]/.test(this.value)?'':f(this.value)><pre id=o>


মহান ধারণা, কিন্তু এই আয় 0জন্য AAAAAAAAAAAAবদলে 1। ( Aএকসাথে 1 এবং 11 হতে পারে)
ETH প্রোডাকশনগুলি

আমাদের দুটি এন্ট্রি একত্রিত করে আপনি s=>eval("q=new Set;for(i=0;s[i];i++)for(t=A=0,j=i;c=s[j++];t==21|t==11&A&&q.add(s.slice(i,j)))t+=+c||(c<'B'?A=1:10);q.size")124 বাইটের জন্য পেতে পারেন
ETH প্রোডাকশনগুলি

21 ইথ প্রডাকশনগুলি 21 থেকে শুরু করা এখনও আমার কাছে একটি বাইট সংরক্ষণ করেছে।
নীল

@ ইথ প্রডাকশনস ... আমি যদি সঠিক বাইট গণনা পোস্ট করি তবে এটি সাহায্য করবে ...
নীল

3

জাভাস্ক্রিপ্ট (ES6), 144 138 129 128 126 124 বাইট

g=([c,...s],a=[],q=new Set)=>c?g(s,[...a,[,21]].map(([x,y,A])=>[x+=c,y-=+c||(c<'B'?A=1:10),A,y&&y^10*A||q.add(x)]),q):q.size

128 এ পুরানো প্রচেষ্টা:

s=>(q=new Set,f=s=>s?f(s.slice(1))&f(s.slice(0,-1))&[...s].map(c=>t+=-c||~(c<'B'?A=0:9),t=A=21)|t&&t-10*!A?q:q.add(s):q)(s).size

s.search`A`>-1হতে পারে~s.search`A`
লুক

@ লুক না, আসলে, কারণ এটি মানগুলি যেমন -2, এবং1&-2 == 0
ইটিএইচ প্রডাকশনগুলি

সত্য। হয়তো সেট tকরার 0মধ্যে .slice(0,-1)কল (সংরক্ষণ 2B)?
লুক

@ লুক, আমি মনে করি না যে এটি কার্যকর হবে, যেমনটি tএকটি বৈশ্বিক পরিবর্তনশীল এবং এটি কল করার কারণে এটি পুনরায় সেট করা হবে f(s.slice(0,-1))। তবে আমি একটি উপায় খুঁজে পেয়েছি s.search`A`>-1:-)
ETH প্রোডাকশনগুলি

আপনি যখন এই গল্ফ শেষ করেন তখন আপনার কী আছে তা দেখার জন্য আমি আগ্রহী। আমি আপাতত 113 এ আটকে আছে বলে মনে হচ্ছে।
আর্নৌল্ড

3

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

f=(s,x=[k=0])=>s?f(s.slice(1),x,[...s].map(c=>x[t+=+c||10^(c<'B'?a=11:0),b+=c]||t-21&&t-a?0:x[b]=++k,a=b=t=0)):k

এই কোড যুক্তিটি ETH প্রোডাকশন এবং নীল থেকে বিদ্যমান জেএস উত্তরে ব্যবহৃত একটির সাথে সমান । তবে এটি একটির পরিবর্তে মুখোমুখি ব্ল্যাকজ্যাক সিকোয়েন্সগুলি ট্র্যাক রাখতে একটি বেসিক অ্যারে ব্যবহার করছেSet

বিন্যাসিত এবং মন্তব্য

f = (                     // given:
  s,                      //  - s = list of cards
  x = [k = 0]             //  - x = array of Blackjack sequences
) =>                      //  - k = number of distinct Blackjack sequences 
  s ?                     // if s is not empty:
    f(                    //   do a recursive call:
      s.slice(1),         //     starting at the next card in the list
      x,                  //     without re-initializing x[]
      [...s].map(         //   for each card 'c' in the list:
        c => x[           //
          t+ =            //   update the total number of points:
            +c ||         //     using the number of the card (for 2 ... 9)
            10 ^ (        //     or using 10 for all other cards
              c < 'B' ?   //     except the Ace which is
                a = 11    //     counted as 1 point and sets 'a' to 11
              :           //     (which means that a total number of points
                0         //     of 11 will be considered valid from now on)
            ),            //
          b += c          //   update the current sequence 'b'
        ] ||              //   if x[b] was previously stored as a Blackjack sequence
        t - 21 &&         //   or the total number of points is not equal to 21
        t - a ?           //   and not equal to 'a':
          0               //     do nothing
        :                 //   else:
          x[b] = ++k,     //     store the current sequence in x[] and increment k
        a = b = t = 0     //   initialization of all variables used in map()
      )                   //
    )                     //
  :                       // else:
    k                     //   return k

পরীক্ষার মামলা


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

2

05AB1E , 40 39 38 37 36 বাইট

-4 এমিনগাকে ধন্যবাদ

Ç<çJŒÙ'@0:[Ž„èµJuS9:S>D1å2‚T*>sOå½]¾

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

Ç<ç                                  # decrement characters by 1
   JŒÙ                               # get all unique substrings
      '@0:                           # replace @ (was A) with 0
          [Ž                      ]  # for everything on the stack
            „èµJuS9:                 # replace what was T,J,Q,K with 9
                    S>D              # increment all values
                       1å2‚T*>       # push [11,21] if there was an A, [1,21] otherwise
                              sO     # sum the values of the cards
                                å½   # increment the counter_variable if the sum 
                                     # is in the array
                                   ¾ # end loop and push (print) the counter_variable

আমাদের হ্রাস -> সাবস্ট্রিং -> ইনক্রিমেন্ট জিনিসটি করা দরকার যাতে ফেস কার্ডগুলি একক সংখ্যার দ্বারা উপস্থাপিত হয়।


ডাবল ডিজিটের কাছাকাছি পাওয়ার দুর্দান্ত উপায়! আপনিই প্রথম অপসারণ করতে পারেন Sযেমন Çচরিত্র কোড একটি তালিকায় স্ট্রিং পালাক্রমে।
এমিগিনা

এছাড়াও, "SIPJ"হতে পারে„èµJu
এমিগনা

@ এমিগনা ধন্যবাদ আমি ভেবেছিলাম এটি করার একটি উপায় আছে তবে আমি কীভাবে ডকুমেন্টেশনে ব্যবহার করব তা খুঁজে পেলাম না ।
রিলে

আপনি এটির হিসাবে পুনরায় Ç<çJŒÙ'@0:)vy„èµJuS9:S>D1å2‚T*>sOå}O
লেখার জন্য

@ এমিগনা এটি একই বাইট গণনা এবং আমার আসলের মতোই।
রিলে

1

বাশ + ইউনিক্স ইউটিলিটিস, 145 142 141 বাইট

for n in {9..155}
{ echo ${1:n%12:n/12};}|sort -u|sed 's/\(.\)/+\1/g;s/A/{1,11}/g;s/[J-T]/10/g;s/^/eval echo $[0/;s/$/]/'|sh|grep -c '\<21\>'

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

টেস্ট রান:

for x in 3282486Q3362 58A24JJ6TK67 Q745Q745Q745 AAAAAAAAAAAA T5AQ26T39QK6 JQ4A4427464K Q74Q74Q74Q74 37AQKA3A4758 TAQA2JA7AJQA TAJAQAKAT777
  do
    echo -n "$x "
    ./21 "$x"
  done

3282486Q3362 0
58A24JJ6TK67 1
Q745Q745Q745 1
AAAAAAAAAAAA 1
T5AQ26T39QK6 2
JQ4A4427464K 3
Q74Q74Q74Q74 3
37AQKA3A4758 7
TAQA2JA7AJQA 10
TAJAQAKAT777 13

1

পিএইচপি, 240 বাইট

$a=str_split($argv[1]);foreach($a as$k=>$v)$n[$k]=$v=='A'?1:($v==0?10:$v);for($i=0;$i<=$k;$i++){$s=$a[$i];$r=$n[$i];for($j=$i+1;$j<=$k;$j++){$s.=$a[$j];$r+=$n[$j];if ($r==21||($r==11&&stristr($s,'A')))$f[]=$s;}}echo count(array_unique($f));

অসমাপ্ত:

$a = str_split($argv[1]);
foreach ($a as $k=>$v)
    $n[$k] = $v == 'A' ? 1 : ($v == 0 ? 10 : $v);
for ($i=0; $i<=$k; $i++) {
    $s = $a[$i];
    $r = $n[$i];
    for ($j=$i+1; $j<=$k; $j++) {
        $s .= $a[$j];
        $r += $n[$j];
        if ($r == 21 || ($r == 11 && stristr($s,'A')) )
            $f[] = $s;
    }
}
echo count(array_unique($f));

এখানে চেষ্টা করুন!


1
অদ্ভুত, আমি এটি শপথ করতে পারি এটি আমার স্থানীয় পরীক্ষাগুলিতে কাজ করেছিল, তবে মনে হয় আপনি ঠিক বলেছেন। যাই হোক; সমস্যাটি আসল ঘটনাটি থেকে $iঘোষিত হয়নি। 4 বাইট যুক্ত হয়েছে এবং এটি নিখুঁতভাবে কাজ করে।
roberto06
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.