অ্যাকর্ডিয়নের একটি খেলা সমাধান করুন


13

অ্যাকর্ডিয়ান একটি সলিটায়ার কার্ড গেম আমি সম্প্রতি এসেছি যেখানে প্রায় প্রতিটি লেআউট দ্রবণযোগ্য তবে অবিশ্বাস্যরকম শক্ত। আপনি এটি এখানে খেলতে পারেন ।

বিধি

52 টি ফেস কার্ডগুলি এলোমেলো ক্রমে মুখোমুখি করা হয়। প্রতিটি বার, আপনি একটি কার্ড পরবর্তী কার্ডের সাথে প্রতিস্থাপন, যেখানে দুটি কার্ড :

  • একটি মামলা বা নম্বর শেয়ার করুন এবং
  • 1 (সংলগ্ন) বা 3 (এর মধ্যে দুটি কার্ড ) এর দূরত্বে রয়েছে

যখন কেবল 1 টি কার্ড বাকি আছে তখন গেমটি জিতে যায় । আপনি ধরে নিতে পারেন যে প্রতিটি ইনপুট সমাধানযোগ্য। প্রতিস্থাপন কার্ডটি সর্বদা প্রতিস্থাপন কার্ডের আগে অবশ্যই আগে চলে।

উদাহরণ

উদাহরণ হিসাবে, নিম্নলিখিত লেআউটটি বিবেচনা করুন:

2H,2S,1S,2D  (H: Hearts, S: Spades, D: Diamonds)

এখানে 3 টি সম্ভাব্য পদক্ষেপ রয়েছে:

  1. 2Hসংলগ্ন সাথে প্রতিস্থাপন 2S, যাতে আমরা শেষ2S,1S,2D
  2. 2Sসংলগ্ন সাথে প্রতিস্থাপন 1S, যাতে আমরা শেষ2H,1S,2D
  3. এর 2Hসাথে 2D(3 দূরত্বে) প্রতিস্থাপন করুন , তাই আমরা শেষ করব2D,2S,1S

ঐ 3 প্যাচসমূহ মধ্যে শুধুমাত্র গত এক বিজয়ী (আপনি প্রতিস্থাপন win সম্ভাবনা রয়েছে 2D <- 2Sতারপর, 2S <- 1S)।

ইনপুট আউটপুট

আপনার কাজ হল একটি অ্যাকর্ডিয়ান সলভার লিখতে । আপনি কার্ডের একটি তালিকা পাস করেছেন, এবং গেমটি সমাধানের জন্য আপনার চালগুলির একটি তালিকা ফেরত দিতে হবে।

আপনি কমা-বিসীমাবদ্ধ স্ট্রিং হিসাবে কার্ডের একটি তালিকা পাস করেছেন, যেখানে প্রতিটি কার্ড তাদের সংখ্যার মান উপস্থাপন করে পূর্ণসংখ্যারূপে পাস হয়, তারপরে একটি চরিত্র যা তাদের মামলাতে প্রতিনিধিত্ব করে।

আপনাকে অবশ্যই কমা-বিস্মৃত স্ট্রিং হিসাবে প্রতিস্থাপনের তালিকাটি ফেরত পাঠাতে হবে, যেখানে প্রতিটি প্রতিস্থাপন বিন্যাসে রয়েছে Card <- Card(উপরে বর্ণিত কার্ড ফর্ম্যাট অনুসরণ করে)। প্রতিটি জোড়ায় প্রথম কার্ডটি হ'ল কার্ডটি প্রতিস্থাপন করা।

পরীক্ষার কেস:

5H,1C,12S,9C,9H,2C,12C,11H,10C,13S,3D,8H,1H,12H,4S,1D,7H,1S,13D,13C,7D,12D,6H,10H,4H,8S,3H,5D,2D,11C,10S,7S,4C,2H,3C,11S,13H,3S,6C,6S,4D,11D,8D,8C,6D,5C,7C,5S,9D,10D,2S,9S
5H,9C,11H,7S,7D,12D,6H,10S,3H,4D,12C,2S,3C,5C,7H,6S,1H,8S,2H,11S,4C,10D,12H,9H,2D,4H,6C,13H,11C,2C,10H,8C,1S,11D,3S,12S,7C,5D,13S,8D,4S,6D,13C,3D,8H,13D,1D,9D,9S,1C,5S,10C
7H,11C,8C,7S,10D,13H,4S,10C,4D,2C,4H,13D,3C,2H,12C,6C,9H,4C,12H,11H,9S,5H,8S,13S,8H,6D,2S,5D,11D,10S,1H,2D,5C,1C,1S,5S,3H,6S,7C,11S,9C,6H,8D,12S,1D,13C,9D,12D,3D,7D,10H,3S

