Sắp xếp lại khối


14

Vì vậy, nhiệm vụ của bạn là lấy một khối 3x3 trong đó -có nghĩa là khoảng trắng và *nghĩa là khoảng trống được lấp đầy, ví dụ:

-**
-*-
*-*

và sắp xếp lại khối sao cho *hình dạng X, như thế này:

*-*
-*-
*-*

Đầu vào: 3x3 hình vuông như trên, chúng có thể là 3 dòng, một mảng hoặc theo cách bạn muốn.

Đầu ra: Lượng di chuyển ngắn nhất để sắp xếp lại thành X. Mỗi lần di chuyển là lật 2 ký tự đang chạm và nằm ngang với nhau, thẳng đứng với nhau hoặc chéo nhau. Nếu không thể, hãy trả lại bất kỳ đầu ra không thể nào, ví dụ 999hoặc -4242. 5là số nhỏ nhất như vậy.

Các trường hợp thử nghiệm:

1) Đầu ra: 1

-**
-*-
*-*

2) Đầu ra: -1

-*-
-*-
*-*

3) Đầu ra: 3

---
-**
***

4) Đầu ra: 0

*-*
-*-
*-*

Bạn có thể thay thế các ký tự trống và không trống nhưng hãy chắc chắn bao gồm các ký tự trong bài viết của bạn

Mã Golf

Hãy nhớ rằng đây là mã golf, mã ngắn nhất sẽ thắng!


1
Bằng cách lật 2 ký tự, bạn có nghĩa là lật từ không gian sang *và ngược lại, hoặc trao đổi chúng?
dùng202729

Nếu có nhiều hơn năm *thì sao? Bạn có thể thêm một số trường hợp thử nghiệm?
Stewie Griffin

@ user202729 ví dụ abc sẽ là acb nếu bạn lật 2 ký tự cuối cùng.

@StewieGriffin "nếu không thể trả về -1" nhiều hơn 5 *hoặc dưới 5 thì không thể thực hiện được.

6
Chúng ta có thể sử dụng cái gì khác -1không? Ví dụ 5(không thể khác), hoặc ném lỗi?
Jonathan Allan

Câu trả lời:


12

Python 3 , 104 78 byte

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

Hãy thử trực tuyến!

Chỉnh sửa: Áp dụng cả đề xuất của @Jonathan Allan và @ xnor để giảm đáng kể số lượng byte.

Đầu vào là một danh sách chuỗi có độ dài 9 với các số 0 và một, các chuỗi *là s.

Dưới đây là một số quan sát:

  • Chúng ta không bao giờ cần phải di chuyển các ngôi sao trên các ô chính xác. Bất kỳ ngôi sao bị đặt sai vị trí nào cũng có 5 ô xung quanh không thể bị chặn cùng một lúc (nếu không câu trả lời đã là -1).
  • Chi phí cho mỗi ngôi sao đặt sai vị trí là 1 hoặc 2 và chỉ bằng 2 nếu được bao quanh bởi ba ngôi sao được đặt chính xác.
  • Chi phí cho mỗi ngôi sao đặt sai vị trí là độc lập với nhau.

Do đó, trước tiên chúng tôi kiểm tra xem chuỗi có năm chuỗi không, sau đó đếm những điều sau:

  • Số lượng sao bị đặt sai (= những ngôi sao ở các chỉ số lẻ)
  • Số lượng sao bị thất lạc của chi phí 2 (= tế bào ở 0124, 0346, 2458,4678 là tất cả những người thân)
    • Yếu tố n[4]là một, và sau đó kiểm tra từng trích xuất phạm vi '111'.
    • Vì ngôi sao như vậy nhiều nhất là một, chúng ta có thể sử dụng một cách an toàn maxthay vì sum.

Lưu 17 byte bằng cách chấp nhận danh sách thay vì chuỗi (thay thế counts bằng sums và '111'bằng [1]*3) TIO (Tôi đã cố gắng thông minh với một n[i::j]>=[1]*3vòng lặp nhưng không tìm thấy ngắn hơn).
Jonathan Allan

