एक मोती का हार स्ट्रिंग


18

अवलोकन

मोती (या Masyu) एक तर्क है जो ग्रिड पर खेला जाता है। ग्रिड पर काले और सफेद मोती रखे गए हैं। ऑब्जेक्ट एक एकल, बंद लूप बनाने के लिए है जो प्रत्येक मोती के माध्यम से केवल सीधी रेखा खंड और समकोण का उपयोग करके यात्रा करता है।

कुछ नियम हैं जो यह बताते हैं कि कैसे मोती के साथ लूप इंटरैक्ट करता है:

  • सफेद मोती के माध्यम से सीधे यात्रा की जानी चाहिए , लेकिन पाश को अपने पथ में पिछले और / या अगले सेल में बदलना होगा ।
  • काले मोती को चालू करना चाहिए , लेकिन पाश को अपने पथ में अगले और पिछले कोशिकाओं के माध्यम से सीधे यात्रा करनी चाहिए ।
  • लूप को स्वयं को पार नहीं करना चाहिए या अन्यथा नहीं करना चाहिए । सभी कोशिकाओं में बिल्कुल शून्य या दो लूप प्रविष्टि / निकास हैं।

विकिपीडिया (और इसके समाधान) से एक उदाहरण पहेली:

यहाँ छवि विवरण दर्ज करें यहाँ छवि विवरण दर्ज करें

आपका उद्देश्य किसी दी गई पहेली को हल करना है। यदि कई संभावित समाधान हैं, तो इससे कोई फर्क नहीं पड़ता कि आप किसे देते हैं।

इनपुट

इनपुट एक अनसुलझा वर्ग ग्रिड होगा। ऊपर दिखाया गया उदाहरण इस तरह दिखेगा:

..w.w.....
....w...b.
..b.b.w...
...w..w...
b....w...w
..w....w..
..b...w...
w...b....w
......ww..
..b......b

wएक सफेद मोती है, bएक काला मोती है, और .एक खाली सेल है।

मान लें कि इनपुट मान्य है। इसका मतलब यह अच्छी तरह से बनता है, और कम से कम एक समाधान संभव है। सभी मान्य पहेलियाँ कम से कम 3x3 हैं, और कम से कम एक मोती शामिल हैं।

उत्पादन

आउटपुट पथ का प्रतिनिधित्व करने वाले निर्देशांक की एक स्ट्रिंग है। ग्रिड के ऊपरी बाएँ कोने में 0 0ऊपरी दायाँ हिस्सा है n-1 0, जहाँ n ग्रिड की चौड़ाई है।

एक मार्ग केवल निर्देशांक की एक श्रृंखला है:

x1 y1 x2 y2 x3 y3 ...

रास्ता बंद मान लिया गया है, इसलिए आपको अंत में पहला समन्वय दोहराने की आवश्यकता नहीं है , लेकिन ऐसा करने के लिए कोई दंड नहीं है।

आउटपुट में पथ में कम से कम सभी कोनों से मिलकर होना चाहिए । बारी न होने पर आपको प्रत्येक सेल को पथ पर आउटपुट करने की आवश्यकता नहीं है। उदाहरण के लिए, उदाहरण के लिए आउटपुट के साथ शुरू हो सकता है:

1 0 5 0 5 1 ...

या

1 0 2 0 3 0 4 0 5 0 5 1 ...

आउटपुट चाहिए नहीं रास्ते में नहीं किसी भी सेल होते हैं। आप पथ के किसी भी कक्ष में प्रारंभ कर सकते हैं।


टुकड़ा

यहां एक स्निपेट है जिसका उपयोग आप अपने समाधान की कल्पना करने के लिए कर सकते हैं। बस उस ग्रिड में पेस्ट करें जिस पर आप काम कर रहे हैं और जिस पथ पर आप आउटपुट दे रहे हैं। मुझे पता है कि यह मेरे कोड को देखने के लिए दर्दनाक है, इसलिए मैं आपको केवल सुझाव नहीं देता;)


परीक्षण के मामलों

ये परीक्षण मामले प्रत्येक इनपुट के लिए एक संभावित आउटपुट दिखाते हैं (अंतिम को छोड़कर, जिसे अनसुलझा दिखाया गया है)। अन्य वैध रास्ते हो सकते हैं, आप सीडब्ल्यू या सीसीडब्ल्यू जा सकते हैं या एक अलग बिंदु पर शुरू कर सकते हैं, आदि समाधान परीक्षण के मामलों को सेकंड / मिनट / घंटे में हल करने में सक्षम होना चाहिए, न कि दिन / सप्ताह / कल्प।

