Визначте, чи містить сітка іншу сітку


10

Виклик
Створення функції містить два двовимірні масиви символів (або рядків, якщо мова програмування не містить символів як тип даних) як входи: a і b. Якщо ваша мова не підтримує ці введення, ви можете використовувати будь-яку іншу стандартну однобайтову змінну.

Ваше завдання - визначити, чи містить b. Якщо це так, поверніть істину. В іншому випадку поверніть хибне.

Зразки тестових випадків

a:

123
456
789

b:

123
456
789

повинні повернути правду.

a:

code
golf

b:

thisis
code!!
golf!!
ohyeah

повинні повернути правду.

a:

abcd
efgh
ijkl

b:

abcdef
ghijkl
mnopqr

має повернути помилкове.

a:

abc
def

b:

1abc2
3def4
5ghi6

повинні повернути правду

a:

ab
cd

b:

#ab##
##cd#

має повернути помилкове

Найменший байт виграє.


2
Привіт і ласкаво просимо до кодегольфу! Я редагував ваші тестові випадки, щоб (сподіваюся) зробити їх більш зрозумілими. Зауважте, що у нас є пісочниця для роботи над проблемами, перш ніж надсилати їх до основного. Удачі!
FryAmTheEggman

2
Також, чи можу я взяти перший масив як масив рядків, а другий - як рядок, розділену новими рядками, навіть якщо моя мова (C #) має вбудований тип символів?
Втілення

@Neil Тестові випадки 2 і 3 не є квадратними.
Робін Райдер

5
Чи можете ви додати пробний тест, у якому aнемає bлівого краю, і тестовий випадок фальси, коли кожен рядок aвідображається в послідовних рядках, bале з лівими краями?
Кошлатий

@EmbodimentofIgnorance так
небезпека

Відповіді:


9

Брахілог (v2), 4 байти

s\s\

Спробуйте в Інтернеті!

Найбільш легко працювати як по повній програмі, як завжди для , з задається як аргумент командного рядка, б на стандартне введення. Питання задає функцію, і програма також працює як функція, з b зліва, a праворуч, і виводиться, створюючи виняток, якщо і тільки якщо рішення є помилковим .

Пояснення

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}

"Стверджувати прямокутний", очевидно, безглуздо, оскільки питання це вже гарантує. Решта програми здійснює пошук сітки для нас, визначаючи підрядку рядків та стовпців, тобто підматрицю.

Мета-дискусія

У нас раніше було дуже схоже питання ; Я очікую, що більшість відповідей на одне питання можуть бути змінені у відповіді на інші. Я думаю, що це акуратніше його версія.


Тут найкоротша відповідь, тому я прийму її.
Небезпека

7

Python 2 , 67 байт

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

Спробуйте в Інтернеті!

Вводиться в якості списків кортежів символів.

Випробовує всі підмережі bта перевіряє, чи aє серед них. Підрешітки генеруються шляхом рекурсивного розгалуження або видалення першого ряду, bабо обертання його на 90 градусів. Після рівно чотирьох обертів перевірте, чи оброблена вниз bрівномірна a.


1
@mazzy Я думаю, що вхідні сітки повинні бути прямокутниками.
xnor

5

J , 21 15 8 7 байт

1#.,@E.

Спробуйте в Інтернеті!

-7 байт завдяки Bolce Bussiere

оригінальна відповідь

J , 21 15 байт

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

Спробуйте в Інтернеті!

-6 байт завдяки FrownyFrog

як

  • <@[ коробчастий лівий арг
  • $@[<;.3] всі прямокутники в правій аргументі тієї ж форми, що і ліва
  • тепер передайте їх як лівий і правий аргумент ...
  • - лівий арг в'яз правого арґ, після сплющення обох e.&,

Я думаю, що це може бути<@[e.&,$@[<;.3]
FrownyFrog

Ах оф, ти! Якщо ви хочете отримати виклик, подивіться на цю жахливість, з якою я осквернив сайт
Йона

1
-7 Б +/@:,@E.. Е. в значній мірі зроблений для цього виклику.
Bolce Bussiere

tyvm @BolceBussiere. я оновлю це сьогодні ввечері.
Йона

4

Вугілля деревне , 26 байт

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

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. На основі моєї відповіді на підрахунок суміжних підматриць , різниця полягає лише в тому, що замість того, щоб брати суму збігів, я приймаю максимум, а через неявне перетворення рядків через використання результату - це вже рядок, який зберігає байт.


4

05AB1E , 10 байт

øŒεøŒI.å}à

Приймає bяк перший вхід, aяк другий. Обидва входи у вигляді матриць символів.

Порт @ Mr.Xcoder 's 05AB1E відповідь на цей пов'язаний виклик , тому не забудьте підтримати його!

Спробуйте в Інтернеті або перевірте всі тестові випадки .

Пояснення:

øŒ          # 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 байт

105 байт:

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

Спробуйте в Інтернеті!

Зміни:

  • m[i]в xі n[z]в l: Повністю забув, що ці змінні вже були інстанційними
  • &&в &: Обидві сторони оператора вже булеві, тому бітовий оператор буде працювати

112 байт:

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

Спробуйте в Інтернеті!

Зміни:

  • map((c,j)=>{...}).some(s=>s)в some((c,j)=>{...}): Надмірність
  • m[i+z].join()в m[i+z]+'': Коротший спосіб перетворення масиву в рядок
  • indexOf(n[z].join(),j)в indexOf(n[z],j): The indexOf методу вже перетворює n[z] в рядок

131 байт:

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

Спробуйте в Інтернеті!

Читає:

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

Замість того, щоб порівнювати окремі значення, я перевіряв, чи входять рядки з сітки N у рядки сітки M, і якщо так, то в яких індексах. Якщо всі рядки включені починаючи з одного і того ж індексу, сітка N міститься в сітці M.


2

PowerShell , 71 102 85 98 байт

дякую @Jo King; додано тестові справи.

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

Спробуйте в Інтернеті!

Менше гольфу:

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.