সুডোকু সংকোচনে


35

আপনার কাজটি হ'ল যে কোনও ভাষায় একটি প্রোগ্রাম (বা দুটি পৃথক প্রোগ্রাম) লিখুন যা:

  1. ইনপুট হিসাবে কোনও সুডোকু বোর্ড নিতে পারে (যে কোনও যৌক্তিক ফর্ম্যাটে) এবং এটি অক্ষরের স্ট্রিংয়ে সংকুচিত করতে পারে
  2. সংক্ষিপ্ত স্ট্রিংটিকে ইনপুট হিসাবে নিতে পারে এবং ঠিক একই সমাপ্ত সুডোকু বোর্ড পেতে (9 সারির কোনও লজিক্যাল বিন্যাসে আউটপুট) পেতে এটি সংক্ষেপিত করতে পারে

দ্রষ্টব্য: আপনার সুবিধার জন্য সুডোকুর বিধিগুলি ব্যবহার করুন; এই এই চ্যালেঞ্জ পিছনে ধারণা।
সুডোকু উইকিপিডিয়ায় নিয়ম করে

বিধি

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

আপনার যদি কোনও প্রশ্ন বা উদ্বেগ থাকে তবে আপনি স্পষ্টতা চাইতে বা মন্তব্যগুলিতে পরামর্শ দিতে পারেন।

শর্ত জয়ের

স্কোর = সমস্ত দশটি পরীক্ষার ক্ষেত্রে অক্ষরের সংখ্যার যোগফল

সর্বনিম্ন স্কোর জয়।

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

আপনার প্রোগ্রামটি কতটা ভাল কাজ করে তা পরীক্ষা করতে আপনি এটি ব্যবহার করতে পারেন।

9 7 3 5 8 1 4 2 6
5 2 6 4 7 3 1 9 8
1 8 4 2 9 6 7 5 3
2 4 7 8 6 5 3 1 9
3 9 8 1 2 4 6 7 5
6 5 1 7 3 9 8 4 2
8 1 9 3 4 2 5 6 7
7 6 5 9 1 8 2 3 4
4 3 2 6 5 7 9 8 1

7 2 4 8 6 5 1 9 3
1 6 9 2 4 3 8 7 5
3 8 5 1 9 7 2 4 6
8 9 6 7 2 4 3 5 1
2 7 3 9 5 1 6 8 4
4 5 1 3 8 6 9 2 7
5 4 2 6 3 9 7 1 8
6 1 8 5 7 2 4 3 9
9 3 7 4 1 8 5 6 2

1 5 7 6 8 2 3 4 9
4 3 2 5 1 9 6 8 7
6 9 8 3 4 7 2 5 1
8 2 5 4 7 6 1 9 3
7 1 3 9 2 8 4 6 5
9 6 4 1 3 5 7 2 8
5 4 1 2 9 3 8 7 6
2 8 9 7 6 1 5 3 4
3 7 6 8 5 4 9 1 2

8 3 5 4 1 6 9 2 7
2 9 6 8 5 7 4 3 1
4 1 7 2 9 3 6 5 8
5 6 9 1 3 4 7 8 2
1 2 3 6 7 8 5 4 9
7 4 8 5 2 9 1 6 3
6 5 2 7 8 1 3 9 4
9 8 1 3 4 5 2 7 6
3 7 4 9 6 2 8 1 5

6 2 8 4 5 1 7 9 3
5 9 4 7 3 2 6 8 1
7 1 3 6 8 9 5 4 2
2 4 7 3 1 5 8 6 9
9 6 1 8 2 7 3 5 4
3 8 5 9 6 4 2 1 7
1 5 6 2 4 3 9 7 8
4 3 9 5 7 8 1 2 6
8 7 2 1 9 6 4 3 5

1 2 3 4 5 6 7 8 9
4 5 6 7 8 9 1 2 3
7 8 9 1 2 3 4 5 6
2 1 4 3 6 5 8 9 7
3 6 5 8 9 7 2 1 4
8 9 7 2 1 4 3 6 5
5 3 1 6 4 8 9 7 2
6 4 8 9 7 2 5 3 1
9 7 2 5 3 1 6 4 8

1 4 5 7 9 2 8 3 6
3 7 6 5 8 4 1 9 2
2 9 8 3 6 1 7 5 4
7 3 1 9 2 8 6 4 5
8 5 9 6 4 7 3 2 1
4 6 2 1 3 5 9 8 7
6 2 4 8 7 3 5 1 9
5 8 7 4 1 9 2 6 3
9 1 3 2 5 6 4 7 8

5 2 7 4 1 6 9 3 8
8 6 4 3 2 9 1 5 7
1 3 9 5 7 8 6 4 2
2 9 1 8 5 4 3 7 6
3 4 8 6 9 7 5 2 1
6 7 5 1 3 2 4 8 9
7 1 2 9 4 5 8 6 3
4 8 3 2 6 1 7 9 5
9 5 6 7 8 3 2 1 4

2 4 6 7 1 3 9 8 5
1 8 5 4 9 6 7 3 2
9 3 7 8 2 5 1 4 6
6 7 8 5 4 2 3 9 1
4 9 3 1 6 8 2 5 7
5 1 2 3 7 9 4 6 8
8 2 4 9 5 7 6 1 3
7 5 9 6 3 1 8 2 4
3 6 1 2 8 4 5 7 9

8 6 1 2 9 4 5 7 3
4 7 5 3 1 8 6 9 2
3 9 2 5 6 7 8 1 4
2 3 6 4 5 9 7 8 1
1 5 4 7 8 3 2 6 9
9 8 7 6 2 1 3 4 5
5 2 9 1 7 6 4 3 8
6 4 8 9 3 2 1 5 7
7 1 3 8 4 5 9 2 6

এর কয়েকটি জন্য ক্রেডিট http://www.opensky.ca/~jdhildeb/software/sudokugen/

আপনি যদি পরীক্ষার মামলাগুলির সাথে কোনও সমস্যা পান তবে আমাকে বলুন tell


5
এছাড়াও, প্রতিটি বোর্ডের কনফিগারেশনকে গণনা করে এমন একটি সমাধান প্রতিরোধের জন্য একটি সময়সীমা থাকা উচিত, যা এটি 6670903752021072936960 সম্ভাব্য সমাধান করা সুডোকু গ্রিডগুলির মধ্যে একটি কিনা কিনা তা পরীক্ষা করে ।
শুক্রবার

3
আপনি স্কোরিং পরিবর্তন করতে চাইতে পারেন। যেহেতু এটি দাঁড়িয়েছে তাই আমাকে পরীক্ষার কেসগুলিকে 1-চর কোডগুলিতে হার্ডকোডিং করা থেকে বিরত রাখার কিছুই নেই এবং কেবলমাত্র সমস্ত কিছুর জন্য 81-চর কোডগুলি ব্যবহার করুন
টোয়নাট

4
@ ট্যুইনাইট এটিকে আলাদা করে একটি মান ফাঁক, আপনার মানে?
জন ডিভোরাক

4
নীচে আমার উত্তর থাকা সত্ত্বেও, আমি মনে করি এটি সমাধানের সর্বোত্তম উপায় হ'ল সুডোকু সমাধানকারী লিখুন, তারপরে গ্রিড থেকে সর্বাধিক সংখ্যাটি সরিয়ে ফেলুন ধাঁধাটি এখনও দ্রবণীয় (এটি চার বা পাঁচটি সংখ্যা বাদে সমস্ত হওয়া উচিত)। তারপরে যে সংকোচনের। ডিকম্প্রেসারেও সলভার থাকে।
এবলিগ

4
@ ক্যাস্পার্ড লাইনটি আঁকানো সত্যিই কঠিন ( fudgeআমার দ্বিতীয় উত্তরে সাবরোটাইন দেখুন যা 12 পয়েন্ট লাভ করেছে)। একটি নিখুঁত পরীক্ষার প্রয়োজন হবে যে (ক) পরীক্ষার সমাধানের কাজগুলি, (খ) এলোমেলোভাবে উত্পাদিত সুডোকু গ্রিডগুলিতে ১,০০০ এর স্কোর করা এবং উত্তরটি ১০০ দ্বারা ভাগ করে নেওয়া। আমি বিশ্বাস করি যে এলোমেলো ডেটা দিয়ে সেরাটি করতে পারে ১০০ এর ভিত্তিতে এক্স লগ-বেস -95 (6670903752021072936960)
সংক্ষেপণ

উত্তর:


26

হাস্কেল, 107 পয়েন্ট

import Control.Monad
import Data.List

type Elem = Char
type Board = [[Elem]]
type Constraints = ([Elem],[Elem],[Elem])

digits :: [Elem]
digits = "123456789"
noCons :: Constraints
noCons = ([],[],[])
disjointCons :: Constraints
disjointCons = ("123","456","789") -- constraints from a single block - up to isomorphism
triples :: [a] -> [[a]]
triples [a,b,c,d,e,f,g,h,i] = [[a,b,c],[d,e,f],[g,h,i]]
(+++) :: Constraints -> Constraints -> Constraints
(a,b,c) +++ (d,e,f) = (a++d,b++e,c++f)

maxB = 12096 
-- length $ assignments noCons disjointCons
maxC = 216 -- worst case: rows can be assigned independently
maxD = maxB
maxE = 448
-- foldl1' max [length $ assignments disjointCons colCons
--             | (_, colCons) <- map constraints $ assignments ([],[1],[1]) ([],[1],[1]),
--               let ([a,d,g],[b,e,h],[c,f,i]) = colCons,
--               a < d, d < g, b < e, e < h, c < f, f < i]
maxF = 2 ^ 3 -- for each row the relevant column constraints can be in the same column (no assignment), 
             -- or in two or three columns (two assignments)
maxG = maxC
maxH = maxF

-- constraints -> list of block solutions
assignments :: Constraints -> Constraints -> [[Elem]]
assignments (r1,r2,r3) (c1,c2,c3) = do
    a <- digits  \\ (r1 ++ c1); let digits1 = digits  \\ [a]
    b <- digits1 \\ (r1 ++ c2); let digits2 = digits1 \\ [b]
    c <- digits2 \\ (r1 ++ c3); let digits3 = digits2 \\ [c]
    d <- digits3 \\ (r2 ++ c1); let digits4 = digits3 \\ [d]
    e <- digits4 \\ (r2 ++ c2); let digits5 = digits4 \\ [e]
    f <- digits5 \\ (r2 ++ c3); let digits6 = digits5 \\ [f]
    g <- digits6 \\ (r3 ++ c1); let digits7 = digits6 \\ [g]
    h <- digits7 \\ (r3 ++ c2); let digits8 = digits7 \\ [h]
    i <- digits8 \\ (r3 ++ c3)
    return [a,b,c,d,e,f,g,h,i]

-- block solution -> tuple of constraints
constraints :: [Elem] -> (Constraints, Constraints)
constraints [a,b,c,d,e,f,g,h,i] = (([a,b,c],[d,e,f],[g,h,i]),([a,d,g],[b,e,h],[c,f,i]))

------------------------------------------------------------------------------------------

-- solution -> Integer
solution2ix :: Board -> Integer
solution2ix [a,b,c,d,e,f,g,h,i] =
    let (ar, ac) = constraints a
        (br, bc) = constraints b
        (_ , cc) = constraints c
        (dr, dc) = constraints d
        (er, ec) = constraints e
        (_ , fc) = constraints f
        (gr, _ ) = constraints g
        (hr, _ ) = constraints h
        (_ , _ ) = constraints i

        Just ixA = findIndex (a ==) $ assignments noCons      noCons
        Just ixB = findIndex (b ==) $ assignments ar          noCons
        Just ixC = findIndex (c ==) $ assignments (ar +++ br) noCons
        Just ixD = findIndex (d ==) $ assignments noCons      ac
        Just ixE = findIndex (e ==) $ assignments dr          bc
        Just ixF = findIndex (f ==) $ assignments (dr +++ er) cc
        Just ixG = findIndex (g ==) $ assignments noCons      (ac +++ dc)
        Just ixH = findIndex (h ==) $ assignments gr          (bc +++ ec)
        Just ixI = findIndex (i ==) $ assignments (gr +++ hr) (cc +++ fc)

    in foldr (\(i,m) acc -> fromIntegral i + m * acc) (fromIntegral ixA)
     $ zip [ixH, ixG, ixF, ixE, ixD, ixC, ixB] [maxH, maxG, maxF, maxE, maxD, maxC, maxB]

--    list of rows 
-- -> list of threes of triples
-- -> three triples of threes of triples 
-- -> three threes of triples of triples
-- -> nine triples of triples
-- -> nine blocks
toBoard :: [[Elem]] -> Board
toBoard = map concat . concat . map transpose . triples . map triples

toBase95 :: Integer -> String
toBase95 0 = ""
toBase95 ix = toEnum (32 + fromInteger (ix `mod` 95)) : toBase95 (ix `div` 95)

------------------------------------------------------------------------------------------