Vì chỉ có thể có một sao 2 chi phí, có vẻ như bạn có thể làm được max(n,n[6:],n[::3],n[2::3])>='1'*3.
xnor

Có những sắp xếp khác có giá 2 sao. Tôi nghĩ rằng [0,1,1,1,1,0,1,0,0] nên trả lại 3 thay vì 2.
RootTwo

Ngoài ra, [1,1,1,1,0,0,1,0,0] phải là 3 thay vì 2.
RootTwo

Ngoài ra, [1,1,1,1,0,0,1,0,0] phải là 3 thay vì 2.
RootTwo

4

Thạch , 26 byte

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

Hãy thử trực tuyến!


Lấy một danh sách phẳng làm đầu vào.

Thật tệ là Jelly không có "chỉ số trung thực đa chiều" ... T€ṭ€"JẎcũng hoạt động nhưng mất thêm 1 byte.


Thuật toán: Có 5 vị trí khối hiện tại và 5 mục tiêu (đích), thuật toán thử từng vị trí trong số 5! khớp và xuất tổng tối thiểu của [nguồn, đích] khoảng cách Ch Quashev.


Bạn có thể có một danh sách phẳng ("tuy nhiên bạn muốn") ... có lẽ bạn thậm chí có thể lấy các chỉ số dựa trên 0 và có 24?
Jonathan Allan

4

Haskell , 176 132 126 104 byte

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

Hãy thử trực tuyến!


Lấy danh sách các số nguyên có 1 là ký tự không trống. Tính tổng số ô vuông không có chỉ số chẵn, sau đó thêm 1 nếu tìm thấy bất kỳ mẫu di chuyển kép nào (hình vuông trung tâm và cột / hàng cạnh hoàn toàn được lấp đầy). Phần cuối hơi lãng phí tôi nghĩ, có lẽ có thể được cải thiện nhiều so với phương pháp vũ phu này. Trả về 5 (một đầu ra không thể) trên một đầu vào không thể.


2
Một số lời khuyên: lengthbài kiểm tra có thể được rút ngắn sum[1|1<-a]. Chức năng s: (1-e,n+sum[1|b>e])mà bạn có thể nội tuyến để lưu một byte khác. Bạn có thể sử dụng otherwisebảo vệ trong mđể lưu cặp (). Cuối cùng, &&ở cấp cao nhất trong một người bảo vệ có thể được thay thế bằng ,. ...
nimi

2
Bạn có thể lưu một byte khác bằng cách sử dụng một summức độ hiểu danh sách để truyền Boolean thành int. Hãy thử trực tuyến!
Đăng Rock Garf Hunter

2
Trên thực tế, bạn có thể lưu khá nhiều byte bởi vì một khi các trình bảo vệ mẫu đã biến mất, bạn có thể chuyển toàn bộ nội dung lên m. Hãy thử trực tuyến!
Đăng Rock Garf Hunter

2
Ngoài ra, vì mọi yếu tố không phải là 1 aphải là 0bạn không thể sử dụng sum athay vì sum[1|1<-a]? Hãy thử trực tuyến!
Đăng Rock Garf Hunter

1
Tôi chỉ nhận ra vì không thể có nhiều hơn 1 bên với tất cả các 1s trừ khi trung tâm là 0, bạn có thể làm 3<-thay vì elem 3$. Ngoài ra bạn có thể sử dụng sum.map(a!!)thay vì sum<$>map(a!!).
Đăng Rock Garf Hunter

3

Python 2 , 194 192 byte

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)

Hãy thử trực tuyến!


1
Không hoạt động với [0,1,0,1,0,1,1,1,0](dự kiến: 4, thực tế: 13).
Bong bóng

@Bubbler đã sửa nó
ovs

3

JavaScript (ES6), 123 byte

Lấy đầu vào dưới dạng số nguyên 9 bit. Giải quyết câu đố bằng cách áp dụng các quy tắc một cách ngây thơ, đã được chứng minh không phải là cách tiếp cận ngắn nhất.

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

