블록, 석판 및 계단으로 그 모양을 만들 수 있습니까?


13

각 셀이 비어 있거나 ( .) 가득 찬 ( 0) 직사각형 2 차원 그리드를 고려하십시오 .

예 :

..00....
0000....
.00000..
000...00
..000000
000.00..

격자는 무한대로 간주되며 묘사 된 영역 외부의 모든 셀은 비어 있습니다.

목표는 채워진 공간을 덮고 각각 그리드의 4 셀 (2 × 2)을 차지하는 7 개의 뚜렷한 모양의 벽돌 세트를 사용하여 빈 공간을 열어 두는 것입니다.

이들은 7 개의 벽돌입니다 :

  • 블록-1 변형

    11
    11
    
  • 석판-2 변형

    ..
    22
    33
    ..
  • 계단-4 변형

    .4
    44
    5.
    55
    66
    .6
    77
    7.

이 브릭은 항상 입력 그리드의 셀보다 두 배 넓고 키가 큰 그리드에 맞춰야합니다. 각 브릭은이 더 큰 그리드에서 하나의 셀만 차지할 수 있지만 더 작은 그리드는 더 큰 그리드 아래로 이동 (위, 아래, 왼쪽, 오른쪽으로 이동)하여 더 많은 옵션을 제공 할 수 있습니다. 그리드 나 개별 브릭은 회전 할 수 없습니다.

따라서 위의 예를 다루는 한 가지 방법은 다음과 같습니다.

..11....
2211....
.47733..
447...22
..771133
227.11..

(동일한 인접 벽돌은 여전히 ​​모호성을 유발할 수 있지만 더 큰 격자를 신중하게 식별하면 문제가 해결됩니다.)

에 대한 잘못된 솔루션

000000
000000

이다

566774
556744

벽돌이 모두 더 큰 격자에 정렬되지 않거나 하나의 셀만 차지하기 때문입니다.

여기에 유효한 솔루션은 3 블록입니다.

111111
111111

또 다른 유효한 솔루션에는 6 개의 슬래브가 포함됩니다.

......
222222
333333
......

따라서 일부 입력 그리드에는 여러 솔루션이 있습니다.

에 대한 잘못된 솔루션

00.00
00...

이다

11.33
11...

벽돌이 더 큰 격자에 정렬되지 않기 때문입니다. 슬래브는 왼쪽 또는 오른쪽으로 하나씩 움직여야하지만 물론 덮개는 불완전합니다. 이 입력 그리드에는 해결책없습니다 .

도전

(표준 입력 / 명령 라인을 통해)에 걸리는 프로그램 텍스트의 직사각형 블록 쓰기 .의 및 0의 적용되는 격자를 나타내고있다.

유효한 커버링 솔루션이있는 경우 위와 동일한 방식으로 하나의 솔루션을 인쇄하여 (표준 표준을 통해) 모든 0것을 적절한 1스루 7브릭으로 교체하십시오 .

해결책이 없으면 프로그램이 아무것도 출력하지 말고 정상적으로 종료하십시오.

노트

  • 입력과 출력이 동일한 직사각형 치수를 가질 필요는 없습니다. 결과가 .솔루션의 무효화되지 않는 한 외부 행 및 / 또는 모든 열을 가질 수 있습니다 .

  • .채워진 공간에 영향을 미치지 않으면 모든 행과 열을 자르는 것이 좋습니다. 예 :

    222222
    333333
    

    에 대한 유효한 솔루션입니다

    000000
    000000
    

    반대로, 00..00채워진 공간이 정렬되지 않기 때문에 두 개의 빈 열을 제거 할 수 없습니다.

  • 선택적으로 입력에 단일 후행 줄 바꿈이 있다고 가정 할 수 있습니다. 솔루션이없는 경우에도 출력의 단일 후행 줄 바꿈이 좋습니다.

  • 완전히 비어있는 그리드 (모두 .)와 사소한 0x0 그리드는 걱정할 필요가없는 입력 사례가 아닙니다. 그러나 01x1 그리드는 적어도 하나를 포함하는 다른 모든 그리드와 마찬가지로 0입니다. (입력 그리드의 너비 나 높이가 고르지 않다고 가정 할 수 있습니다!)

  • 프로그램 대신 입력을 문자열 인수로 사용하여 출력을 정상적으로 인쇄하거나 문자열로 반환하는 함수를 작성할 수 있습니다. 모든 falsy 값은 해결책이없는 경우 반환 할 수 있습니다.

  • 대신 9 개의 고유 한 인쇄 가능한 ASCII 문자를 사용할 수 있습니다 . 0 1 2 3 4 5 6 7. 당신의 대체물이 무엇인지 말하십시오! 줄 바꿈은 그대로 유지해야합니다.

채점

바이트 단위의 가장 짧은 코드가 이깁니다. Tiebreaker는 최고 투표 게시물입니다.

이 과제는 여기에 설명 된 것과 동일한 규칙을 따르는 Minecraft의 블록 , 석판계단 에서 영감을 얻었습니다 . PPCG 와 Minecraft 를 즐기는 경우 PPCG Minecraft Server 를 확인하십시오 .


3
이것은 마인 크래프트 서버는 골프 스크립트에서 구현되지 않은 것 같다 - :-) 지루한
토마스 웰러을

5
@ThomasWeller CJam에서 몇 바이트를 절약하기 위해 다시 구현되었습니다.
Alex A.

답변:


6

파이썬 - 525 491 478 430 바이트

r=range
def t(s):
 m=s.find("\n")+1
 for q in r(4):
  try:
   for i in r(-q%2,m-1,2):
    for j in r(-q/2,len(s)/m,2):
     k,g=j*m+i,""
     b=[k,k+1,k+m,k+m+1]
     for z in b:g+=a(s,z)
     for z in b:
      if a(s,z)!="d":s=s[:z]+`dict(dddd=0,zzdd=3,ddzz=2,zzzd=7,zzdz=6,zdzz=5,dzzz=4,zzzz=1)[g]`+s[z+1:]
   return s
  except:d
def a(v,i):
 try:
  if v[i]!="\n":return v[i]
  return "d"
 except:return "d"

설명 : 이것은 첫 번째 코드 골프이므로 최적이 아닐 수 있지만 작동 방식은 다음과 같습니다. 함수 t (s)는 전달 된 문자열에 대한 결과를 제공합니다. 먼저 열 수를 찾은 다음 1 (없음, 왼쪽, 위, 왼쪽 위)로 네 가지 가능한 고유 한 변환을 수행하여 해결하려고합니다. 각각에 대해. 각 2x2 블록을보고 사전에서 제공 한 유효한 블록 번호에 매핑하고 0을 숫자로 변경합니다.

사전에없는 것을 찾으면 해당 오프셋을 버리고 다음 오프셋으로 다시 시작합니다. 유효한 솔루션을 찾지 않고 4 개의 오프셋을 모두 통과하면 아무 것도 출력하지 않고 종료됩니다. a (v, i)는 문자열 외부의 기본값을 허용하고 줄 바꿈 문자를 무시합니다. 실행 기간 동안 부분 솔루션으로 끝날 수 있지만 존재하는 경우 항상 올바른 최종 솔루션으로 대체합니다.

편집 : 다른 문자 매핑이 사용됩니다 :. -> d, 0-> z, 다른 모든 숫자는 스스로 이동합니다. 이것은 입력과 출력 모두에 적용됩니다.


1
PPCG에 오신 것을 환영합니다! 파이썬에서 골프치기 위한 몇 가지 팁이 있습니다 . 내가 바이트를 절약 할 수 있다고 생각합니다.
lirtosiast 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.