ตรวจสอบโซลูชั่น Loopy


9

นี้เป็นความท้าทายเพิ่มเติมเพื่อสร้าง Loopy ปริศนาท้าทาย คุณอาจต้องการแก้ปัญหานี้ก่อนที่จะลองความท้าทายที่ยากขึ้นในลิงค์ก่อนหน้า

เป้าหมายของการท้าทายนี้คือการตรวจสอบการแก้ปัญหากับตัวต่อแบบวนรอบ โปรดรับเอกสารทั้งหมดเกี่ยวกับตัวต่อวงแหวนจากลิงก์ก่อนหน้า ปริศนาแบบวนรอบที่แก้ไขแล้วนั้นได้รับการจัดรูปแบบในลักษณะที่คล้ายกันมากกับผลลัพธ์ของการส่งที่ถูกต้องกับความท้าทาย“ สร้างปริศนาวนรอบ” และอาจมีลักษณะเช่นนี้:

+-+-+ +-+ +-+ +
|   | | |2|3|  
+-+ + + + + +-+
 2| | | |2|  3|
+ + +-+ + + +-+
 2|  2 1|3| |  
+-+ +-+ +-+ +-+
|2  | |    1 2|
+ +-+ +-+ +-+ +
| |2 1 2|3|3| |
+ + +-+ +-+ +-+
| | |3|2   1   
+ +-+ +-+-+-+-+
|        2 2  |
+-+-+-+-+-+-+-+

เส้นทางที่ประกอบขึ้นเป็นโซลูชันที่มีการทำเครื่องหมายด้วย|และ-ตัวละครระหว่าง+ตัวละคร

ข้อมูลจำเพาะของอินพุต

โปรแกรมของคุณจะได้รับตัวต่อแบบวงแหวนโดยใช้วิธีแก้ปัญหาที่จัดรูปแบบตามตัวอย่างด้านบนเป็นอินพุต โปรแกรมของคุณจะอนุมานขนาดของตัวต่อจากอินพุต คุณสามารถกำหนดสมมติฐานต่อไปนี้เกี่ยวกับอินพุต:

  • ปริศนามีไม่น้อยกว่า 2 และไม่เกิน 99 เซลล์ในทิศทางใดทิศทางหนึ่ง
  • ดังนั้นแต่ละบรรทัดมีความยาวสูงสุด 199 ตัวอักษรโดยไม่รวมอักขระบรรทัดใหม่
  • ดังนั้นอินพุตมีความยาวสูงสุด 99 บรรทัด
  • แต่ละบรรทัดอาจสิ้นสุดหลังจากอักขระที่พิมพ์ได้ครั้งสุดท้ายหรืออาจมีการเว้นวรรคด้วยอักขระ whitespace ดังนั้นจึงมีความยาวสูงสุด2 · y + 1อักขระโดยที่yคือจำนวนเซลล์ในแนวนอน
  • แต่ละตำแหน่งที่มีทั้งพิกัดxและyยังประกอบด้วย+อักขระ
  • ตำแหน่งในแนวนอนหรือแนวตั้งติดกับตำแหน่งที่มี+อักขระประกอบด้วยอักขระช่องว่างอยู่ด้านหลังสุดของบรรทัดหรือมี-อักขระหากอยู่ติดกันในแนวนอนหรือ|อักขระถ้าอยู่ติดกันในแนวตั้ง
  • ตำแหน่งอื่น ๆ ทั้งหมดมีทั้งที่อยู่เบื้องหลังการจุดสิ้นสุดของบรรทัดหรือมีหนึ่งในตัวละคร, 0, 1, 2หรือ3
  • ทุกบรรทัดถูกยกเลิกด้วยอักขระขึ้นบรรทัดใหม่ที่เป็นค่าเริ่มต้นของแพลตฟอร์ม
  • มีการขึ้นบรรทัดใหม่หนึ่งบรรทัด

ต้องป้อนข้อมูลด้วยวิธีใดวิธีหนึ่งต่อไปนี้:

  • จากอินพุตมาตรฐาน
  • เป็นค่าของพารามิเตอร์ที่มีชื่อpในคำขอ HTTP POST
  • เป็นเนื้อหาของรูปแบบ HTML
  • เป็นเนื้อหาของไฟล์ที่มีชื่อpในไดเร็กทอรีที่กำหนดการนำไปใช้งาน
  • ในวิธีการนำไปปฏิบัติที่กำหนดไว้ที่รันไทม์หากไม่มีสี่อันก่อนหน้านี้
  • เขียนโค้ดยากถ้าภาษาของคุณไม่มีการป้อนข้อมูลที่ได้รับ

สเปคเอาท์พุท

