블록 재 배열


14

따라서 귀하의 작업은 3x3 블록을 사용하여 -의 평균 공백 공간을 의미하고 *의 평균 공간을 채 웁니다 (예 :

-**
-*-
*-*

다음과 *같이 X를 형성 하도록 블록을 재 배열하십시오 .

*-*
-*-
*-*

입력 : 위와 같이 3x3 정사각형, 3 줄, 배열 또는 원하는 수 있습니다.

출력 : X로 재 배열 할 가장 짧은 이동량입니다. 각 이동은 서로 닿아 있고 가로, 세로, 대각선 인 두 문자를 뒤집습니다. 불가능한 경우 불가능한 출력을 반환하십시오 (예 : 999또는) -4242. 5가장 작은 숫자입니다.

테스트 사례 :

1) 출력 : 1

-**
-*-
*-*

2) 출력 : -1

-*-
-*-
*-*

3) 출력 : 3

---
-**
***

4) 출력 : 0

*-*
-*-
*-*

공백과 공백이 아닌 문자로 대체 할 수 있지만 게시물에 어떤 문자를 포함해야합니다

코드 골프

가장 짧은 코드가이기는 코드 골프입니다!


1
2자를 뒤집 으면 공간에서 뒤집 *거나 반대로 바꾸는 것을 의미 했 습니까?
user202729

5 개 이상이 있으면 어떻게 *합니까? 테스트 케이스를 더 추가 할 수 있습니까?
Stewie Griffin

예를 들어, @ user202729는 마지막 2자를 뒤집 으면 abc는 acb입니다.
노아 크리스티 노

@StewieGriffin "가능한 경우 -1을 반환 할 수없는 경우"가 5보다 크 *거나 5보다 작 으면 불가능합니다.
노아 크리스티 노

6
우리가 아닌 다른 것을 사용해도 -1될까요? 예를 들어 5(그렇지 않으면 불가능한) 오류가 발생합니까?
Jonathan Allan

답변:


12

파이썬 3 , 104 78 바이트

lambda n:-(sum(n)!=5)or sum(n[1::2])+n[4]*(max(n,n[6:],n[::3],n[2::3])>=[1]*3)

온라인으로 사용해보십시오!

편집 : @Jonathan Allan과 @xnor의 제안을 모두 적용하여 바이트 수를 크게 줄였습니다.

입력은 길이가 9 인 문자열 목록이며 0은 1이며 1은 *s입니다.

다음은 몇 가지 관찰 사항입니다.

  • 우리는 이미 올바른 세포에서 별을 움직일 필요가 없습니다. 잘못 배치 된 별에는 한 번에 차단할 수없는 주변 셀이 5 개 있습니다 (그렇지 않으면 답은 이미 -1 임).
  • 잘못 배치 된 각 별의 비용은 1 또는 2이며, 올바르게 배치 된 별 3 개로 둘러싸인 경우에만 2입니다.
  • 잘못 배치 된 각 별의 비용은 서로 독립적입니다.

따라서 먼저 문자열에 5 개의 문자열이 있는지 테스트 한 후 다음을 계산합니다.

  • 잘못 배치 된 별 수 (= 홀수 인덱스에있는 별)
  • 잘못 비용 2의 별의 수 (=에서 세포 0124, 0346, 2458, 4678모두 1 인)
    • 아웃 인자 n[4]하나되는, 그리고 각각의 영역 추출 존재를 테스트 '111'.
    • 그러한 별은 최대 하나이기 때문에 max대신에 안전하게 사용할 수 있습니다 sum.

문자열 대신 목록을 받아들이는 (대체하여 17 바이트의 저장을 count함께들 sum들과 '111'함께 [1]*3) TIO (난과 영리 노력했습니다 n[i::j]>=[1]*3루프, 짧은 발견하지 않았습니다).
Jonathan Allan

하나의 비용 2 별만있을 수 있으므로 할 수있는 것처럼 보입니다 max(n,n[6:],n[::3],n[2::3])>='1'*3.
xnor