ix2solution :: Integer -> Board
ix2solution ix =
    let (ixH', ixH) = ix   `divMod` maxH
        (ixG', ixG) = ixH' `divMod` maxG
        (ixF', ixF) = ixG' `divMod` maxF
        (ixE', ixE) = ixF' `divMod` maxE
        (ixD', ixD) = ixE' `divMod` maxD
        (ixC', ixC) = ixD' `divMod` maxC
        (ixA , ixB) = ixC' `divMod` maxB

        a = assignments noCons      noCons      !! fromIntegral ixA
        (ra, ca) = constraints a
        b = assignments ra          noCons      !! fromIntegral ixB
        (rb, cb) = constraints b
        c = assignments (ra +++ rb) noCons      !! fromIntegral ixC
        (_ , cc) = constraints c
        d = assignments noCons      ca          !! fromIntegral ixD
        (rd, cd) = constraints d
        e = assignments rd          cb          !! fromIntegral ixE
        (re, ce) = constraints e
        f = assignments (rd +++ re) cc          !! fromIntegral ixF
        (_ , cf) = constraints f
        g = assignments noCons      (ca +++ cd) !! fromIntegral ixG
        (rg, _ ) = constraints g
        h = assignments rg          (cb +++ ce) !! fromIntegral ixH
        (rh, _ ) = constraints h
        [i] = assignments (rg +++ rh) (cc +++ cf)
    in  [a,b,c,d,e,f,g,h,i]

--    nine blocks
-- -> nine triples of triples
-- -> three threes of triples of triples
-- -> three triples of threes of triples
-- -> list of threes of triples
-- -> list of rows
fromBoard :: Board -> [[Elem]]
fromBoard = map concat . concat . map transpose . triples . map triples

fromBase95 :: String -> Integer
fromBase95 ""     = 0
fromBase95 (x:xs) = (toInteger $ fromEnum x) - 32 + 95 * fromBase95 xs

------------------------------------------------------------------------------------------

main = do line <- getLine
          if length line <= 12
             then putStrLn $ unlines $ map (intersperse ' ') $ fromBoard $ ix2solution $ fromBase95 line
             else do nextLines <- replicateM 8 getLine
                     putStrLn $ toBase95 $ solution2ix $ toBoard $ map (map head.words) $ line:nextLines

পরীক্ষার ক্ষেত্রে ফলাফল:

q`3T/v50 =3,
^0NK(F4(V6T(
d KTTB{pJc[
B]^v[omnBF-*
WZslDPbcOm7'
)
ukVl2x/[+6F
qzw>GjmPxzo%
KE:*GH@H>(m!
SeM=kA`'3(X*

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

ভারী উত্তোলনটি solution2ixফাংশন দ্বারা সম্পন্ন হয় , যা প্রতিটি 3x3 ব্লকের জন্য, এটি সমস্ত সম্ভাব্য ক্রম উত্পন্ন করে, বাম দিক থেকে এবং উপরে থেকে সীমাবদ্ধতার সাপেক্ষে, যতক্ষণ না এটি এনকোডযুক্ত সমাধানের মধ্যে এটি সন্ধান করে, কেবলমাত্র অনুমানের সূচকটি মনে রাখে। তারপরে এটি কিছু পূর্বনির্ধারিত ওজন এবং হর্নারের স্কিম ব্যবহার করে সূচকগুলি একত্রিত করে।

অন্য দিকে, ix2solutionফাংশনটি প্রথমে সূচকটিকে নয়টি মানের মধ্যে বিভক্ত করে। তারপরে প্রতিটি ব্লকের জন্য এটি তার নিজস্ব মান সহ সম্ভাব্য ক্রমগুলির তালিকাটি সূচক করে, তারপরে পরবর্তী ব্লকগুলির সীমাবদ্ধতাগুলি বের করে।

assignmentsতালিকা মোনাড ব্যবহার করে একটি সরল কিন্তু কুরুচিযুক্ত নিয়ন্ত্রণহীন পুনরাবৃত্তি। এটি সীমাবদ্ধতার একটি সেট দেওয়া অনুমতিগুলির তালিকা তৈরি করে।

প্রকৃত শক্তি ক্রমশক্তি তালিকার দৈর্ঘ্যের আঁটসীমা থেকে আসে:

  • উপরের বাম কোণটি নিয়ন্ত্রণহীন। আদেশের সংখ্যা সহজভাবে 9!। এই মানটি আউটপুট দৈর্ঘ্যের জন্য উপরের বাউন্ড ছাড়া কখনও ব্যবহৃত হয় না।
  • উপরে বাম থেকে - এর পাশের ব্লকগুলিতে কেবলমাত্র একটি সেট বাধা রয়েছে। একটি নিষ্পাপ উপরের গণ্ডী 6*5*4*6!গণনার দ্বারা প্রাপ্ত প্রকৃত গণনার চেয়ে সাত গুণ খারাপ:12096
  • উপরের ডান দিকের কোণটি বাম থেকে দুবার সীমাবদ্ধ। প্রতিটি সারিতে কেবল ছয়টি অনুমতি দেওয়া যেতে পারে এবং সবচেয়ে খারাপ ক্ষেত্রে (প্রকৃতপক্ষে প্রতিটি বৈধ ক্ষেত্রে) অ্যাসাইনমেন্টটি স্বাধীন। একইভাবে নীচের বাম কোণে।
  • কেন্দ্রের অংশটি অনুমান করা সবচেয়ে কঠিন। আবার ব্রুট ফোর্স জয়লাভ করে - আইসোমরফিজম পর্যন্ত প্রতিটি সম্ভাব্য সীমাবদ্ধতার জন্য ক্রমশক্তি গণনা করুন। কিছুক্ষণ সময় নেয়, তবে এটি কেবল একবার প্রয়োজন।
  • ডান কেন্দ্রের অংশটিতে বাম দিক থেকে দ্বৈত বাধা রয়েছে, যা প্রতিটি সারিকে একটি ক্রমান্বয়ে আনতে বাধ্য করে, তবে উপরের দিক থেকেও একটি একক প্রতিবন্ধকতা, যা নিশ্চিত করে যে সারি প্রতি মাত্র দুটি ক্রমচঞ্চল সম্ভব সম্ভব are নীচে কেন্দ্র টুকরা জন্য একইভাবে।
  • নীচের ডান কোণটি তার প্রতিবেশীদের দ্বারা সম্পূর্ণরূপে নির্ধারিত হয়। সূচকটি গণনা করার সময় একমাত্র ক্রমানুসারে বাস্তবে কখনই যাচাই করা হয় না। জোর করে মূল্যায়ন করা সহজ হবে, এটি কেবল প্রয়োজনীয় নয়।

এই সমস্ত সীমাবদ্ধতার গুণফল 71025136897117189570560~ = 95^11.5544, যার অর্থ কোনও কোড 12 টি অক্ষরের বেশি নয় এবং এর প্রায় অর্ধেকটি 11 টি অক্ষর বা তার চেয়ে কম হওয়া উচিত। আমি সংক্ষিপ্ত স্ট্রিং এবং স্পেস সহ ডান প্যাডযুক্ত একই স্ট্রিংয়ের মধ্যে পার্থক্য না করার সিদ্ধান্ত নিয়েছি। অন্য কোথাও স্থানগুলি উল্লেখযোগ্য।

উপসর্গ-মুক্ত কোডগুলির জন্য এনকোডিং দক্ষতার তাত্ত্বিক সীমা - বেস -৯৯ লোগারিদম অফ 6670903752021072936960- এর 11.035অর্থ, একটি সর্বোত্তম অ্যালগরিদম দৈর্ঘ্য -১২ আউটপুট উত্পাদন এড়াতে পারে না, যদিও এটি তাদের সকল ক্ষেত্রে মাত্র ৩.৩% উত্পাদন করে। দৈর্ঘ্যটি তাৎপর্যপূর্ণ হতে দেয় (বা সমপরিমাণ, পূর্ববর্তী স্থানগুলি যোগ করা) কয়েকটি কোড যুক্ত করে (মোট পরিমাণের 1%), তবে দৈর্ঘ্য -12 কোডের প্রয়োজনীয়তা অপসারণ করার জন্য যথেষ্ট নয়।


আপনি কি মনে করেন যে সারিগুলির চেয়ে ব্লকগুলি দিয়ে কাজ করা আরও দক্ষ?
xnor

@ এক্সনর সেইভাবে বাধাগুলি যাচাই করা অবশ্যই সহজ
জন ডিভোরাক

... এবং সেই অনুক্রমের গণনা আবদ্ধ করা, যা এখানে আরও বেশি গুরুত্বপূর্ণ
জন ডিভোরাক

@ এক্সনোর, ব্লকগুলি যত বড় হবে, অনুকূলতার জন্য তত ভাল। এক সাথে শীর্ষস্থানীয় তিনটি ব্লকের সাথে লেনদেন করা, তারপরে এক সাথে পরবর্তী তিনটি ব্লক এবং শেষ পর্যন্ত নীচের অংশগুলি সম্ভবত স্কোরটি উন্নতির লজিকাল পরবর্তী পদক্ষেপ।
পিটার টেলর

@ পিটারটেলর 9! ^ 3 = 4.8e16। এটি সামান্য খুব বেশি, তবে প্রথম সারিকে সংখ্যাসূচকভাবে পরিচালনা করছেন, তারপরে পরবর্তী দুটি, পরবর্তী তিনটি এবং শেষ পর্যন্ত শেষেরটি সম্ভবত ব্যবহারযোগ্য হতে পারে en আমি এটি চেষ্টা করতে পারে।
জন ডিভোরাক

10

পাইথন, ১৩০ পয়েন্ট

j1:4}*KYm6?D
h^('gni9X`g'#
$2{]8=6^l=fF!
BS ;1;J:z"^a"
\/)gT)sixb"A+
WI?TFvj%:&3-\$
*iecz`L2|a`X0
eLbt<tf|mFN'&
;KH_TzK$erFa!
7T=1*6$]*"s"!

অ্যালগরিদম বোর্ডের প্রতিটি পজিশনকে একবারে একবারে একটি বড় পূর্ণসংখ্যায় এনকোড করে কাজ করে। প্রতিটি পজিশনের জন্য, এটি এ পর্যন্ত এনকোড করা সমস্ত কার্যবিধি দেওয়া সম্ভাব্য মান গণনা করে। সুতরাং যদি [1,3,7,9] কোনও প্রদত্ত অবস্থানের সম্ভাব্য মান হয় তবে পছন্দটি এনকোড করতে 2 বিট লাগে।

এই স্কিমটি সম্পর্কে দুর্দান্ত বিষয়টি হ'ল যদি কোনও পজিশনে কেবলমাত্র একটিমাত্র বাকী পছন্দ থাকে তবে এটি এনকোড করতে কোনও স্থান নেয় না।

একবার আমাদের বড় পূর্ণসংখ্যার পরে আমরা এটি বেস 95 তে লিখি।

অভিধানের চেয়ে সম্ভবত আরও ভাল এনকোডিং ক্রম রয়েছে, তবে আমি এটি সম্পর্কে খুব বেশি চিন্তা করিনি।

এনকোডার:

import sys

sets = [range(i*9, i*9+9) for i in xrange(9)]
sets += [range(i, 81, 9) for i in xrange(9)]
sets += [[i/3*27+i%3*3+j/3*9+j%3 for j in xrange(9)] for i in xrange(9)]

M = []
for line in sys.stdin.readlines():
    M += [int(x) for x in line.split()]

A = 0
m = 1
for i in xrange(81):
    allowed = set(xrange(1,10))
    for s in sets:
        if i in s:
            for j in s:
                if j < i: allowed.discard(M[j])
    allowed = sorted(allowed)
    A += m * allowed.index(M[i])
    m *= len(allowed)

s=''
while A != 0:
    s+='%c'%(32+A%95)
    A /= 95
print s

সঙ্কেতমোচক:

sets = [range(i*9, i*9+9) for i in xrange(9)]
sets += [range(i, 81, 9) for i in xrange(9)]
sets += [[i/3*27+i%3*3+j/3*9+j%3 for j in xrange(9)] for i in xrange(9)]

s=raw_input()
A=0
m=1
while s != '':
    A += m * (ord(s[0])-32)
    s = s[1:]
    m *= 95

M=[]
for i in xrange(81):
    allowed = set(xrange(1,10))
    for s in sets:
        if i in s:
            for j in s:
                if j < i: allowed.discard(M[j])
    allowed = sorted(allowed)
    M += [allowed[A%len(allowed)]]
    A /= len(allowed)

for i in xrange(9):
    print ' '.join(str(x) for x in M[i*9:i*9+9])

এটি এইভাবে চালান:

> cat sudoku1 | ./sudokuEnc.py | ./sudokuDec.py
9 7 3 5 8 1 4 2 6
5 2 6 4 7 3 1 9 8
1 8 4 2 9 6 7 5 3
2 4 7 8 6 5 3 1 9
3 9 8 1 2 4 6 7 5
6 5 1 7 3 9 8 4 2
8 1 9 3 4 2 5 6 7
7 6 5 9 1 8 2 3 4
4 3 2 6 5 7 9 8 1

পরীক্ষার কেস আউটপুট কি? উৎসুক. কোডটি আমার সাথে কীভাবে তুলনা করা যায় তার চেয়ে কম স্কোরটি চিত্তাকর্ষক।
জন ডিভোরাক

@ জনডভোরাক: আমি এনকোডযুক্ত বোর্ডগুলি যুক্ত করেছি।
কিথ র্যান্ডাল

7

পার্ল - স্কোর 115 113 103 113

আউটপুট:

"#1!A_mb_jB)
FEIV1JH~vn"
$\\XRU*LXea.
EBIC5fPxklB
5>jM7(+0MrM
!'Wu9FS2d~!W
":`R60C"}z!k
:B&Jg[fL%\j
"L28Y?3`Q>4w
o0xPz8)_i%-

আউটপুট:

                  # note this line is empty
S}_h|bt:za        
%.j0.6w>?RM+
:H$>a>Cy{7C
'57UHjcWQmcw
owmK0NF?!Fv
# }aYExcZlpD
nGl^K]xH(.\
9ii]I$voC,x
!:MR0>I>PuTU

এই লাইনের কোনওটিরই শেষের স্থান নেই। লক্ষ্য করুন যে প্রথম লাইনটি খালি রয়েছে।

এই অ্যালগরিদম নিম্নলিখিত হিসাবে কাজ করে। সংকোচনের জন্য:

  1. সুডোকু গ্রিড উপস্থাপন করে একটি খালি 'বর্তমান' স্ট্রিং দিয়ে শুরু করুন

  2. সেই স্ট্রিংটিতে প্রতিটি অঙ্ক 1 .. 9 এর পরিবর্তে যোগ করার কথা বিবেচনা করুন এবং কোনটি কার্যকর হবে তা নির্ধারণ করুন।

  3. উত্তর গ্রিড থেকে পরবর্তী অঙ্কটি পান (এবং এটি বর্তমানতে যুক্ত করুন)

  4. যদি শুধুমাত্র একটি কার্যকর হয়, কোড করার কিছুই নেই

  5. যদি একের অধিক কার্যকর হয়, কার্যকরযোগ্য বিকল্পগুলির সংখ্যা গণনা করুন, তাদের বাছাই করুন, এবং অঙ্কটিকে সাজানো অ্যারেতে সূচক হিসাবে সেই সংখ্যাটি কোড করুন। একটি অ্যারেতে 2-টিপল হিসাবে অঙ্ক এবং কার্যকর সংখ্যাটি রেকর্ড করুন।

  6. সব হয়ে গেলে, বিগিন্ট হিসাবে সঞ্চিত ভেরিয়েবল ভিত্তিক সংখ্যায় প্রতিটি 2-টি-টিপলকে (বিপরীত ক্রমে) কোড করুন।

  7. 95 বেসে বিগিন্ট প্রকাশ করুন।

ডিকোড করতে:

  1. সুডোকু গ্রিড উপস্থাপন করে একটি খালি 'বর্তমান' স্ট্রিং দিয়ে শুরু করুন

  2. বেস 95 নম্বরটি একটি বড়গুজে ডিকোড করুন

  3. সেই স্ট্রিংটিতে প্রতিটি অঙ্ক 1 .. 9 এর পরিবর্তে যোগ করার কথা বিবেচনা করুন এবং কোনটি কার্যকর হবে তা নির্ধারণ করুন।

  4. যদি শুধুমাত্র একটি কার্যকর হয়, কোড করার কিছুই নেই; গ্রিডে সেই পছন্দটি যুক্ত করুন

  5. যদি একের অধিক কার্যকর হয়, কার্যকরযোগ্য বিকল্পগুলির সংখ্যা গণনা করুন, তাদের বাছাই করুন, এবং অঙ্কটিকে সাজানো অ্যারেতে সূচক হিসাবে সেই সংখ্যাটি কোড করুন।

  6. বেস হিসাবে চলিত বিকল্পগুলির সংখ্যা এবং অ্যারেতে সূচক হিসাবে মডিউলাস ব্যবহার করে ভেরিয়েবল-বেস বিগিন্ট ডিকোড করুন এবং সেল মান হিসাবে সেই অঙ্কটি আউটপুট করুন।

ব্যবহারযোগ্য বিকল্পগুলির সংখ্যা নির্ধারণের জন্য, গেমস :: সুডোকু :: সলভার ব্যবহৃত হয় is এটি মূলত স্পষ্টতার জন্য কারণ এই সাইটে 3 লাইন সুডোকু সলভার রয়েছে।

সমস্ত 10 করতে আমার ল্যাপটপে 8 সেকেন্ড সময় নিয়েছিল।

fudgeঅপারেশন পরীক্ষার বিষয় জন্য ন্যূনতম মান অর্জন করতে ভিন্নভাবে অ্যারের বাছাই করে। ডকুমেন্টেড হিসাবে, এটি একটি ফ্যাজ। ফজ স্কোরটি ১১৪ থেকে কমিয়ে ১০৩ এ কমিয়েছে। প্রথম পরীক্ষার জন্য বিগিন্ট কোডটি 0 হয় তা নিশ্চিত করার জন্য হস্তশিল্প রচনা করা হয়। যে কোনও সুডোকুর জন্য সবচেয়ে খারাপ ক্ষেত্রে স্কোরটি ১২২ এর স্কোর দেয়। আমি এইভাবে গণনা করি বলে মনে করি না হার্ড কোডিং হিসাবে; বরং এটি পরীক্ষার তথ্যের জন্য অনুকূলিত হয়। এটা এই ছাড়া কাজ, পরিবর্তন দেখার জন্য sort fudgeবা sortদুটি জায়গাতেই।

কোড অনুসরণ:

#!/usr/bin/perl

use strict;
use warnings;
use Getopt::Long;
use bigint;
use Games::Sudoku::Solver qw (:Minimal set_solution_max count_occupied_cells);

# NOTE THIS IS NOT USED BY DEFAULT - see below and discussion in comments
my @fudgefactor = qw (9 7 3 5 8 1 4 2 6 5 2 6 4 7 3 1 9 8 1 8 4 2 9 6 7 5 3 2 4 7 8 6 5 3 1 9 3 9 8 1 2 4 6 7 5 6 5 1 7 3 9 8 4 2 8 1 9 3 4 2 5 6 7 7 6 5 9 1 8 2 3 4 4 3 2 6 5 7 9 8 1);
my $fudgeindex=0;
my $fudging=0; # Change to 1 to decrease score by 10

sub isviable
{
    no bigint;
    my $current = shift @_;
    my @test = map {$_ + 0} split(//, substr(($current).("0"x81), 0, 81));
    my @sudoku;
    my @solution;
    set_solution_max (2);
    my $nsolutions;

    eval
    {
        sudoku_set(\@sudoku, \@test);
        $nsolutions = sudoku_solve(\@sudoku, \@solution);
    };
    return 0 unless $nsolutions;
    return ($nsolutions >=1);
}

sub getnextviable
{
    my $current = shift @_; # grid we have so far
    my %viable;

    for (my $i = 1; $i<=9; $i++)
    {
        my $n;
        my $solution;
        $viable{$i} = 1 if (isviable($current.$i));
    }
    return %viable;
}

sub fudge
{
    return $a<=>$b unless ($fudging);
    my $k=$fudgefactor[$fudgeindex];
    my $aa = ($a+10-$k) % 10;
    my $bb = ($b+10-$k) % 10;
    return $aa<=>$bb;
}


sub compress
{
    my @data;
    while (<>)
    {
        chomp;
        foreach my $d (split(/\s+/))
        {
            push @data, $d;
        }
    }

    my $code = 0;
    my $current = "";
    my @codepoints;
    foreach my $d (@data)
    {
        my %viable = getnextviable($current);
        die "Digit $d is unexpectedly not viable - is sudoku impossible?" unless ($viable{$d});

        my $nviable = scalar keys(%viable);
        if ($nviable>1)
        {
            my $n=0;
            foreach my $k (sort fudge keys %viable)
            {
                if ($k==$d)
                {
                    no bigint;
                    my %cp = ( "n"=> $n, "v"=> $nviable);
                    unshift @codepoints, \%cp;
                    last;
                }
                $n++;
            }
        }
        $fudgeindex++;
        $current .= $d;
    }

    foreach my $cp (@codepoints)
    {
        $code = ($code * $cp->{"v"})+$cp->{"n"};
    }

    # print in base 95
    my $out="";
    while ($code)
    {
        my $digit = $code % 95;
        $out = chr($digit+32).$out;
        $code -= $digit;
        $code /= 95;
    }

    print "$out";
}

sub decompress
{
    my $code = 0;

    # Read from base 95 into bigint
    while (<>)
    {
        chomp;
        foreach my $char (split (//, $_))
        {
            my $c =ord($char)-32;
            $code*=95;
            $code+=$c;
        }
    }

    # Reconstruct sudoku
    my $current = "";
    for (my $cell = 0; $cell <81; $cell++)
    {
        my %viable = getnextviable($current);
        my $nviable = scalar keys(%viable);
        die "Cell $cell is unexpectedly not viable - is sudoku impossible?" unless ($nviable);

        my $mod = $code % $nviable;
        $code -= $mod;
        $code /= $nviable;

        my @v = sort fudge keys (%viable);
        my $d = $v[$mod];
        $current .= $d;
        print $d.(($cell %9 != 8)?" ":"\n");
        $fudgeindex++;
    }
}

my $decompress;
GetOptions ("d|decompress" => \$decompress);


if ($decompress)
{
    decompress;
}
else
{
    compress;
}

5
"আমি এইভাবে কঠোর কোডিং হিসাবে গণনা করি না" এটি একটি দুর্দান্ত সাহসী বক্তব্য, পরীক্ষার যে কোনও একটি ক্ষেত্রে বিবেচনা করা আপনার কোড ভারব্যাটিম।
অ্যারন ডুফর

অ্যারোনডুফার আপনি নিম্নলিখিত শব্দগুলি বাদ দিয়েছেন: "তবে এটি পরীক্ষার ডেটার জন্য অনুকূল করে তোলে"। প্রশ্নের অধীনে আলোচনাও দেখুন; মূলত যদি আপনি অনুকূলিত হন, আপনি 120 থেকে 0 থেকে 12 টি প্রতীক ফেলতে পারবেন luck ভাগ্যক্রমে অরক্ষিত সমাধান 115 দেয়; একটি এলোমেলো স্থির মডুলাস অফসেটটি এটি 113 এ নিয়ে যায় the আপনি যেভাবে চ্যালেঞ্জটি করেছেন তার কারণে আপনি সম্ভবত 12 টি বিয়োগ করতে পারেন। আমি যথেষ্ট আত্মবিশ্বাসী এই পদ্ধতিটি এখনও এলোমেলো ইনপুট সেটটির জন্য সর্বনিম্ন গড় সমাধান আকার দেয় (যদি আপনি এটির বিষয়ে চিন্তা করেন তবে এটি অবশ্যই অবশ্যই করা উচিত বা এটির খুব কাছাকাছি হওয়া উচিত), যার কারণে আমি বলছি এটি শক্তির উপর নির্ভর করছে না কোডিং।
abligh

1
একটি নিখুঁত কোডার (যেমন একটি যা 6670903752021072936960 কেস গণনা করে) সহজেই এটিতে দশটি পরীক্ষার কেসকে একটি হার্ড কোডিং যুক্ত করতে পারে, যার ফলে স্কোর ৯ হয় Just বিশেষ ক্ষেত্রে। শূন্য স্ট্রিং হিসাবে 0 কোড, এবং একটি অক্ষর হিসাবে বাক্য কোড, অতএব স্কোর 9। এটি বোর্ডের প্রতি অক্ষরের গড় সংখ্যার উপর এর প্রভাব হ'ল 3.3x10 ^ -22, যা অন্বেষণযোগ্য।
মার্ক অ্যাডলার

... এ কারণেই এখানে স্কোরিংটি ভেঙে গেছে। আমি বিকল্পের পরামর্শ দিলাম।

Fudging জন্য -1 - এমনকি যদি এটি শুধুমাত্র স্কোরিংয়ের সাথে কোনও সমস্যা দেখানোর জন্য ...
জন ডিভোরাক

6

সিজেম, 309 বাইট

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

এনকোডার

q~{);}%);:+:(9b95b32f+:c

সঙ্কেতমোচক

l:i32f-95b9bW%[0]64*+64<W%:)8/{_:+45\-+}%z{_:+45\-+}%z`

এটি এখানে পরীক্ষা করুন।

এনকোডারটির ইনপুট (এসটিডিআইএন-এ) এবং ডিকোডারের আউটপুট (এসটিডিআউটে) একটি নেস্টেড সিজেএম অ্যারের আকারে। যেমন

[[8 3 5 4 1 6 9 2 7] [2 9 6 8 5 7 4 3 1] [4 1 7 2 9 3 6 5 8] [5 6 9 1 3 4 7 8 2] [1 2 3 6 7 8 5 4 9] [7 4 8 5 2 9 1 6 3] [6 5 2 7 8 1 3 9 4] [9 8 1 3 4 5 2 7 6] [3 7 4 9 6 2 8 1 5]]

10 পরীক্ষার ফলাফলগুলি হ'ল:

U(5wtqmC.-[TM.#aMY#k*)pErHQcg'{
EWrn"^@p+g<5XT5G[r1|bk?q6Nx4~r?
#489pLj5+ML+z@y$]8a@CI,K}B$$Mwn
LF_X^"-h**A!'VZq kHT@F:"ZMD?A0r
?gD;"tw<yG%8y!3S"BC:ojQ!#;i-:\g
qS#"L%`4yei?Ce_r`{@EOl66m^hx77
"EF?` %!H@YX6J0F93->%90O7T#C_5u
9V)R+6@Jx(jg@@U6.DrMO*5G'P<OHv8
(Ua6z{V:hX#sV@g0s<|!X[T,Jy|oQ+K
N,F8F1!@OH1%%zs%dI`Q\q,~oAEl(:O

অ্যালগরিদম খুব সহজ:

  • শেষ কলাম এবং সারি সরান।
  • বাকি digit৪ সংখ্যাটিকে বেস -৯ নম্বর হিসাবে আচরণ করুন (প্রতিটি সংখ্যা 1 দ্বারা হ্রাস করার পরে)।
  • এটিকে বেস -৯৯ এ রূপান্তর করুন, প্রতিটি সংখ্যায় 32 যোগ করুন এবং এটিকে ASCII অক্ষরে পরিণত করুন।
  • ডিকোডিংয়ের জন্য, বেস রূপান্তরটি বিপরীত করুন এবং চূড়ান্ত কলামটি পূরণ করুন এবং নিখোঁজ সংখ্যাগুলির সাথে সারি করুন।

আমি 10 টি পরীক্ষার কেস যুক্ত করেছি। স্কোর হ'ল এখন সমস্ত 10 টিতে অক্ষরের সংখ্যার যোগফল।
kukac67

@ kukac67 হ্যাঁ, ইতিমধ্যে স্থির।
মার্টিন এন্ডার

আমি দুঃখিত, আমি মনে করি আপনি 8 তম পরীক্ষার কেসটি চালানোর ঠিক পরে পরিবর্তন করেছেন। আমি যথেষ্ট দ্রুত ছিল না। : ডি
kukac67

7 তম পরীক্ষার কেসটি ডিকোডিং করে আমি লক্ষ্য করেছি এটি কার্যকর হয়নি। আমি মনে করি আপনি একটি বাগ আছে। "[[4 5 7 9 2 8 3 3 4] ..."
কুকাক67

@ kukac67 ঠিক করা উচিত। শীর্ষস্থানীয় 0 টি দিয়ে আমি 64-অঙ্কের ফলাফলটি প্যাড করতে ভুলে গিয়েছি।
মার্টিন এন্ডার

6

পাইথন ২.7, মোট ১০ cha টি চর

টিএল; ডিআর ব্রুট ফোর্স শীর্ষ + বাম সীমাবদ্ধতার সাথে 3x3 স্কোয়ারের গণনা

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

import itertools

inputs = """
9 7 3 5 8 1 4 2 6
5 2 6 4 7 3 1 9 8
1 8 4 2 9 6 7 5 3
2 4 7 8 6 5 3 1 9
3 9 8 1 2 4 6 7 5
6 5 1 7 3 9 8 4 2
8 1 9 3 4 2 5 6 7
7 6 5 9 1 8 2 3 4
4 3 2 6 5 7 9 8 1

7 2 4 8 6 5 1 9 3
1 6 9 2 4 3 8 7 5
3 8 5 1 9 7 2 4 6
8 9 6 7 2 4 3 5 1
2 7 3 9 5 1 6 8 4
4 5 1 3 8 6 9 2 7
5 4 2 6 3 9 7 1 8
6 1 8 5 7 2 4 3 9
9 3 7 4 1 8 5 6 2

1 5 7 6 8 2 3 4 9
4 3 2 5 1 9 6 8 7
6 9 8 3 4 7 2 5 1
8 2 5 4 7 6 1 9 3
7 1 3 9 2 8 4 6 5
9 6 4 1 3 5 7 2 8
5 4 1 2 9 3 8 7 6
2 8 9 7 6 1 5 3 4
3 7 6 8 5 4 9 1 2

8 3 5 4 1 6 9 2 7
2 9 6 8 5 7 4 3 1
4 1 7 2 9 3 6 5 8
5 6 9 1 3 4 7 8 2
1 2 3 6 7 8 5 4 9
7 4 8 5 2 9 1 6 3
6 5 2 7 8 1 3 9 4
9 8 1 3 4 5 2 7 6
3 7 4 9 6 2 8 1 5

6 2 8 4 5 1 7 9 3
5 9 4 7 3 2 6 8 1
7 1 3 6 8 9 5 4 2
2 4 7 3 1 5 8 6 9
9 6 1 8 2 7 3 5 4
3 8 5 9 6 4 2 1 7
1 5 6 2 4 3 9 7 8
4 3 9 5 7 8 1 2 6
8 7 2 1 9 6 4 3 5

1 2 3 4 5 6 7 8 9
4 5 6 7 8 9 1 2 3
7 8 9 1 2 3 4 5 6
2 1 4 3 6 5 8 9 7
3 6 5 8 9 7 2 1 4
8 9 7 2 1 4 3 6 5
5 3 1 6 4 8 9 7 2
6 4 8 9 7 2 5 3 1
9 7 2 5 3 1 6 4 8

1 4 5 7 9 2 8 3 6
3 7 6 5 8 4 1 9 2
2 9 8 3 6 1 7 5 4
7 3 1 9 2 8 6 4 5
8 5 9 6 4 7 3 2 1
4 6 2 1 3 5 9 8 7
6 2 4 8 7 3 5 1 9
5 8 7 4 1 9 2 6 3
9 1 3 2 5 6 4 7 8

5 2 7 4 1 6 9 3 8
8 6 4 3 2 9 1 5 7
1 3 9 5 7 8 6 4 2
2 9 1 8 5 4 3 7 6
3 4 8 6 9 7 5 2 1
6 7 5 1 3 2 4 8 9
7 1 2 9 4 5 8 6 3
4 8 3 2 6 1 7 9 5
9 5 6 7 8 3 2 1 4

2 4 6 7 1 3 9 8 5
1 8 5 4 9 6 7 3 2
9 3 7 8 2 5 1 4 6
6 7 8 5 4 2 3 9 1
4 9 3 1 6 8 2 5 7
5 1 2 3 7 9 4 6 8
8 2 4 9 5 7 6 1 3
7 5 9 6 3 1 8 2 4
3 6 1 2 8 4 5 7 9

8 6 1 2 9 4 5 7 3
4 7 5 3 1 8 6 9 2
3 9 2 5 6 7 8 1 4
2 3 6 4 5 9 7 8 1
1 5 4 7 8 3 2 6 9
9 8 7 6 2 1 3 4 5
5 2 9 1 7 6 4 3 8
6 4 8 9 3 2 1 5 7
7 1 3 8 4 5 9 2 6
""".strip().split('\n\n')

সুডোকু প্রিন্ট করতে সহায়ক ফাংশন

def print_sudoku(m):
    for k in m:
        print' '.join(str(i) for i in k)

উপরে এবং বামে প্রতিবন্ধকতা দেওয়া সমস্ত সম্ভাব্য স্কোয়ার তৈরি করে

আরও তথ্যের জন্য কোড মন্তব্য দেখুন

def potential_squares(u1, u2, u3, l1, l2, l3):
    """
    returns generator of possible squares given lists of digits above and below

           u1 u2 u3
           |  |  |
    l1 --  a  b  c
    l2 --  d  e  f
    l3 --  g  h  i

    if no items exist the empty list must be given
    """
    for a, b, c, d, e, f, g, h, i in itertools.permutations(xrange(1, 10)):
        if a not in u1 and a not in l1 and b not in u2 and b not in l1 and c not in u3 and c not in l1 and d not in u1 and d not in l2 and e not in u2 and e not in l2 and f not in u3 and f not in l2 and g not in u1 and g not in l3 and h not in u2 and h not in l3 and i not in u3 and i not in l3:
            yield (a, b, c, d, e, f, g, h, i)

টিপলস হিসাবে সুডোকু বোর্ড থেকে সমস্ত স্কোয়ার উত্তোলন করে

আরও তথ্যের জন্য কোড মন্তব্য দেখুন

def board_to_squares(board):
    """
    finds 9 squares in a 9x9 board in this order:
    1 1 1 2 2 2 3 3 3
    1 1 1 2 2 2 3 3 3
    1 1 1 2 2 2 3 3 3
    4 4 4 5 5 5 6 6 6
    4 4 4 5 5 5 6 6 6
    4 4 4 5 5 5 6 6 6
    7 7 7 8 8 8 9 9 9
    7 7 7 8 8 8 9 9 9
    7 7 7 8 8 8 9 9 9

    returns tuple for each square as follows:
    a b c
    d e f   -->  (a,b,c,d,e,f,g,h,i)
    g h i
    """
    labels = [[3 * i + 1] * 3 + [3 * i + 2] * 3 + [3 * i + 3] * 3 for i in [0, 0, 0, 1, 1, 1, 2, 2, 2]]
    labelled_board = zip(sum(board, []), sum(labels, []))
    return [tuple(a for a, b in labelled_board if b == sq) for sq in xrange(1, 10)]

স্কোয়ারগুলি সুডোকু বোর্ডে ফিরিয়ে দেয়

মূলত উপরের ফাংশনটির একটি বিপরীত

def squares_to_board(squares):
    """
    inverse of above
    """
    board = [[i / 3 * 27 + i % 3 * 3 + j / 3 * 9 + j % 3 for j in range(9)] for i in range(9)]
    flattened = sum([list(square) for square in squares], [])
    for i in range(9):
        for j in range(9):
            board[i][j] = flattened[board[i][j]]
    return board

স্কোয়ারগুলি বামে দেওয়া হয়েছে, ফেরতের সীমাবদ্ধতা

আরও তথ্যের জন্য কোড মন্তব্য দেখুন

def sum_rows(*squares):
    """
    takes tuples for squares and returns lists corresponding to the rows:
    l1 -- a b c   j k l
    l2 -- d e f   m n o  ...
    l3 -- g h i   p q r
    """
    l1 = []
    l2 = []
    l3 = []
    if len(squares):
        for a, b, c, d, e, f, g, h, i in squares:
            l1 += [a, b, c]
            l2 += [d, e, f]
            l3 += [g, h, i]
        return l1, l2, l3
    return [], [], []

উপরের স্কোয়ারগুলি দেওয়া হয়েছে, ফেরতের সীমাবদ্ধতা

আরও তথ্যের জন্য কোড মন্তব্য দেখুন

def sum_cols(*squares):
    """
    takes tuples for squares and returns lists corresponding to the cols:

    u1 u2 u3
    |  |  |
    a  b  c
    d  e  f
    g  h  i

    j  k  l
    m  n  o
    p  q  r

      ...

    """
    u1 = []
    u2 = []
    u3 = []
    if len(squares):
        for a, b, c, d, e, f, g, h, i in squares:
            u1 += [a, d, g]
            u2 += [b, e, h]
            u3 += [c, f, i]
        return u1, u2, u3
    return [], [], []

একটি স্ট্রিং তোলে

def base95(A):
    if type(A) is int or type(A) is long:
        s = ''
        while A > 0:
            s += chr(32 + A % 95)
            A /= 95
        return s
    if type(A) is str:
        return sum((ord(c) - 32) * (95 ** i) for i, c in enumerate(A))

এটি প্রতিটি স্কোয়ারের জন্য নির্ভরশীলতার একটি হার্ডকোডযুক্ত তালিকা

আরও তথ্যের জন্য কোড মন্তব্য দেখুন

"""
dependencies: every square as labeled
1 2 3
4 5 6
7 8 9
is dependent on those above and to the left

in a dictionary, it is:
square: ([above],[left])
"""
dependencies = {1: ([], []), 2: ([], [1]), 3: ([], [1, 2]), 4: ([1], []), 5: ([2], [4]), 6: ([3], [4, 5]),
                7: ([1, 4], []), 8: ([2, 5], [7]), 9: ([3, 6], [7, 8])}

এটি প্রতিটি স্কোয়ারের পক্ষে সম্ভাব্য বিকল্পের সর্বাধিক সংখ্যার একটি হার্ডকোডযুক্ত তালিকা

আরও তথ্যের জন্য কোড মন্তব্য দেখুন

"""
max possible options for a given element

  9 8 7   ? ? ?   3 2 1
  6 5 4  (12096)  3 2 1
  3 2 1   ? ? ?   3 2 1

  ? ? ?   ? ? ?   2 2 1
 (12096)  (420)   2 1 1    (limits for squares 2,4 determined experimentally)
  ? ? ?   ? ? ?   1 1 1    (limit for square 5 is a pessimistic guess, might be wrong)

  3 3 3   2 2 1   1 1 1
  2 2 2   2 1 1   1 1 1
  1 1 1   1 1 1   1 1 1
"""
possibilities = [362880, 12096, 216, 12096, 420, 8, 216, 8, 1]

এগুলি উপরের ফাংশনগুলিকে একত্রিত করে এবং একটি বোর্ডকে পূর্ণসংখ্যার তালিকায় রূপান্তর করে

def factorize_sudoku(board):
    squares = board_to_squares(board)
    factors = []

    for label in xrange(1, 10):
        above, left = dependencies[label]
        u1, u2, u3 = sum_cols(*[sq for i, sq in enumerate(squares) if i + 1 in above])
        l1, l2, l3 = sum_rows(*[sq for i, sq in enumerate(squares) if i + 1 in left])
        for i, k in enumerate(potential_squares(u1, u2, u3, l1, l2, l3)):
            if k == squares[label - 1]:
                factors.append(i)
                continue
    return factors

এবং একটি বোর্ড ফিরে

def unfactorize_sudoku(factors):
    squares = []
    for label in xrange(1, 10):
        factor = factors[label - 1]
        above, left = dependencies[label]
        u1, u2, u3 = sum_cols(*[sq for i, sq in enumerate(squares) if i + 1 in above])
        l1, l2, l3 = sum_rows(*[sq for i, sq in enumerate(squares) if i + 1 in left])
        for i, k in enumerate(potential_squares(u1, u2, u3, l1, l2, l3)):
            if i == factor:
                squares.append(k)
                continue
    return squares

ঠিক আছে যে সমস্ত ফাংশন

প্রতিটি বোর্ডের জন্য স্ট্রিং তৈরি করে প্রিন্ট করুন

strings = []
for sudoku in inputs:
    board = [[int(x) for x in line.split()] for line in sudoku.strip().split('\n')]
    print_sudoku(board)
    factors = factorize_sudoku(board)

    i = 0
    for item, modulus in zip(factors, possibilities):
        i *= modulus
        i += item

    strings.append(base95(i))
    print 'integral representation:', i
    print 'bits of entropy:', i.bit_length()
    print 'base95 representation:', strings[-1]
    print ''

এখন সমস্ত স্ট্রিংয়ের মোট দৈর্ঘ্য মুদ্রণ করুন

print 'overall output:', strings
print 'total length:', len(''.join(strings))
print ''

এবং আন-স্ট্রিংয়েফ করুন, এটি প্রমাণ করার জন্য এটি কোনও একতরফা সংকোচনের নয়

for string in strings:
    print 'from:', string

    i = base95(string)
    retrieved = []
    for base in possibilities[::-1]:
        retrieved.append(i % base)
        i /= base

    squares = unfactorize_sudoku(retrieved[::-1])
    print_sudoku(squares_to_board(squares))
    print ''

আউটপুট:

9 7 3 5 8 1 4 2 6
5 2 6 4 7 3 1 9 8
1 8 4 2 9 6 7 5 3
2 4 7 8 6 5 3 1 9
3 9 8 1 2 4 6 7 5
6 5 1 7 3 9 8 4 2
8 1 9 3 4 2 5 6 7
7 6 5 9 1 8 2 3 4
4 3 2 6 5 7 9 8 1
integral representation: 65073646522550110083448
bits of entropy: 76
base95 representation: 23f!dvoR[pI+

7 2 4 8 6 5 1 9 3
1 6 9 2 4 3 8 7 5
3 8 5 1 9 7 2 4 6
8 9 6 7 2 4 3 5 1
2 7 3 9 5 1 6 8 4
4 5 1 3 8 6 9 2 7
5 4 2 6 3 9 7 1 8
6 1 8 5 7 2 4 3 9
9 3 7 4 1 8 5 6 2
integral representation: 45592184788002754998731
bits of entropy: 76
base95 representation: +gel3sJ?vL!(

1 5 7 6 8 2 3 4 9
4 3 2 5 1 9 6 8 7
6 9 8 3 4 7 2 5 1
8 2 5 4 7 6 1 9 3
7 1 3 9 2 8 4 6 5
9 6 4 1 3 5 7 2 8
5 4 1 2 9 3 8 7 6
2 8 9 7 6 1 5 3 4
3 7 6 8 5 4 9 1 2
integral representation: 3351617758498333760666
bits of entropy: 72
base95 representation: !"=W3R"`w|W

8 3 5 4 1 6 9 2 7
2 9 6 8 5 7 4 3 1
4 1 7 2 9 3 6 5 8
5 6 9 1 3 4 7 8 2
1 2 3 6 7 8 5 4 9
7 4 8 5 2 9 1 6 3
6 5 2 7 8 1 3 9 4
9 8 1 3 4 5 2 7 6
3 7 4 9 6 2 8 1 5
integral representation: 54077388556332388193975
bits of entropy: 76
base95 representation: zAu5Rvno.2P)

6 2 8 4 5 1 7 9 3
5 9 4 7 3 2 6 8 1
7 1 3 6 8 9 5 4 2
2 4 7 3 1 5 8 6 9
9 6 1 8 2 7 3 5 4
3 8 5 9 6 4 2 1 7
1 5 6 2 4 3 9 7 8
4 3 9 5 7 8 1 2 6
8 7 2 1 9 6 4 3 5
integral representation: 38664325462033435490761
bits of entropy: 76
base95 representation: ?8KJHGXS^hk&

1 2 3 4 5 6 7 8 9
4 5 6 7 8 9 1 2 3
7 8 9 1 2 3 4 5 6
2 1 4 3 6 5 8 9 7
3 6 5 8 9 7 2 1 4
8 9 7 2 1 4 3 6 5
5 3 1 6 4 8 9 7 2
6 4 8 9 7 2 5 3 1
9 7 2 5 3 1 6 4 8
integral representation: 9
bits of entropy: 4
base95 representation: )

1 4 5 7 9 2 8 3 6
3 7 6 5 8 4 1 9 2
2 9 8 3 6 1 7 5 4
7 3 1 9 2 8 6 4 5
8 5 9 6 4 7 3 2 1
4 6 2 1 3 5 9 8 7
6 2 4 8 7 3 5 1 9
5 8 7 4 1 9 2 6 3
9 1 3 2 5 6 4 7 8
integral representation: 2146071528999475941021
bits of entropy: 71
base95 representation: ]ib2[x.u*pC

5 2 7 4 1 6 9 3 8
8 6 4 3 2 9 1 5 7
1 3 9 5 7 8 6 4 2
2 9 1 8 5 4 3 7 6
3 4 8 6 9 7 5 2 1
6 7 5 1 3 2 4 8 9
7 1 2 9 4 5 8 6 3
4 8 3 2 6 1 7 9 5
9 5 6 7 8 3 2 1 4
integral representation: 31150627593616723824594
bits of entropy: 75
base95 representation: BFK1'H9}r9M%

2 4 6 7 1 3 9 8 5
1 8 5 4 9 6 7 3 2
9 3 7 8 2 5 1 4 6
6 7 8 5 4 2 3 9 1
4 9 3 1 6 8 2 5 7
5 1 2 3 7 9 4 6 8
8 2 4 9 5 7 6 1 3
7 5 9 6 3 1 8 2 4
3 6 1 2 8 4 5 7 9
integral representation: 9659549243898865961967
bits of entropy: 74
base95 representation: ;EOSPiy9T?b!

8 6 1 2 9 4 5 7 3
4 7 5 3 1 8 6 9 2
3 9 2 5 6 7 8 1 4
2 3 6 4 5 9 7 8 1
1 5 4 7 8 3 2 6 9
9 8 7 6 2 1 3 4 5
5 2 9 1 7 6 4 3 8
6 4 8 9 3 2 1 5 7
7 1 3 8 4 5 9 2 6
integral representation: 56473223126891371769434
bits of entropy: 76
base95 representation: 3TLSl3hPU3x)

overall output: ['23f!dvoR[pI+', '+gel3sJ?vL!(', '!"=W3R"`w|W', 'zAu5Rvno.2P)', '?8KJHGXS^hk&', ')', ']ib2[x.u*pC', "BFK1'H9}r9M%", ';EOSPiy9T?b!', '3TLSl3hPU3x)']
total length: 107

from: 23f!dvoR[pI+
9 7 3 5 8 1 4 2 6
5 2 6 4 7 3 1 9 8
1 8 4 2 9 6 7 5 3
2 4 7 8 6 5 3 1 9
3 9 8 1 2 4 6 7 5
6 5 1 7 3 9 8 4 2
8 1 9 3 4 2 5 6 7
7 6 5 9 1 8 2 3 4
4 3 2 6 5 7 9 8 1

from: +gel3sJ?vL!(
7 2 4 8 6 5 1 9 3
1 6 9 2 4 3 8 7 5
3 8 5 1 9 7 2 4 6
8 9 6 7 2 4 3 5 1
2 7 3 9 5 1 6 8 4
4 5 1 3 8 6 9 2 7
5 4 2 6 3 9 7 1 8
6 1 8 5 7 2 4 3 9
9 3 7 4 1 8 5 6 2

from: !"=W3R"`w|W
1 5 7 6 8 2 3 4 9
4 3 2 5 1 9 6 8 7
6 9 8 3 4 7 2 5 1
8 2 5 4 7 6 1 9 3
7 1 3 9 2 8 4 6 5
9 6 4 1 3 5 7 2 8
5 4 1 2 9 3 8 7 6
2 8 9 7 6 1 5 3 4
3 7 6 8 5 4 9 1 2

from: zAu5Rvno.2P)
8 3 5 4 1 6 9 2 7
2 9 6 8 5 7 4 3 1
4 1 7 2 9 3 6 5 8
5 6 9 1 3 4 7 8 2
1 2 3 6 7 8 5 4 9
7 4 8 5 2 9 1 6 3
6 5 2 7 8 1 3 9 4
9 8 1 3 4 5 2 7 6
3 7 4 9 6 2 8 1 5

from: ?8KJHGXS^hk&
6 2 8 4 5 1 7 9 3
5 9 4 7 3 2 6 8 1
7 1 3 6 8 9 5 4 2
2 4 7 3 1 5 8 6 9
9 6 1 8 2 7 3 5 4
3 8 5 9 6 4 2 1 7
1 5 6 2 4 3 9 7 8
4 3 9 5 7 8 1 2 6
8 7 2 1 9 6 4 3 5

from: )
1 2 3 4 5 6 7 8 9
4 5 6 7 8 9 1 2 3
7 8 9 1 2 3 4 5 6
2 1 4 3 6 5 8 9 7
3 6 5 8 9 7 2 1 4
8 9 7 2 1 4 3 6 5
5 3 1 6 4 8 9 7 2
6 4 8 9 7 2 5 3 1
9 7 2 5 3 1 6 4 8

from: ]ib2[x.u*pC
1 4 5 7 9 2 8 3 6
3 7 6 5 8 4 1 9 2
2 9 8 3 6 1 7 5 4
7 3 1 9 2 8 6 4 5
8 5 9 6 4 7 3 2 1
4 6 2 1 3 5 9 8 7
6 2 4 8 7 3 5 1 9
5 8 7 4 1 9 2 6 3
9 1 3 2 5 6 4 7 8

from: BFK1'H9}r9M%
5 2 7 4 1 6 9 3 8
8 6 4 3 2 9 1 5 7
1 3 9 5 7 8 6 4 2
2 9 1 8 5 4 3 7 6
3 4 8 6 9 7 5 2 1
6 7 5 1 3 2 4 8 9
7 1 2 9 4 5 8 6 3
4 8 3 2 6 1 7 9 5
9 5 6 7 8 3 2 1 4

from: ;EOSPiy9T?b!
2 4 6 7 1 3 9 8 5
1 8 5 4 9 6 7 3 2
9 3 7 8 2 5 1 4 6
6 7 8 5 4 2 3 9 1
4 9 3 1 6 8 2 5 7
5 1 2 3 7 9 4 6 8
8 2 4 9 5 7 6 1 3
7 5 9 6 3 1 8 2 4
3 6 1 2 8 4 5 7 9

from: 3TLSl3hPU3x)
8 6 1 2 9 4 5 7 3
4 7 5 3 1 8 6 9 2
3 9 2 5 6 7 8 1 4
2 3 6 4 5 9 7 8 1
1 5 4 7 8 3 2 6 9
9 8 7 6 2 1 3 4 5
5 2 9 1 7 6 4 3 8
6 4 8 9 3 2 1 5 7
7 1 3 8 4 5 9 2 6

6

গণিত, স্কোর: 130 9

হালনাগাদ:

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


এটি রাস্টার ক্রমে একটি সময়ে একটি ঘর এনকোড করে, এবং প্রতিটি কক্ষের জন্য সুডোকুর প্রাথমিক নিয়মগুলি ব্যবহার করে পরবর্তী কক্ষগুলির জন্য যথাযথভাবে এর মান নির্ধারণ করে। সুতরাং, উদাহরণস্বরূপ, যখন কোনও ঘর এনকোডড থাকে এবং কেবলমাত্র চারটি সম্ভাবনা থাকে, তখন বড় সংখ্যায় একটি বেস 4 ডিজিট যুক্ত করা হয়। এটি পরীক্ষার কেসগুলি সরাসরি ছোট পূর্ণসংখ্যার হিসাবেও কোড করে, এখনও সঠিকভাবে সমস্ত বৈধ সুডোকু বোর্ডকে কমপ্রেস করে ~ 12.5 অক্ষরের দৈর্ঘ্যের গড় সংক্ষিপ্ত দৈর্ঘ্য সহ অপেক্ষাকৃত সরল কোড এবং কোনও সুডোকু দ্রাবক প্রয়োজন নেই।

rule=({#}&/@Union[Join[
        Range[#+1,Ceiling[#,9]],Range[#+9,81,9],
        Flatten[Outer[Plus,Range[Floor[#+8,9],Ceiling[#,27]-9,9],
            Floor[Mod[#-1,9],3]+Range[3]]]]])&/@Range[81];

encode[board_]:=
Block[{step,code,pos},
    step[{left_,x_,m_},n_]:={
        MapAt[Complement[#,{board[[n]]}]&,left,rule[[n]]],
        x+m(FirstPosition[left[[n]],board[[n]]][[1]]-1),m Length[left[[n]]]};
    code=Fold[step,{Table[Range[9],{81}],0,1},Range[81]][[2]];
    pos=Position[{206638498064127103948214,1665188010993633759502287,
        760714067080859855534739,1454154263752219616902129,6131826927558056238360710,
        237833524138130760909081600,8968162948536417279508170,3284755189143784030943149,
        912407486534781347155987,556706937207676220045188},code];
    code=If[pos==={},code+10,pos[[1,1]]-1];
    FromCharacterCode[If[code==0,{},IntegerDigits[code,95]+32]]
]    

decode[str_]:=
Block[{step,code},
    code=FromDigits[ToCharacterCode[str]-32,95];
    code=If[code<10,{206638498064127103948214,1665188010993633759502287,
        760714067080859855534739,1454154263752219616902129,6131826927558056238360710,
        237833524138130760909081600,8968162948536417279508170,3284755189143784030943149,
        912407486534781347155987,556706937207676220045188}[[code+1]],code-10];
    step[{left_,x_,board_},n_]:=Function[z,{
        MapAt[Complement[#,{z}]&,left,rule[[n]]],Quotient[x,Length[left[[n]]]],
        Append[board,z]}][left[[n,Mod[x,Length[left[[n]]]]+1]]];
    Fold[step,{Table[Range[9],{81}],code,{}},Range[81]][[3]]
]

এনকোডেড পরীক্ষার কেসগুলি:

     <- empty string
!
"
#
$
%
&
'
(
)

এটি নিখুঁত কোডিংয়ের (গড় 11 ডলার) ফলাফল দেয় না, যেহেতু প্রাথমিক নিয়মগুলি এমন কিছু পছন্দকে বাতিল করে না যার পক্ষে বাস্তবে কোনও সমাধান নেই। পারফরম্যান্সটি নিখুঁত করা যায় (যেমন বড় পূর্ণসংখ্যা সর্বদা সম্ভব সুডোকু বোর্ডের সংখ্যার চেয়ে কম হবে) যাচাই করে সুডোকু সলভার ব্যবহার করে বর্তমান কয়েকটি বিকল্পের কোনও সমাধান নেই কিনা তা পরীক্ষা করে এবং সেগুলিও মুছে ফেলা যায়।


এবং হ্যাঁ, দুর্ভাগ্যজনক যে এই চ্যালেঞ্জের নিয়মগুলি এই সমাধানের অনুমতি দেয়।
মার্ক অ্যাডলার

1
হ্যাঁ, লিখিত হিসাবে চ্যালেঞ্জটি এই ফাঁদে পড়ে, তবে হার্ডকোডিং একটি মানক ফাঁক: meta.codegolf.stackexchange.com/a/1063/20260
xnor

1
সেই মেটা পোস্ট থেকে "আপনার প্রোগ্রামটি কেবল প্রাক-গণনা করা ফলাফল মুদ্রণ করেই কাজ করবে বলে আশা করা যায়।" প্রকৃতপক্ষে এই প্রোগ্রামটি পরীক্ষার ফলাফলগুলি সংকোচনের জন্য সমস্ত কাজ করে এবং তারপরে এই অনুকূল ফলাফলটি পাওয়ার জন্য ফলাফলগুলি বড় বড় পূর্ণসংখ্যাগুলিগুলিকে পূর্ণসংখ্যা 0..9 তে প্রতিনিধিত্ব করে ps সেই মানচিত্রগুলিতে এমন মানচিত্র রয়েছে যা সেগুলির পূর্ণসংখ্যার জন্য যাই হোক না কেন। আমি কেবল বোর্ডগুলির হয়ে পরীক্ষার কেসগুলি বেছে নিয়েছি। প্রোগ্রামটি সমস্ত সম্ভাব্য বোর্ডকে এনকোড করে এবং ডিকোড করে, তাই এটি চ্যালেঞ্জের জন্য প্রয়োজনীয় সমস্ত কাজ করে।
মার্ক অ্যাডলার

আপনি ঠিক বলেছেন, মেটা পোস্টটি এটি আবরণ করে না। এটি করার জন্য একটি নতুন পোস্ট করা হয়েছিল: meta.codegolf.stackexchange.com/a/2507/20260
xnor

4

জে, 254 পয়েন্ট

সঙ্কোচন
fwrite&'sudoku.z' 1 u: u: 32 + (26$95) #: (9 $ !9x)#. A."1 (1&".);._2 stdin''
decompression
echo A.&(>:i.9)"1 (9 $ !9x) #: 95x #. 32 -~ 3 u: fread'sudoku.z'

স্ট্যান্ডার্ড আই / ও হ'ল জেতে কিছুটা আনাড়ি যেহেতু jconsoleপ্রকৃতপক্ষে একটি আরপিএল, তাই আমি সংকুচিত আউটপুট ফাইলগুলিতে লেখার স্বাধীনতা নিয়েছিলাম।

প্রতিটি লাইনের অ্যানগ্রামগ্রাম সূচকটি সন্ধান করে, ফলে নয়টি সংখ্যাকে বেস-(9!) নম্বর হিসাবে গণ্য করে এবং শেষ পর্যন্ত বেস -৯৯ তে রূপান্তর করে 32 টি যোগ করে এবং মার্টিন বাটনারের সমাধানের মতো ASCII তে রূপান্তরিত করে। ১..n এর অনুক্রমের আনগ্রামগ্রাম সূচকটি হ'ল এই জাতীয় ক্রমের সমস্ত বর্ণের তালিকা অনুসারে সাজানো 5 4 3 2 1সূচির সূচক , উদাহরণস্বরূপ এনগ্রামের ইনডেক্স 5 রয়েছে! - 1 = 119

সমস্ত ক্রিয়াকলাপে সহজ বিপরীতে থাকে, তাই ডিকম্প্রেশনটি সহজ।

বোনাস হিসাবে, উদাহরণগুলি খুব জে-বান্ধব বিন্যাসে রয়েছে, তাই সংক্রামিত সুডোকাসের ইনপুট / আউটপুট হ'ল উদাহরণগুলিতে দেওয়া হয়েছে (যদিও এনকোডারটিতে ইনপুটটির জন্য একটি নতুন নতুন লাইনের প্রয়োজন হয়)।


টেস্টকেসগুলির জন্য সংকীর্ণ স্ট্রিং:

#p8<!w=C6Cpgi/-+vn)FU]AHr\
"bC]wPv{8ze$l,+jkCPi0,e>-D
2}2EZZB;)WZQF@JChz}~-}}_<
#2Ofs0Mm]).e^raUu^f@sSMWc"
":kkCf2;^U_UDC?I\PC"[*gj|!
#TISE3?d7>oZ_I2.C16Z*gg
,@ CE;zX{.l\xRAc]~@vCw)8R
!oN{|Y6V"C.q<{gq(s?M@O]"]9
VORd2"*T,J;JSh<G=rR*8J1LT
#?bHF:y@oRI8e1Zdl5:BzYO.P.

যদি আপনি কেবল প্রথম 8 টি সারি সংকুচিত করেন তবে নবম সারিটি গণনা করা সহজ।
কিথ রান্ডাল

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

3

পাইথন 3, 120 পয়েন্ট

এই প্রোগ্রামটি সমস্ত সম্ভাব্য 3x3-ব্লক তালিকাভুক্ত করে এবং তাদের মধ্যে কোনটি আসল সুডোকুতে প্রকৃতপক্ষে উপস্থিত ছিল তা স্মরণ করে, তারপরে এই সমস্ত সংখ্যাটি বেস -99 উপস্থাপনায় একসাথে রাখে। যদিও এটি হার্ড-কোডিংয়ের খুব কাছাকাছি, এটি আমার মেশিনে প্রায় 5 সেকেন্ডের মধ্যে উদাহরণগুলি সংকুচিত করে এবং ডিকম্প্রেস করে।

import functools

def readSudoku(s):
    values = [int(c) for c in s.split()]
    blocks = []
    for i in range(3):
        for j in range(3):
            block = []
            for k in range(3):
                for l in range(3):
                    block.append(values[i * 27 + k * 9 + j * 3 + l])
            blocks.append(block)
    return blocks

def writeSudoku(blocks):
    text = ""
    for i in range(9):
        for j in range(9):
            text += str(blocks[3 * (i // 3) + (j // 3)][3 * (i % 3) + (j % 3)]) + " "
        text += "\n"
    return text

def toASCII(num):
    chars = "".join(chr(c) for c in range(32, 127))
    if num == 0:
        return chars[0]
    else:
        return (toASCII(num // len(chars)).lstrip(chars[0]) + chars[num % len(chars)])

def toNum(text):
    chars = "".join(chr(c) for c in range(32, 127))
    return sum((len(chars) ** i * chars.index(c) for (i, c) in enumerate(text[::-1])))

def compress(sudoku):
    info = compressInfo(readSudoku(sudoku))
    return toASCII(functools.reduce(lambda old, new: (old[0] + new[0] * old[1], old[1] * new[1]), info, (0, 1))[0])

def compressInfo(sudoku):
    finished = [[0]*9]*9
    indices = [(-1, 0)]*9
    for (index, block) in enumerate(sudoku):
        counter = 0
        actual = -1
        for (location, solution) in enumerate(possibleBlocks(finished, index)):
            counter += 1
            if block == solution:
                actual = location
        if actual == -1:
            print(finished)
            print(block)
            raise ValueError
        finished[index] = block
        indices[index] = (actual, counter)
    return indices

def decompress(text):
    number = toNum(text)
    finished = [[0]*9]*9
    for i in range(9):
        blocks = list(possibleBlocks(finished, i))
        index = number % len(blocks)
        number //= len(blocks)
        finished[i] = blocks[index]
    return writeSudoku(finished)

def possibleBlocks(grid, index):
    horizontals = [grid[i] for i in (3 * (index // 3), 3 * (index // 3) + 1, 3 * (index // 3) + 2)]
    verticals = [grid[i] for i in (index % 3, index % 3 + 3, index % 3 + 6)]
    for i1 in range(1, 10):
        if any((i1 in a[0:3] for a in horizontals)) or\
           any((i1 in a[0::3] for a in verticals)):
            continue
        for i2 in range(1, 10):
            if i2 == i1 or\
               any((i2 in a[0:3] for a in horizontals)) or\
               any((i2 in a[1::3] for a in verticals)):
                continue
            for i3 in range(1, 10):
                if i3 in (i2, i1) or\
                   any((i3 in a[0:3] for a in horizontals)) or\
                   any((i3 in a[2::3] for a in verticals)):
                    continue
                for i4 in range(1, 10):
                    if i4 in (i3, i2, i1) or\
                       any((i4 in a[3:6] for a in horizontals)) or\
                       any((i4 in a[0::3] for a in verticals)):
                        continue
                    for i5 in range(1, 10):
                        if i5 in (i4, i3, i2, i1) or\
                           any((i5 in a[3:6] for a in horizontals)) or\
                           any((i5 in a[1::3] for a in verticals)):
                            continue
                        for i6 in range(1, 10):
                            if i6 in (i5, i4, i3, i2, i1) or\
                               any((i6 in a[3:6] for a in horizontals)) or\
                               any((i6 in a[2::3] for a in verticals)):
                                continue
                            for i7 in range(1, 10):
                                if i7 in (i6, i5, i4, i3, i2, i1) or\
                                   any((i7 in a[6:9] for a in horizontals)) or\
                                   any((i7 in a[0::3] for a in verticals)):
                                    continue
                                for i8 in range(1, 10):
                                    if i8 in (i7, i6, i5, i4, i3, i2, i1) or\
                                       any((i8 in a[6:9] for a in horizontals)) or\
                                       any((i8 in a[1::3] for a in verticals)):
                                        continue
                                    for i9 in range(1, 10):
                                        if i9 in (i8, i7, i6, i5, i4, i3, i2, i1) or\
                                           any((i9 in a[6:9] for a in horizontals)) or\
                                           any((i9 in a[2::3] for a in verticals)):
                                            continue
                                        yield [i1, i2, i3, i4, i5, i6, i7, i8, i9]

প্রধান ফাংশনগুলি হ'ল compress(sudoku)এবং decompress(text)

আউটপুট:

!%XIjS+]P{'Y
$OPMD&Sw&tlc
$1PdUMZ7K;W*
*=M1Ak9Oj6i\
!SY5:tDJxVo;
!F ]ki%jK>*R
'PXM4J7$s?#%
#9BJZP'%Ggse
*iAH-!9%QolJ
#&L6W6i> Dd6

3

পাইথন 2.5, 116 পয়েন্ট

কোড:

emptysud=[[' ']*9 for l in range(9)]

def encconfig(dig,sud):
 conf1=[(sud[i].index(dig),i) for i in range(9)]; out=[]
 for xgroup in range(3):
  a=filter(lambda (x,y): xgroup*3<=x<(xgroup+1)*3, conf1)
  b=[x-xgroup*3 for (x,y) in sorted(a,key = lambda (x,y): y)]
  out.append([[0,1,2],[0,2,1],[1,0,2],[1,2,0],[2,0,1],[2,1,0]].index(b))
 for ygroup in range(3):
  a=filter(lambda (x,y): ygroup*3<=y<(ygroup+1)*3, conf1)
  b=[y-ygroup*3 for (x,y) in sorted(a,key = lambda (x,y): x)]
  out.append([[0,1,2],[0,2,1],[1,0,2],[1,2,0],[2,0,1],[2,1,0]].index(b))
 return sum([out[i]*(6**i) for i in range(6)])

def decconfig(conf,dig,sud=emptysud):
 inp=[]; conf1=[]; sud=[line[:] for line in sud]
 for i in range(6):
  inp.append([[0,1,2],[0,2,1],[1,0,2],[1,2,0],[2,0,1],[2,1,0]][conf%6]); conf/=6
 for groupx in range(3):
  for groupy in range(3):
   conf1.append((groupx*3+inp[groupx][groupy],groupy*3+inp[groupy+3][groupx]))
 for (x,y) in conf1: sud[y][x]=dig
 return sud

def compatible(sud,conf,dig):
 a=reduce(lambda x,y: x+y, sud)
 b=decconfig(conf,dig,sud)
 c=reduce(lambda x,y: x+y, b)
 return a.count(' ')-c.count(' ')==9

def encode(sud):
 k=[encconfig(str(i),sud) for i in range(1,10)]; m=k[0]; p=6**6
 cursud=decconfig(k[0],'1')
 for i in range(1,9):
  t=filter(lambda u: compatible(cursud,u,str(i+1)), range(6**6))
  m=m+p*t.index(k[i]); p*=len(t)
  cursud=decconfig(k[i],str(i+1),cursud)
 return m

def decode(n):
 k=[n%46656]; n/=46656; cursud=decconfig(k[-1],'1')
 for i in range(2,10):
  t=filter(lambda u: compatible(cursud,u,str(i)), range(6**6))
  k.append(n%len(t)); n/=len(t); cursud=decconfig(t[k[-1]],str(i),cursud)
 return cursud

def base95(n):
 out=''
 while n: out+=chr(32+n%95); n/=95
 return out[::-1]

def base10(s): s=s[::-1]; return sum([(ord(s[i])-32)*(95**i) for i in range(len(s))])

import time
t0=time.clock()
for part in file('sudoku.txt','rb+').read().split('\r\n\r\n'):
 sudoku=[line.split(' ') for line in part.split('\r\n')]
 encsud=base95(encode(sudoku)); sud2=decode(base10(encsud))
 print encsud,sud2==sudoku
print time.clock()-t0

ফলাফল:

!|/FC,">;&3z
rUH">FLSgT|
)3#m|:&Zxl1c
jh _N@MG/zr
%Iye;U(6(p;0
!21.+KD0//yG
"O\B*O@8,h`y
A$`TUE#rsQu
J}ANCYXX*y5
".u2KV#4K|%a

খুব ধীর. আমার মেশিনে চালনা এবং যাচাই করতে 517 সেকেন্ড সময় নিয়েছে।

encconfig একটি সুডোকু বোর্ড নেয় এবং 1-9-এর একটি অঙ্ক নিয়ে থাকে, যেখানে সেই প্রদর্শিত হবে এমন xy স্থানাঙ্কের তালিকাবদ্ধ করে এবং এই স্থানাঙ্কগুলিকে প্রতিনিধিত্ব করে এমন একটি পরিসীমা (6 ** 6) আউটপুট দেয়। ("অঙ্কের কনফিগারেশন")

decconfig হ'ল বিপরীত ফাংশন। এটি একটি পরিসীমা (6 ** 6), একটি অঙ্ক এবং সুডোকু বোর্ড (খালি ডিফল্ট) নেয় takes এটি সুডোকু বোর্ডকে ডিজিটাল কনফিগারেশন দিয়ে আচ্ছাদন করে। যদি ডিজিটের কনফিগারেশনের কোনও পজিশন ইতিমধ্যে ইনপুটযুক্ত সুডোকু বোর্ডে নেওয়া হয় তবে সেই অবস্থানে থাকা অঙ্কটি নতুন অঙ্ক দ্বারা ওভাররাইট করা হয়।

সুসংগত একটি সুডোকু বোর্ড এবং একটি ডিজিট কনফিগারেশন নেয় (কনফ এবং ডিগ দ্বারা সংজ্ঞায়িত), সুডোকু বোর্ডের উপর ডিজিটাল কনফিগারেশনকে ওভারলে করে এবং বিরোধগুলির জন্য পরীক্ষা করে। এটি ফলাফলের উপর নির্ভর করে সত্য বা মিথ্যা প্রদান করে।

সঙ্কেতাক্ষরে লিখা হ'ল সংক্ষেপণ ফাংশন। এটি একটি সুডোকু বোর্ড নেয় এবং এটি উপস্থাপন করে এমন একটি সংখ্যা আউটপুট করে। এটি প্রথমে 1 এর অবস্থানগুলি একটি খালি বোর্ডে অনুলিপি করে এবং 2-এর সমস্ত কনফিগারেশনগুলির একটি তালিকা তৈরি করে যা 1-কনফিগারেশনের সাথে সামঞ্জস্যপূর্ণ (এটি ইতিমধ্যে নেওয়া স্থানগুলির কোনও গ্রহণ করে না) 1 এর)। এটি তালিকায় বোর্ডের প্রকৃত ২-কনফিগারেশনের ক্রমটি সন্ধান করে এবং এটি সংরক্ষণ করে, তারপরে সেই কনফিগারেশনটি নতুন বোর্ডে অনুলিপি করে, যেখানে এখন কেবলমাত্র 1 এবং 2 রয়েছে। এরপরে এটি 3 নম্বরের সমস্ত কনফিগারেশন তালিকাভুক্ত করে যা 1 এবং 2 এর অবস্থানের সাথে সামঞ্জস্যপূর্ণ এবং আরও কিছু।

পাঠোদ্ধার করা হ'ল বিপরীত ফাংশন।

পাইথন 2.5।


2

সি #, 150 বাইট

সঙ্কুচিত আউটপুট:

KYxnUjIpNe/YDnA
F97LclGuqeTcT2c
i6D1SvMVkS0jPlQ
32FOiIoUHpz5GGs
aAazPo2RJiH+IWQ
CwAA5NIMyNzSt1I
Cc2jOjU1+buCtVM
OgQv3Dz3PqsRvGA
eSxaW3wY5e6NGFc
olQvtpDOUPJXKGw

কিভাবে এটা কাজ করে:

এটি 123456789 এর সমস্ত সম্ভাব্য অনুমতি তৈরি করে এবং সেগুলি মনে রাখে। তারপরে এটি সুডোকুতে সারিগুলির সাথে আদেশের তুলনা করে। যখন কোনও প্রদানের সারিটির জন্য কোনও মিলে যায় এমন ক্রিয়াকলাপ পাওয়া যায় তখন তা সেই অনুমানের সূচকের কথা মনে রাখে। প্রতিটি সারির পরে এটি সমস্ত ক্রম সরিয়ে ফেলবে যেখানে বর্তমান সারির সমান অবস্থানে কমপক্ষে একটি চর রয়েছে। এটি নিশ্চিত করে যে প্রতিটি সংখ্যা তার কলামে অনন্য। তারপরে এটি এমন সমস্ত অনুমতিগুলি নিয়ে যায় যা বাক্স-মানদণ্ডের দ্বারা আর কাজ করে না। যেহেতু শেষ সারিটি তুচ্ছ, এটি 8 সংখ্যা উত্পন্ন করে। আমি পরীক্ষ করেছি যে এই সংখ্যার প্রত্যেকটির সর্বোচ্চ মানটি কী হবে এবং সেইগুলির প্রতিটি পজিশনের জন্য একটি ডিজিট-কাউন্ট-মাস্ক তৈরি করেছে। {6, 5, 3, 5, 3, 1, 2, 1, 1}। প্রথমটি সম্ভবত স্পষ্টভাবে দীর্ঘতম 362880 ক্রমবিধি সহ। ডিজিটমাস্ক ব্যবহার করে আমি একটি 28 টি দীর্ঘ দীর্ঘ করতে একটি শীর্ষস্থানীয় 1 দিয়ে একটি বিগইন্টিজার নির্মাণ করি। মোট 11 বাইটে এর ফলাফল। তারপরে সেই বাইটগুলি বেস 64 এ রূপান্তরিত হয়। একটি চর সংরক্ষণ করতে আমি শেষে = চিহ্ন সরিয়ে ফেলি।

পুনর্গঠন একইসাথে কাজ করে।

এটি বেস 64 স্ট্রিং থেকে বিগইন্টিজার পুনর্গঠন করে এবং তারপরে আবার স্ট্রিংয়ে পরিণত হয় এবং উল্লিখিত অঙ্ক-গণনা-মুখোশ ব্যবহার করে আবার বিভাজন করে। এই স্ট্রিংগুলি সূচকগুলিতে ফিরে যায়।

তারপরে অ্যালগোরিদম প্রায় একই কাজ করে, ক্রমগুলি সারিটি সন্ধান করার পরিবর্তে এটি সারিটি পেতে সূচকটি ব্যবহার করে, বাকীগুলি একই কাজ করে।

সম্ভবত এটি কেবলমাত্র 64 এর পরিবর্তে 94 সম্ভাব্য চর্যাচটারগুলি ব্যবহার করা কিছুটা ভাল হতে পারে তবে এটি করার জন্য আমার মস্তিষ্কের অভাব রয়েছে।

উত্স : অনুলিপি- এবং এটি 10 ​​টি উদাহরণ দিয়ে চালিত করতে পেষ্টযোগ্য। .ডটনেট-ফিডল আমাকে বলেছে এটি স্মৃতিশক্তি ছাড়িয়ে গেছে তাই আপনাকে এটি পাঠাতে আপনার মেশিনে চালানো দরকার।

using System;
using System.Collections.Generic;
using System.Linq;
using System.Numerics;
using System.Text;

public class Programm
{
    public static void Main(string[] args)
    {
        string[] input = new[] {
            "973581426526473198184296753247865319398124675651739842819342567765918234432657981",
            "724865193169243875385197246896724351273951684451386927542639718618572439937418562", 
            "157682349432519687698347251825476193713928465964135728541293876289761534376854912", 
            "835416927296857431417293658569134782123678549748529163652781394981345276374962815", 
            "628451793594732681713689542247315869961827354385964217156243978439578126872196435", 
            "123456789456789123789123456214365897365897214897214365531648972648972531972531648", 
            "145792836376584192298361754731928645859647321462135987624873519587419263913256478",
            "527416938864329157139578642291854376348697521675132489712945863483261795956783214", 
            "246713985185496732937825146678542391493168257512379468824957613759631824361284579",
            "861294573475318692392567814236459781154783269987621345529176438648932157713845926" };

        string[] permutations = GetPermutations();
        foreach (string sudoku in input)
        {

            int[] indices = _compressSudoku(sudoku, permutations).ToArray();
            string compressedRepresentation = _toCompressedRepresentation(indices);

            Console.WriteLine(compressedRepresentation);
            indices = _fromCompressedRepresentation(compressedRepresentation);
            string decompressedSudoku = _decompressSudoku(indices, permutations);

            if (decompressedSudoku != sudoku)
                throw new Exception();
        }
        Console.ReadKey();
    }

    static int[] _digitMask = new int[] { 6, 5, 3, 5, 3, 1, 2, 1, 1 };

    private static int[] _fromCompressedRepresentation(string compressedRepresentation)
    {
        BigInteger big = new BigInteger(Convert.FromBase64String(compressedRepresentation + "="));

        string stringValue = big.ToString().Substring(1);

        List<int> indexes = new List<int>();
        int i = 0;
        while (stringValue.Length > 0)
        {
            int length = _digitMask[i++];
            string current = stringValue.Substring(0, length);
            stringValue = stringValue.Substring(length);
            indexes.Add(int.Parse(current));
        }
        return indexes.ToArray(); ;
    }

    private static string _toCompressedRepresentation(int[] indices)
    {
        StringBuilder builder = new StringBuilder("1");
        int i = 0;
        foreach (int index in indices)
        {
            string mask = "{0:D" + _digitMask[i++].ToString() + "}";
            builder.AppendFormat(mask, index);
        }

        string base64 = Convert.ToBase64String(BigInteger.Parse(builder.ToString()).ToByteArray());
        return base64.Substring(0, base64.Length - 1); // remove the = at the end.
    }

    private static IEnumerable<int> _compressSudoku(string input, string[] remainingPermutations)
    {
        string[] localRemainingPermutations = null;
        List<HashSet<char>> localUsed = null;
        for (int i = 0; i < 8; i++)
        {
            string currentRow = _getCurrentRow(input, i);
            if (i % 3 == 0)
            {
                localRemainingPermutations = remainingPermutations;
                localUsed = _initLocalUsed();
            }

            int index = 0;
            foreach (string permutation in localRemainingPermutations)
            {
                if (permutation == currentRow)
                {
                    yield return index;
                    break;
                }
                index++;
            }
            remainingPermutations = remainingPermutations.Where(permutation => _isStillValidPermutation(currentRow, permutation)).ToArray();
            if (i % 3 < 2)
            {
                for (int j = 0; j < 9; j++)
                    localUsed[j / 3].Add(currentRow[j]);
                localRemainingPermutations = localRemainingPermutations.Where(permutation => _isStillValidLocalPermutation(permutation, localUsed)).ToArray();
            }
        }
    }

    private static string _decompressSudoku(int[] indices, string[] remainingPermutations)
    {
        StringBuilder result = new StringBuilder();

        string[] localRemainingPermutations = null;
        List<HashSet<char>> localUsed = null;
        for (int i = 0; i < 9; i++)
        {
            if (i % 3 == 0)
            {
                localRemainingPermutations = remainingPermutations;
                localUsed = _initLocalUsed();
            }
            string currentRow = localRemainingPermutations[i < indices.Length ? indices[i] : 0];
            result.Append(currentRow);

            remainingPermutations = remainingPermutations.Where(permutation => _isStillValidPermutation(currentRow, permutation)).ToArray();
            if (i % 3 < 2)
            {
                for (int j = 0; j < 9; j++)
                    localUsed[j / 3].Add(currentRow[j]);
                localRemainingPermutations = localRemainingPermutations.Where(permutation => _isStillValidLocalPermutation(permutation, localUsed)).ToArray();
            }
        }
        return result.ToString();
    }

    private static string _getCurrentRow(string input, int i)
    {
        return new string(input.Skip(i * 9).Take(9).ToArray());
    }

    private static List<HashSet<char>> _initLocalUsed()
    {
        return new List<HashSet<char>> { new HashSet<char>(), new HashSet<char>(), new HashSet<char>() };
    }

    private static bool _isStillValidLocalPermutation(string permutation, List<HashSet<char>> localUsed)
    {
        for (int i = 0; i < 9; i++)
        {
            if (localUsed[i / 3].Contains(permutation[i]))
                return false;
        }
        return true;
    }

    private static bool _isStillValidPermutation(string currentRow, string permutation)
    {
        return permutation.Select((c, j) => c != currentRow[j]).All(b => b);
    }

    static string[] GetPermutations(char[] chars = null)
    {
        if (chars == null)
            chars = new[] { '1', '2', '3', '4', '5', '6', '7', '8', '9' };
        if (chars.Length == 2)
            return new[] { new String(chars), new String(chars.Reverse().ToArray()) };
        return chars.SelectMany(c => GetPermutations(chars.Where(sc => sc != c).ToArray()), (c, s) => c + s).ToArray();
    }
}

1

পার্ল - 290 টি অক্ষর = 290 পয়েন্ট

এই প্রোগ্রামটি কোনও হার্ড কোডিং ব্যবহার করে না এবং নির্ভরযোগ্যভাবে একটি গ্রিডকে ঠিক 29 টি চরিত্রের মধ্যে সংকোচিত করে তোলে (তাত্ত্বিকভাবে কিছু ছোটগুলি খুঁজে পাওয়া সম্ভব হবে)।

এখানে কিভাবে এটা কাজ করে:

  • প্রথমে 9 x 9 অ্যারে 60 সংখ্যায় রূপান্তর করুন। এটি সর্বশেষ কলাম, শেষ সারি এবং প্রতিটি 3 x 3 ঘরের চূড়ান্ত বর্গক্ষেত্র হিসাবে ফেলে দেওয়া যেতে পারে।

  • তারপরে 9 ^ 60 উপাদান ব্যবহার করে বিগিন্টকে একটি একক পূর্ণসংখ্যায় রূপান্তর করুন।

  • তারপরে বিগিন্টকে বেস 95 এ রূপান্তর করুন।

সংক্ষেপক এবং সংক্ষেপক:

#!/usr/bin/perl

use strict;
use warnings;
use Getopt::Long;
use bigint;

sub compress
{
    my @grid;
    my @nums;
    while (<>)
    {
        push @grid, [split];
    }

    # encode into 60 numbers omitting last from each row, column and 3 x 3 square
    my $i;
    my $j;
    for ($i=0; $i<=7; $i++)
    {
        for ($j=0; $j<=7; $j++)
        {
            push @nums, $grid[$i][$j] if (($i % 3 !=2 ) || ($j % 3 !=2));
        }
    }

    # encode into a big int
    my $code = 0;
    foreach my $n (@nums)
    {
        $code = $code * 9 + ($n-1);
    }

    # print in base 95
    my $out="";
    while ($code)
    {
        my $digit = $code % 95;
        $out = chr($digit+32).$out;
        $code -= $digit;
        $code /= 95;
    }

    print "$out";
}

sub decompress
{
    my @grid;
    my @nums;
    my $code = 0;

    # Read from base 95 into bigint
    while (<>)
    {
        chomp;
        foreach my $char (split (//, $_))
        {
            my $c =ord($char)-32;
            $code*=95;
            $code+=$c;
        }
    }

    # convert back to 60 numbers
    for (my $n = 0; $n<60; $n++)
    {
        my $d = $code % 9;
        $code -= $d;
        $code/=9;
        unshift @nums, $d+1;
    }

    # print filling in last column, row and 3 x 3 square
    for (my $i=0; $i<=8; $i++)
    {
        for (my $j=0; $j<=8; $j++)
        {
            if ($j == 8)
            {
                my $tot = 0;
                for (my $jj = 0; $jj<=7; $jj++)
                {
                    $tot += $grid[$i][$jj];
                }
                $grid[$i][$j]=45-$tot;
            }
            elsif ($i == 8)
            {
                my $tot = 0;
                for (my $ii = 0; $ii<=7; $ii++)
                {
                    $tot += $grid[$ii][$j];
                }
                $grid[$i][$j]=45-$tot;
            }
            elsif (($i % 3 == 2 ) && ($j % 3 == 2))
            {
                my $tot = 0;
                for (my $ii = $i-2; $ii<=$i; $ii++)
                {
                    for (my $jj = $j-2; $jj<=$j; $jj++)
                    {
                        next if (($ii % 3 == 2 ) && ($jj % 3 == 2));
                        $tot += $grid[$ii][$jj];
                    }
                }
                $grid[$i][$j]=45-$tot;
            }
            else
            {
                $grid[$i][$j] = shift @nums;
            }

            print $grid[$i][$j].(($j==8)?"":" ");
        }
        print "\n";
    }
}

my $decompress;
GetOptions ("d|decompress" => \$decompress);

if ($decompress)
{
    decompress;
}
else
{
    compress;
}

যে স্কোর বাইট বা পয়েন্ট?
বিল উড্ডার

@ বিলডুজারকে আমি মনে করি বাইটস (ভাল, অক্ষর) = পয়েন্ট?
17l7 এবলিগ

1

পিএইচপি, 214

<?php
// checks each row/col/block and removes impossible candidates
function reduce($cand){
    do{
        $old = $cand;
        for($r = 0; $r < 9; ++$r){
        for($c = 0; $c < 9; ++$c){
            if(count($cand[$r][$c]) == 1){ // if filled in
                // remove values from row and col and block
                $remove = $cand[$r][$c];
                for($i = 0; $i < 9; ++$i){
                    $cand[$r][$i] = array_diff($cand[$r][$i],$remove);
                    $cand[$i][$c] = array_diff($cand[$i][$c],$remove);
                    $br = floor($r/3)*3+$i/3;
                    $bc = floor($c/3)*3+$i%3;
                    $cand[$br][$bc] = array_diff($cand[$br][$bc],$remove);
                }
                $cand[$r][$c] = $remove;
            }
        }}
    }while($old != $cand);
    return $cand;
}

// checks candidate list for completion
function done($cand){
    for($r = 0; $r < 9; ++$r){
    for($c = 0; $c < 9; ++$c){
        if(count($cand[$r][$c]) != 1)
            return false;
    }}
    return true;
}

// board format: [[1,2,0,3,..],[..],..], $b[$row][$col]
function solve($board){
    $cand = [[],[],[],[],[],[],[],[],[]];
    for($r = 0; $r < 9; ++$r){
    for($c = 0; $c < 9; ++$c){
        if($board[$r][$c]){ // if filled in
            $cand[$r][$c] = [$board[$r][$c]];
        }else{
            $cand[$r][$c] = range(1, 9);
        }
    }}
    $cand = reduce($cand);

    if(done($cand))  // goto not really necessary
        goto end;    // but it feels good to use it 
    else return false;

    end:
    // back to board format
    $b = [];
    for($r = 0; $r < 9; ++$r){
        $b[$r] = [];
        for($c = 0; $c < 9; ++$c){
            if(count($cand[$r][$c]) == 1)
                $b[$r][$c] = array_pop($cand[$r][$c]);
            else 
                $b[$r][$c] = 0;
        }
    }
    return $b;
}

function add_zeros($board, $ind){
    for($r = 0; $r < 9; ++$r){
    for($c = 0; $c < 9; ++$c){
        $R = ($r + (int)($ind/9)) % 9;
        $C = ($c + (int)($ind%9)) % 9;
        if($board[$R][$C]){
            $tmp = $board[$R][$C];
            $board[$R][$C] = 0;
            if(!solve($board))
                $board[$R][$C] = $tmp;
        }   
    }}
    return $board;
}

function base95($str, $b, $z){
    $tmp = gmp_init($str, $b); $zero = gmp_init(0); $gmp95 = gmp_init(95);
    $out = '';
    while(gmp_cmp($tmp, $zero) > 0){
        $arr = gmp_div_qr($tmp, $gmp95);
        $tmp = $arr[0];
        $out .= chr(32+gmp_intval($arr[1]));
    }
    $out = chr((32+($z << 2))|($b - 10)) . strrev($out);
    return $out;
}

function encode($board, $ind){
    // remove last row+col
    $board[8] = [0,0,0,0,0,0,0,0,0];
    foreach($board as &$j) $j[8] = 0;

    // remove bottom corner of each box
    $board[2][2] = $board[2][5] = $board[5][2] = $board[5][5] = 0;

    $board = add_zeros($board, $ind);

    $str = '';$z=0;
    for($r = 0; $r < 8; ++$r){
        for($c = 0; $c < 8; ++$c){
            if(($r==2||$r==5)&&($c==2||$c==5)) continue;
            if($str == '' && !$board[$r][$c]) ++$z;
            else $str .= $board[$r][$c];
        }
    }

    $b10 = base95(rtrim($str,'0'), 10, $z);
    $b11 = base95(rtrim(str_replace(['00'],['A'],$str),'0'), 11, $z);
    $b12 = base95(rtrim(str_replace(['000','00'],['B','A'],$str),'0'), 12, $z);

    $l10 = strlen($b10);
    $l11 = strlen($b11);
    $l12 = strlen($b12);
    var_dump($z);
    if($l10 < $l11)
        if($l10 < $l12)
            return $b10;
        else 
            return $b12;
    else
        if($l11 < $l12)
            return $b11;
        else 
            return $b12;    
}

function decode($str){
    $fc = ord($str[0]);
    $base = 10 + ($fc & 3);
    $z = ($fc - 32) >> 2;

    $tmp = gmp_init(0);
    $zero = gmp_init(0); $gmp95 = gmp_init(95);
    while(strlen($str = substr($str, 1))){
        $tmp = gmp_mul($tmp, $gmp95);
        $tmp = gmp_add($tmp, gmp_init(ord($str[0])-32));
    }
    $str = gmp_strval($tmp, $base);
    $expanded = str_repeat('0', $z) . str_replace(['a','b'],['00','000'],$str) . str_repeat('0', 81);

    $board = [];
    $ind = 0;
    for($i = 0; $i < 8; ++$i){
        $board[$i] = [];
        for($j = 0; $j < 8; ++$j){
            if(($i == 2 || $i == 5) && ($j == 2 || $j == 5)) 
                $board[$i][$j] = 0;
            else
                $board[$i][$j] = (int)$expanded[$ind++];
        }
        $board[$i][8] = 0;
    }
    $board[8] = [0,0,0,0,0,0,0,0,0];
    return solve($board);
}

function printBoard($board){
    for($i = 0; $i < 9; ++$i){
        echo implode(' ', $board[$i]) . PHP_EOL;
    }
    flush();
}

function readBoard(){
    $board = [];
    for($r = 0; $r < 9; ++$r){
        $board[$r] = fscanf(STDIN, "%d%d%d%d%d%d%d%d%d");
    }
    return $board;
}
if(isset($argv[1])){
    if($argv[1] === 'enc'){
        $board = readBoard();
        $bests = ''; $bestl = 999;
        for($i = 0; $i < 71; ++$i){
            $str = encode($board, $i);
            $len = strlen($str);
            if($len < $bestl){
                $bestl = $len;
                $bests = $str;
            }
        }
        echo $bests . PHP_EOL;
    }else if($argv[1] === 'dec'){
        echo printBoard(decode(trim(fgets(STDIN))));
    }
}else{
    echo "Missing argument. Use `{$argv[0]} [enc|dec]`.\n";
}

এই সমাধানটি প্রথমে ডান কলাম এবং নীচের সারিটি পাশাপাশি প্রতিটি 3x3 ব্লকের নীচে-ডান কোণটি পরিষ্কার করে। এরপরে এটি একটি ঘর পরিষ্কার করার চেষ্টা করে। যদি একটি সহজ সমাধান উপস্থিত থাকে, ঘর ফাঁকা থাকে।

তারপরে, সুডোকু গ্রিডটি ডান কলাম, নীচের সারি এবং নীচে-ডান কোণটি বাদ দিয়ে বাম থেকে ডানে এবং উপরে থেকে নীচে একটি স্ট্রিংয়ে ফর্ম্যাট করা হবে। শীর্ষস্থানীয় শূন্যগুলি গণনা করা হয় (এটি হতে দিন z) এবং সরানো হয়েছে। চলন্ত শূন্যগুলি একইভাবে সরানো হয়েছে।

স্ট্রিংটি দুটি জিরোর প্রতিনিধিত্ব করে একটি বেস 10, 11 বা 12 পূর্ণসংখ্যায় (এই বেসটি হতে দিন b) ফর্ম্যাট করা হয়েছে AএবংB তিনটি ।

এটি একটি বেস -৯৯ পূর্ণসংখ্যায় রূপান্তরিত হয় এবং বেস -৯৯ সংখ্যার প্রতিনিধিত্ব করে এটি প্রেরেন্ট করা হয় z << 2 | (b - 10)

php sudoku-compress.php encএনকোড এবং php sudoku-compress.php decডিকোড করতে কল করুন। এনকোডার একটি বাধ্যতামূলকভাবে চলন্ত নতুন লাইনের সাথে প্রশ্নটিতে দেওয়া বিন্যাসটি গ্রহণ করে takes

পরীক্ষার ফলাফল:

R'Ngxgi#Hu~+cR)0nE)+
Veu-b454j|:tRm(b-Xk'I
V.{mi;*6-/9Ufu[~GE"e>
F/YgX]PeyeKX5=M_+,z+Z
R&3mEHyZ6sSF'-$L<:VmX
"#b'npsIv0%L,t0yr^a.+'&
UNjx*#~I/siBGck7u9eaC%
Z!SuM^f{e<ji@F&hP-S<
*0:43tD r;=x8|&I0/k[&%
B1Mm-dx@G}[2lZId/-'h{zU

1

জাভা, 330 পয়েন্ট

এ জাতীয় উচ্চ স্কোরের জন্য আমি বিদ্রূপ করার আগে আমাকে স্পষ্ট করে বলি যে আমি এটি চেষ্টা করার চেষ্টা করেছি এবং এটি ভিন্ন ধরণের সমাধান করার চেষ্টা করেছি কারণ এটি জেনে রাখা সম্ভবত এখানে আরও ভাল উত্তরের মতো যথেষ্ট অনুকূল হবে না। আমি বেশী বা কম কৌতুহলী যদি আমি পেতে পারে ছিল ঘনিষ্ঠ যা আমার বিস্ময় আমি বুঝতে পারছি না ঠিক কত খারাপ তা আবর্তিত হবে। আমার পদ্ধতির যা ছিল তা এখানে রইল:

  1. সুডোকু ধাঁধা সমাধানের জন্য বিকাশ করুন।

  2. এমন একটি স্ক্র্যাম্বিং আলগো বিকাশ করুন যা এখনও সমাধানযোগ্য হতে পারে। হাতের আগে তুচ্ছভাবে নির্ধারণ করা যেতে পারে এমন চিহ্নগুলি অপসারণ করার সময় এটি কিছুটা এলোমেলোভাবে এটি করে। এটি অনেক দীর্ঘ সময় নেওয়ার আগে আমি নির্ভরযোগ্যভাবে প্রায় 22 টি ক্লু পেতে পারি।

  3. একবার স্ক্যাম্বলড হয়ে গেলে ধাঁধাটি প্রতিটি ক্লুটির জন্য একক অঙ্কের পূর্ণসংখ্যার একটি ট্রিপল দ্বারা প্রতিনিধিত্ব করা যেতে পারে, আমার ক্ষেত্রে ৩ এর ২২ টি ট্রিপল্ট আমি ভেবেছিলাম যদি আমি এগুলিকে একক digit 66 ডিজিটের সংখ্যায় একত্রিত করতে পারি তবে বেস95 এই কোডটি এনকোড করে তবে আমার এমন কিছু আছে যা পারে সহজেই ডিকোড করা হবে।

এনকোডযুক্ত স্ট্রিংটি প্রায় আমি প্রায় 33 টি অক্ষর লম্বায় প্রত্যাশার চেয়ে দীর্ঘ হয়ে যায়। আমি জাভা বিগইন্টিজার ব্যবহারের চেয়ে বিকল্প পন্থায় চেষ্টা করেছি যেখানে আমি একটি গ্রিডের ৮১ টি কোষের প্রতিনিধিত্বকারী ৮১ বিট মাস্ক থেকে একটি বৃহত সংখ্যক তৈরি করেছি যেখানে এই কোষের জন্য একটি ক্লু বিদ্যমান বলে বোঝায়। আমি তখন বিটমাস্কটি প্রতিটি সেল মানের 4 বিট উপস্থাপনাগুলিকে অনুক্রমিক ক্রমে একত্রিত করে বাইট অবধি গোল করে দেখতে পেলাম বেস বেস 95 এনকোড করার পরে আমি প্রায় একই এনকোডযুক্ত স্ট্রিংয়ের দৈর্ঘ্য পেয়েছি।

সুতরাং মূলত আমি আমার কোড পোস্ট করছি যদি কেউ কোনও ভিন্ন পদ্ধতির সাথে আগ্রহী যেটি এত ভাল কাজ করে না।

ক্লাস পাজ

public class Puzz {

    enum By {
        Row, Column, Block
    }

    static final List<Integer> NUMBERS = Arrays.asList(new Integer[] { 1, 2, 3,
            4, 5, 6, 7, 8, 9 });

    List<Square> entries = new ArrayList<Square>();
    HashMap<Integer, List<Square>> squaresByRow = new HashMap<Integer, List<Square>>();
    HashMap<Integer, List<Square>> squaresByColumn = new HashMap<Integer, List<Square>>();
    HashMap<Integer, List<Square>> squaresByBlock = new HashMap<Integer, List<Square>>();

    public Puzz(int[][] data) {

        // Create squares put them in squares by row hashtable
        for (int r = 0; r < 9; r++) {
            List<Square> squaresInRow = new ArrayList<Square>();
            for (int c = 0; c < 9; c++) {
                Square square = new Square(r, c, data[r][c], this);
                entries.add(square);
                squaresInRow.add(square);
            }
            squaresByRow.put(r, squaresInRow);
        }

        // Put squares in column hash table
        for (int c = 0; c < 9; c++) {
            List<Square> squaresInColumn = new ArrayList<Square>();
            for (int r = 0; r < 9; r++) {
                squaresInColumn.add(squaresByRow.get(r).get(c));
            }
            squaresByColumn.put(c, squaresInColumn);
        }

        // Put squares in block hash table
        for (int i = 1; i < 10; i++) {
            squaresByBlock.put(i, new ArrayList<Square>());
        }
        for (int r = 0; r < 9; r++) {
            for (int c = 0; c < 9; c++) {
                int block = getBlock(r, c);
                squaresByBlock.get(block).add(get(r, c));
            }
        }

        // Discover the possibilities
        updatePossibilities();
    }

    public void updatePossibilities() {
        for (int r = 0; r < 9; r++) {
            for (int c = 0; c < 9; c++) {
                Square theSquare = get(r, c);
                if (theSquare.value != 0) {
                    theSquare.possibilities.removeAll(NUMBERS);
                    continue;
                } else {
                    theSquare.possibilities.addAll(NUMBERS);
                }
                int block = getBlock(r, c);
                HashSet<Square> squares = new HashSet<Square>();
                squares.addAll(squaresByRow.get(r));
                squares.addAll(squaresByColumn.get(c));
                squares.addAll(squaresByBlock.get(block));
                for (Square s : squares) {
                    if (s == theSquare)
                        continue;

                    theSquare.possibilities.remove(s.value);
                }
            }
        }
    }

    public int getValue(int row, int column) {
        return squaresByRow.get(row).get(column).value;
    }

    public Square get(int row, int column) {
        return squaresByRow.get(row).get(column);
    }

    public boolean set(int row, int column, int value) {
        if (value == 0) {
            squaresByRow.get(row).get(column).value = 0;
            updatePossibilities();
            return true;
        }

        if (isValid(row, column, value)) {
            squaresByRow.get(row).get(column).value = value;
            updatePossibilities();
            return true;
        } else {
            return false;
        }
    }

    public boolean isValidSubset(By subset, int row, int column, int value) {
        List<Dubs> dubss = new ArrayList<Dubs>();
        List<Trips> tripss = new ArrayList<Trips>();
        Square theSquare = get(row, column);
        int block = getBlock(row, column);
        List<Square> squares = new ArrayList<Square>();
        switch (subset) {
        case Row:
            squares.addAll(squaresByRow.get(row));
            break;
        case Column:
            squares.addAll(squaresByColumn.get(column));
            break;
        default:
            squares.addAll(squaresByBlock.get(block));
            break;
        }

        for (Square r : squares) {
            if (r == theSquare)
                continue;
            // if any of the impacted squares have this value then it is not a
            // valid value
            if (r.value == value)
                return false;

            if (r.possibilities.size() == 3) {
                List<Integer> poss = new ArrayList<Integer>(r.possibilities);
                tripss.add(new Trips(poss.get(0), poss.get(1), poss.get(2),
                        r.row, r.col));
            }

            if (r.possibilities.size() == 2) {
                List<Integer> poss = new ArrayList<Integer>(r.possibilities);
                dubss.add(new Dubs(poss.get(0), poss.get(1), r.row, r.col));
            }
        }

        // Find the trips and rule out the value if a triplet exists in squares
        List<Trips> tripsCopy = new ArrayList<Trips>(tripss);
        for (Trips trips : tripsCopy) {
            int countOfOccurrences = 0;
            for (Trips tr : tripss) {
                if (tr.equals(trips) && !(tr.row == row && tr.col == column))
                    countOfOccurrences++;
            }

            for (Dubs dubs : dubss) {
                if (trips.containedWithin(dubs)
                        && !(dubs.row == row && dubs.col == column))
                    countOfOccurrences++;
            }

            if (countOfOccurrences == 3 && trips.containedWithin(value))
                return false;
        }

        // Find the dubs and rule out the value if a double exists in squares
        List<Dubs> dubsCopy = new ArrayList<Dubs>(dubss);
        for (Dubs dubs : dubsCopy) {
            int countOfOccurrences = 0;
            for (Dubs du : dubss) {
                // Count occurrences of Dubs that are not the tested square
                if (du.equals(dubs) && !(du.row == row && du.col == column))
                    countOfOccurrences++;
            }

            if (countOfOccurrences == 2 && dubs.containedWithin(value))
                return false;
        }

        return true;
    }

    public boolean isValid(int row, int column, int value) {

        return isValidSubset(By.Row, row, column, value)
                && isValidSubset(By.Column, row, column, value)
                && isValidSubset(By.Block, row, column, value);
    }

    public int getBlock(int row, int column) {
        int blockRow = (int) Math.floor(row / 3);
        int columnRow = (int) Math.floor(column / 3) + 1;
        return (blockRow * 3) + columnRow;
    }

    public Puzz solve(Puzz arg, boolean top) throws Exception {
        // Make an original copy of the array
        Puzz p = (Puzz) arg.clone();
        for (int i = 1; i < 10; i++) {
            for (Square s : p.squaresByBlock.get(i)) {
                if (s.value == 0) {
                    for (Integer number : NUMBERS) {
                        if (p.set(s.row, s.col, number)) {
                            // System.out.println(p);
                            Puzz solved = solve(p, false);
                            if (solved != null)
                                return solved;
                        }
                    }
                    // no numbers fit here, return null and backtrack
                    p.set(s.row, s.col, 0);
                    return null;
                }
            }
        }

        // Check for remaining 0's
        for (Square s : p.entries) {
            if (s.value == 0)
                return null;
        }
        return p;
    }

    public Puzz scramble(int clues) throws Exception {
        Puzz p = (Puzz) clone();
        Random rand = new Random();
        int removed = 0;

        //Remove the last row, it is a freebie
        int toRemove = 81 - clues - 15;
        for (int c = 0; c < 9; c++) {
            p.set(8, c, 0);
        }
        p.set(0, 0, 0);
        p.set(0, 3, 0);
        p.set(0, 6, 0);
        p.set(3, 0, 0);
        p.set(3, 3, 0);
        p.set(3, 6, 0);

        // Keeping track of this because randomly removing squares can potentially create an 
        // unsolvable situation
        HashSet<Square> alreadyTried = new HashSet<Square>();
        while (removed < toRemove) {
            if (alreadyTried.size() >= ((toRemove + clues) - removed)) {
                // Start over
                removed = 0;
                alreadyTried = new HashSet<Square>();
                p = (Puzz)clone();
                for (int c = 0; c < 9; c++) {
                    p.set(8, c, 0);
                }
                p.set(0, 0, 0);
                p.set(0, 3, 0);
                p.set(0, 6, 0);
                p.set(3, 0, 0);
                p.set(3, 3, 0);
                p.set(3, 6, 0);
            }
            int randX = rand.nextInt((7) + 1);
            int randY = rand.nextInt((8) + 1);
            int existingValue = p.getValue(randX, randY);
            if (existingValue != 0) {
                p.set(randX, randY, 0);
                // confirm it is still solvable after removing this item
                Puzz psol = solve(p, true);
                if (psol != null && psol.equals(this)) {
                    removed++;
                    alreadyTried = new HashSet<Square>();
                    System.out.println("Clues Remaining: " + (81 - 15 - removed));
                } else {
                    // otherwise set it back to what it was and try again
                    p.set(randX, randY, existingValue);
                    Square s = new Square(randX, randY, existingValue, p);
                    alreadyTried.add(s);
                }
            }

        }
        p.updatePossibilities();
        return p;
    }

    public static String encode(Puzz p) { // Remove all zero'ed items
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < 9; i++) {
            for (Square s : p.squaresByRow.get(i)) {
                if (s.value == 0)
                    continue;
                sb.append(s.row).append(s.col).append(s.value);
            }
        }

        // number mod 95 gives lowest digit, subtract that from original number
        BigInteger num = new BigInteger(sb.toString());
        byte[] numBytes = num.toByteArray();

        StringBuffer retVal = new StringBuffer();
        while (num.compareTo(BigInteger.ZERO) > 0) {
            int modu = num.mod(new BigInteger("95")).intValue();
            retVal.append((char) (modu + 32));
            num = num.subtract(new BigInteger("" + modu));
            num = num.divide(new BigInteger("95"));
        }
        return retVal.toString();
    }


    @Override
    public boolean equals(Object arg0) {
        if (arg0 == null || !(arg0 instanceof Puzz))
            return false;

        Puzz p = (Puzz) arg0;
        for (int r = 0; r < 9; r++) {
            for (int c = 0; c < 9; c++) {
                int val1 = getValue(r, c);
                int val2 = p.getValue(r, c);
                if (val1 != val2)
                    return false;
            }
        }
        return true;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        int[][] data = new int[9][9];
        for (Square square : entries) {
            data[square.row][square.col] = square.value;
        }

        return new Puzz(data);
    }

    @Override
    public String toString() {
        if (entries == null)
            return "";
        StringBuffer sb = new StringBuffer();
        for (int r = 0; r < 9; r++) {
            for (int c = 0; c < 9; c++) {
                sb.append(getValue(r, c)).append(' ');
            }
            sb.append('\n');
        }
        return sb.toString();
    }

}

class Square {

    public Square(int row, int col, Puzz p) {
        this.row = row;
        this.col = col;
        this.p = p;
    }

    public Square(int row, int col, int value, Puzz p) {
        this(row, col, p);
        this.value = value;
    }

    int row;
    int col;
    int value;
    HashSet<Integer> possibilities = new HashSet<Integer>(Puzz.NUMBERS);
    Puzz p;

    @Override
    protected Object clone() throws CloneNotSupportedException {
        Square s = new Square(row, col, value, p);
        s.possibilities = new HashSet<Integer>();
        for (Integer val : possibilities) {
            s.possibilities.add(new Integer(val));
        }
        return s;
    }

    @Override
    public boolean equals(Object obj) {
        if (!(obj instanceof Square))
            return false;

        Square s = (Square) obj;
        return row == s.row && col == s.col && value == s.value
                && p.equals(s.p);
    }

    @Override
    public int hashCode() {
        return row ^ col ^ value ^ p.hashCode();
    }
}

class Dubs {
    int p1;
    int p2;

    int row, col;

    public Dubs(int p1, int p2) {
        this.p1 = p1;
        this.p2 = p2;
    }

    public Dubs(int p1, int p2, int row, int col) {
        this(p1, p2);
        this.row = row;
        this.col = col;
    }

    public boolean containedWithin(int value) {
        return (p1 == value || p2 == value);
    }

    @Override
    public boolean equals(Object arg0) {
        if (!(arg0 instanceof Dubs))
            return false;

        Dubs d = (Dubs) arg0;
        return (this.p1 == d.p1 || this.p1 == d.p2)
                && (this.p2 == d.p1 || this.p2 == d.p2);
    }
}

class Trips {
    int p1;
    int p2;
    int p3;
    int row, col;

    public Trips(int p1, int p2) {
        this.p1 = p1;
        this.p2 = p2;
    }

    public Trips(int p1, int p2, int p3) {
        this(p1, p2);
        this.p3 = p3;
    }

    public Trips(int p1, int p2, int p3, int row, int col) {
        this(p1, p2, p3);
        this.row = row;
        this.col = col;
    }

    public boolean containedWithin(int value) {
        return (p1 == value || p2 == value || p3 == value);
    }

    public boolean containedWithin(Dubs d) {
        return (d.p1 == p1 || d.p1 == p2 || d.p1 == p3)
                && (d.p2 == p1 || d.p2 == p2 || d.p2 == p3);
    }

    public boolean equals(Object arg0) {
        if (!(arg0 instanceof Trips))
            return false;

        Trips t = (Trips) arg0;
        return (this.p1 == t.p1 || this.p1 == t.p2 || this.p1 == t.p3)
                && (this.p2 == t.p1 || this.p2 == t.p2 || this.p2 == t.p3)
                && (this.p3 == t.p1 || this.p3 == t.p2 || this.p3 == t.p3);
    }
}

আমার পরীক্ষার কেস

public class TestCompression extends TestCase {

    public static int[][] test1 = new int[][] {
            new int[] { 9, 7, 3, 5, 8, 1, 4, 2, 6 },
            new int[] { 5, 2, 6, 4, 7, 3, 1, 9, 8 },
            new int[] { 1, 8, 4, 2, 9, 6, 7, 5, 3 },
            new int[] { 2, 4, 7, 8, 6, 5, 3, 1, 9 },
            new int[] { 3, 9, 8, 1, 2, 4, 6, 7, 5 },
            new int[] { 6, 5, 1, 7, 3, 9, 8, 4, 2 },
            new int[] { 8, 1, 9, 3, 4, 2, 5, 6, 7 },
            new int[] { 7, 6, 5, 9, 1, 8, 2, 3, 4 },
            new int[] { 4, 3, 2, 6, 5, 7, 9, 8, 1 } };
    public static int[][] test2 = new int[][] {
            new int[] { 7, 2, 4, 8, 6, 5, 1, 9, 3 },
            new int[] { 1, 6, 9, 2, 4, 3, 8, 7, 5 },
            new int[] { 3, 8, 5, 1, 9, 7, 2, 4, 6 },
            new int[] { 8, 9, 6, 7, 2, 4, 3, 5, 1 },
            new int[] { 2, 7, 3, 9, 5, 1, 6, 8, 4 },
            new int[] { 4, 5, 1, 3, 8, 6, 9, 2, 7 },
            new int[] { 5, 4, 2, 6, 3, 9, 7, 1, 8 },
            new int[] { 6, 1, 8, 5, 7, 2, 4, 3, 9 },
            new int[] { 9, 3, 7, 4, 1, 8, 5, 6, 2 } };
    public static int[][] test3 = new int[][] {
            new int[] { 1, 5, 7, 6, 8, 2, 3, 4, 9 },
            new int[] { 4, 3, 2, 5, 1, 9, 6, 8, 7 },
            new int[] { 6, 9, 8, 3, 4, 7, 2, 5, 1 },
            new int[] { 8, 2, 5, 4, 7, 6, 1, 9, 3 },
            new int[] { 7, 1, 3, 9, 2, 8, 4, 6, 5 },
            new int[] { 9, 6, 4, 1, 3, 5, 7, 2, 8 },
            new int[] { 5, 4, 1, 2, 9, 3, 8, 7, 6 },
            new int[] { 2, 8, 9, 7, 6, 1, 5, 3, 4 },
            new int[] { 3, 7, 6, 8, 5, 4, 9, 1, 2 } };
    public static int[][] test4 = new int[][] {
            new int[] { 8, 3, 5, 4, 1, 6, 9, 2, 7 },
            new int[] { 2, 9, 6, 8, 5, 7, 4, 3, 1 },
            new int[] { 4, 1, 7, 2, 9, 3, 6, 5, 8 },
            new int[] { 5, 6, 9, 1, 3, 4, 7, 8, 2 },
            new int[] { 1, 2, 3, 6, 7, 8, 5, 4, 9 },
            new int[] { 7, 4, 8, 5, 2, 9, 1, 6, 3 },
            new int[] { 6, 5, 2, 7, 8, 1, 3, 9, 4 },
            new int[] { 9, 8, 1, 3, 4, 5, 2, 7, 6 },
            new int[] { 3, 7, 4, 9, 6, 2, 8, 1, 5 } };
    public static int[][] test5 = new int[][] {
            new int[] { 6, 2, 8, 4, 5, 1, 7, 9, 3 },
            new int[] { 5, 9, 4, 7, 3, 2, 6, 8, 1 },
            new int[] { 7, 1, 3, 6, 8, 9, 5, 4, 2 },
            new int[] { 2, 4, 7, 3, 1, 5, 8, 6, 9 },
            new int[] { 9, 6, 1, 8, 2, 7, 3, 5, 4 },
            new int[] { 3, 8, 5, 9, 6, 4, 2, 1, 7 },
            new int[] { 1, 5, 6, 2, 4, 3, 9, 7, 8 },
            new int[] { 4, 3, 9, 5, 7, 8, 1, 2, 6 },
            new int[] { 8, 7, 2, 1, 9, 6, 4, 3, 5 } };
    public static int[][] test6 = new int[][] {
            new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 },
            new int[] { 4, 5, 6, 7, 8, 9, 1, 2, 3 },
            new int[] { 7, 8, 9, 1, 2, 3, 4, 5, 6 },
            new int[] { 2, 1, 4, 3, 6, 5, 8, 9, 7 },
            new int[] { 3, 6, 5, 8, 9, 7, 2, 1, 4 },
            new int[] { 8, 9, 7, 2, 1, 4, 3, 6, 5 },
            new int[] { 5, 3, 1, 6, 4, 8, 9, 7, 2 },
            new int[] { 6, 4, 8, 9, 7, 2, 5, 3, 1 },
            new int[] { 9, 7, 2, 5, 3, 1, 6, 4, 8 } };
    public static int[][] test7 = new int[][] {
            new int[] { 1, 4, 5, 7, 9, 2, 8, 3, 6 },
            new int[] { 3, 7, 6, 5, 8, 4, 1, 9, 2 },
            new int[] { 2, 9, 8, 3, 6, 1, 7, 5, 4 },
            new int[] { 7, 3, 1, 9, 2, 8, 6, 4, 5 },
            new int[] { 8, 5, 9, 6, 4, 7, 3, 2, 1 },
            new int[] { 4, 6, 2, 1, 3, 5, 9, 8, 7 },
            new int[] { 6, 2, 4, 8, 7, 3, 5, 1, 9 },
            new int[] { 5, 8, 7, 4, 1, 9, 2, 6, 3 },
            new int[] { 9, 1, 3, 2, 5, 6, 4, 7, 8 } };
    public static int[][] test8 = new int[][] {
            new int[] { 5, 2, 7, 4, 1, 6, 9, 3, 8 },
            new int[] { 8, 6, 4, 3, 2, 9, 1, 5, 7 },
            new int[] { 1, 3, 9, 5, 7, 8, 6, 4, 2 },
            new int[] { 2, 9, 1, 8, 5, 4, 3, 7, 6 },
            new int[] { 3, 4, 8, 6, 9, 7, 5, 2, 1 },
            new int[] { 6, 7, 5, 1, 3, 2, 4, 8, 9 },
            new int[] { 7, 1, 2, 9, 4, 5, 8, 6, 3 },
            new int[] { 4, 8, 3, 2, 6, 1, 7, 9, 5 },
            new int[] { 9, 5, 6, 7, 8, 3, 2, 1, 4 } };
    public static int[][] test9 = new int[][] {
            new int[] { 2, 4, 6, 7, 1, 3, 9, 8, 5 },
            new int[] { 1, 8, 5, 4, 9, 6, 7, 3, 2 },
            new int[] { 9, 3, 7, 8, 2, 5, 1, 4, 6 },
            new int[] { 6, 7, 8, 5, 4, 2, 3, 9, 1 },
            new int[] { 4, 9, 3, 1, 6, 8, 2, 5, 7 },
            new int[] { 5, 1, 2, 3, 7, 9, 4, 6, 8 },
            new int[] { 8, 2, 4, 9, 5, 7, 6, 1, 3 },
            new int[] { 7, 5, 9, 6, 3, 1, 8, 2, 4 },
            new int[] { 3, 6, 1, 2, 8, 4, 5, 7, 9 } };
    public static int[][] test10 = new int[][] {
            new int[] { 8, 6, 1, 2, 9, 4, 5, 7, 3 },
            new int[] { 4, 7, 5, 3, 1, 8, 6, 9, 2 },
            new int[] { 3, 9, 2, 5, 6, 7, 8, 1, 4 },
            new int[] { 2, 3, 6, 4, 5, 9, 7, 8, 1 },
            new int[] { 1, 5, 4, 7, 8, 3, 2, 6, 9 },
            new int[] { 9, 8, 7, 6, 2, 1, 3, 4, 5 },
            new int[] { 5, 2, 9, 1, 7, 6, 4, 3, 8 },
            new int[] { 6, 4, 8, 9, 3, 2, 1, 5, 7 },
            new int[] { 7, 1, 3, 8, 4, 5, 9, 2, 6 } };

    @Test
    public void test2() throws Exception {
        int encodedLength = 0;
        Puzz expected = new Puzz(test1);
        Puzz test = (Puzz) expected.clone();

        long start = System.currentTimeMillis();
        test = test.scramble(22);
        long duration = System.currentTimeMillis() - start;
        System.out.println("Duration of scramble for 22 clue puzzle: " + duration);
        System.out.println("Scrambled");
        System.out.println(test);

        String encoded = Puzz.encode(test);

        System.out.println("Encoded Length with BigInteger: " + encoded.length());
        encodedLength += encoded.length();


        expected = new Puzz(test2);
        test = (Puzz) expected.clone();

        start = System.currentTimeMillis();
        test = test.scramble(22);
        duration = System.currentTimeMillis() - start;
        System.out.println("Duration of scramble for 22 clue puzzle: " + duration);
        System.out.println("Scrambled");
        System.out.println(test);

        encoded = Puzz.encode(test);

        System.out.println("Encoded Length with BigInteger: " + encoded.length());
        encodedLength += encoded.length();

        expected = new Puzz(test3);
        test = (Puzz) expected.clone();

        start = System.currentTimeMillis();
        test = test.scramble(22);
        duration = System.currentTimeMillis() - start;
        System.out.println("Duration of scramble for 22 clue puzzle: " + duration);
        System.out.println("Scrambled");
        System.out.println(test);

        encoded = Puzz.encode(test);

        System.out.println("Encoded Length with BigInteger: " + encoded.length());
        encodedLength += encoded.length();

        expected = new Puzz(test4);
        test = (Puzz) expected.clone();

        start = System.currentTimeMillis();
        test = test.scramble(22);
        duration = System.currentTimeMillis() - start;
        System.out.println("Duration of scramble for 22 clue puzzle: " + duration);
        System.out.println("Scrambled");
        System.out.println(test);

        encoded = Puzz.encode(test);

        System.out.println("Encoded Length with BigInteger: " + encoded.length());
        encodedLength += encoded.length();

        expected = new Puzz(test5);
        test = (Puzz) expected.clone();

        start = System.currentTimeMillis();
        test = test.scramble(22);
        duration = System.currentTimeMillis() - start;
        System.out.println("Duration of scramble for 22 clue puzzle: " + duration);
        System.out.println("Scrambled");
        System.out.println(test);

        encoded = Puzz.encode(test);

        System.out.println("Encoded Length with BigInteger: " + encoded.length());
        encodedLength += encoded.length();

        expected = new Puzz(test6);
        test = (Puzz) expected.clone();

        start = System.currentTimeMillis();
        test = test.scramble(22);
        duration = System.currentTimeMillis() - start;
        System.out.println("Duration of scramble for 22 clue puzzle: " + duration);
        System.out.println("Scrambled");
        System.out.println(test);

        encoded = Puzz.encode(test);

        System.out.println("Encoded Length with BigInteger: " + encoded.length());
        encodedLength += encoded.length();

        expected = new Puzz(test7);
        test = (Puzz) expected.clone();

        start = System.currentTimeMillis();
        test = test.scramble(22);
        duration = System.currentTimeMillis() - start;
        System.out.println("Duration of scramble for 22 clue puzzle: " + duration);
        System.out.println("Scrambled");
        System.out.println(test);

        encoded = Puzz.encode(test);

        System.out.println("Encoded Length with BigInteger: " + encoded.length());
        encodedLength += encoded.length();

        expected = new Puzz(test8);
        test = (Puzz) expected.clone();

        start = System.currentTimeMillis();
        test = test.scramble(22);
        duration = System.currentTimeMillis() - start;
        System.out.println("Duration of scramble for 22 clue puzzle: " + duration);
        System.out.println("Scrambled");
        System.out.println(test);

        encoded = Puzz.encode(test);

        System.out.println("Encoded Length with BigInteger: " + encoded.length());
        encodedLength += encoded.length();

        expected = new Puzz(test9);
        test = (Puzz) expected.clone();

        start = System.currentTimeMillis();
        test = test.scramble(22);
        duration = System.currentTimeMillis() - start;
        System.out.println("Duration of scramble for 22 clue puzzle: " + duration);
        System.out.println("Scrambled");
        System.out.println(test);

        encoded = Puzz.encode(test);

        System.out.println("Encoded Length with BigInteger: " + encoded.length());
        encodedLength += encoded.length();

        expected = new Puzz(test10);
        test = (Puzz) expected.clone();

        start = System.currentTimeMillis();
        test = test.scramble(22);
        duration = System.currentTimeMillis() - start;
        System.out.println("Duration of scramble for 22 clue puzzle: " + duration);
        System.out.println("Scrambled");
        System.out.println(test);

encoded = Puzz.encode(test);
encodedLength += encoded.length();

        System.out.println("Final Result: " + encodedLength); 
    }

}

পরীক্ষার আউটপুট

Duration of scramble for 22 clue puzzle: 427614
Scrambled
0 0 3 0 0 0 0 0 6 
0 2 0 0 0 0 0 9 0 
0 0 0 0 9 6 7 5 0 
0 4 0 0 0 5 0 1 0 
0 0 0 1 0 0 0 0 0 
0 5 0 0 0 0 8 4 0 
0 0 0 3 0 0 5 0 7 
7 0 0 9 0 8 0 3 0 
0 0 0 0 0 0 0 0 0 

Building encoded string: U5[XZ+C6Bgf)}O."gDE)`\)kNv7*6}1w+
Encoded Length with BigInteger: 33

Duration of scramble for 22 clue puzzle: 167739
Scrambled
0 2 4 0 0 0 0 0 0 
1 6 0 0 4 0 8 0 5 
0 0 5 0 9 7 2 0 0 
0 0 0 0 2 4 0 0 1 
0 0 3 9 0 0 0 0 0 
0 0 0 0 0 0 0 0 7 
0 4 0 0 0 0 0 0 8 
0 1 0 5 0 0 0 3 0 
0 0 0 0 0 0 0 0 0 

Building encoded string: 7\c^oE}`H6@P.&E)Zu\t>B"k}Vf<[0a3&
Encoded Length with BigInteger: 33

Duration of scramble for 22 clue puzzle: 136364
Scrambled
0 0 7 0 8 0 0 0 0 
0 3 2 0 0 9 6 0 0 
0 0 0 0 0 0 2 5 0 
0 2 0 0 0 6 0 0 0 
0 0 0 9 0 0 0 0 0 
0 0 4 1 0 5 7 2 0 
5 0 1 0 0 0 0 7 0 
2 8 9 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 

Building encoded string: [S#bHlTDwS,&w,moQ{WN}Z9!{1C>.vN{-
Encoded Length with BigInteger: 33

Duration of scramble for 22 clue puzzle: 392150
Scrambled
0 0 0 0 0 6 0 0 0 
0 9 0 0 0 0 0 0 1 
4 0 0 0 0 3 6 0 8 
0 0 0 0 0 0 0 8 0 
0 0 3 0 7 8 0 0 9 
7 0 0 0 0 0 0 0 3 
6 0 2 0 0 0 0 9 0 
9 0 1 3 4 0 2 0 0 
0 0 0 0 0 0 0 0 0 

Building encoded string: T-yKJ2<d)Dj~[~>]334*9YpxM<JQNf2|<
Encoded Length with BigInteger: 33

Duration of scramble for 22 clue puzzle: 169355
Scrambled
0 0 0 0 0 1 0 0 0 
0 9 4 7 0 0 0 8 0 
0 1 3 0 0 0 5 0 2 
0 0 0 0 0 0 0 0 9 
0 0 0 0 2 7 3 5 4 
0 8 0 0 0 0 0 1 0 
0 0 0 0 4 0 9 0 8 
0 0 0 5 0 0 0 0 6 
0 0 0 0 0 0 0 0 0 

Building encoded string: 5@.=FmOKws7jl5*hWMQqqou\lv'e^Q}D:
Encoded Length with BigInteger: 33

Duration of scramble for 22 clue puzzle: 786
Scrambled
0 2 3 0 0 6 0 0 0 
0 5 0 7 0 0 1 2 3 
0 8 0 0 2 0 0 0 0 
0 0 0 0 0 5 0 0 7 
0 6 5 8 0 0 0 0 0 
0 0 7 0 0 4 3 0 0 
0 3 0 0 4 0 0 0 2 
0 0 0 0 0 2 0 0 0 
0 0 0 0 0 0 0 0 0 

Building encoded string: wY%(O9tOSDZu-PBaFl^.f0xH7C~e)=\3&
Encoded Length with BigInteger: 33

Duration of scramble for 22 clue puzzle: 826530
Scrambled
0 0 0 0 9 0 0 0 0 
0 0 0 0 0 0 0 0 0 
0 9 0 3 0 1 7 0 0 
0 3 0 0 0 8 0 4 5 
0 0 9 0 0 7 3 0 0 
0 0 2 0 3 0 0 8 0 
6 0 0 0 0 0 0 0 9 
5 0 0 4 1 0 2 0 3 
0 0 0 0 0 0 0 0 0 

Building encoded string: K|>.Aa?,8e&NRL;*ut=+Iqk8E$@&-zlF9
Encoded Length with BigInteger: 33

Duration of scramble for 22 clue puzzle: 4834
Scrambled
0 2 0 0 1 0 0 3 8 
8 6 0 3 0 0 1 0 0 
0 0 0 0 0 8 6 0 2 
0 0 0 0 0 0 0 7 0 
0 0 8 0 0 0 0 0 0 
0 0 0 0 3 0 0 0 0 
0 0 2 0 0 5 8 0 3 
4 0 0 0 0 1 7 9 0 
0 0 0 0 0 0 0 0 0 

Building encoded string: GOS0!r=&HR5PZ|ezy>*l7 HWU`wIN7Q4&
Encoded Length with BigInteger: 33

Duration of scramble for 22 clue puzzle: 42126
Scrambled
0 0 0 0 0 3 0 0 5 
0 0 5 4 0 0 0 3 2 
9 0 0 8 0 0 0 0 0 
0 0 0 0 0 2 0 0 0 
0 0 0 0 6 8 2 0 7 
5 1 0 0 7 0 0 0 8 
8 0 0 0 5 0 0 1 0 
7 0 0 0 0 0 0 0 4 
0 0 0 0 0 0 0 0 0 

Building encoded string: [4#9D_?I1.!h];Y_2!iqLyngbBJ&k)FF;
Encoded Length with BigInteger: 33

Duration of scramble for 22 clue puzzle: 156182
Scrambled
0 6 0 0 0 0 0 7 0 
4 0 5 3 1 0 0 0 2 
0 0 0 0 6 0 0 0 0 
0 3 0 0 0 9 0 8 1 
0 0 0 0 0 0 0 0 0 
0 0 7 0 0 1 0 4 5 
5 0 9 0 0 0 0 0 8 
6 0 0 0 3 2 0 0 0 
0 0 0 0 0 0 0 0 0 

Building encoded string: r+a;I%hGj4YCA-pXz+n=ioRL:agzH'K<(
Encoded Length with BigInteger: 33
Final Result: 330

আপনি ইতিমধ্যে এটি করছেন কিনা তা আমি জানি না, তবে আপনার স্ক্যাম্বলের শেষ সারিটি সবসময় সমস্ত শূন্য হয়ে শেষ হয়, তাই আপনি যে একটি অপ্টিমাইজেশন করতে পারেন তা হ'ল শেষ সারিটি মঞ্জুর করা এবং কেবল ধরে নেওয়া যে কোষগুলি শেষ থেকে নিখোঁজ রয়েছে আপনার এনকোডিং সমস্ত শূন্য হয়।
kukac67

0

সি ++ 241, স্কোর: 82 * 10 = 820

যোগ '!' কোন ক্রিয়াকলাপ সম্পাদন করতে হবে তা নির্ধারণ করতে এনকোডযুক্ত স্ট্রিংয়ের শুরু to

গল্ফযুক্ত 241 চর

void D(char i){static int x=0;cout<<(int)(i-'a')<<" ";if(x++%8==0) cout<<endl;}
int main()
{
int i=81;int n;string S;
char c=cin.peek();
if(c=='!'){cin>>S;for_each(S.begin()+1,S.end(),D);}
else{S.push_back('!');while(i--){cin>>n;S.push_back(n+'a');}cout<<S;}
}

অসমাপ্ত 312 অক্ষর

void decode(char i) {
static int x=0;
cout<<(int)(i-'a')<<" ";
if(x++%8==0) cout<<endl;
}
int main()
{
int i=81;
int n;
string d;
char c=cin.peek();
if(c=='!'){
cin>>d;
for_each(d.begin()+1,d.end(),decode);
}
else{
d.push_back('!');
while(i--)
{
cin>>n;
d.push_back(n+'a');
}
cout<<d;
}
}

4
এটি কোড গল্ফ নয়। এই চ্যালেঞ্জের বিষয়টি হ'ল এনকোডেড বোর্ডের দৈর্ঘ্য হ্রাস করা ...
জন ডিভোরাক

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