একটি 0 ঘন্টা এন0 বোর্ড সমাধান করুন


19

0 ঘন্টা এন 0 হ'ল একটি খুব সহজ এবং উপভোগযোগ্য খেলা, কিছুটা সুডোকু বা মাইনসুইপারের মতো।

খেলার নিয়ম

(আমি খেলায় টিউটোরিয়ালটি ব্যবহার করার পরামর্শ দিচ্ছি যদি আপনি পারেন তবে এটি খুব সহজ এবং দরকারী)

ধাঁধাটি n * nকিছু স্থির টুকরো এবং কিছু খালি কোষ সমন্বিত একটি বোর্ড দিয়ে শুরু হয় এবং সমাধানকারীকে অবশ্যই খালি কোষগুলি টুকরো দিয়ে পূরণ করার এবং স্থির টুকরো দ্বারা আরোপিত সমস্ত প্রতিবন্ধকতাগুলি পূরণ করার জন্য একটি উপায় বের করতে হবে। এখানে সংক্ষিপ্তসার সহ আমরা ব্যবহার করব টুকরো টাইপগুলি:

  • # লাল টুকরা (একটি নীল টুকরো ব্লক দর্শন)
  • O নীল টুকরা
  • . খালি অবস্থান
  • numberসংখ্যাযুক্ত নীল টুকরা ( numberএক অঙ্কের সংখ্যা> 0)

সমস্ত নম্বরযুক্ত টুকরা অবশ্যই সংখ্যার মতো একই পরিমাণে নীল টুকরো দেখতে হবে। উদাহরণ স্বরূপ:

#1O#O
...O.

1টুকরা শুধুমাত্র অন্য একজন নীল টুকরা দেখতে পারেন।

কিভাবে টুকরা একে অপরকে দেখতে

দুটি নীল টুকরা যদি একই সারি বা কলামে থাকে এবং তাদের মধ্যে কোনও লাল টুকরা না থাকে তবে একে অপরকে দেখতে পাবে। উদাহরণ:

( Sএকটি অবস্থান যে Oটুকরা দেখতে পারেন, Xদেখা যাবে না)

   S
   S
X#SOSS
   #
   X

প্রতিটি নীল টুকরা অবশ্যই কমপক্ষে অন্য একটি নীল টুকরা দেখতে পাবে:

#O#

কাজ করবে না, তবে:

#OO

বা:

###

কাজ কর.

ডেমো বোর্ড সমাধান

.1..
..1.
....
22#2

ডান নীচে 2 কেবল নিজের উপরে দেখতে পারে, তাই এগুলি অবশ্যই নীল হবে এবং উপরের ডানটি অবশ্যই লাল হতে হবে।

.1.#
..1O
...O
22#2

যেহেতু 1ভরাট হয়েছে, আমরা এটি লাল টুকরা দিয়ে ঘিরে রাখতে পারি।

.1##
.#1O
..#O
22#2

উপরের 1বামটি এখন কেবল এক দিকে দেখতে পারে, তাই আমরা এটি পূরণ করতে পারি।

O1##
.#1O
..#O
22#2

এখন যারা শেষ 2এস। আমরা তাদের উপর 2 নীল টুকরা রাখতে পারি।

O1##
.#1O
OO#O
22#2

শেষটি ভরে যাবে #

O1##
##1O
OO#O
22#2

ইনপুট

ইনপুটটি একটি বহু-লাইন স্ট্রিং। আকারটি 9x9পিছনে স্থান ছাড়াই হবে । এটিতে নিম্নলিখিত পিসের ধরণ রয়েছে:

  • . খালি
  • # প্রিসেট লাল, পরিবর্তন করা যায় না
  • number প্রিসেট নম্বর, পরিবর্তন করা যায় না

(দ্রষ্টব্য যে নীল কখনই ইনপুটটিতে আসবে না)

আউটপুট

আউটপুট হ'ল ইনপুট হিসাবে একই, খালি ( .) বোর্ডটি সমাধানের জন্য একটি লাল বা নীল দ্বারা প্রতিস্থাপন করা হয়, এবং নীল রঙের টুকরা ( O) দিয়ে সংখ্যাগুলি প্রতিস্থাপন করা হয় ।

উদাহরণ

(নোট করুন যে প্রতিটি ধাঁধার জন্য একাধিক সমাধান সম্ভব হতে পারে তবে আপনাকে কেবল সেগুলির মধ্যে একটি দেখাতে হবে)

Input:
........4
...3.1...
45...2.3.
..9......
1..6#44..
....4..5.
....4.36.
2.......6
1....4...

Output:
OOO###OOO
OOOO#O#OO
OOO#OO#OO
#OOOO#O##
O#OO#OOOO
O#OOOO#OO
#OOOO#OOO
OO#O#OOOO
O#OOOO#O#