मोती -3

...
w..
..b

0 0 1 0 2 0 2 1 2 2 1 2 0 2 0 1

मोती -6

.wb..b
......
..b...
w.ww..
......
b....b

0 0 2 0 2 2 4 2 4 1 3 1 3 0 5 0 5 5 3 5 3 4 4 4 4 3 1 3 1 4 2 4 2 5 0 5 0 2 1 2 1 1 0 1

मोती-12

.....w.b.w..
ww..b...b...
.w.....b....
...wbww..b.b
....b.......
w.w.........
..w......b.b
.....bb.....
.....b.....w
w.ww..b.....
...w......w.
b..w.....b..

आपने अंतिम परीक्षण मामले के लिए समाधान नहीं डाला ...
mbomb007

2
@ mbomb007 सही।
Geobits

तो कोई उपाय नहीं है?
mbomb007

2
एक उपाय है। मैंने इसे खुला छोड़ दिया ताकि उनके प्रयास के लिए कुछ उत्तर दिखें। इसके अलावा, नियमों को महसूस करने के लिए एक पहेली या दो को हाथ से हल करने में मदद मिल सकती है, और ऐसा करना मुश्किल है अगर सभी उदाहरण पूर्व-हल किए गए हों।
Geobits

क्या कोई ग्रिड 2x2 या बड़ा ग्रिड जिसमें कोई मोती नहीं माना जाता है वह वैध है (दूसरा वाक्य नहीं बताता है, और इनपुट के अनसुलझा होने के बारे में बिंदु (यदि कोई अनस्ट्रुंग मोती नहीं हैं, तो इसे हल किया जाना चाहिए))? यदि हां, तो क्या आप एक लूप की उम्मीद करेंगे, बस इसमें कोई मोती नहीं है, या वास्तव में क्या है? संभवतः किसी विशेष रंग के मौजूद होने की कोई आवश्यकता नहीं है?
विजुअलमेल

जवाबों:


7

C, 590 640 760 880 963 1018

इसके लिए ब्रूट बल काफी तेज है। 12x12 का परीक्षण 10ms के तहत चलता है। यह जानना कि गोल्फ के लिए अधिक उपयुक्त कुछ भाषा चुन सकते हैं।

मुझे नहीं लगता कि बोर्ड वर्गाकार है क्योंकि बड़ी पहेलियां चौकोर नहीं होती हैं।

Wसेट बोर्ड आयामों पर सीमा निर्धारित करते हैं। W - 2सीमा की जाँच से बचने के लिए सीमाओं के लिए अतिरिक्त पंक्तियों का उपयोग करने के लिए वास्तविक सीमा छोटी है ।

#define W 40
int Y,X,T,P,Q[W*W],D[]={-W,-1,1,W};char B[W*W],K[W*W],I[W];
t(x,d,s){for(P=0;B[x];x*=x!=*Q)s-=K[Q[P++]=x]-1,
d=(54202126527627840ll>>2*(d*7+B[x+=D[d]]%8))&3;return x?0:s;}
m(x){int c=K[x],u=B[x-W],U=u&7,l=B[x-1],L=l&7,r=0,
i=U!=3&U!=4&L!=2&L!=4,o=(39>>U)&1?57:70;o&=(52>>L)&1?42:85;
if(x/W>Y+1){for(;P--;)printf("%d %d ",Q[P]%W-1,Q[P]/W-1);exit(0);}
if(u>7)o&=U>4?~64:~6;if(l>7)o&=L>4?~32:~10;
for(o&=c?c>1?c>2?(r=8*i,96):(r=8,i*30):~0:1;o;r++,o/=2)
if(o&1)if(B[x]=r,r%8!=1||!t(x,0,T))m(x+1);B[x]=0;}
main(){for(;gets(I);Y++)for(X=0;I[X];X++)
T+=(K[X+1+Y*W+W]=I[X]/36)-1;m(W);}

मुझे परखो ।

यहाँ एक और अधिक चुनौतीपूर्ण परीक्षण मामला है:

.b.....b.b.......b..
.....w.....b.w....w.
....w.........w.....
..bb.....w.w.b....b.
.w.....b..b......w..
.....b..............
.b..........b.b..bw.
....w....w....b...w.
.......bb...b...w...
..b.......w.........
....b.w.....w.b...b.
w...b...w..b.w.w....
b.w....w............
...b.w......b..b...b
w......w.b.ww.......
.b....b..........b..
....b....w.bb.w...w.
w..b......w...b.....
b.....w.........w...
...b....w..w..b...w.
...................b
.b..w..bb.b..b..w...
........w......b....
b....w......b..b.b..
...b..bb.w.w........
...b.......w......w.
w...w.b.w.....b....b
............w..ww...
..b.b..b....b.......
....b.........w...b.
.ww.......b.w.w.....
b.....w..w.w...b....
....ww..b.b.w....w.w
.............bb..w..
.b....w.b.b........w
....bw..........b...

मैं भाग्यशाली था कि मेरा कोड रन (<5min) में काफी जल्दी समाधान ढूंढता है, लेकिन पूर्ण खोज में अधिक समय (67 मिनट) लगता है।

20x36


s / Brute का बल काफी तेज है / C काफी तेज है /
kirbyfan64sos

9

अजगर - 1669

अभी भी बहुत लंबा है, लेकिन मेरे कंप्यूटर पर एक सेकंड के तहत अंतिम उदाहरण को चलाने के लिए पर्याप्त तेज़ है। संभवत: गति की लागत से इसे कम करना संभव है, लेकिन अब के लिए यह बहुत ज्यादा नहीं है, बल्कि यह असंगठित कोड के बराबर है।

अंतिम परीक्षण मामले के लिए उदाहरण आउटपुट:

0 11 1 11 2 11 3 11 4 11 4 10 3 10 2 10 1 10 1 9 2 9 3 9 4 9 4 8 3 8 3 7 4 7 5 7 5 6 5 5 6 5 6 6 6 7 7 7 8 7 8 8 7 8 6 8 5 8 5 9 5 10 5 11 6 11 6 10 6 9 7 9 8 9 8 10 7 10 7 11 8 11 9 11 9 10 9 9 10 9 10 10 10 11 11 11 11 10 11 9 11 8 11 7 10 7 10 8 9 8 9 7 9 6 10 6 11 6 11 5 11 4 11 3 10 3 9 3 9 4 9 5 8 5 8 4 8 3 8 2 8 1 9 1 10 1 10 0 9 0 8 0 7 0 7 1 7 2 6 2 5 2 5 1 6 1 6 0 5 0 4 0 3 0 2 0 2 1 3 1 4 1 4 2 4 3 5 3 6 3 7 3 7 4 6 4 5 4 4 4 4 5 4 6 3 6 3 5 3 4 3 3 3 2 2 2 2 3 1 3 1 2 1 1 1 0 0 0 0 1 0 2 0 3 0 4 0 5 0 6 1 6 1 5 1 4 2 4 2 5 2 6 2 7 1 7 1 8 0 8 0 9 0 10

यहाँ छवि विवरण दर्ज करें

कोड:

