হৃদয় একটি হাত স্কোর


22

হৃদয় 4 জন খেলোয়াড়ের জন্য একটি কৌশল-গ্রহণ কার্ড গেম। প্রতিটি কৌশলটি সেই খেলোয়াড় দ্বারা নেওয়া হয় যিনি শীর্ষস্থানীয় স্যুটটির সর্বোচ্চ কার্ড খেলেন। প্রতিটি হাতের শেষে, খেলোয়াড়রা তাদের নেওয়া পেনাল্টি কার্ডগুলির উপর নির্ভর করে পেনাল্টি স্কোর করে; কাজটি হ'ল মাইক্রোসফ্ট হার্টসের বিধি অনুসারে স্কোরগুলি নির্ধারণ করা ।

ইনপুট

ইনপুট 4 টি তালিকার (বা সীমিত স্ট্রিং, অ্যারে ইত্যাদি) 4 জন খেলোয়াড়ের প্রত্যেকে নেওয়া পেনাল্টি কার্ডগুলি দেখায়। পেনাল্টি কার্ডগুলি হল

2♥, 3♥, 4♥, 5♥, 6♥, 7♥, 8♥, 9♥, 10♥, J♥, Q♥, K♥, A♥, Q♠

যা আমরা প্রতিনিধিত্ব করব

2,  3,  4,   5,  6,  7,  8,  9,  10,  11, 12,  13,  1,  0

যথাক্রমে।

আউটপুট

আউটপুট হল 4 প্লেয়ারের দ্বারা প্রদত্ত 4 পেনাল্টি পয়েন্ট (তালিকা, স্ট্রিং, অ্যারে ইত্যাদি)। স্কোরিং নিম্নরূপ:

  • প্রতিটি হৃদয় ( ইন্টিজার দ্বারা উপস্থাপিত 1করার 13সহ) 1 পয়েন্ট incurs
  • কোদালদের রানী (যার Q♠প্রতিনিধিত্ব করে 0) 13 পয়েন্ট নিয়ে আসে
  • ব্যতিক্রম: যদি কোনও খেলোয়াড় পেনাল্টি কার্ডের সমস্তটি গ্রহণ করে (যা চাঁদকে শুটিং নামে ডাকা হয়), তবে তিনি 0 পয়েন্ট অর্জন করেন, অন্য সমস্ত খেলোয়াড়ের 26 পয়েন্ট থাকে।

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

[2, 8, 7, 1], [3, 4], [], [9, 5, 6, 0, 10, 11, 12, 13]     -->  4,  2,  0, 20
[0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], [], [], [1]   --> 25,  0,  0,  1
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0], [], [], [] -->  0, 26, 26, 26

বাইটস মধ্যে সংক্ষিপ্ত কোড।

উত্তর:


3

সিজেম, 22 20 বাইট

2 বাইট সংরক্ষণের জন্য জিমি 23013 কে ধন্যবাদ।

{{XD?}f%1fb_26&1bf^}

একটি নামবিহীন ব্লক (ফাংশন), যা ইনপুট হিসাবে 4 টি তালিকার একটি তালিকা নেয় এবং স্কোরগুলির তালিকা প্রদান করে।

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

ব্যাখ্যা

{      e# For each card...
  XD?  e#   Choose 1 if it's positive and 13 if it's zero.
}f%
1fb    e# Sum each hand.
_26&   e# Get the set intersection of the scores with 26. This gives [26]
       e# if someone shot the moon, and [] otherwise.
1b     e# Treat as base-1 digits, which gives 26 if someone shot the moon
       e# and zero otherwise.
f^     e# XOR each result with this number. This swaps zeros and 26s when 
       e# someone shot the moon and does nothing otherwise.

_26&1b। -২ বাইট।
জিমি 23013

@ jimmy23013 ahhhh, 1b... আমি একটি সংক্ষিপ্ত পথ ঘুরে খুঁজে বের করার চেষ্টা করা হয়েছিল [26]মধ্যে 26এবং []মধ্যে 0কিন্তু একরকম যে আমার কাছে ঘটেনি। আপনাকে ধন্যবাদ :)
মার্টিন এন্ডার

8

আর, 85 77 74 বাইট

function(x,z=sapply(x,function(x)sum(x>0)+any(x<1)*13))abs(z-any(z>25)*26)

নামহীন ফাংশন যা ইনপুট হিসাবে একটি আর-তালিকা নেয়। উপাদানের সংখ্যা বেড়ে চলেছে করে কাজ করে >0এবং 13 যোগ করে যদি প্রতিটি ভেক্টর মধ্যে যে কোনো উপাদান <1(Spades এর অর্থাত রাণী) এবং যেমন দোকান z

যদি কোনও উপাদান থাকে zতবে >25ফিরে 26-zআসুন, অন্যথায় ফিরে আসুন z

এটি আর-ফিডেলে চেষ্টা করুন