Input:
..7..#...
#...8..11
2....5...
..5...48.
...#...4.
.5...6...
...1.2...
2.....6.8
.7..#....

Output:
OOOOO####
##OOOO#OO
O#OOOO###
OOO#OOOOO
OO##O##O#
#O##OOOOO
#O#O#O#OO
OO#OOOOOO
OOO###O#O

Input:
5.3..33..
...4...23
.6.6.34..
...3#....
....5..4.
.5....3..
7.98.6#.3
.5.6..2..
..6...2..

Output:
OOOOO####
##OOOO#OO
O#OOOO###
OOO#OOOOO
OO##O##O#
#O##OOOOO
#O#O#O#OO
OO#OOOOOO
OOO###O#O

স্যান্ডবক্সে তাদের সমস্ত সহায়তার জন্য @ পিটারটেলর এবং @ অ্যাপসিলারদের ধন্যবাদ !


আমি শিরোনামটিতে খুব সামান্য সম্পাদনা করেছি কারণ নিম্নলিখিত শব্দটি একটি স্বর দিয়ে শুরু হলে "একটি" ভাল শোনাচ্ছে - আমি অ-স্থানীয় ইংরেজী স্পিকার বা এমনকি নেটিভ স্পিকারদের বিরক্ত করার আশা করি না, তবে এটি ব্যাকরণগত।
বিড়াল

উত্তর:


2

হাস্কেল, 224 বাইট

সম্পূর্ণরূপে পরীক্ষিত নয়, কারণ এটি এত ধীরে (কমপক্ষে O(n*2^n^2))।

t=1<2
x!p|p<0=0|t=mod(div x$2^p)2
l#x=[[sum$map(p&)[-1,1,l+1,-l-1]|p<-[q..q+l]]|q<-[0,l..l*l],let i&v|x!i<1=0|t=x!(i+v)+(i+v)&v]
b%v|b<1=t|t=b==v
s b|l<-length b-1=[l#x|x<-[0..2^l^2],and.map and$zipWith(zipWith(%))b(l#x)]!!0

ব্যাখ্যা:

বেসিক ধারণাটি Red, Blueতালিকাগুলির তালিকাগুলির তালিকা হিসাবে টুকরোগুলির একটি বোর্ডকে প্রতিনিধিত্ব করা হয় 0, 1, যেখানে তালিকার তালিকাটি সহজ গণনার জন্য একক পূর্ণসংখ্যায় প্যাক করা হয়। বোর্ড আকারের জন্য এই জাতীয় সমস্ত পূর্ণসংখ্যার প্রতিবেশী গণনা সহ একটি ফর্মটিতে উত্পন্ন এবং রূপান্তরিত হয়। ইনপুটটির বৈধ সমাধান এমন প্রথম বোর্ডটি ফিরে আসে।

-- integer x at position p with out of bounds defined to be 0 (so no bounds checking)
(!) :: (Integral b, Integral r) => r -> b -> r
x ! p | p < 0     = 0 
      | otherwise = mod (div x (2^p)) 2


-- Sum of values from position p along vector v (x is implicit)
-- Note that a cartesian vector (x,y) in this representation is (l*x + y)
(&) :: (Integral a, Integral b) => b -> b -> a
p & v | x ! p == 0 = 0
      | otherwise  = x ! (p+v)  +  (p+v) & v


-- Value of board at position p (implicit x, l)
value :: Integral a => a -> a
value p = sum $ map (p&) [-1, 1, l+1, -l-1]


-- Integer to board, where l is length, x is input integer
(#) :: (Integral t, Integral a) => a -> t -> [[t]]
l # x = [[sum $ map (p&) [-1,1,l+1,-l-1] | p <- [q..q+l-1]] | q <- [0,l..l*l]]


-- Comparison operator, to see whether a solved board is a solution of the input
(%) :: (Num a, Ord a) => a -> a -> Bool
b % v | b == 0    = True
      | otherwise = b == v


-- Check one possible solution
check :: Integral a => [[a]] -> Int -> [[a]] -> Bool
check b l x = (and . (map and)) zipWith(zipWith (%)) b (l # x)

-- Solver
solve :: Integral t => [[t]] -> [[t]]
solve b = [l # x | x <- [0..2^l^2], check b l x]
  where
    l = length b

অংশ সম্ভবত সবচেয়ে golfed যেতে পারে যে: and.map and$zipWith(zipWith(%))। অন্যথায়, আমি কয়েকটি বাই-ওয়ান ত্রুটি ধরলাম যা দৈর্ঘ্য যুক্ত করেছিল এবং সম্ভবত আরও গল্ফ করা যেতে পারে।

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