โปรแกรมของคุณจะสิ้นสุดสำหรับอินพุตทั้งหมดที่ตรงกับข้อกำหนดของอินพุตและต้องคำนวณว่าคำตอบของปริศนานั้นถูกต้องหรือไม่ โปรแกรมของคุณจะแสดงผลลัพธ์ของการคำนวณเป็นค่าบูลีนด้วยวิธีใดวิธีหนึ่งต่อไปนี้:

  • เนื่องจากสถานะการออกเป็นศูนย์ (การแก้ปัญหาที่ถูกต้อง) หรือไม่เป็นศูนย์ (การแก้ปัญหาไม่ถูกต้อง)
  • ในฐานะที่เป็นตัวละครy(การแก้ปัญหาที่ถูกต้อง) หรือn(การแก้ปัญหาที่ไม่ถูกต้อง) ตามด้วยศูนย์หรือมากกว่าตัวละครเอาท์พุทโดยวิธีการที่กำหนดไว้ในการดำเนินงาน

ลักษณะการทำงานของโปรแกรมของคุณไม่ได้รับการระบุเมื่อพบอินพุตที่ไม่ได้จัดรูปแบบตามข้อกำหนดคุณสมบัติอินพุต

เกณฑ์การให้คะแนน

คะแนนของโปรแกรมของคุณคือจำนวนอักขระในแหล่งที่มายกเว้นอักขระช่องว่างที่ละเว้นได้และความคิดเห็นที่ละเว้นได้ คุณได้รับการสนับสนุนให้เยื้องการส่งของคุณเพื่อให้ง่ายต่อการอ่านสำหรับผู้อื่นและแสดงความคิดเห็นโซลูชันของคุณเพื่อให้ง่ายต่อการติดตาม

การส่งที่ไม่สามารถปฏิบัติตามข้อกำหนดคุณสมบัติอินพุตหรือเอาต์พุตหรือสร้างผลลัพธ์ที่ไม่ถูกต้องจะไม่ถูกต้อง


อินพุตจะถูกจัดการอย่างไร? อ่านจากไฟล์? STDIN? ฉันสามารถเขียนฟังก์ชั่นได้หรือไม่?
Martin Ender

@ MartinBüttner "โปรแกรมของคุณจะได้รับ ... " ไม่แน่ใจว่าทำไมคุณถึงชอบอ่านจากไฟล์
John Dvorak

@ MartinBüttnerคุณต้องเขียนโปรแกรมทั้งหมด ฉันคิดว่าภาษา "โปรแกรมของคุณ", "จะยุติ", "สถานะทางออก" ค่อนข้างชัดเจน
FUZxxl

1
นอกจากนี้โปรดทราบว่าในปริศนาส่วนใหญ่0เป็นหมายเลขที่ถูกต้องสำหรับเซลล์ด้วย
โฮเวิร์ด

@Howard ขอโทษที่พลาด
FUZxxl

คำตอบ:


2

GolfScript, 133 อักขระ