1
চান 26-zকাজ করে?
u54112

হ্যাঁ অবশ্যই / ফেসপালম
বিলিওব

4

সি ++ 14, 158 বাইট

নামবিহীন লাম্বদা:

[](auto c){typename decltype(c)::value_type r;int b=0;for(auto d:c){int q=0;for(auto i:d)q+=i?1:13;r.push_back(q);b+=q==26;}if(b)for(int&x:r)x=26-x;return r;}

একটি vector<vector<int>>এবং রিটার্ন প্রয়োজনvector<int>

Ungolfed:

[](auto c){
 typename decltype(c)::value_type r;   //result vector
 int b=0;                              //flag if one has all cards
 for(auto d:c){                        //over all decks
  int q=0;                             //count points
  for(auto i:d) q+=i?1:13;             //+13 for queen, +1 else
  r.push_back(q);                      //add to result
  b+=q==26;                            //possibly activate flag
 }
 if(b) for(int&x:r) x=26-x;            //if flag is set, mirror the results
 return r;
}

আপনার জন্য কয়েকটি টেস্টকেস:

 auto r = std::vector<std::vector<int>>{{2,8,7,1},{3,4},{},{9,5,6,0,10,11,12,13}};
 auto s = std::vector<std::vector<int>>{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0},{},{},{}};
 auto t = std::vector<std::vector<int>>{{},{2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0},{},{1}};

4

পাইথন 2, 75 72 71 বাইট

i=[len(a)+12*(0in a)for a in input()]
print[[x,26-x][26in i]for x in i]

হিসাবে ইনপুট লাগে [2, 8, 7, 1], [3, 4], [], [9, 5, 6, 0, 10, 11, 12, 13]


আপনি [0,12] [0 ইন এ] এর পরিবর্তে 12 * [0 ইন এ] ব্যবহার করে 3 টি অক্ষর সংরক্ষণ করতে পারেন?
কস্টান্টিনো

@ কাস্টান্টিনো আমি মনে করি আপনি বোঝাতে চাইছেন 12*(0in a)
mbomb007

print[[x,26-x][26in i]for x in i]এক বাইট খাটো।
mathmandan

3

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

function h($a){foreach($a as&$b)$b=count($b)+12*in_array(0,$b);if(max($a)>25)foreach($a as&$n)$n=26-$n;return$a;}

ফাংশন অ্যারের একটি অ্যারে নেয়, মানগুলির একটি অ্যারে প্রদান করে।


পিএইচপি-তে অন্য অ্যারে ম্যাপিংকে আশ্চর্য করুন: রেফারেন্সযুক্ত আইটেমগুলি সহ লুপগুলি। ওয়াহা এর চেয়ে খাটো array_map


3

হাস্কেল, 62 59 56 বাইট

f x|all(<26)x=x|0<1=map(26-)x
f.map(sum.map((13^).(0^)))

ব্যবহার:

> f.map(sum.map((13^).(0^))) $ [[0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], [], [], [1]]
[25,0,0,1]

আমি মনে করি আপনি fযেমন লিখতে পারেন f n=13^0^n
xnor

@ এক্সনর আমি মনে করি আপনি ঠিক বলেছেন 3 বাইট সঞ্চয়
এঙ্গস

আমার মনে f x|all(<26)x=x|0<1=map(26-)xহয় ল্যাম্বডা ফাংশনের জায়গায় এটি সংজ্ঞায়িত করা এবং ব্যবহার করা কিছু বাইট সংরক্ষণ করে।
জাগারব

@ জাগারব ঠিক আপনি আছেন, আমি এটি আরও 3 বাইট বলব।
অ্যাঙ্গস

2

05AB1E ,26 22 21 বাইট

ট্রেলিং হোয়াইটস্পেস অবশ্যই ইনপুট থেকে অপসারণ করতে হবে যাতে এটি অ্যারে হিসাবে ব্যাখ্যা হয়। যখন কোনও খেলোয়াড় সমস্ত পেনাল্টি কার্ড সংগ্রহ করেছিলেন তখন (26-x) ব্যবহার করার সময় শেষটি অন্যান্য উত্তরগুলির দ্বারা অনুপ্রাণিত হয়েছিল।

vy0å12*yg+})D26©åi(®+

v                    For each array
 y                   Push array on the stack
  0å                 Generate a boolean array indicating whether the queen of spades is at the same index in the original array
    12*              Multiply by 12 the value of the queen of spades
       yg+           Add the length of the array; the queen of spades gets her last point from this part
          }          End for
           )         Push an array of all evaluated scores
            D26©å    1 if there is a 26, 0 otherwise
                 i   If there is a 26
                  (®+ Mirror the array: for each element yield 26-element
                      Implicit end if
                      Implicitly print the score array

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

এটি এখনও বেশ গল্ফযোগ্য দেখাচ্ছে, নকল ধ্রুবক এবং শর্তাধীন বিবৃতি সহ।

প্রাক্তন সংস্করণ, 26 বাইট

(সর্বাধিক জরিমানার মান প্রতিটি পয়েন্টের জন্য একটি বাইট)

আমি স্থির করেছি যে এটির দৈর্ঘ্যটি আমার মতে এই চ্যালেঞ্জটির পক্ষে সবচেয়ে উপযুক্ত :)