যদিও এই প্রতিযোগিতাটি একটি , আমি সময়-দক্ষ সমাধানগুলিতে বিশেষভাবে আগ্রহী এবং বেনিফিটগুলির সাথে বুদ্ধিমান সমাধানগুলি পুরস্কৃত করতে পারি। এটি বলেছে যে জ্যোতির্বিজ্ঞান পরিমাণ সময় নেয় এমন সমাধানগুলি এখনও গ্রহণযোগ্য (আমি একটি ছোট ডেকের সাথে পরীক্ষার পরামর্শ দেব, যেমন একটি 16-কার্ড, 4 স্যুট ডেক)।


আপনার নিয়মগুলি কি উল্লেখ করে যে চালগুলি কেবল এক দিকেই করা যেতে পারে?
ফায়ারসাম

6
টেবিলের প্রতিটি কার্ডে গড়ে প্রায় 0.25 + 0.25 = 0.5 আইনী পদক্ষেপ থাকে। সুতরাং অনুসন্ধানের স্থান প্রায় 52! * 0.5 = 4E67। (কোড গল্ফ ট্যাগ সহ) লিখিত হিসাবে চ্যালেঞ্জটি কেবলমাত্র পুরো পুরো জায়গাটি অনুসন্ধান করার এবং কোনও সমাধানের (বা "অবসন্ন হলে" কিছুই নয়) রিপোর্ট করার প্রয়োজন হিসাবে ব্যাখ্যা করা যেতে পারে, যা দক্ষতার জন্য খুব কম জায়গা ছেড়ে যায় এবং জ্যোতির্বিদ্যার টাইমসেলস প্রয়োজন। আমি আপনাকে সাফল্যের হার এবং সময় বিবেচনা করে কোড কোড চ্যালেঞ্জ হিসাবে তৈরি করার পরামর্শ দিচ্ছি, এবং হয় স্কোরের কোডের দৈর্ঘ্যের প্রভাব হ্রাস করুন বা একে একে একে একে নির্মূল করুন।
লেভেল নদী সেন্ট

1
@ Pietu1998 এবং এর মধ্যে সমস্যা রয়েছে। আমি ধরে নিচ্ছি যে মুখস্থকারীটি আপনার বাইটের জন্য ব্যয় করছে, সুতরাং আপনার মুখোমুখী সংস্করণ হিসাবে গল্ফযুক্ত সংস্করণ হিসাবে জমা দেওয়া উচিত তবে 52 কার্ডের ডেকে পরীক্ষা করা অসম্ভব হয়ে পড়ে। কোডগল্ফ বড় অনুসন্ধানের জায়গাগুলির সমস্যা নিয়ে স্কোরিং সিস্টেমের মতো ভাল কাজ করে না।
স্তর নদী সেন্ট

3
আমি কোড-গল্ফ প্রতিযোগিতামূলক হতে চাই তাদের জন্য জ্যোতির্বিজ্ঞানের রানটাইমগুলির সাথে ঠিক আছি। তবে লোকেরা অবশ্যই উত্তর পোস্ট করতে সক্ষম (এবং উত্সাহিত) যা প্রতিযোগিতামূলক নয়, এবং রান-টাইম প্রায়।
নাথান মেরিল

4
তদ্ব্যতীত, আপনি যদি কোনও কোড-গল্ফ সমাধান পরীক্ষা করতে চান, একটি 52-কার্ড ডেকের প্রয়োজন হয় না। একটি 16-কার্ড (4 স্যুট) ডেকে সংক্ষিপ্ত রানটাইম সরবরাহ করা উচিত, এবং যথার্থতা যাচাই করা উচিত।
নাথান মেরিল

