地面の宝石を数える


8

宝石を数える

バックグラウンド

宝石箱が落ちた!地面にさまざまな形の宝石が多すぎます。そして、あなたの仕事は、特定の種類の宝石の数を数えることです。

I / O

  • コードは2つの入力Sとを受け取る必要がありますG。これは、改行を含む文字列、行の配列、文字の2次元配列、テキストファイル、または適切な形式の場合があります(そうであれば、明記してください)。
  • これらの2つの文字列には、!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~(ASCIIテーブルの0x21to から0x7E)、スペース、および改行(プラットフォームに応じてバイナリ形式)のみが含まれます。
  • 各文字列では、行は同じ長さです。
  • S数えたい宝石です。2つの状況があります。
    1. 囲まれ、ネストされた囲まれた領域を含みません。(例では1/2)
    2. 囲まれた領域は含まれません。(例3/4)
  • 周囲の空間は宝石の一部とは見なされません。
  • G 地面にある宝石の形です。
  • それはあなたのコードがの寸法(複数可)を指定するために余分な入力を必要とすることが可能ですSし、G
  • コードが文字自体ではなく、ASCII値を入力として受け取ることは許容されます。ただし、文字をより単純な整数(0、1、2、3)に置き換えないでください。プログラムは、文字またはASCII値を処理できる必要があります。

例1(入力としての文字)

入力S

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

入力G

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

アウトプット:

2

例2(入力としてのASCII値)

入力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

入力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

出力:

1

視覚化S(32を-に置き換え):

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

視覚化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 -- --

例3(同封されていません)

@ Draco18sに感謝

入力 S

AB

入力 G

AAB BA CAB

出力

2

例4(囲まれていない2D)

入力 S

ABCD
  GE
   F

入力 G

ABCD 
BGGED
CDEFE
    F

出力

1

備考

  • 正確に1つの形状の2つの宝石のみが同じと見なされます。
  • 異なる方向の同じ形状は同じとは見なされません。
  • ただし、例のI / Oで説明されているように、オーバーラップは可能です。このような状況では、完全なものだけがカウントされます。
  • +-および|例では特別な意味はありません。形状の角やエッジを示すものではありません。
  • 入力は常に有効であると想定できます。
  • 2つのターゲット宝石がまったく同じエッジを共有することはないと仮定する場合があります。
  • 標準の抜け穴は禁止されています。
  • これはコードゴルフなので、最短のコードが勝ちます!

2
私はどのようにされ、第二の例を理解していないG内に含まれますかS
LiefdeWen 2017年

@LiefdeWen私はそれを視覚化しました、あなたはSの真ん中に見つけるかもしれませんG
Keyu Gan 2017

私は、次のような、いくつかの単純な例が、ここで必要とされていると思うS = "AB"G=" AAB BA CAB"と、出力=?
Draco18sはSEを信頼しなくなりました2017

@ Draco18sありがとう、追加します。
Keyu Gan 2017

この単純な例は、望ましい動作を理解するのに役立ちました。クール
Draco18sがSEを信頼しなくなった2017

回答:


1

C(gcc)、303305 326 バイト

すべての最適化をオフにする必要があり、32ビットGCCでのみ機能します。

#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;}}

このコードは、塗りつぶしを使用して周囲のスペースをに置き換え\0、無視しながら一致を探し\0ます。

計算されていないマクロと計算されたマクロ(一部の文字はゴルフバージョンとは異なりますが、ロジックは同じです):

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;
        }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.