Đếm đá quý trên mặt đất


8

Đếm đá quý

Lý lịch

Hộp ngọc của tôi vừa rơi xuống! Có quá nhiều đá quý có hình dạng khác nhau trên mặt đất. Và nhiệm vụ của bạn là đếm số loại đá quý nhất định.

Tôi / O

  • Mã của bạn phải có hai đầu vào SG, có thể là một chuỗi có dòng mới, một mảng các dòng, một mảng các ký tự hai chiều, một tệp văn bản hoặc ở bất kỳ định dạng hợp lý nào (nếu vậy, vui lòng nêu rõ).
  • Hai chuỗi này sẽ chỉ chứa !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~(từ 0x21đến 0x7Etrong bảng ASCII), dấu cách và dòng mới (dạng nhị phân tùy thuộc vào nền tảng của bạn).
  • Trong mỗi chuỗi, các dòng có cùng độ dài.
  • Slà viên ngọc chúng ta muốn đếm. Có hai hoàn cảnh.
    1. Kèm theo và không chứa bất kỳ khu vực kèm theo lồng nhau. (ví dụ 1/2)
    2. Không chứa bất kỳ khu vực kèm theo. (ví dụ 3/4)
  • Không gian xung quanh không được coi là một phần của đá quý.
  • G là hình dạng của đá quý trên mặt đất.
  • Có thể chấp nhận rằng mã của bạn yêu cầu thêm đầu vào để chỉ định (các) thứ nguyên của SG
  • Có thể chấp nhận rằng mã của bạn lấy giá trị ASCII làm đầu vào, thay vì chính các ký tự. Nhưng bạn không nên thay thế các ký tự bằng các số nguyên đơn giản hơn (0,1,2,3). Chương trình của bạn sẽ có thể xử lý các ký tự hoặc các giá trị ASCII.

Ví dụ 1 (Ký tự là đầu vào)

Đầu vào S:

+-+  
| +-+
| | |
| | |
| +-+
+-+  

Đầu vào G:

    +-+       +-+
    | +-+   +-+ |
    | | |   | | |
    | | |   | | |
    | +-+   +-+ |
    +-+       +-+
         +-+     
+---+    | +-+   
|   |    | | |   
|   |    | | |   
|   |    | +-++  
|   |    +-+| +-+
+---+       | | |
            | | |
  +-+       | +-+
  | +-+     +-+  
  | |-|          
  | |-|          
  | +-+          
  +-+            

Ouptut:

2

Ví dụ 2 (giá trị ASCII làm đầu vào)

Đầu vào S:

32 32 32 32 32 32 32 32
32 32 32 32 99 32 99 32
32 32 32 99 32 99 32 99
32 32 32 99 32 32 32 99
32 32 32 99 32 32 32 99
32 32 32 99 32 32 32 99
32 32 32 32 99 32 99 32
32 32 32 32 32 99 32 32
32 32 32 32 32 32 32 32

Đầu vào G:

32 99 32 99 32 99 32 99 32 32 99 32
99 32 99 32 99 32 99 32 99 99 32 99
99 32 32 32 99 32 32 32 99 32 32 99
99 99 32 32 99 32 32 32 99 32 32 99
99 32 32 32 99 32 32 32 99 32 32 99
32 99 32 99 32 99 32 99 99 32 99 32
32 32 99 32 32 32 99 32 32 99 32 32

Đầu ra:

1

Trực quan hóa S(32 thay thế bằng -):

-- -- -- -- -- -- -- --
-- -- -- -- 99 -- 99 --
-- -- -- 99 -- 99 -- 99
-- -- -- 99 -- -- -- 99
-- -- -- 99 -- -- -- 99
-- -- -- 99 -- -- -- 99
-- -- -- -- 99 -- 99 --
-- -- -- -- -- 99 -- --
-- -- -- -- -- -- -- --

Hình dung G:

-- 99 -- 99 -- 99 -- 99 -- -- 99 --
99 -- 99 -- 99 -- 99 -- 99 99 -- 99
99 -- -- -- 99 -- -- -- 99 -- -- 99
99 99 -- -- 99 -- -- -- 99 -- -- 99
99 -- -- -- 99 -- -- -- 99 -- -- 99
-- 99 -- 99 -- 99 -- 99 99 -- 99 --
-- -- 99 -- -- -- 99 -- -- 99 -- --

Ví dụ 3 (Không kèm theo)

