ตรรกะ Dot Shapes


12

เกม

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

ตอนนี้ที่นี่มีสามสิ่งหลักที่ต้องแจ้งให้ทราบ

  1. กระดานเกม (ตาราง 4x4 ของสี่เหลี่ยมอยู่ตรงกลาง)
  2. รูปร่างที่ต้องการ (จุดเชื่อมโยงในแถบที่สองจากด้านบนใต้คะแนนและเมนู ฯลฯ ) ซึ่งเป็นเส้นทั้งหมดหรือa1 สี่เหลี่ยม
  3. ตัวเลขเหนือแถวและคอลัมน์ซึ่งแสดงถึงจำนวนจุดที่ต้องอยู่ในคอลัมน์สำหรับการแก้ปัญหา

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

ในการแก้ปัญหาให้สังเกตว่ารูปร่างทั้งหมดจะถูกสร้างขึ้นเพียงครั้งเดียว (เพราะพวกเขาอยู่ในรูปร่างที่ต้องการเพียงครั้งเดียว) และในกรณีนี้พวกเขาเป็นแนวนอนทั้งหมด แต่พวกเขาสามารถแนวตั้ง สีชมพูที่เต็มไปด้วยสี่เหลี่ยมหมายถึงสี่เหลี่ยมที่ไม่ได้ใช้

นี่คือตารางที่ใหญ่กว่าและซับซ้อนกว่าเล็กน้อย:

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

เอกสาร

สำหรับส่วนที่เหลือของโพสต์นี้ฉันจะอ้างถึงบอร์ดโดยใช้สัญลักษณ์ต่อไปนี้:

  • <,>, ^, v -หมายถึงจุดที่วางไว้ล่วงหน้าโดยมีหางยื่นออกไปในทิศทางของจุด
  • * -หมายถึงจุด หากได้รับในตารางที่ไม่ได้แก้ไข (อินพุต) มันเป็นรูปร่างของแต่ละบุคคล หากอยู่ในเอาต์พุตก็จะเชื่อมต่อกับจุดโดยรอบ
  • # -หมายถึงสี่เหลี่ยมกริดที่ถูกบล็อก (ซึ่งคุณไม่สามารถวางจุดได้)
  • -, | (เครื่องหมายขีดคั่นและแถบ) -ระบุจุดด้วยหางขวาและซ้ายและจุดที่มีหางขึ้นและลงตามลำดับ
  • ** (อักขระเว้นวรรค) - ** หมายถึงพื้นที่ว่าง

การใช้สัญลักษณ์เหล่านี้กรณีตัวอย่างหลัง (ยังไม่แก้) สามารถแสดงได้ดังนี้:

 <    



    # 
 ^ #

และการแก้ปัญหาสามารถแสดงเป็น:

*< * *
   *  
     *
 *   *
 * *#*
 ^ # *

โปรดทราบว่าไม่มีสองรูปทรงที่สามารถสัมผัสในแนวนอนแนวตั้งหรือแนวทแยงมุมดังนั้นกรณีต่อไปนี้ไม่ถูกต้อง:

 *** 
**   
  ** 

ท้าทาย

ความท้าทายของคุณคือการแก้ปริศนาลอจิกจุดตั้งแต่ 4x4 ถึง 9x9 คุณจะได้รับอินพุตสี่บรรทัดจากนั้นบอร์ดเกม บรรทัดจะเป็นดังนี้:

  • บรรทัดที่ 1, รูปร่าง - รูปร่างที่จะค้นหาแต่ละอันที่อยู่ในรูปแบบsizexquantity(เช่น3x2สำหรับสองรูปร่างที่มีความยาวสาม) และคั่นด้วยช่องว่าง บรรทัดตัวอย่าง:3x1 2x1 1x1
  • บรรทัดที่ 2, คอลัมน์ - รายการที่คั่นด้วยช่องว่างของจำนวนจุดที่ต้องการสำหรับแต่ละคอลัมน์ บรรทัดตัวอย่าง:1 1 2 2
  • บรรทัดที่ 3, แถว - รายการที่คั่นด้วยช่องว่างของจำนวนจุดที่ต้องการสำหรับแต่ละแถว บรรทัดตัวอย่าง:3 0 3 0
  • บรรทัดที่ 4, ขนาดบอร์ด - จำนวนเต็มเดียว, ขนาดบอร์ด, B

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

4x1 3x1 2x2 1x2
1 4 0 3 0 5
4 1 1 2 3 2
6
 <    



    # 
 ^ #  

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

** * *
   *  
     *
 *   *
 * *#*
 * # *

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

นี่คือรหัสกอล์ฟอย่างน้อยไบต์จะชนะ


กรณีทดสอบ

อินพุต 1

3x2 1x4
2 2 3 1 2
4 0 3 0 3
5


    #
  #  
    *

เอาท์พุท 1

*** *

 ***#
  #  