Hãy thử trực tuyến!

Đã bình luận

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

Lưu ý : Mã này thực hiện một số động thái bất hợp pháp vượt ra khỏi đầu bảng khi m được nhân với 64. Nhưng chúng đơn giản bị bỏ qua, vì chúng không thể dẫn đến một giải pháp ngắn hơn giải pháp pháp lý tốt nhất.

Dưới đây là 9 bitmasks trao đổi cơ sở và mẫu đích. Góc trên bên trái là bit đáng kể nhất.

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

Bạn có thể liên kết một hexdump để thử nghiệm? Ngoài ra, tôi không biết số nguyên 9 bit có thể có trong JS
Stan Strum

@StanStrum Cập nhật lên phiên bản ngắn hơn với mã hóa đơn giản hơn. (Và có: JS hỗ trợ các hoạt động theo bit cho tối đa 32 bit.)
Arnauld

2

Thạch , 26 byte

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

Hãy thử trực tuyến!

Một liên kết đơn nguyên.

Làm sao?

Lấy cảm hứng từ câu trả lời Python của Bubbler ; chơi golf cho phù hợp với Jelly ...

“ċȤ‘Ḥ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

JavaScript, 85 byte

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

Đây là một cổng regex của câu trả lời của Bubbler .

Nhập dưới dạng chuỗi 0/1.


2

Stax , 23 22 byte

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

Chạy và gỡ lỗi nó

Chương trình này có một mảng [0, 1] là đầu vào và trả về số lượng di chuyển nguyên hoặc một chuỗi trống nếu không có giải pháp nào khả thi.

Hãy xem xét các chỉ số này cho lưới điện

0 1 2
3 4 5
6 7 8
  • Nếu không có chính xác 5 1 giây trong đầu vào, thì không có giải pháp, vì vậy chúng tôi không tạo ra đầu ra.
  • Các trung tâm của mỗi bên là các vị trí không chính xác. Đây là các chỉ số 1, 3, 5 và 7. Tổng hợp khoảng cách cho mỗi1 vị trí này sẽ tạo ra kết quả cuối cùng.
  • Đối với mỗi 1vị trí không chính xác, khoảng cách của nó là 1 hoặc 2. Nó sẽ là 2 nếu nó được bao quanh bởi các 1s khác . Ví dụ: nếu có 1s tại các chỉ số [0, 1, 2, 4], thì khoảng cách cho không chính xác1 là 2.
  • Với suy nghĩ này, hãy xem xét mã giả này để có được khoảng cách đóng góp vào kết quả theo chỉ số 1.

    1. Đọc 4 bit từ các chỉ số [1, 0, 2, 4]. Điều này đặt vị trí không chính xác ở vị trí quan trọng nhất.
    2. Chuyển đổi các bit này thành một số b từ 0 đến 15.
    3. Khi 0 <= b <= 7khoảng cách bằng 0. Khi 8 <= b <= 14khoảng cách là 1. Khi b == 15khoảng cách là 2. Điều này có thể được tính bằng cách sử dụng phép chia số nguyên theo b * 2 / 15.

Vì vậy, tổng khoảng cách có thể được tính bằng cách lặp lại quá trình này 4 lần và xoay lưới ở giữa.

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

Chạy cái này


Kiểm tra chỉnh sửa, mọi giá trị không thể được chấp nhận, không chỉ -1 nếu điều đó giúp bạn
Noah Cristino

Đúng. Điều đó đã lưu 2 byte.
đệ quy

1

Excel, 86 81 byte

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

Cũ: Khi đầu ra 'không thể' là-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)

Sử dụng 1cho đầy và 0trống, đầu vào trong phạm vi A1:C3. Có thể chơi gôn xa hơn nếu chúng ta có thể trả về các giá trị khác ngoài -1"không thể". Trả về một#DIV/0! lỗi trên lưới không thể

Hoạt động theo logic tương tự như câu trả lời Python của Bubbler's .


Kiểm tra chỉnh sửa, mọi giá trị không thể được chấp nhận, không chỉ -1
Noah Cristino
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.