একটি খুনি সুডোকু সলভার তৈরি করুন


9

আপনি ভেবেছিলেন নিয়মিত সুডোকু শক্ত, এখন খুনি সুডোকু চেষ্টা করে দেখুন !

কিলার সুডোকু গেমটিতে আপনাকে কোনও নম্বর দেওয়া হয় না। পরিবর্তে, আপনাকে এমন অঞ্চল দেওয়া হয়েছে যা নির্দিষ্ট সংখ্যায় যোগ করার কথা রয়েছে। নিম্নলিখিত উদাহরণটি বিবেচনা করুন, উইকিপিডিয়া থেকে:

ঘাতক সুডোকু ধাঁধা

এবং এর সমাধান:

ঘাতক সুডোকু ধাঁধা সমাধান

আপনি যে প্রোগ্রামটি লিখেছেন তাতে 81 টি বর্ণের ক্রম সমন্বিত অঞ্চলগুলির প্রতিনিধিত্ব করে একটি সংখ্যার ক্রম অনুসরণ করবে followed তারপরে ক্রমের প্রতিটি সংখ্যা "A", "B" ইত্যাদি থেকে শুরু করে বর্ণের প্রতিটি অঞ্চলে সংখ্যার যোগফল উপস্থাপন করে

এরপরে এটি 81 টি সংখ্যার একটি ক্রম সমাধানের প্রতিনিধিত্ব করবে।

উদাহরণস্বরূপ, উপরের উদাহরণ ধাঁধাটিতে নিম্নলিখিত ইনপুট থাকবে:

AABBBCDEFGGHHCCDEFGGIICJKKFLMMINJKOFLPPQNJOORSPTQNUVVRSTTQWUUXXSYZWWaaXXSYZWbbbcc
3 15 22 4 16 15 25 17 9 8 20 6 14 17 17 13 20 12 27 6 20 6 10 14 8 16 15 13 17

এবং ফলাফল আউটপুট হবে:

215647398368952174794381652586274931142593867973816425821739546659428713437165289

আপনি ধরে নিতে পারেন যে ইনপুটটি বৈধ, এবং অঞ্চলগুলি সর্বদা A, B, ..., Y, Z, a, b, ..., z দ্বারা প্রদর্শিত হবে।

(সবচেয়ে সংক্ষিপ্ততম কোড যা জয়ী কাজ করে।)


আপনি কীভাবে প্রতিযোগিতা জিতবেন? সংক্ষিপ্ততম কোড? দ্রুততম কোড?
beary605

সংক্ষিপ্ততম কোড। [ চরিত্রের সীমাটি 1 টি চরিত্রের দ্বারা মিস হয়েছে ]]
জো জেড।

এবং যদি এখানে 52 টিরও বেশি অঞ্চল রয়েছে তবে কি?
মিস্টার লিস্টার

আপনি ধরে নিতে পারেন 45 টিরও বেশি অঞ্চল থাকবে না।
জো জেড।

1
একটি খাঁচার মধ্যে একটি সংখ্যা পুনরাবৃত্তি করতে পারেন?
পিটার টেলর

উত্তর:


4

আর - 378 টি অক্ষর

অভিমানী

x="AABBBCDEFGGHHCCDEFGGIICJKKFLMMINJKOFLPPQNJOORSPTQNUVVRSTTQWUUXXSYZWWaaXXSYZWbbbcc"
y="3 15 22 4 16 15 25 17 9 8 20 6 14 17 17 13 20 12 27 6 20 6 10 14 8 16 15 13 17"

378 টি অক্ষর:

z=strsplit
v=sapply
R=rep(1:9,9)
C=rep(1:9,e=9)
N=1+(R-1)%/%3+3*(C-1)%/%3
G=z(x,"")[[1]]
M=as.integer(z(y," ")[[1]])[order(unique(G))]
s=c(1,rep(NA,80))
i=1
repeat if({n=function(g)!any(v(split(s,g),function(x)any(duplicated(x,i=NA))))
S=v(split(s,G),sum)
n(R)&&n(C)&&n(N)&&n(G)&&all(is.na(S)|S==M)}){if(i==81)break;i=i+1;s[i]=1}else{while(s[i]==9){s[i]=NA
i=i-1};s[i]=s[i]+1}
s

2,964,690 পুনরাবৃত্তির পরে, আমার পরিমিত পিসিতে প্রায় এক ঘন্টা সময় নিয়ে প্রত্যাশিত সমাধানে পৌঁছায়।


ডি-golfed:

ROWS   <- rep(1:9, 9)
COLS   <- rep(1:9, each = 9)
NONETS <- 1 + (ROWS - 1) %/% 3 + 3 * (COLS - 1) %/% 3
CAGES  <- strsplit(x, "")[[1]]
SUMS   <- as.integer(strsplit(y, " ")[[1]])[order(unique(CAGES))]

is.valid <- function(sol) {

   has.no.repeats <- function(sol, grouping) {
      !any(vapply(split(sol, grouping),
                  function(x) any(duplicated(x, incomparables = NA)),
                  logical(1)))
   }
   has.exp.sum <- function(sol, grouping, exp.sums) {
      sums <- vapply(split(sol, grouping), sum, integer(1))
      all(is.na(sums) | sums == exp.sums)
   }

   has.no.repeats(sol, ROWS  ) &&
   has.no.repeats(sol, COLS  ) &&
   has.no.repeats(sol, NONETS) &&
   has.no.repeats(sol, CAGES ) &&
   has.exp.sum(sol, CAGES, SUMS)        
}

