তুমি কিসের জন্য অপেক্ষা করছো? (একজন মাহজং সমাধানকারী)


14

আড্ডায় আলোচনার মাধ্যমে @ মার্টিনব্যাটনারকে আইডিয়া ধন্যবাদ

মাহজং একটি টাইল গেম যা এশিয়াতে প্রচুর জনপ্রিয়। এটি সাধারণত চারজন খেলোয়াড়ের সাথে খেলে যায় এবং গেমের লক্ষ্যটি হ'ল প্রথম ব্যক্তি যিনি টাইলস ব্যবহার করে বৈধ হাত শেষ করেন। এই চ্যালেঞ্জের জন্য, আমরা গেমটির সরলীকৃত সংস্করণ - পিপিসিজি মাহজং বিবেচনা করব।

- PPCG Mahjong, সেখানে তিন মামলা হয় m, pএবং s- এবং টাইলস থেকে সংখ্যা নির্ধারণ করা হয় 1থেকে 9। সেখানে ঠিক প্রতিটি টালি চার কপি, এবং টাইলস তার সংখ্যাকে মামলা দ্বারা অনুসরণ (যেমন দ্বারা প্রকাশ করা হয় 3m, 9s)।

একটি সম্পূর্ণ পিপিসিজি মাহজং হাতে মোট ১৪ টি টাইলের জন্য তিনটি এবং একটি জোড়া চার সেট থাকে।

তিনজনের একটি সেট হতে পারে:

  • একই টাইলের তিনটি (যেমন 4s 4s 4s, তবে নয় 4m 4p 4s), বা
  • একই স্যুট পরপর তিন টাইলস একটি ক্রম (যেমন 1s 2s 3sঅথবা 6p 7p 8pকিন্তু 3s 4m 5mবা 3p 5p 7p)। সিকোয়েন্সগুলি মোড়ানো হয় না (তাই 9m 1m 2mঅবৈধ)।

একটি জুড়ি কেবল দুটি অভিন্ন টাইল (যেমন 5s 5s)।

চ্যালেঞ্জ

আপনার প্রোগ্রামটি 13 টাইলের ব্যবধানে পৃথক হাত পাবে, প্রতিটি টাইল চারবারের বেশি উপস্থিত হবে না। আপনি হয় পুরো প্রোগ্রাম বা একটি ফাংশন যা একটি স্ট্রিং লাগে লিখতে পারেন।

আপনার কাজটি হ'ল সমস্ত সম্ভাব্য 14 টি টাইলস ("অপেক্ষা") সন্ধান করা যা হাতে যুক্ত হলে একটি সম্পূর্ণ পিপিসিজি মাহজং হাত তৈরি করে। আউটপুটযুক্ত টাইলগুলি স্থান পৃথক হওয়া উচিত, তবে এটি কোনও ক্রম হতে পারে। শীর্ষস্থানীয় বা পূর্ববর্তী সাদা স্থান অনুমোদিত।

আপনার প্রোগ্রামটি একটি যুক্তিসঙ্গত সময়ে চলতে হবে, এক মিনিটের বেশি নয়।

উদাহরণ

Input: 1m 1m 1m 4s 4s 4s 7p 7p 7p 3m 3m 3m 9s
Output: 9s

Input: 1m 1m 1m 3m 3m 3m 5m 5m 5m 2s 3s 7p 8p
Output:

Input: 1m 2m 2m 3m 3m 3m 3m 4m 1s 1s 9s 9s 9s
Output: 1s

Input: 1m 1m 1m 2m 3m 4m 5m 6m 7m 8m 9m 9m 9m
Output: 1m 2m 3m 4m 5m 6m 7m 8m 9m

Input: 1m 1m 1m 5p 2m 3m 5p 7s 8s 5p 9s 9s 9s
Output: 1m 4m 6s 9s 

প্রথম উদাহরণে, 1m 4s 7p 3mসমস্তগুলি বিদ্যমান ট্রিপলগুলি গঠন করে, একা তৈরি 9sকরার জন্য একাকী রেখে ।

দ্বিতীয় উদাহরণে, 2s 3sএবং 7p 8pকেবল সিকোয়েন্সগুলি তৈরি করতে পারে এবং বাকী টাইলগুলি কেবল ট্রিপল্ট গঠন করতে পারে। অতএব কোনও জোড় গঠন করা যায় না, এবং কোনও আউটপুটও হয় না।

তৃতীয় উদাহরণে, হাতটি বিভক্ত হয় 1m2m3m 2m3m4m 3m3m 1s1s 9s9s9s। সাধারণত এটির জন্য অপেক্ষা করা হবে 3m 1s, তবে চারটি 3mব্যবহার করা হয়েছে, কেবলমাত্র অপেক্ষারত অবলম্বন 1s

চতুর্থ উদাহরণে, সমস্ত mটাইলস হাতটি সম্পূর্ণ করে। উদাহরণস্বরূপ, উদাহরণস্বরূপ, 1mএকজনের কাছে 1m1m1m 1m2m3m 4m5m6m 7m8m9m 9m9mএটি সম্পূর্ণ হাত হতে পারে ।

