Bestimmen Sie, ob ein Raster ein anderes Raster enthält

10

Herausforderung Beim
Erstellen einer Funktion werden zwei zweidimensionale Anordnungen von Zeichen (oder Zeichenfolgen, wenn die Programmiersprache keine Zeichen als Datentyp enthält) als Eingaben verwendet: a und b. Wenn Ihre Sprache diese Eingaben nicht unterstützt, können Sie jede andere Standard-Ein-Byte-Variable verwenden.

Ihre Aufgabe ist es festzustellen, ob b a enthält. Wenn dies der Fall ist, geben Sie true zurück. Andernfalls geben Sie false zurück.

Beispieltestfälle

a:

123
456
789

b:

123
456
789

sollte true zurückgeben.

a:

code
golf

b:

thisis
code!!
golf!!
ohyeah

sollte true zurückgeben.

a:

abcd
efgh
ijkl

b:

abcdef
ghijkl
mnopqr

sollte false zurückgeben.

a:

abc
def

b:

1abc2
3def4
5ghi6

sollte true zurückgeben

a:

ab
cd

b:

#ab##
##cd#

sollte false zurückgeben

Kleinste Bytes gewinnen.

Gefahr
quelle
2
Hallo und willkommen bei Codegolf! Ich habe Ihre Testfälle bearbeitet, um sie (hoffentlich) etwas klarer zu machen. Beachten Sie, dass wir eine Sandbox haben , in der Sie an Herausforderungen arbeiten können, bevor Sie sie in main veröffentlichen. Viel Glück!
FryAmTheEggman
2
Darf ich auch das erste Array als Array von Zeichenfolgen und das zweite als durch Zeilenumbrüche getrennte Zeichenfolge verwenden, obwohl in meiner Sprache (C #) ein Zeichentyp integriert ist?
Verkörperung der Unwissenheit
@ Neil Testfälle 2 und 3 sind nicht quadratisch.
Robin Ryder
5
Könnten Sie einen wahrheitsgemäßen Testfall hinzufügen, bei dem asich der blinke Rand nicht befindet, und einen falschen Testfall, bei dem jede Zeile ain aufeinanderfolgenden Zeilen angezeigt wird b, deren linke Kanten jedoch versetzt sind?
Shaggy
@EmbodimentofIgnorance ja
Gefahr

Antworten:

9

Brachylog (v2), 4 Bytes

s\s\

Probieren Sie es online aus!

Am einfachsten als vollständiges Programm ausführen, wie bei einem üblich , mit einem als Befehlszeilenargument angegebenen Argument, b bei Standardeingabe. Die Frage fragt nach einer Funktion, und das Programm arbeitet auch als Funktion, wobei b links, a rechts und die Ausgabe über eine Ausnahme ausgegeben werden , wenn die Entscheidung falsch ist .

Erläuterung

s\s\
s     a substring of rows of {the left input}
 \…\  assert rectangular; swap row and column operations
  s   a substring of <s>rows</s> columns of {the above matrix}
      {implicit} assert that the result can be {the right input}

Das "Assert Rechteck" ist offensichtlich sinnlos, da die Frage dies bereits garantiert. Der Rest des Programms führt die Rasterfindung für uns durch, indem er einen Teilstring der Zeilen und Spalten identifiziert, dh eine Submatrix.

Meta-Diskussion

Wir hatten schon einmal eine sehr ähnliche Frage . Ich würde erwarten, dass die meisten Antworten auf eine Frage in Antworten auf die andere geändert werden können. Ich denke, dies ist die sauberere Version davon.

ais523
quelle
Kürzeste Antwort hier, also werde ich es akzeptieren.
Gefahr
7

Python 2 , 67 Bytes

f=lambda a,b,r=4:b*r and f(a,b[1:],r)|f(a,zip(*b)[::-1],r-1)or a==b

Probieren Sie es online aus!

Übernimmt die Eingabe als Liste von Tupeln von Zeichen.

Versucht alle Teilgitter von bund prüft, ob sie adarunter sind. Die Teilgitter werden durch rekursives Verzweigen erzeugt, indem entweder die erste Reihe entfernt boder um 90 Grad gedreht wird. Prüft nach genau vier Umdrehungen, ob der Zuschnitt bgleich ist a.

xnor
quelle
1
@mazzy Ich denke, die Eingabegitter sollen Rechtecke sein.
xnor
5

J , 21 15 8 7 Bytes

1#.,@E.

Probieren Sie es online aus!

-7 Bytes dank Bolce Bussiere

ursprüngliche Antwort

J , 21 15 Bytes

<@[e.&,$@[<;.3]

Probieren Sie es online aus!

-6 Bytes dank FrownyFrog

Wie

  • <@[ boxed left arg
  • $@[<;.3] Alle Rechtecke im rechten Argument haben dieselbe Form wie das linke Argument
  • Übergeben Sie diese nun als linkes und rechtes Argument an ...
  • ist das linke Argument eine Ulme des rechten Arg, nachdem beide abgeflacht wurden e.&,
Jona
quelle
Ich denke, das kann sein<@[e.&,$@[<;.3]
FrownyFrog
Ah ofc, ty! Wenn Sie eine Herausforderung wollen, schauen Sie sich diese Monstrosität an, mit der ich die Seite beschmutzt habe
Jonah
1
-7 Bytes : +/@:,@E.. E. ist so ziemlich für diese Herausforderung gemacht.
Bolce Bussiere
tyvm @BolceBussiere. Ich werde dies heute Abend aktualisieren.
Jonah
4

Holzkohle , 26 Bytes

⌈⭆η⭆ι⁼θE✂ηκ⁺Lθκ¹✂νμ⁺L§θ⁰μ¹

Probieren Sie es online aus! Der Link führt zur ausführlichen Version des Codes. Stark basierend auf meiner Antwort auf Zählen der zusammenhängenden Submatrizen , besteht der einzige Unterschied darin, dass ich anstelle der Summe der Übereinstimmungen das Maximum nehme und aufgrund der impliziten Zeichenfolgenkonvertierung aufgrund der Verwendung des Ergebnisses bereits eine Zeichenfolge ist, die a speichert Byte.

Neil
quelle
4

05AB1E , 10 Bytes

øŒεøŒI.å}à

Nimmt bals erste Eingabe, aals zweite. Beide Eingaben als Zeichenmatrizen.

Port of @ Mr.Xcoders 05AB1E-Antwort auf diese damit verbundene Herausforderung , also stimmen Sie ihm zu!

Probieren Sie es online aus oder überprüfen Sie alle Testfälle .

Erläuterung:

øŒ          # Get the sublists of every column of the (implicit) input `b`
  ε         # Map each list of sublists to:
   øŒ       #  Get the sublists of every column again
            #  (now we have all sub-matrices of `b`)
     I    #  Check if the second input `a` is in this list of sub-matrices
          # After the map: check if any are truthy by taking the maximum
            # (which is output implicitly as result)
Kevin Cruijssen
quelle
3

Python 2 , 106 118 113 Bytes

lambda a,b,L=len:any(sum(A==B[j:j+L(A)]for A,B in zip(a,b[i:]))==L(a)for i in range(L(b))for j in range(L(b[0])))

Probieren Sie es online aus!

Chas Brown
quelle
@Neil: Jetzt behoben.
Chas Brown
3

JavaScript (ES6) , 131 112 105 Byte

105 Bytes:

f=(m,n)=>m.some((x,i)=>i<=m.length-n.length&x.some((c,j)=>n.every((l,z)=>(m[i+z]+'').indexOf(l,j)==2*j)))

Probieren Sie es online aus!

Änderungen:

  • m[i]in xund n[z]in l: Völlig vergessen, dass diese Variablen bereits instanziiert wurden
  • &&in &: Beide Seiten des Operators sind bereits Boolesche Werte, sodass ein bitweiser Operator funktioniert

112 Bytes:

f=(m,n)=>m.some((x,i)=>i<=m.length-n.length&&m[i].some((c,j)=>n.every((l,z)=>(m[i+z]+'').indexOf(n[z],j)==2*j)))

Probieren Sie es online aus!

Änderungen:

  • map((c,j)=>{...}).some(s=>s)in some((c,j)=>{...}): Redundanz
  • m[i+z].join()in m[i+z]+'': Eine kürzere Möglichkeit, das Array in eine Zeichenfolge zu konvertieren
  • indexOf(n[z].join(),j)in indexOf(n[z],j): Die indexOf Methode wird bereits in eine Zeichenfolge konvertiertn[z]

131 Bytes:

f=(m,n)=>m.some((x,i)=>i<=m.length-n.length&&m[i].map((c,j)=>n.every((l,z)=>m[i+z].join().indexOf(n[z].join(),j)==2*j)).some(s=>s))

Probieren Sie es online aus!

Lesbar:

function f (m, n) {
  return m.some((x, i) => {
    return i <= m.length - n.length
      && m[i].map((c, j) => {
        return n.every((l, z) => {
          return m[i + z].join().indexOf(n[z].join(), j) == 2 * j
        })
      })
        .some(s => s)
  })
}

Anstatt einzelne Werte zu vergleichen, habe ich geprüft, ob die Linien aus Gitter N in den Linien von Gitter M enthalten sind und an welchen Indizes. Wenn alle Zeilen ab demselben Index enthalten sind, ist das Gitter N im Gitter M enthalten.

M. Paviza
quelle
2

PowerShell , 71 102 85 98 Byte

danke @Jo King; Testfälle hinzugefügt.

param($a,$b)!!($a|%{$p=[regex]::Escape($_)
$b|sls $p -a -ca|% m*}|group index|?{"$a"-ceq$_.Group})

Probieren Sie es online aus!

Weniger Golf:

param($a,$b)

$matches = $a|%{
    $pattern = [regex]::Escape($_)
    $b|Select-String $pattern -AllMatches -CaseSensitive|% Matches
}

$relevantGroupsByMatchPosition = $matches|group index|?{
    "$a"-ceq$_.Group  # the '$_.Group' contains matches in source order
                      # -ceq is case sensitivity equation operator
                      # -ceq performs an implicit conversion to the left operand type
}

!!($relevantGroupsByMatchPosition)  # true if the variable is not $null
mazzy
quelle
1

Javascript, 150 Bytes

f=(a,b)=>{_='length';for(r=i=0;i<=b[_]-a[_];i++)for(j=0;j<=b[0][_]-a[0][_];j++){u=0;a.map((l,y)=>l.map((c,x)=>u=u||b[i+y][j+x]!=c));r=r||!u;}return r}

Probieren Sie es online aus

Johan du Toit
quelle