비용-2 별이있는 다른 배열이 있습니다. [0,1,1,1,1,0,1,0,0]은 2 대신 3을 반환해야한다고 생각합니다.
RootTwo

또한 [1,1,1,1,0,0,1,0,0]은 2 대신 3이어야합니다.
RootTwo

또한 [1,1,1,1,0,0,1,0,0]은 2 대신 3이어야합니다.
RootTwo

4

젤리 , 26 바이트

5ḶḤd3ạŒ!Ṁ€€ḅ1Ṃ
T’d3Ç-L=5Ɗ?

온라인으로 사용해보십시오!


간단한 목록을 입력으로 사용하십시오.

젤리에 "다차원 적 진실 지수"가 없다는 것은 너무 나쁘다 T€ṭ€"JẎ.


알고리즘 : 5 개의 현재 블록 위치와 5 개의 목표 (목적지)가 있으며 알고리즘은 5 개 각각을 시도합니다! [source, destination] Chebyshev 거리의 최소 합을 일치시키고 출력합니다.


당신은 ( "그러나 당신이 원하는") 플랫리스트를 가질 수 있습니다.
Jonathan Allan

4

하스켈 , 176 132 126 104 바이트

w=0:1:w
m a|sum a/=5=5|1>0=sum$[a!!4|3<-sum.map(a!!)<$>[[0,1,2],[0,3,6],[2,5,8],[6,7,8]]]++zipWith(*)a w

온라인으로 사용해보십시오!


공백이 아닌 문자로 1을 갖는 정수 목록을 가져옵니다. 0이 아닌 짝수 색인 사각형의 수를 합한 다음 이중 이동 패턴이 발견되면 1을 더합니다 (중앙 사각형 및 가장자리 열 / 행이 완전히 채워짐). 마지막 부분은 약간 낭비 적이며 아마도이 무차별 방법보다 훨씬 향상 될 수 있다고 생각합니다. 불가능한 입력에 대해 5 (불가능한 출력)를 리턴합니다.


2
몇 가지 팁 : length테스트가로 단축 될 수 있습니다 sum[1|1<-a]. 기능 s: (1-e,n+sum[1|b>e])다른 바이트를 저장하기 위해 인라인 할 수 있습니다. otherwise가드 를 사용하여의 m쌍을 저장할 수 있습니다 (). 마지막으로 &&가드의 최상위 레벨을로 대체 할 수 있습니다 ,. ...
nimi

2
sum목록 이해를 사용하여 부울을 int로 캐스팅 하여 다른 바이트를 저장할 수 있습니다 . 온라인으로 사용해보십시오!
포스트 락 가프 헌터

2
실제로 패턴 가드가 사라지면 모든 것을 위로 이동할 수 있기 때문에 상당히 많은 바이트를 절약 할 수 있습니다 m. 온라인으로 사용해보십시오!
Post Rock Garf Hunter

2
또한 모든 비 1 요소부터 a해야는 0당신이 사용할 수없는 sum a대신에 sum[1|1<-a]? 온라인으로 사용해보십시오!
Post Rock Garf Hunter

1
모두가 1 개 이상 측면이있을 수 없기 때문에 난 그냥 깨달았다 1중심이되지 않는이야 0, 당신이 할 수있는 3<-대신에 elem 3$. 또한 sum.map(a!!)대신에 사용할 수 있습니다 sum<$>map(a!!).
Post Rock Garf Hunter

3

파이썬 2 , 194192 바이트

from itertools import*
f=lambda l,k=0:-(sum(l)!=5)or[1,0]*4!=l[:-1]and k<4and-~min(f(l[:a]+[l[b]]+l[a+1:b]+[l[a]]+l[b+1:],k+1)for a,b in combinations(range(9),2)if max(b/3-a/3,abs(a%3-b%3))<2)

온라인으로 사용해보십시오!


1
작동하지 않습니다 [0,1,0,1,0,1,1,1,0](예상 : 4, 실제 : 13).
Bubbler

@ 버블 러가 수정했습니다
ovs

3

자바 스크립트 (ES6), 123 바이트

