Déterminer si une grille contient une autre grille


10

Défi
Créer une fonction prend en deux tableaux bidimensionnels de caractères (ou chaînes si le langage de programmation n'a pas de caractères comme type de données) comme entrées: a et b. Si votre langue ne prend pas en charge ces entrées, vous pouvez utiliser toute autre variable standard à un octet.

Votre tâche consiste à déterminer si b contient a. Si tel est le cas, retournez true. Sinon, retournez false.

Exemples de cas de test

a:

123
456
789

b:

123
456
789

devrait retourner vrai.

a:

code
golf

b:

thisis
code!!
golf!!
ohyeah

devrait retourner vrai.

a:

abcd
efgh
ijkl

b:

abcdef
ghijkl
mnopqr

devrait retourner faux.

a:

abc
def

b:

1abc2
3def4
5ghi6

devrait retourner vrai

a:

ab
cd

b:

#ab##
##cd#

devrait retourner faux

Le moins d'octets l'emporte.


2
Salut et bienvenue sur codegolf! J'ai édité vos cas de test pour (espérons-le) les rendre un peu plus clairs. Notez que nous avons un bac à sable pour travailler sur les défis avant de les publier sur main. Bonne chance!
FryAmTheEggman

2
De plus, puis-je prendre le premier tableau comme un tableau de chaînes et le second comme une chaîne séparée par des retours à la ligne, même si mon langage (C #) a un type de caractère intégré?
Incarnation de l'ignorance

Les cas de test @Neil 2 et 3 ne sont pas carrés.
Robin Ryder

5
Pourriez-vous ajouter un cas de test véridique où an'est pas sur ble bord gauche et un cas de test falsey où chaque ligne de aapparaît sur des lignes consécutives de bmais avec leurs bords gauches décalés?
Shaggy

@EmbodimentofIgnorance yes
Hazard

Réponses:


9

Brachylog (v2), 4 octets

s\s\

Essayez-le en ligne!

Exécutez le plus facilement en tant que programme complet, comme d'habitude pour un , avec un argument spécifié comme ligne de commande, b sur l'entrée standard. La question demande une fonction, et le programme fonctionne également comme une fonction, avec b à gauche, a à droite et sortie via la production d'une exception si et seulement si la décision est fausse .

Explication

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}

L '«assertion rectangulaire» est évidemment inutile, comme la question le garantit déjà. Le reste du programme effectue la recherche de grille pour nous en identifiant une sous-chaîne des lignes et des colonnes, c'est-à-dire une sous-matrice.

Méta-discussion

Nous avons déjà posé une question très similaire ; Je m'attends à ce que la plupart des réponses à une question soient modifiables en réponses à l'autre. Je pense que c'est la version plus soignée de celui-ci, cependant.


La réponse la plus courte ici, donc je l'accepterai.
Danger

7

Python 2 , 67 octets

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

Essayez-le en ligne!

Prend la saisie sous forme de listes de tuples de caractères.

Essaie toutes les sous-grilles de bet vérifie s'il en afait partie. Les sous-grilles sont générées en se ramifiant récursivement en supprimant la première rangée bou en la faisant pivoter de 90 degrés. Après exactement quatre rotations, vérifie si la réduction best égale à a.


1
@mazzy Je pense que les grilles d'entrée sont censées être des rectangles.
xnor

5

J , 21 15 8 7 octets

1#.,@E.

Essayez-le en ligne!

-7 octets grâce à Bolce Bussiere

réponse originale

J , 21 15 octets

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

Essayez-le en ligne!

-6 octets grâce à FrownyFrog

Comment

  • <@[ arg de boîte gauche
  • $@[<;.3] tous les rectangles dans l'arg droit avec la même forme que l'arg gauche
  • passer maintenant ceux-ci comme l'argument gauche et droit à ...
  • est l'arg de gauche un orme de l'arg de droite, après aplatissement à la fois e.&,

Je pense que cela peut être<@[e.&,$@[<;.3]
FrownyFrog

Ah ofc, ty! Si vous voulez un défi, jetez un œil à cette monstruosité avec laquelle j'ai souillé le site
Jonah

1
-7 Octets +/@:,@E.. E. est à peu près fait pour ce défi.
Bolce Bussiere

tyvm @BolceBussiere. je mettrai à jour ce soir.
Jonah

4

Fusain , 26 octets

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

Essayez-le en ligne! Le lien est vers la version détaillée du code. Fortement basé sur ma réponse à Count les sous - matrices contiguës , la seule différence étant qu'au lieu de prendre la somme des correspondances, je prends le maximum, et à cause de la conversion de chaîne implicite due à l'utilisation du résultat est déjà une chaîne qui enregistre un octet.


4

05AB1E , 10 octets

øŒεøŒI.å}à

Prend bcomme première entrée, acomme deuxième. Les deux entrées sous forme de matrices de caractères.

Port de la réponse 05AB1E de @ Mr.Xcoder pour ce défi connexe , alors assurez-vous de lui donner un vote positif!

Essayez-le en ligne ou vérifiez tous les cas de test .

Explication:

øŒ          # 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)



3

JavaScript (ES6) , 131 112 105 octets

105 octets:

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

Essayez-le en ligne!

Changements:

  • m[i]dans xet n[z]dans l: totalement oublié que ces variables ont déjà été instanciées
  • &&dans &: les deux côtés de l'opérateur sont déjà des booléens donc un opérateur au niveau du bit fonctionnera

112 octets:

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

Essayez-le en ligne!

Changements:

  • map((c,j)=>{...}).some(s=>s)en some((c,j)=>{...}): Redondance
  • m[i+z].join()en m[i+z]+'': un moyen plus court de convertir le tableau en chaîne
  • indexOf(n[z].join(),j)en indexOf(n[z],j): la indexOf méthode est déjà convertie n[z] en chaîne

131 octets:

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

Essayez-le en ligne!

Lisible:

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)
  })
}

Au lieu de comparer les valeurs individuelles, j'ai vérifié si les lignes de la grille N étaient incluses dans les lignes de la grille M, et si oui, à quels indices. Si toutes les lignes sont incluses à partir du même indice, la grille N est contenue dans la grille M.


2

PowerShell , 71 102 85 98 octets

merci @Jo King; cas de test ajoutés.

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

Essayez-le en ligne!

Moins 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

1

Javascript, 150 octets

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}

Essayez-le en ligne

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.