বাকি চতুর্থ উদাহরণ এবং পঞ্চম উদাহরণটি চেষ্টা করার চেষ্টা করুন :)

স্কোরিং

এটি , সুতরাং কয়েকটি বাইটে সমাধান জিততে পারে। স্ট্যান্ডার্ড লুফোলস প্রযোজ্য।


9
ওয়েস্টার্নরা যখনই "মাহজং" শব্দটি শোনেন তখন পাশ্চাত্যরা মনে করে যে টাইলগুলি ভেবে দেখে মনে হয় সলিটায়ারের পরিবর্তে (আইএমও বিরক্তিকর) সলিটায়ার পরিবর্তে মহজং করার জন্য আপনাকে ধন্যবাদ।
জাস্টিন

@ কুইনকুনস ফান ফ্যাক্ট: এই চ্যালেঞ্জটি এলো কারণ আমি মাহজং সলিটায়ারের একটি ASCII প্রতিনিধিত্বের সাথে একটি চ্যালেঞ্জ করতে চেয়েছিলাম (যা আমি এখনও কিছুটা সময়ে করতে পারি ...)। যদিও আমি এটিকে "মাহজং সলিটায়ার" বলেছিলাম। ;)
মার্টিন ইন্ডার

2
@ কুইনকুনস: আমি মনে করি না যে এটি তাদের দোষ। গেম ডেভেলপারদের তাদের "মাহজং সলিটায়ার" গেমগুলিকে "মাহজং" বলার জন্য দোষ এবং অন্য কিছুই নয়।
জো জেড।

সাতটি জুটির কী হবে? তেরো এতিম? আপনি অনার্সের সাথে আরও জটিল কিছু করতে পারেন :) আপনি কি মনে করেন যে যদি আমি কোনও হাতের শ্যান্টেন ( টেনপাই পাওয়ার আগে তৈরি ন্যূনতম সংখ্যক টাইলস - জয়ের জন্য প্রস্তুত) গণনা করতে বলে এমন একটি কোডগল্ফ তৈরি করি তবে এটি নির্দ্বিধায় ?
ভি। কুর্তোইস

@ ভিকুর্তোইস এটি বেশ কিছুক্ষণ হয়েছে, তবে আমি বিশেষত সাতটি জোড়, তেরো এতিম, সম্মান এবং ইতিমধ্যে কলগুলি বাদ দিয়ে স্মরণ করছি যাতে গেমটিতে নতুন লোকদের চ্যালেঞ্জকে কাটিয়ে উঠতে না পারে। আমি মনে করি এর পরে আমি একটি স্থির চ্যালেঞ্জ তৈরির বিষয়টি বিবেচনা করেছি তবে শেষ পর্যন্ত কখনই হয়নি - আপনি যদি একটি পোস্ট করতে চান তবে আমার মনে হয় এটি একটি দুর্দান্ত চ্যালেঞ্জ তৈরি করবে।
Sp3000

উত্তর:


4

পাইথন, 312 281 বাইট

def W(S):H=lambda C,n=0,t=1:sum([m<C[0]and H([c-s for c in C][:l]+C[l:],n+1,u)for m,s,l,u in(2,3,1,t),(t,2,1,4),(4-5*all(C[:3]),1,3,t)])|H(C[1:],n,t)if C[2:]and max(C)<5else n>4;T=[i+s for s in"mps"for i in"12345678900"];return" ".join(t for t in T if("1"<t)*H(map((S+t).count,T)))

W ইনপুট হিসাবে একটি স্ট্রিং নেয় এবং আউটপুট হিসাবে একটি স্ট্রিং প্রদান করে।

টাইলসের সংখ্যক সংখ্যা (২ 27) এগুলির প্রতিটি হাতটি সম্পূর্ণ করে কিনা তা পরীক্ষার জন্য দ্রুত পর্যাপ্ত করে তোলে। কোনও হাতটি বৈধ কিনা তা পরীক্ষা করতে সমস্যা হয়। ফাংশনটিতে একটি সাধারণ ব্যাকট্রাকিং অ্যালগরিদম ব্যবহার করা হয় যা সেটগুলির সমস্ত সম্ভাব্য পছন্দগুলি এবং চেকগুলির মধ্যে কোনও একটি সম্পূর্ণ হাতে যোগ করে কিনা তা বিবেচনা করে।

হাতগুলিকে টাইল হিস্টোগ্রাম হিসাবে উপস্থাপন করা হয়, অর্থাত টাইল গণনাগুলির একটি তালিকা (সমস্ত টাইলের জন্য, কেবল হাতে উপস্থিত রয়েছে তা নয়)) এটি উভয়ই আমাদের কাছে একটি নির্দিষ্ট টাইলের একটি নির্দিষ্ট সংখ্যা আছে কিনা তা পরীক্ষা করা সহজ করে তোলে এবং যদি আমরা সংলগ্ন টাইলগুলির একটি ক্রম রয়েছে (বিভিন্ন স্যুটগুলির টাইলগুলির মধ্যে প্যাডিং মাল্টি স্যুট ক্রমগুলি প্রতিরোধ করে))


