논리적 점 모양


12

게임

최근에, 내 시간의 대부분은 Logic Dots 라 불리는 중독성있는 게임으로 인해 어려움을 겪었습니다. 게임 디스플레이를 보여 주면 규칙을 설명하는 것이 더 쉬우므로 해결되지 않은 퍼즐의 스크린 샷입니다.

이제 여기에 주목해야 할 세 가지 주요 사항이 있습니다.

  1. 게임 보드 (중앙에 4x4 격자 사각형)
  2. 모든 선 또는 a1 개의 사각형으로 필요한 모양 (위에서 두 번째 막대의 점수 및 메뉴 등의 연결된 점)
  3. 행과 열 위의 숫자 (해당 열에 몇 개의 점이 있어야하는지 나타냄)

게임의 목적은 필요한 모양을 그리드에 맞추는 것입니다. 도형을 회전 할 수는 있지만 대각선으로 이동할 수는 없습니다.

이 솔루션에서는 모든 도형이 한 번만 생성되며 (필요한 도형에만 한 번만 있기 때문에)이 경우에는 모두 수평이지만 수직 일 수도 있습니다. 사각형으로 채워진 분홍색은 사용되지 않은 사각형을 나타냅니다.

다음은 더 크고 약간 더 복잡한 그리드입니다.

해결되지 않은 퍼즐에는 이미 채워진 몇 개의 사각형이 있습니다. 회색 사각형은 점을 놓을 수없는 차단 된 사각형을 나타냅니다 . 꼬리를 가진 점 점 그 자리에 있음을 말해, 그것은으로 연결 이상 (반대 방향 포함) 다른 방향으로 꼬리의 방향으로 한 번 더 점,하지만.

표기법

이 게시물의 나머지 부분에서는 다음 기호를 사용하여 보드를 참조합니다.

  • <,>, ^, v- 점의 방향으로 연장되는 꼬리가있는 미리 배치 된 점을 나타냅니다.
  • *- 점을 나타냅니다. 해결되지 않은 그리드 (입력)에 제공된 경우 개별 모양입니다. 출력 상태이면 주변의 점에 연결됩니다.
  • #- 차단 된 그리드 사각형을 나타냅니다 (점을 배치 할 수없는 위치)
  • -, | (하이픈 및 막대)- 오른쪽 및 왼쪽 꼬리가있는 점과 각각 위쪽 및 아래쪽 꼬리가있는 점을 나타냅니다.
  • ** (공백 문자)-** 빈 공간을 나타냅니다.

이러한 기호를 사용하여 후자의 사례 (미해결)는 다음과 같이 나타낼 수 있습니다.

 <    



    # 
 ^ #

솔루션은 다음과 같이 나타낼 수 있습니다.

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

두 개의 도형이 가로, 세로 또는 대각선 으로 닿을 수 없으므로 다음과 같은 경우에는 유효하지 않습니다.

 *** 
**   
  ** 

도전

당신의 도전은 4x4에서 9x9까지 논리 도트 퍼즐을 해결하는 것입니다. 네 줄의 입력을받은 다음 게임 보드를 받게됩니다. 라인은 다음과 같습니다.

  • 첫 번째 줄, 모양-찾을 모양으로, 각각 형태 sizexquantity(예 : 3x2길이 3의 두 가지 모양)로 주어지고 공백으로 구분됩니다. 예제 라인 :3x1 2x1 1x1
  • 두 번째 줄, 열-각 열에 필요한 점 수의 공백으로 구분 된 목록입니다. 예제 라인 :1 1 2 2
  • 세 번째 줄, 행-각 행에 필요한 도트 수의 공백으로 구분 된 목록입니다. 예제 라인 :3 0 3 0
  • 네 번째 줄, 보드 크기-단일 정수, 보드 크기, B

그런 다음 보드가 제공되며 B위에서 언급 한 표기법을 사용하여 보드를 나타내는 입력 라인입니다. 예를 들어, 후자의 경우에 대한 전체 입력은 다음과 같습니다.

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



    # 
 ^ #  

그러면 프로그램은 해결 된 보드를 동일한 표기법으로 출력합니다. 위의 입력에 대한 일치 출력은 다음과 같습니다.

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

게임 보드에는 여러 가지 솔루션이있을 수 있습니다. 이 경우 하나의 유효한 솔루션 만 출력하십시오. 또한 프로그램은 복잡한 10x10 그리드에 적합한 합리적인 데스크톱 컴퓨터에서 10 초 이내에 올바른 솔루션을 출력해야합니다.

이것은 코드 골프이므로 최소 바이트가 이깁니다.


테스트 사례

입력 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

@TunPronk No. #은 두 번째 예의 회색 사각형과 같이 레벨에 점을 배치 할 수 없도록 미리 결정된 공간입니다.
globby

2
현상금을 제공하는 것보다 더 흥미로운 테스트 사례를 추가하고 질문의 오류를 수정해야합니다. 예를 들어, 현재 테스트 사례 이전의 마지막 출력에는 여전히 <및 ^가 포함되어 있습니다.
edc65

답변:


3

파이썬 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에서 행을 복사하여 붙여 넣으십시오 (그러나 스택 교환은 때로는 공백이나 행을 삭제합니다).

이 코드의 몇 가지 기본 아이디어 : 재귀 함수를 사용합니다 f. f보드에 한 모양을 배치하려고합니다. 가능한 모든 위치에 대해 수정 된 보드로 자체 호출됩니다. 3 개의 루프가 있습니다. o방향을 결정합니다 (2-가로, 3-세로). 항상 모양을 수평으로 배치하므로 끝 부분에 o=2보드를 기능으로 바꿉니다 t. i행이며 j가능한 모든 시작 열입니다. 그런 다음 도형의 끝에 유효한 문자가 있고 도형의 중간에 유효한 문자가 있고 주변이 비어있는 경우 많은 검사가 수행됩니다.


마지막 편집 (-30)을보고 포기했을 때 마지막 6 바이트를 자르려고 고군분투하고있었습니다 ... 가치있는 것에 대한 내 투표권이 있습니다
edc65

3

자바 스크립트 (ES6) 661 667 695 702 745 755 786 790 784 798

진행중인 작업을 단축 할 수 있습니다. 복잡한 그리드에서 너무 느릴 수 있습니다. 아마.

편집 A는 훨씬 빨리, 더 비트.
2 버그 수정, 열 / 행 확인을 편집 하십시오. 덧붙여서 지금은 더 빠릅니다

M 기능이 주 기능입니다. w 매개 변수는 모든 입력이있는 여러 줄 문자열입니다. 이 기능은 입력을 구문 분석하고 시작 보드를 준비합니다. <>^v|-*시작 보드의 문자 는로 바뀌고 올바른 해결책으로 ,각각 ,바꿔야 *합니다.

R 함수는 모든 모양을 보드에 재귀 적으로 시도합니다. 셰이프를 배치하면 더 짧은 셰이프 목록과 수정 된 보드를 전달하여 자체 호출됩니다. 모든 셰이프를 배치 할 때로 ,대체 하지 않으면 솔루션이 여전히 유효하지 않을 수 있습니다 *.

P 함수는 모양이 주어진 위치와 방향에 놓일 수 있는지 테스트합니다. 모든 비용을 점검합니다 (보드 내부, 겹침 없음, 터치 없음, 유효한 행 및 열 수).

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 2019
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.