I=raw_input().split('\n');X=len(I[0]);Y=len(I);R=range
def S(g=0,c=0,x=0,y=0):
    if y>=Y:return 0
    if g==0:g=[[-1]*X for i in R(Y)];c=[[-1]*X for i in R(Y)]
    o={'.':set(R(7)),'w':{1,2},'b':{3,4,5,6}}[I[y][x]].copy()
    o&={0,1,3,4}if y<1 or g[y-1][x]in[0,1,5,6]else{2,5,6}
    o&={0,2,4,5}if x<1 or g[y][x-1]in[0,2,3,6]else{1,3,6}
    if y>Y-2:o&={0,1,5,6}
    if x>X-2:o&={0,2,3,6}
    if y>0 and g[y-1][x]in[2,3,4]:
        if'b'==I[y][x]and g[y-1][x]!=2:return 0
        if'b'==I[y-1][x]:o&={2}
        elif'w'==I[y-1][x]and g[y-2][x]==2:o&={5,6}
    if x>0 and g[y][x-1]in[1,4,5]:
        if'b'==I[y][x]and g[y][x-1]!=1:return 0
        if'b'==I[y][x-1]:o&={1}
        elif'w'==I[y][x-1]and g[y][x-2]==1:o&={3,6}
    h=[r[:]for r in c]
    if y>0 and g[y-1][x]in[2,3,4]:
        if x>0 and g[y][x-1]in[1,4,5]:
            if c[y-1][x]==c[y][x-1]:
                if(6 not in o)+any(any(i!=c[y-1][x]and i!=-1 for i in r)for r in c)+any(I[v][u]!='.'and(v>y)+(u>x)for v in R(y,Y)for u in R(X)):return 0
                g[y][x]=6
                for v in R(y,Y):
                    for u in R(X):
                        if v!=y or u>x:g[v][u]=0
                for y in R(Y):
                    for x in R(X):
                        if g[y][x]>0:break
                f=[];d=-1;u,v=p,q=x,y
                while(u,v)!=(p,q)or-1==d:f+=[u,v];d=([0,{0,2},{1,3},{2,3},{0,3},{0,1},{1,2}][g[v][u]]-{(d+2)%4}).pop();i,j={0:(u+1,v),1:(u,v-1),2:(u-1,v),3:(u,v+1)}[d];u,v=i,j
                return f
            else:
                for v in R(y+1):
                    for u in R(X):
                        if h[v][u]==c[y][x-1]:h[v][u]=c[y-1][x]
                h[y][x]=c[y-1][x]
        else:h[y][x]=c[y-1][x]
    elif x>0 and g[y][x-1]in[1,4,5]:h[y][x]=c[y][x-1]
    else:h[y][x]=max(max(r)for r in c)+1
    for n in sorted(list(o))[::-1]:
        if n==0:h[y][x]=-1
        if x>X-2:i,j=0,y+1
        else:i,j=x+1,y
        g[y][x]=n;r=S(g,h,i,j)
        if r!=0:return r
    return 0
for i in S():print i,

Ungolfed:

class Grid:
    def __init__(self,input):
        self.input = input.split('\n')
        self.x = len(self.input[0])
        self.y = len(self.input)
        self.options = {'.':{0,1,2,3,4,5,6},'w':{1,2},'b':{3,4,5,6}}

    def convert(self,grid):
        directions = [None,{0,2},{1,3},{2,3},{0,3},{0,1},{1,2}]

        for y in range(self.y):
            for x in range(self.x):
                if grid[y][x] != 0:
                    break

        chain = []
        start_pos = (x,y)
        dir = -1
        pos = start_pos
        while dir == -1 or pos != start_pos:
            chain.extend(pos)
            x,y = pos
            next_dir = (directions[grid[y][x]]-{(dir+2)%4}).pop()
            if next_dir == 0: nx,ny = x+1,y
            elif next_dir == 1: nx,ny = x,y-1
            elif next_dir == 2: nx,ny = x-1,y
            elif next_dir == 3: nx,ny = x,y+1
            dir = next_dir
            pos = (nx,ny)

        return chain

    def solve(self,grid=None,chain_ids=None,pos=(0,0)):
        x,y = pos
        if y >= self.y:
            return None

        if grid is None:
            grid = [[-1]*self.x for i in range(self.y)]
        if chain_ids is None:
            chain_ids = [[-1]*self.x for i in range(self.y)]

        options = self.options[self.input[y][x]].copy()
        if y == 0 or grid[y-1][x] in [0,1,5,6]:
            options &= {0,1,3,4}
        else:
            options &= {2,5,6}
        if y == self.y-1:
            options &= {0,1,5,6}

        if x == 0 or grid[y][x-1] in [0,2,3,6]:
            options &= {0,2,4,5}
        else:
            options &= {1,3,6}
        if x == self.x-1:
            options &= {0,2,3,6}

        if y != 0 and grid[y-1][x] in [2,3,4]:
            if self.input[y][x] == 'b' and grid[y-1][x] != 2:
                return None
            if self.input[y-1][x] == 'b':
                options &= {2}
            elif self.input[y-1][x] == 'w':
                if grid[y-2][x] == 2:
                    options &= {5,6}
        if x != 0 and grid[y][x-1] in [1,4,5]:
            if self.input[y][x] == 'b' and grid[y][x-1] != 1:
                return None
            if self.input[y][x-1] == 'b':
                options &= {1}
            elif self.input[y][x-1] == 'w':
                if grid[y][x-2] == 1:
                    options &= {3,6}


        new_chain_ids = [[i for i in row] for row in chain_ids]
        if y != 0 and grid[y-1][x] in [2,3,4]:
            if x != 0 and grid[y][x-1] in [1,4,5]:

                if chain_ids[y-1][x] == chain_ids[y][x-1]:
                    if 6 not in options:
                        return None

                    if any(any(i != chain_ids[y-1][x] and i != -1 for i in row) for row in chain_ids) or \
                    any(self.input[v][u] != '.' and (v!=y or u>x) for v in range(y,self.y) for u in range(self.x)):
                        return None

                    grid[y][x] = 6
                    for v in range(y,self.y):
                        for u in range(self.x):
                            if v != y or u > x: 
                                grid[v][u] = 0

                    return self.convert(grid)

                else:
                    for v in range(y+1):
                        for u in range(self.x):
                            if new_chain_ids[v][u] == chain_ids[y][x-1]:
                                new_chain_ids[v][u] = chain_ids[y-1][x]
                    new_chain_ids[y][x] = chain_ids[y-1][x]

            else:
                new_chain_ids[y][x] = chain_ids[y-1][x]
        elif x != 0 and grid[y][x-1] in [1,4,5]:
            new_chain_ids[y][x] = chain_ids[y][x-1]
        else:
            new_chain_ids[y][x] = max(max(row) for row in chain_ids)+1

        for n in sorted(list(options),key=lambda n: -n):
            grid[y][x] = n
            if n == 0:
                new_chain_ids[y][x] = -1

            if x == self.x-1:
                nx,ny = 0,y+1
            else:
                nx,ny = x+1,y

            result = self.solve(grid,new_chain_ids,(nx,ny))
            if result is not None:
                return result