আহ, আপনি আমাকে মারলেন: পি যাইহোক, দেখে মনে হচ্ছে আপনি mapকয়েকটি জায়গায় ব্যবহার করতে পারেন , যেমন:H(map((S+t).count,T))
FryAmTheEggman

@ ফ্রিআম দ্য এজিজিম্যান এটি মিস করেছেন। ধন্যবাদ!
Ell

@ স্প3000 এটি পাইথন ২ 2. এটি আমার জন্য ২.7.৮-এ দুর্দান্ত কাজ করে।
Ell

@ সবকটি কাজ ২. in.৮ - ২.7.৫ এ 5 টি পছন্দ করেননি: পি
এসপি 3000

2

জাভাস্ক্রিপ্ট (E6) 306

F=h=>(
  R=(a,p,n=1)=>(a=[...a]).splice(p,n)&&a,
  K=(t,d=3)=>
    !t[0]
    |t.some(
      (v,p)=>
        v==t[p+1]&v==t[p+d-1]&&
        K(R(t,p,d))
      ||
        ~((r=t.indexOf((x=-~v[0])+v[1]))|(s=t.indexOf(-~x+v[1])))&&
        K(R(R(R(t,s),r),p))
    ),
  o=[],
  [for(s of'mps')for(i of'123456789')h.replace(t=i+s,s,'g')[34]
  &&K([t,...h.split(' ')].sort(),2)&&o.push(t)
  ],o
)

ব্যাখ্যা

F=hand=>(
  Remove=(a,p,n=1)=>                // function to remove 1 or more element from an array, returning a new shorter array
    ((a=[...a]).splice(p,n), a),    // using array.splice on a new created array 

  Check=(ckHand, dim)=>  // recursive function to check hand. 
                         // removing pairs (at iteration 0) or sequence of three, if at last the hand remain empty then success
                         // parameter dim is 2 or 3 indicating how many equal elements are to be removed
    !ckHand[0]           // check if empty (element 0 does not exist)
    |ckHand.some(        // else traverse all array checking what can be removed
      (value, position)=> 
        value == ckHand[position + 1] 
        & value == ckHand[position + dim-1] &&   // look for 3 (or 2) equal elements
        Check(Remove(ckHand, position, dim), 3)   // if found, then remove elements and check again
      ||
        ~((r = ckHand.indexOf((x=-~value[0]) + value[1]))     // value[0] is number, value[1] is suit 
        |(s = ckHand.indexOf(-~x + value[1]))) &&              // look for an ascending sequence in following elements (the array is sorted)
        Check(Remove(Remove(Remove(ckHand, s), r), position),3) // if sequence found, remove elements and check again
    ),
  output=[], // start with an empty solution list
  [ // using array comprehension to implement a double loop
    for(s of'mps')        // loop for all suits
    for(i of'123456789')  // loop for all numbers
    (
       tile=i+s, // current tile 
       (hand.replace(tile,' ','g').length > 34)      // if tile is present 4 times in hand, the replaced length is 38-4 == 34
       && (                                       // else proceed with check
         ckHand = hand.split(' '), 
         ckHand.push(tile),    // in ckHand (as an array) the hand to be checked, that is base hand + current tile
         ckHand.sort(),        // sorting the array simplfy the checks
         Check(ckHand, 2)      // start checks looking for a pair
       )
       && 
         output.push(tile)   // if check ok, add tile to the solution list
    )   
  ],
  output // last expression in list is the function return value 
)

টেস্ট ফায়ারফক্স / Firebug কনসোলে

;["1m 1m 1m 4s 4s 4s 7p 7p 7p 3m 3m 3m 9s", "1m 1m 1m 3m 3m 3m 5m 5m 5m 2s 3s 7p 8p",
 "1m 2m 2m 3m 3m 3m 3m 4m 1s 1s 9s 9s 9s", "1m 1m 1m 2m 3m 4m 5m 6m 7m 8m 9m 9m 9m",
 "1m 1m 1m 5p 2m 3m 5p 7s 8s 5p 9s 9s 9s"].forEach(s=>console.log(s+' => '+F(s)))

আউটপুট

1m 1m 1m 4s 4s 4s 7p 7p 7p 3m 3m 3m 9s => 9s
1m 1m 1m 3m 3m 3m 5m 5m 5m 2s 3s 7p 8p =>
1m 2m 2m 3m 3m 3m 3m 4m 1s 1s 9s 9s 9s => 1s
1m 1m 1m 2m 3m 4m 5m 6m 7m 8m 9m 9m 9m => 1m,2m,3m,4m,5m,6m,7m,8m,9m
1m 1m 1m 5p 2m 3m 5p 7s 8s 5p 9s 9s 9s => 1m,4m,6s,9s
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.