উত্তর:


5

পাইথন 3, 274 272 271 বাইট

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

def g(p):
 q=lambda a:[[i,a]for i in range(len(p)-a)if p[i][:-1]==p[i+a][:-1]or p[i][-1]in p[i+a]]
 for n in q(1)+q(3):
  s=sum(n);c=p[:s]+p[s+1:];c[n[0]]=p[s]
  if g(c):return p[n[0]]+' <- '+p[s]+','+g(c)
 return' 'if len(p)<2else[]
print(g(input().split(','))[:-2]or'')

এটি অত্যন্ত ধীর। তবে, আপনি এটি একটি স্মৃতিচারণ দিয়ে চেষ্টা করতে পারেন । এটিতে কয়েকটি অতিরিক্ত list- tupleরূপান্তর রয়েছে তবে তা অন্যথায় সমতুল্য।

import functools
@functools.lru_cache(maxsize=None)
def g(p):
 q=lambda a:[[i,a]for i in range(len(p)-a)if p[i][:-1]==p[i+a][:-1]or p[i][-1]in p[i+a]]
 for n in q(1)+q(3):
  s=sum(n);c=list(p[:s]+p[s+1:]);c[n[0]]=p[s]
  if g(tuple(c)):return p[n[0]]+' <- '+p[s]+','+g(tuple(c))
 return' 'if len(p)<2else[]
print(g(tuple(input().split(',')))[:-2]or'')

এমনকি এটি একটি নির্দিষ্ট ইনপুটগুলির সাথে জ্যোতির্বিজ্ঞানের দিক থেকে ধীরে ধীরে।

কোডটি স্ট্রিংগুলি ব্যবহার করে, সংখ্যাগুলি নয়, সুতরাং এটি KHপরিবর্তে পছন্দ মতো স্বাক্ষরকেও সমর্থন করে 13H

উদাহরণ:

$ python accordion.py
5H,9C,11H,7S,7D,12D,6H,10S,3H,4D,12C,2S,3C,5C,7H,6S,1H,8S,2H,11S,4C,10D,12H,9H,2D,4H,6C,13H,11C,2C,10H,8C,1S,11D,3S,12S,7C,5D,13S,8D,4S,6D,13C,3D,8H,13D,1D,9D,9S,1C,5S,10C
7S <- 7D,7D <- 12D,3C <- 5C,12H <- 9H,11C <- 2C,3S <- 12S,13D <- 1D,1D <- 9D,9D <- 9S,2S <- 6S,7H <- 1H,6S <- 8S,1H <- 2H,8S <- 11S,2H <- 9H,10D <- 2D,9H <- 4H,4H <- 4C,5C <- 4C,4D <- 4C,4C <- 12C,10S <- 11S,11H <- 11S,6H <- 3H,12D <- 2D,12C <- 2C,2C <- 6C,6C <- 8C,12S <- 13S,5D <- 6D,6D <- 8D,8D <- 3D,4S <- 9S,13S <- 9S,11D <- 3D,7C <- 1C,1S <- 1C,1C <- 13C,8C <- 13C,13C <- 13H,13H <- 10H,2D <- 3D,3D <- 3H,3H <- 8H,8H <- 10H,11S <- 5S,5H <- 10H,5S <- 9S,10H <- 10C,10C <- 9C,9C <- 9S

functools.lru_cacheনিজের লেখার পরিবর্তে ব্যবহার করুন ।
orlp

@ orlp আমি চাইব, তবে যেহেতু listঅপ্রয়োজনীয় এটি কার্যকর হয় না।
পুর্বকুডারী

তারপরে টিপলস ব্যবহার করুন।
orlp

@ অরলপ ঠিক আছে, তবে এর জন্য কোডে পরিবর্তন প্রয়োজন (যেমন str.splitরিটার্ন list)। আমি দুটি প্রোগ্রাম ক্রিয়ামূলক সমতুল্য হতে পছন্দ করব।
পুর্কাকুডারী

আপনি করতে পারেন h=lambda p:lru_cache(None)(g)(''.join(p))
orlp
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.