Edelsteine ​​am Boden zählen


8

Edelsteine ​​zählen

Hintergrund

Meine Schmuckschatulle ist gerade heruntergefallen! Es gibt zu viele Edelsteine ​​unterschiedlicher Form auf dem Boden. Und Ihre Aufgabe ist es, die Anzahl einer bestimmten Art von Edelstein zu zählen.

I / O.

  • Ihr Code sollte zwei Eingaben enthalten Sund Geine Zeichenfolge mit Zeilenumbrüchen, ein Zeilenarray, ein zweidimensionales Zeichenarray, eine Textdatei oder ein beliebiges vernünftiges Format sein (wenn ja, geben Sie dies bitte deutlich an).
  • Diese beiden Zeichenfolgen enthalten nur !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~(von 0x21bis 0x7Ein der ASCII-Tabelle) Leerzeichen und Zeilenumbrüche (Binärform abhängig von Ihrer Plattform).
  • In jeder Zeichenfolge sind die Zeilen gleich lang.
  • Sist das Juwel, das wir zählen wollen. Es gibt zwei Umstände.
    1. Geschlossen und enthält keinen verschachtelten geschlossenen Bereich. (in Beispiel 1/2)
    2. Enthält keinen geschlossenen Bereich. (in Beispiel 3/4)
  • Umliegende Räume werden nicht als Teil des Edelsteins angesehen.
  • G ist die Form von Edelsteinen auf dem Boden.
  • Es ist akzeptabel, dass Ihr Code zusätzliche Eingaben erfordert, um die Dimension (en) von Sund anzugebenG
  • Es ist akzeptabel, dass Ihr Code ASCII-Werte anstelle von Zeichen selbst als Eingaben verwendet. Sie sollten Zeichen jedoch nicht durch einfachere Ganzzahlen (0,1,2,3) ersetzen. Ihr Programm sollte in der Lage sein, Zeichen oder ASCII-Werte zu verarbeiten.

Beispiel 1 (Zeichen als Eingabe)

Eingabe S:

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

Eingabe G:

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

Ouptut:

2

Beispiel 2 (ASCII-Wert als Eingabe)

Eingabe 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

Eingabe 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

Ausgabe:

1

Visualisiert S(32 ersetzt durch -):

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

Visualisiert 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 -- --

Beispiel 3 (nicht beigefügt)

Vielen Dank an @ Draco18s

Eingang S

AB

Eingang G

AAB BA CAB

Ausgabe

2

Beispiel 4 (nicht eingeschlossenes 2D)

Eingang S

ABCD
  GE
   F

Eingang G

ABCD 
BGGED
CDEFE
    F

Ausgabe

1

Bemerkungen

  • Nur zwei Edelsteine ​​mit genau einer Form werden als gleich angesehen.
  • Gleiche Form in verschiedenen Richtungen wird nicht als gleich angesehen.
  • Wie in Beispiel-E / A beschrieben, ist jedoch eine Überlappung möglich. Unter solchen Umständen werden nur vollständige gezählt.
  • +, -Und |in dem Beispiel keine besondere Bedeutung hat. Sie zeigen keine Ecke oder Kante der Form an.
  • Sie können davon ausgehen, dass die Eingabe immer gültig ist.
  • Sie können davon ausgehen, dass zwei Zieledelsteine ​​niemals genau dieselbe Kante haben.
  • Standardlücken sind verboten.
  • Dies ist ein Code-Golf, also gewinnt der kürzeste Code!

2
Ich verstehe das zweite Beispiel nicht, wie ist es Genthalten S?
LiefdeWen

@LiefdeWenn ich es visualisiert habe, findest du es vielleicht Sin der Mitte von G.
Keyu Gan

Ich denke , einige einfacheren Beispiele hier benötigt werden, wie zum Beispiel S = "AB", G=" AAB BA CAB"Ausgang =?
Draco18s vertraut SE

@ Draco18s Danke, ich werde es hinzufügen.
Keyu Gan

Dieses einfache Beispiel hat wirklich geholfen, das gewünschte Verhalten zu verstehen. Cool
Draco18s vertraut SE

Antworten:


1

C (gcc) , 303305 326 Bytes

Alle Optimierungen müssen deaktiviert sein und funktionieren nur mit 32-Bit-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;}}

Der Code verwendet Floodfill, um umgebende Räume durch Übereinstimmungen zu ersetzen \0und sucht nach Übereinstimmungen, während diese ignoriert werden \0.

ungolfed und Makros berechnet (einige Buchstaben unterscheiden sich von der Golfversion, aber die Logik bleibt gleich):

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;
        }
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.