vyD0å12*sg+})D26©QDOi_®*ë\

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


2

পাইথন 3, 101 বাইট

def s(a):r=[sum([(1,13)[c==0]for c in h])for h in a];s=(r,[(26,0)[s==26]for s in r]);return s[26in r]

সম্পূর্ণ কোড:

def score(hands):
    result = [sum([(1, 13)[card == 0] for card in hand]) for hand in hands]
    results = (result, [(26, 0)[score == 26] for score in result])
    return results[26 in result]

12*(c<1)+12 চেয়ে খাটো বাইট (1,13)[c==0]26*(s>25)3 চেয়ে খাটো বাইট (26,0)[s==26]
মেগো

2

জাভাস্ক্রিপ্ট (ES6), 82 80 77 72 70 69 67 বাইট

সংরক্ষিত 2 বাইট @ নীলকে ধন্যবাদ

f = 
s=>s.map(c=>c.map(t=>r+=t?1:13,r=0)|(b|=r>25,r),b=0).map(c=>b*26^c)

console.log(f.toString().length)
console.log(f([[2, 8, 7, 1], [3, 4], [], [9, 5, 6, 0, 10, 11, 12, 13]]));
console.log(f([[0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], [], [], [1] ]));
console.log(f([[0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], [], [1], [] ]));
console.log(f([[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0], [], [], []]));
console.log(f([[],[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0], [], []]));

ভাঙ্গন

s=>s.map(                              // for each hand
 c=>c.map(                             // for each card
  t=>r+=t?1:13,                        // add value of card
 r=0)|(
  b=b|r>25,r                           // set flag if any hand scores 26 points
 ),
 b=0)
.map(c=>b?                             // for every card if a hand scored 26
  c?0:26                               // set every 0 hand to 26 and the 26 hand to 0
:c)                                    // otherwise do nothing

c=>b*26^c2 বাইট সঞ্চয়
নিল

1

পিপ , 28 বাইট

27 বাইট কোডের, -pপতাকা জন্য +1 ।

Y{$+1+12*!*a}M Va26Ny?26-yy

কমান্ড-লাইনে নেস্টেড তালিকার প্রতিনিধিত্বকারী স্ট্রিং হিসাবে ইনপুট নেয়, যেমন "[[2 8 7 1] [3 4] [] [9 5 6 0 10 11 12 13]]"(টিআইও-তে কোট প্রয়োজন হয় না)। এটি অনলাইন চেষ্টা করুন!


1

রুবি, 59 বাইট

->a{a.map{|h|a.max.size>13?h.min||26:h.size+12*h.count(0)}}

অথবা, বিকল্পভাবে,

->a{a.map{|h|a.count([])>2?h.min||26:h.size+12*h.count(0)}}

শুধুমাত্র এক হাত কোনো কার্ড থাকে, তাহলে আমরা কল করে আমি এই কাজ 0. মান পেতে 26 এর একটি মান, এবং কার্ডের হাত পেতে খালি হাত চান minহাতে - এই আয় nilএকটি খালি অ্যারের জন্য, এবং তারপর আমি ||এটি ২ 26-এ পরিণত করি other অন্যান্য ক্ষেত্রে, আমি কোনও হাতে কার্ডের সংখ্যাটি গণনা করি এবং তারপরে স্পেডেসের রানীতে 12 টি যুক্ত করি।


0

স্কালা, 93 বাইট

a=>{val% =a.map(_.map{case 0=>13;case _=>1}sum)
if(%toSet 26)%map{case 0=>26;case _=>0}else%}

ব্যবহার:

val f:(Seq[Seq[Int]]=>Seq[Int])=...
f(Seq(Seq(2, 8, 7, 1), Seq(3, 4), Seq(), Seq(9, 5, 6, 0, 10, 11, 12, 13)))

ব্যাখ্যা:

a=>{           //define an anonymou function with a parameter a
  val% =         //define % as...
    a.map(         //map each element of a...
      _.map{         //to each of the card
        case 0=>13     //replaced with its value
        case _=>1
      }
      sum            //and the sum of the values
    )
  if(            //if
    %toSet 26      //one player has all cards
  )
    %map{          //return % with...
      case 0=>26     //each 0 replaced with 26
      case _=>0      //and everything else (aka the 26) replaced 0
    }
  else           //else
    %              //return %
}

আমি ব্যবহার করতে পারে %toSet 26পরিবর্তে % contains 26কারণ Setএর applyপদ্ধতি containsএবং পেতে-অ্যাট-সূচক মত Seq'র

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