입력을 9 비트 정수로 사용합니다. 가장 짧은 접근 방법이 아닌 것으로 입증 된 규칙을 순진하게 적용하여 퍼즐을 해결합니다.

f=(n,k=b=-1)=>n^341?k>2?b:[3,6,9,10,17,18,20,34,36].map(m=>[1,8,8].map(M=>(x=n&(m*=M))&-x^x||f(n^m,k+1)))|b:!~b|k<b?b=k+1:b

온라인으로 사용해보십시오!

댓글

f = (                           // f = recursive function taking:
  n,                            //   n = input
  k =                           //   k = number of moves, initialized to -1
  b = -1                        //   b = best result so far, initialized to -1
) =>                            //
  n ^ 341 ?                     // if n does not match the target pattern:
    k > 2 ?                     //   if we've already done more than 3 moves:
      b                         //     we're not going to find a solution -> abort
    :                           //   else:
      [3,6,9,10,17,18,20,34,36] //     for each swap bitmask m
      .map(m =>                 //     and
      [1,8,8]                   //     for each multiplier M:
      .map(M =>                 //       apply the multiplier to m and
        (x = n & (m *= M))      //       apply the final bitmask to n -> this gives x
        & -x                    //       isolate the least significant bit of x
        ^ x ||                  //       if it's the only bit set,
        f(n ^ m, k + 1)         //       then swap the bits and make a recursive call
      )) | b                    //     end of both map() loops; return b
  :                             // else:
    !~b | k < b ? b = k + 1 : b //   this is a solution in k+1 moves: update b

NB :이 코드 는 m 에 64를 곱 하면 보드 상단을 넘어 불법 이동을 수행합니다. 그러나 최고의 법적 솔루션보다 더 짧은 솔루션으로 이어질 수 없기 때문에 무시됩니다.

아래는 9 개의 기본 스왑 비트 마스크와 대상 패턴입니다. 왼쪽 상단이 가장 중요합니다.

000  000  001  001  010  010  010  100  100     101
011  110  001  010  001  010  100  010  100     010 (341)
(3)  (6)  (9)  (10) (17) (18) (20) (34) (36)    101

테스트를 위해 hexdump를 연결할 수 있습니까? 또한, 나는 9 개 비트 정수 JS 가능 몰랐
스탠 스트 럼

@StanStrum보다 간단한 인코딩으로 더 짧은 버전으로 업데이트되었습니다. (그리고 예 : JS는 최대 32 비트의 비트 연산을 지원합니다.)
Arnauld

2

젤리 , 26 바이트

“ċȤ‘ḤB;U$=a¥;Ḋm2ƊẠ€SɓSn5Nȯ

온라인으로 사용해보십시오!

모나 딕 링크.

어떻게?

Bubbler의 Python 답변에서 영감을 얻었습니다 . 젤리에 맞는 골프 ...

“ċȤ‘ḤB;U$=a¥;Ḋm2ƊẠ€SɓSn5Nȯ - Link: length 9 list of ones & zeros, X
“ċȤ‘                       - list of code-page indices     = [232,154]
    Ḥ                      - double                        = [464,308]
     B                     - to binary     = [[1,1,1,0,1,0,0,0,0],[1,0,0,1,1,0,1,0,0]]
        $                  - last two links as a monad:
       U                   -   upend       = [[0,0,0,0,1,0,1,1,1],[0,0,1,0,1,1,0,0,1]]
      ;                    -   concatenate = [[1,1,1,0,1,0,0,0,0],[1,0,0,1,1,0,1,0,0],[0,0,0,0,1,0,1,1,1],[0,0,1,0,1,1,0,0,1]]
           ¥               - last two links as a dyad:
          a                -   logical AND (vectorises)
         =                 -   equal? (vectorises)
                Ɗ          - last three links as a monad:
             Ḋ             -   dequeue X (remove leftmost element)
               2           -   literal two
              m            -   modulo slice (keeps the "edge-elements") 
            ;              - concatenate
                 Ạ€        - all? for €ach (edge-elements: no-op
                           -                else: 1 for any cost-2 element 0 otherwise)
                   S       - sum
                    ɓ      - new dyadic chain ^that on the right; X on the left
                     S     - sum X
                       5   - literal five
                      n    - not equal?
                        N  - negate (-1 if not exactly 5 1s, 0 otherwise)
                         ȯ - logical OR with right