'|':^4,{48+.(}%+^*1>.^/'-'*+2/:F;4{{~@@/*}2F//n%zip-1%n*}:X*.'+-'?.3+@/(-2<' 9'+\+'9-+  99|+  9'3/:F;.,4*{X}*.9`?@=\' +09
'-!&'ny'1/=

คาดว่าอินพุตจาก STDIN และพิมพ์yสำหรับโซลูชันที่ถูกต้องและnสำหรับรายการที่ไม่ถูกต้อง ดำเนินงานโดยใช้การแทนที่สตริงเป็นส่วนใหญ่บนกริดหรือกับกริดเวอร์ชันที่หมุน

รหัสข้อเขียน:

# construct the string "|0|/|1|0|2|1|3|2-0-/-1-0-2-1-3-2"
# split into pieces of two and save to variable F
'|':^4,{48+.(}%+^*1>.^/'-'*+
2/:F;

# run the code block X 4 times
# with X: string-replace 1st item in F with 2nd, 3rd with 4th, ...
# i.e. '|0' with '|/', '|1' with '|0'
# and then rotate grid by 90 degrees
4{{~@@/*}2F//n%zip-1%n*}:X*

# for a valid grid all digits are now reduced to exactly '0'
# (i.e. no '1' or '2' or '3' or '/')

# now follow the loop along and remove it
# start: find the first occurence of '+-+' and replace with '+ 9'
# note: '9' is the marker for the current position
.'+-'?
.3+@/(-2<' 9'+\+

# string-replace '9-+' or '9|+' by '  9' (i.e. go one step along the loop)
# using block X enough times
'9-+  99|+  9'3/:F;
.,4*{X}*

# look for the marker '9' in the result and check if it is at the original
# position again
.9`?
@=

# the remaining grid must not contain any digits besides 0 and 9
# esp. no '|' or '-' may remain
\' +09
'-!

# check if both conditions are fulfilled and output corresponding character
&'ny'1/=

2

C # 803 579 ไบต์

โปรแกรมที่สมบูรณ์อ่านจาก STDIN ควรจัดการกับชุดรูปแบบบรรทัดใหม่ทั่วไปตราบใดที่มีบรรทัดฟีด ขอบคุณ HackerCow ที่ชี้ให้เห็นว่าฉันไม่ต้องต่อท้ายบรรทัดใหม่ในคำถามอื่นกระตุ้นให้ฉันลบที่นี่และบันทึก 4 ไบต์

รหัส Golfed:

using C=System.Console;class P{static void Main(){var D=C.In.ReadToEnd().Replace("\r","").Split('\n');int w=D[0].Length+2,h=D.Length+1,i=0,j,c,T=0,O=1,o,z,R=0;var B=new int[w,h];var S=new int[w*h*9];for(;i++<w-2;)for(j=0;j<h-2;B[i,j]=c)if((c=(D[j++][i-1]-8)%10)>5){c=5;T++;S[0]=i+j*w;}for(i=0;++i<w-1;)for(j=0;++j<h-1;)R=(i%2+j%2>1&(o=B[i,j-1]%2+B[i-1,j]%2+B[i+1,j]%2+B[i,j+1]%2)>0&o!=2)|((c=B[i,j])<4&c!=o)?7:R;for(o=h=0;o<O;B[i,j]=0)if(B[i=(c=S[o++])%w,j=c/w]>4){h++;S[O++]=(S[O++]=c-w-1)+2;S[O++]=(S[O++]=c+w-1)+2;z=j%2<1?w*2:2;S[O++]=c-z;S[O++]=c+z;}C.Write(h-R<T?"n":"y");}}

รหัสทำการตรวจสอบ 3 ครั้งแรกตรวจสอบจำนวนบรรทัดโดยรอบแต่ละหมายเลขและแต่ละแยกมี 0 หรือ 2 บรรทัดนำหน้าจากนั้นให้ทุกบรรทัดรวมเข้าด้วยกัน

รหัสที่จัดรูปแบบ:

using C=System.Console;

class P
{
    static void Main()
    {
        var D=C.In.ReadToEnd().Replace("\r","").Split('\n');
        int w=D[0].Length+2,h=D.Length+1,i=0,j,c,T=0,O=1,o,z,R=0;
        var B=new int[w,h]; // this is the grid
        var S=new int[w*h*9]; // this is a list of joined up lines (stored as x+y*w)

        for(;i++<w-2;)
            for(j=0;j<h-2;B[i,j]=c)
                if((c=(D[j++][i-1]-8)%10)>5)
                { // we are a line
                    c=5;
                    T++; // increment line counter
                    S[0]=i+j*w; // set start of loop
                }

        for(i=0;++i<w-1;) // this loop checks the numbers and that every + has 0 or 2 lines leading from it
            for(j=0;++j<h-1;)
                R=(i%2+j%2>1&(o=B[i,j-1]%2+B[i-1,j]%2+B[i+1,j]%2+B[i,j+1]%2)>0&o!=2)|((c=B[i,j])<4&c!=o)?7:R; // set R to 7 (no significance) if check fails

        for(o=h=0;o<O;B[i,j]=0) // this loops through the list of joined lines adding more until the whole loop has been seen
            if(B[i=(c=S[o++])%w,j=c/w]>4)
            {
                h++; // increment "seen" counter
                S[O++]=(S[O++]=c-w-1)+2;
                S[O++]=(S[O++]=c+w-1)+2;
                z=j%2<1?w*2:2; // special for | and -
                S[O++]=c-z;
                S[O++]=c+z;
            }

        C.Write(h-R<T?"n":"y"); // check if R is greater than 0 or h is less than T and output appropriately
    }
}

ขอบคุณ @ edc65 ไม่รู้ว่าจะทำยังไงดี!
VisualMelon

1

คอบร้า - 514

class P
    def main
        t,m,g=[[1]][:0],nil,File.readAllLines('p')
        u,i=g[0].length,1
        for l in g.length,for c in u,if g[l][c]in'0123'
            n=0
            for j in-1:2:2,for r in[g[l+j][c],g[l][c+j]],if r in'-|',n+=1
            if'[n]'<>g[l][c],m?='n'
        else if g[l][c]in'-|',x,y,t,d=c,l,t+[[c,l]],g[l][c]
        while i
            i=z=6
            for f,b in[[-1,1],[1,1],[0,2],[-1,-1],[+1,-1],[0,-2]]
                if'-'==d,f,b=b,f
                for w in t.count,if z and t[w]==[x+f,y+b],t,x,y,d,z=t[:w]+t[w+1:],x+=f,y+=b,g[y][x],0
                i-=z//6
        print if(t.count,'n',m?'y')

ตรวจสอบว่าทุกหมายเลขมีจำนวนบรรทัดที่ถูกต้องอยู่ข้างๆหรือไม่จากนั้นก็เดินไปรอบ ๆ บรรทัดนั้นและตรวจสอบว่ามันพลาดหรือไม่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.