Trình xác nhận Pentomino


9

Là một người không thể bận tâm nhìn vào pentominos của họ để xem nó có tạo thành hình chữ nhật không, tôi đã quyết định bắt bạn viết một chương trình thực hiện nó.

Nhiệm vụ của bạn

Đưa ra một số phân tách đầu vào bởi các dòng mới chứa 12 ký tự duy nhất, quyết định xem đó có phải là một giải pháp hợp lệ không.

Một giải pháp hợp lệ PHẢI

  • Có 5 mỗi ký tự (trừ dòng mới)
  • Mỗi bộ ký tự phải được kết nối đầy đủ
  • Mỗi bộ ký tự phải có một hình dạng duy nhất
  • Trong một hình chữ nhật thông thường

Nếu đó là một giải pháp hợp lệ, hãy đưa ra một giá trị trung thực, nếu không thì xuất ra một giá trị giả.

Chương trình của bạn có thể là một chức năng hoặc một chương trình đầy đủ nhưng phải lấy đầu vào từ stdin và đầu ra thành thiết bị xuất chuẩn.

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

Giải pháp hợp lệ

000111
203331
203431
22 444
2   46
57 666
57769!
58779!
58899!
5889!!

00.@@@ccccF111//=---
0...@@c))FFF1//8===-
00.ttttt)))F1/8888=-

Cấu hình không hợp lệ

invalid (doesn't contain 12 unique characters)

111112222233333444445555566666
77777888889999900000qqqqqwwwww (Each set has the same shape)

1234567890qw
w1234567890q
qw1234567890
0qw123456789
90qw12345678 (None of the characters are connected)

1234567890qw (Not 5 characters in every set)

1111122222333334444455555666666
77777888889999900000qqqqqwwwwww (More than 5 characters in some sets)

00
0                   
00.@@@ccccF111//=---
 ...@@c))FFF1//8===-
  .ttttt)))F1/8888=- (Doesn't form a rectangular shape)

1. Phản xạ của một pentomino có hình dạng giống như bản gốc không? 2. Chúng ta có thể giả sử đầu vào sẽ bao gồm các ký tự ASCII có thể in và các dòng mới không?
Dennis

@Dennis Có và Có
Màu xanh

@DigitalTrauma Nó không phải là một bản sao từ xa. BTW đó là một câu hỏi tuyệt vời, thật xấu hổ tôi không có thời gian để trả lời nó khi nó mới được hỏi.
Cấp sông St

@steveverill bạn nói đúng - Tôi đã không đọc đúng câu hỏi này
Chấn thương kỹ thuật số

Câu trả lời:


3

JavaScript (ES6), 237 235 222 byte

f=p=>(m=[],s=[],d=0,l=p.indexOf`
`+1,[...p].map((c,i)=>(i+1)%l&&!m[i]?g=d-2<s.indexOf((t=a=>m[a]|p[a]!=c?r=0:(m[a]=y.push(a),n=a<n?a:n,t(a+1)+t(a-1)+t(a+l)+t(a-l)+1))(n=i,y=[])!=5?g=0:s[d++]=y.map(a=>r+=a-n)|r):0),d==12&g)

Lưu 2 byte nhờ @DankMeme !

Sử dụng

f(`000111
203331
203431
22 444
2   46
57 666
57769!
58779!
58899!
5889!!`);
=> true

Giải trình

Một vài lưu ý về giải pháp này:

  • Có thể câu trả lời này không hợp lệ. Nó không thực sự kiểm tra xem các hình ngũ giác xoay có cùng hình dạng hay không, tuy nhiên tôi đã thử nhưng không thể tìm thấy hình chữ nhật pentomino hợp lệ đáp ứng các yêu cầu trong quy tắc và bao gồm hai hoặc nhiều hình dạng giống nhau được xoay. Nhưng tôi không phải là chuyên gia về pentomino nên nếu bạn tìm thấy một sự kết hợp hợp lệ mà điều này không thành công, hãy cho tôi biết.
  • Các quy tắc cũng yêu cầu câu trả lời để sử dụng STDINSTDOUTcho đầu vào và đầu ra nhưng prompt()chỉ được thiết kế cho đầu vào một dòng và máy tính (Windows) của tôi sẽ tự động đặt các \r\nký tự ở mỗi dòng mới khi dán để tôi tạo cho nó một hàm chấp nhận một chuỗi.
f=p=>(
  m=[],                      // m = map of checked characters
  s=[],                      // s = list of shapes found (stored as integer)
  d=0,                       // d = number shapes found
  l=p.indexOf`
`+1,                         // l = length of each line (including newline character)
  [...p].map((c,i)=>         // iterate through each character of the input
    (i+1)%l&&                // skip newline characters
      !m[i]?                 // skip the character if it has already been mapped
        g=                   // g = pentomino is valid
          d-2<s.indexOf(     // check if shape already existed before just now
            (t=a=>           // t() checks if character is part of the shape then maps it
              m[a]|          // skip if character is already mapped
                p[a]!=c      //    or if the current character is part of the shape
              ?r=0:(
                m[a]=        // mark the character as mapped
                  y.push(a), // y = list of shape character indices
                n=a<n?a:n,   // n = minimum index of all characters in the shape
                t(a+1)+      // check and map adjacent characters
                t(a-1)+
                t(a+l)+
                t(a-l)+
                1
              )
          )(n=i,y=[])
            !=5?g=0:         // make sure there are only 5 characters in the shape
            s[d++]=          // add the shape to the list
              y.map(a=>      // sum of (index of each character in the shape - minimum
                r+=a-n)|r    //     index) = unique integer representing the shape
        ):0
  ),
  d==12&g                    // ensure there is 12 shapes and return the 'is valid' result
)

1
Bạn có thể lạm dụng các mẫu được gắn thẻ l=p.indexOf`<newline here>`để lưu 2 byte
DankMeme

@DankMeme Cảm ơn bạn đã bắt! Tôi thực sự mệt mỏi khi tôi viết nó và tôi chưa kiểm tra nó lần nào. : P
user81655
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.