input = """

.....w.b.w..
ww..b...b...
.w.....b....
...wbww..b.b
....b.......
w.w.........
..w......b.b
.....bb.....
.....b.....w
w.ww..b.....
...w......w.
b..w.....b..

""".strip()

def print_grid(grid):
    for y,row in enumerate(grid):
        s = ""
        for i in row:
            s += {-1:'xxx',0:'   ',1:'   ',2:' | ',3:'   ',4:'   ',5:' | ',6:' | '}[i]
        s += '\n'
        for x,i in enumerate(row):
            s += {-1:'x%sx',0:' %s ',1:'-%s-',2:' %s ',3:'-%s ',4:' %s-',5:' %s-',6:'-%s '}[i] % input.split('\n')[y][x]
        s += '\n'
        for i in row:
            s += {-1:'xxx',0:'   ',1:'   ',2:' | ',3:' | ',4:' | ',5:'   ',6:'   '}[i]
        s += '\n'
        print s

result = Grid(input).solve()
print result

@Geobits ओह, ऐसा लगता है कि मैंने नियमों को ध्यान से नहीं पढ़ा। मेरे द्वारा अभी जो सही है, उसके साथ अद्यतित उत्तर
केएसब

नया रास्ता मुझे अच्छा लग रहा है! +1
Geobits

1

लुआ, 830 810 765 752 739 729 710

बोर्ड 1 और बोर्ड 2 को ठीक चलाता है, लेकिन बोर्ड 3 पर थोड़ा समय लगता है।

यह सिर्फ पहले के बजाय हर पथ का आउटपुट करके 9 बाइट्स बचा सकता है ...

b={}s={0,0,0}R=table.insert Z=unpack for l in io.lines()do w=#l for i=1,w do
c=({b=1,w=2,['.']=3})[l:sub(i,i)]R(b,c)s[c]=s[c]+1 end end h=#b/w for e=0,w*h-1
do function g(p,d,X,t)local function G(I,r)T={Z(t)}a=b[I+1]T[a]=T[a]+1
P={Z(p)}D={Z(d)}R(P,I%w)R(P,I/w-I/w%1)R(D,r)l=#D for U=2,#p,2 do if
I==p[U-1]+w*p[U]then return end end if I==e then if T[1]==s[1]and T[2]==s[2]then
for k=1,l do K=D[k]M=D[(k-2)%l+1]N=D[k%l+1]O=D[(k+1)%l+1]if({K==N or K~=M or
N~=O,K~=N or(K==M and N==O)})[b[1+P[2*k-1]+w*P[2*k]]]then return end end
os.exit(print(table.concat(P,' ')))end else g(P,D,I,T)end end _=X%w<w-1 and
G(X+1,1)_=X/w-X/w%1<h-1 and G(X+w,2)_=X%w>0 and G(X-1,3)_=X/w-X/w%1>0 and
G(X-w,4)end g({},{},e,{0,0,0})end
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.