sol <- c(1L, rep(NA, 80)) # start by putting a 1
i <- 1L                   # in the first cell
it <- 0L

repeat {
   it <- it + 1L
   if (it %% 100L == 0L) print(sol)
   if(is.valid(sol)) {         # if everything looks good
      if (i == 81L) break         # we are either done
      i <- i + 1L                 # or we move to the next cell
      sol[i] <- 1L                # and make it a 1
   } else {                    # otherwise
      while (sol[i] == 9L) {      # while 9s are found
         sol[i] <- NA             # replace them with NA
         i <- i - 1L              # and move back to the previous cell
      }
      sol[i] <- sol[i] + 1L       # when a non-9 is found, increase it
   }                           # repeat
}
sol

4

গল্ফস্ক্রিপ্ট, 138 টি অক্ষর

n%~[~]:N;1/:P.&:L;9..*?{(.[{.9%)\9/}81*;]:§;L{.`{\~@@=*}+[P§]zip%{+}*\L?N==}%§9/..zip+\3/{{3/}%zip{{+}*}%}%{+}*+{.&,9=}%+1-,!{§puts}*.}do;

এটি গল্ফস্ক্রিপ্টের একটি হত্যাকারী সুডোকু সমাধানকারী। এটি উপরের উদাহরণে দেওয়া হিসাবে দুটি সারিতে STDIN এ ইনপুট প্রত্যাশা করে।

দয়া করে নোট করুন: ধাঁধা বর্ণনাটি কার্যকর করার সময়টিতে কোনও বিধিনিষেধ তৈরি করে না বলে আমি গতির চেয়ে ছোট কোডের আকারকেই পছন্দ করি। কোডটি এমন একটি সমাধানের জন্য সমস্ত 9 ^ 81 গ্রিড কনফিগারেশনগুলি পরীক্ষা করে যা ধীর কম্পিউটারে কিছুটা সময় নিতে পারে ;-)


আপনি এটি যাচাই করতে পারেন? : পি
জো জেড।

@ জোজেং, এটি 4x4-এর জন্য টুইট করতে যথেষ্ট সহজ দেখাচ্ছে। এখানে একটি পরীক্ষার কেস দেওয়া হয়েছে:AABBCADEFFDDGGGG 6 7 4 8 2 3 10
পিটার টেলর

@ পিটারটেলর আপনার পরীক্ষার ক্ষেত্রে চারটি ভিন্ন বৈধ সমাধান রয়েছে।
জো জেড।

4

রুবি, 970 টি অক্ষর

A,B=gets,gets.split
L=[]
R=[]
U=[]
D=[]
N=[]
C=[]
S=[]
O=[0]*81
z='A'
(0..324).map{|j|U<<j;D<<j;R<<(j+1)%325;L<<(j+324)%325;N<<j;C<<j;S<<0}
X=->s,j,c,cf,n{j<81?(z==A[j]?(0..8).map{|i|X[s-1-i,j+1,c+[i],cf+[1+j,1+81+27*i+j/9,1+81+27*i+9+j%9,1+81+27*i+18+j/3%3+j/27*3],n+[i+1]]}:X[s,j+1,c,cf,n+[0]]if s>=0):(h=U.size;cf.uniq.sort.map{|l|N<<n;L<<(L[h]||h);R<<h;U<<U[l];D<<l;C<<l;S[l]+=1;L[R[-1]]=R[L[-1]]=U[D[-1]]=D[U[-1]]=L.size-1}if s==0)}
Y=->c{L[R[c]]=L[c];R[L[c]]=R[c];i=D[c];(j=R[i];(U[D[j]]=U[j];D[U[j]]=D[j];S[C[j]]-=1;j=R[j])while j!=i;i=D[i])while i!=c}
Z=->c{i=U[c];(j=L[i];(S[C[j]]+=1;U[D[j]]=j;D[U[j]]=j;j=L[j])while j!=i;i=U[i])while i!=c;L[R[c]]=c;R[L[c]]=c}
B.map{|k|X[k.to_i,0,[],[],[]];z=z=='Z'?'a':z.next}
s=->k{c=R[0];c<1?($><<(O[0,k].map{|s|N[s]}.transpose.map &:max)*""):(g=S[b=c];g=S[b=c]if S[c]<g while 0<c=R[c];Y[b];r=D[b];(O[k]=r;j=R[r];(Y[C[j]];j=R[j])while j!=r;s[k+1];r=O[k];c=C[r];j=L[r];(Z[C[j]];j=L[j])while j!=r;r=D[r])while r!=b;Z[b])}
s[0]

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

এসটিডিআইএন-এ দুটি লাইন হিসাবে ইনপুট দিতে হবে। উদাহরণ ( অনলাইন ):

> AABBBCDEFGGHHCCDEFGGIICJKKFLMMINJKOFLPPQNJOORSPTQNUVVRSTTQWUUXXSYZWWaaXXSYZWbbbcc
3 15 22 4 16 15 25 17 9 8 20 6 14 17 17 13 20 12 27 6 20 6 10 14 8 16 15 13 17

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