* * *

อินพุต 2

3x1 1x6
2 0 4 0 3
3 1 2 1 2
5
*    


   # 

เอาท์พุท 2

* * *
  *  
  * *
*  # 
  * *

อินพุต 3

5x1 4x1 2x1 1x2
1 2 3 3 2 2
0 5 0 4 0 4
6
#     
  -   


 #    
   <  

เอาท์พุท 3

#     
 *****

 **** 
 #    
* ** *

ใช่นั่นถูกต้อง @flawr
globby

@flawr t no two shapes can touch horizontally, vertically or diagonally(นี้ควรจะเป็นจุดเริ่มต้นที่ไม่ได้หายไปเกือบใกล้จะจบ แต่อย่างไรก็ตาม ... )
edc65

@globby จะไม่มีการแทนที่พื้นที่ว่างด้วย # ฉันคิดว่า # คือเมื่อคุณแตะที่ว่างในเกม เมื่อคุณจบด่านมันจะเติมเซลล์ว่างทั้งหมด
Teun Pronk

@TununPronk # # เป็นช่องว่างที่กำหนดไว้ล่วงหน้าว่าคุณไม่สามารถวางจุดในระดับเช่นสี่เหลี่ยมสีเทาในตัวอย่างที่สอง
globby

2
ดีกว่าเสนอเงินรางวัลคุณควรเพิ่มกรณีทดสอบที่น่าสนใจและแก้ไขข้อผิดพลาดในคำถามของคุณ ตัวอย่างเช่นผลลัพธ์สุดท้ายก่อนที่กรณีทดสอบปัจจุบันยังคงมี <และ ^
edc65

คำตอบ:


3

Python 2: 766 739 696 663 633 ไบต์

def f(B,S,o=0):
 if[]==S:print'\n'.join(B);exit()
 s=S[0]
 for i in r:
  for j in R(Z-s+1):
   if(B[i][j]in' '+'>v'[o])*(B[i][j+s-1]in' '+'<^'[o])*({' ','-|'[o]}>=set(B[i][j+1:j+s-1]))*all(B[x][y]in'# 'for x,y in [(x,y)for y in R(j-1,j+s+1)for x in i-1,i+1]+[(i,j-1),(i,j+s)]if 0<=x<Z>y>=0):q=B[:];q[i]=q[i][:j]+'*'*s+q[i][j+s:];q=(q,t(q))[o];any((t(q)+q)[k].count('*')>m[k]for k in R(Z+Z))or f(q,S[1:])
 o or f(t(B),S,1)
y=raw_input;S=[];s=str.split
for i in s(y()):u,v=map(int,s(i,'x'));S+=[u]*v
m=map(int,s(y())+s(y()));Z=input();R=range;r=R(Z);B=[y()for _ in r];J=''.join;t=lambda x:map(J,zip(*x))
f(B,S[:len(S)-J(B).count('*')])

ดูการทำงานออนไลน์: Ideone.com (เวอร์ชั่นออนไลน์อาจช้าเกินไปสำหรับกริดขนาดใหญ่และยากออฟไลน์ควรจะใช้ได้)

อินพุตคือผ่าน stdin เพียงแค่คัดลอกและวางบรรทัดจาก OP (แต่ระวังการ stackexchange บางครั้งจะลบช่องว่างหรือบรรทัด)

fบางความคิดพื้นฐานของรหัสนี้จะใช้ฟังก์ชันเวียน fพยายามที่จะวางรูปร่างหนึ่งที่คณะกรรมการ สำหรับแต่ละตำแหน่งที่เป็นไปได้มันจะเรียกตัวเองว่าบอร์ดที่ถูกดัดแปลง มี 3 ลูปอยู่ในนั้น oกำหนดทิศทาง (2 - แนวนอน, 3 - แนวตั้ง) มันจะวางในแนวนอนรูปร่างดังนั้นในตอนท้ายของมันจะย้ายคณะกรรมการที่มีฟังก์ชั่นo=2 คือแถวและเป็นคอลัมน์เริ่มต้นทั้งหมดที่เป็นไปได้ จากนั้นการตรวจสอบจำนวนมากจะเกิดขึ้นหากส่วนท้ายของรูปร่างมีตัวอักษรที่ถูกต้องหากตรงกลางของรูปร่างนั้นมีตัวอักษรที่ใช้ได้และหากสภาพแวดล้อมว่างเปล่าtij


ฉันกำลังดิ้นรนเพื่อตัด 6 ไบต์สุดท้ายเมื่อฉันเห็นการแก้ไขครั้งล่าสุดของคุณ (-30) และยอมแพ้ ... คุณมีคะแนนของฉันสำหรับสิ่งที่คุ้มค่า
edc65

3

JavaScript (ES6) 661 667 695 702 745 755 786 790 784 798