2

자바 스크립트, 85 바이트

s=>/^0*(10*){5}$/.test(s)*s.match(/(?=1.(..)*$|^1(..)?11.1|1.11(..)?1$)|$/g).length-1

이것은 Bubbler 's answer의 정규식 포트입니다 .

0 / 1의 문자열로 입력하십시오.


2

Stax , 23 22 바이트

Ç╙╤Ü┤└åVτ┐├Y-²▼░█∩¡3ëâ

실행 및 디버깅

이 프로그램은 [0, 1] 입력으로 받아 정수의 이동 횟수를 반환하거나 솔루션을 사용할 수없는 경우 빈 문자열을 반환합니다.

그리드에 대한이 지수를 고려하십시오

0 1 2
3 4 5
6 7 8
  • 정확히 5가 없으면 1입력에 초가 없으면 해결책이 없으므로 출력을 생성하지 않습니다.
  • 각면의 중심이 잘못된 위치입니다. 이들은 인덱스 1, 3, 5 및 7입니다. 각각에 대한 거리 합산1 입니다.이 위치에서 최종 결과가 생성됩니다.
  • 1잘못된 위치에있는 각각 의 거리는 1 또는 2 1입니다. 다른 s로 둘러싸여 있으면 2가됩니다 . 예를 들어, 1인덱스 [0, 1, 2, 4]에 s 가 있으면 잘못된 거리1 2입니다.
  • 이를 염두에두고, 거리가 인덱스 1에 의해 결과에 기여하도록하기위한이 의사 코드를 고려하십시오.

    1. 인덱스 [1, 0, 2, 4]에서 4 비트를 읽습니다. 이것은 잘못된 위치를 가장 중요한 위치에 둡니다.
    2. 이 비트를 숫자로 변환 b 0에서 15 사이 .
    3. 경우 0 <= b <= 7때 거리가 0 인 8 <= b <= 14경우에는 거리가 1이고 b == 15거리 이것은하여 정수 나눗셈을 이용하여 계산 될 수있다 (2) b * 2 / 15.

총 거리는이 과정을 4 번 반복하고 그 사이에서 그리드를 회전시켜 계산할 수 있습니다.

1#5=4*  if the number of 1s is 5, then 4, else 0
D       repeat the rest of the program that many times
  x     push the value in the x register, which is initially the input
  3/    split into 3 rows
  rM    rotate 90 degrees
  $X    flatten back into single array, and save the "rotated" array in the X register
  A|2E  get the digits of 2^10 i.e. [1,0,2,4]
  @     read the bits from the current rotation at indices [1,0,2,4]
  :b    convert bits to integer
  H15/  double, then divide by 2
  +     add to running total

이것을 실행


편집을 확인하십시오. -1이 아니라 불가능한 값이 허용됩니다.
Noah Cristino

예. 그것은 2 바이트를 절약했습니다.
재귀

1

엑셀, 86 81 바이트

=SUM(B1,A2,B3,C2)+B2*(AND(A1:A3)+AND(A1:C1)+AND(C1:C3)+AND(A3:C3))/(SUM(A1:C3)=5)

Old : '불가능'출력이-1

=IF(SUM(A1:C3)=5,SUM(B1,A2,B3,C2)+B2*(AND(A1:A3)+AND(A1:C1)+AND(C1:C3)+AND(A3:C3)),-1)

용도 1작성 및 0범위 빈, 입력 A1:C3. "불가능" 이외의 값을 반환 할 수 있으면 더 골프를 치는 것이 가능합니다 -1. #DIV/0!불가능한 그리드 에서 오류를 반환

Bubbler의 Python answer 와 동일한 논리로 작동합니다 .


편집을 확인하십시오. -1이 아니라 불가능한 값이 허용됩니다.
Noah Cristino
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.