Cảm ơn @ Draco18s

Đầu vào S

AB

Đầu vào G

AAB BA CAB

Đầu ra

2

Ví dụ 4 (Không kèm theo 2D)

Đầu vào S

ABCD
  GE
   F

Đầu vào G

ABCD 
BGGED
CDEFE
    F

Đầu ra

1

Nhận xét

  • Chỉ có hai viên đá quý có hình dạng chính xác được coi là giống nhau.
  • Cùng một hình dạng theo các hướng khác nhau không được coi là giống nhau.
  • Tuy nhiên, như được mô tả trong I / O ví dụ, việc chồng chéo là có thể. Trong những trường hợp như vậy, chỉ những người hoàn thành được tính.
  • +, -|trong ví dụ này không có ý nghĩa đặc biệt. Họ không chỉ ra bất kỳ góc hoặc cạnh của hình dạng.
  • Bạn có thể cho rằng đầu vào luôn hợp lệ.
  • Bạn có thể giả sử hai viên đá quý mục tiêu không bao giờ chia sẻ một cạnh chính xác.
  • Sơ hở tiêu chuẩn bị cấm.
  • Đây là một mã golf, vì vậy mã ngắn nhất sẽ thắng!

2
Tôi không hiểu ví dụ thứ hai, làm thế nào được Gchứa trong S?
LiefdeWen

@LiefdeWen Tôi đã làm cho nó trực quan, bạn có thể tìm thấy Sở giữa G.
Keyu Gan

Tôi nghĩ rằng một số ví dụ đơn giản là cần thiết ở đây, chẳng hạn như S = "AB", G=" AAB BA CAB", = đầu ra?
Draco18 không còn tin tưởng SE

@ Draco18s Cảm ơn bạn, tôi sẽ thêm nó.
Keyu Gan

Ví dụ đơn giản đó thực sự đã giúp hiểu hành vi mong muốn. Thật tuyệt
Draco18s không còn tin tưởng SE

Câu trả lời:


1

C (gcc) , 303304 327 byte

Tất cả các tối ưu hóa cần phải được tắt và chỉ hoạt động trên GCC 32 bit.

#define r(z,k)for(z=0;z<k;z++)
#define c s[i][j]
x,y,o,p,t,i,j;char**s;h(i,j){!((i<0)+(j<0)+i/x+j/y+c-32)?h(i+1,j),h(i-1,j),h(i,j+1),h(i,j-1),c=0:0;}f(w,e,u,v,a,g)char**a,**g;x=w,y=e,s=a;r(o,x)h(o,0),h(o,y-1);r(p,y)h(0,p),h(x-1,p);w=0;r(o,u-x+1)r(p,v-y+1){t=1;r(i,x)r(j,y)t*=!(c*(c-g[i+o][j+p]));w+=t;}}

Mã này sử dụng vùng lũ để thay thế các không gian xung quanh bằng \0và tìm kiếm các kết quả khớp trong khi bỏ qua \0.

không tính toán và macro được tính toán (một số chữ cái khác với phiên bản được đánh gôn, nhưng logic vẫn giữ nguyên):

int x, y, o, p, c, d, t;
char **s, **g;
h(int i, int j) {                             // Floodfill function
    if(i<0 || j<0) return;                    // Boundary detection
    if(i>=x || j>=y) return;
    if(s[i][j] != ' ') return;                // Character detection

    s[i][j] = 0;                              // Replace it with \0
    h(i+1, j);
    h(i-1, j)
    h(i  , j+1);
    h(i  , j-1);
}
f(
    int w,    //1st dimension of S
    int e,    //2nd dimension of S
    int u,    //1st dimension of G
    int v     //2nd dimension of G
    char** i, //Input S
    char** j, //Input G
    );
{
    x=w,y=e,s=i,g=j;
    for(o=0; o<x; o++)                        // Replace all surrounding spaces using floodfill
    {
        h(o, 0);                               
        h(o, y-1);
    }
    for(p=0; p<y; p++)
    {
        h(0,   p);
        h(x-1, p);
    }
    w = 0;
    for(o=0; o<=u-x; o++)                     // Main O(w*e*u*v) matching process
        for(p=0; p<=v-y; p++) {
            t=1;
            for(c=0; c<x; c++)
                for(d=0; d<y; d++)
                if(s[c][d]*(s[c][d]-g[c+o][d+p]))
                    t=0;
            w+=t;
        }
}
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.