กำลังดำเนินการอยู่สามารถย่อให้สั้นลงได้ อาจช้าเกินไปบนกริดที่ซับซ้อน อาจจะไม่.

แก้ไขนานขึ้นเร็วขึ้นมาก
แก้ไข 2 แก้ไขข้อผิดพลาดตรวจสอบคอลัมน์ / แถว บังเอิญตอนนี้มันเร็วกว่า

ฟังก์ชั่น M เป็นหลัก พารามิเตอร์ w เป็นสตริงหลายบรรทัดที่มีอินพุตทั้งหมด ฟังก์ชันแยกวิเคราะห์อินพุตและเตรียมบอร์ดเริ่มต้น ตัวละคร<>^v|-*ในกระดานเริ่มต้นจะถูกแทนที่ด้วย,แต่ละตัว,จะต้องถูกแทนที่ด้วย*วิธีการแก้ไขที่ถูกต้อง

ฟังก์ชัน R พยายามวนซ้ำเพื่อวางรูปร่างทั้งหมดไว้ในบอร์ด เมื่อวางรูปร่างมันจะเรียกตัวเองว่าผ่านรายการรูปร่างที่สั้นกว่าและบอร์ดที่ดัดแปลง เมื่อรูปทรงที่มีอยู่แก้ปัญหายังคงสามารถที่ไม่ถูกต้องถ้ามีไม่ได้ถูกแทนที่โดย,*

ฟังก์ชั่น P ทดสอบว่าสามารถวางรูปร่างไว้ในตำแหน่งและทิศทางที่กำหนดหรือไม่ จะตรวจสอบ costrains ทั้งหมด (ภายในบอร์ดไม่มีการทับซ้อนไม่มีการสัมผัสแถวที่ถูกต้องและจำนวนคอลัมน์)

M=w=>(
  [x,c,r,z]=w=w[S='split'](n='\n'),
  (b=[...w.slice(4).join(n)])
  .map((c,p)=>~(k='*<>-*^v|'.indexOf(c))&&[(q=k>3?z:1,0),k&1&&-q,k&2&&q].map(o=>b[p+o]=0),
    c=c[S](e=' '),r=r[S](e),w=z++,f='*',s='',x[S](e).map(v=>s+=v[0].repeat(v[2]))),
  R=(s,b,x=0,y=0,n=s[0],V=i=>b[i]>'#',
    P=(p,o,q,t,g,l,d=[...b])=>{
        if(l<z-n&!V(p+o*l-o)&!V(p+o*l+o*n))
        {
          for(i=-1;v=d[p],++i<w;p+=o,t-=v==f)
            if(i>=l&i-n<l)
              for(v!=e&v!=0|[q,w,~z].some(w=>V(p+w)|V(p-w))?t=0:d[p]=f,j=o*i,u=k=0;
                  ++k<z;(u+=d[j]==f)>g[i]?t=0:j+=q);
          return t>=n&&d.join('')
        }
    })=>{
    if(b){
      if(!n)return~b.search(0)?0:b;
      for(s=s.slice(1);y<w||(y=0,++x<w);++y)
        if(h=R(s,P(y*z,1,z,r[y],c,x))||n>1&&R(s,P(x,z,1,c[x],r,y)))return h
    }
  })(s,b)

ทดสอบในคอนโซล FireFox / FireBug

;['3x2 1x4\n2 2 3 1 2\n4 0 3 0 3\n5\n     \n     \n    #\n  #  \n    *\n'
,'3x1 1x6\n2 0 4 0 3\n3 1 2 1 2\n5\n*    \n     \n     \n   # \n     \n'
,'5x1 4x1 2x1 1x2\n1 2 3 3 2 2\n0 5 0 4 0 4\n6\n#     \n  -   \n      \n      \n #    \n   <  \n'
,'4x1 3x1 2x2 1x2\n1 4 0 3 0 5\n4 1 1 2 3 2\n6\n <    \n      \n      \n      \n    # \n ^ #  \n']
.forEach(x=>console.log(x,M(x).replace(/ /g,'`'))) // space replaced with ` for clarity

เอาท์พุท (เวลาดำเนินการทั้งหมด <1 วินาที)

3x2 1x4
2 2 3 1 2
4 0 3 0 3
5


    #
  #  
    *

***`*
`````
`***#
``#``
*`*`*

3x1 1x6
2 0 4 0 3
3 1 2 1 2
5
*    


   # 


*`*`*
``*``
``*`*
*``#`
``*`*

5x1 4x1 2x1 1x2
1 2 3 3 2 2
0 5 0 4 0 4
6
#     
  -   


 #    
   <  

#`````
`*****
``````
`****`
`#````
*`**`*

4x1 3x1 2x2 1x2
1 4 0 3 0 5
4 1 1 2 3 2
6
 <    



    # 
 ^ #  

**`*`*
```*``
`````*
`*```*
`*`*#*
`*`#`*

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