Это был мой укус?

12

Вчера я оставил свой бутерброд на столе. Когда я встал сегодня, там был укус ... Это было мое? Я не могу вспомнить ...

Проблема:

Возьмите изображение сэндвича и мой рисунок укуса и скажите мне, был ли это мой укус или нет.

Примеры:

Пример 1:

Мой образец укуса:

..
.

Sandwich:

#####
.####
..###

Выход:

truthy

Пример 2:

Мой образец укуса:

..
..

Sandwich:

...##
..###
.####

Выход:

falsy

Пример 3:

Если есть хотя бы 1 вращение, которое считается правдивым, результат будет правдивым.

Мой образец укуса:

.
 .
  .

Sandwich:

##.
#.#
.##

Выход:

Два возможных поворота (кусание в северо-восточном или юго-западном углу).

truthy

Некоторые действительные укусы:

..
.

...
.
.

.
 .
  .

..
. .
 ..

 ..
.
. .

Некоторые недействительные укусы:

..

...
.

..
.
 .

Правила:

  • Моя ориентация прикуса всегда будет направлена ​​на то, чтобы кусать северо-западный угол. И должен вращаться, чтобы кусать другие углы;

  • В сэндвиче всегда будет 1 и только 1 укус;

  • Укус в бутерброде может быть в любом из 4 углов (повернут соответственно);

  • Образцы прикуса всегда будут симметричны по главной диагонали;

  • Шаблоны укусов всегда будут по крайней мере 1 шириной и непустыми;

  • Сэндвич всегда будет прямоугольником с шириной и высотой, равными или превышающими ширину моего рисунка прикуса;

  • В качестве входных данных вы можете выбрать любые 2 различных непробельных символа для представления сэндвича и прикуса;

  • Пробелы в шаблоне укуса означают, что мой укус не касается этой части сэндвича.

Фелипе Нарди Батиста
источник
Может ли рисунок укуса быть больше, чем бутерброд? Может ли образец прикуса быть пустым? Может ли рисунок прикуса совпадать с бутербродом? то есть .., ..?
TheLethalCoder
@ TheLethalCoder правила гласят, что рисунок прикуса всегда будет соответствовать бутерброду. я добавлю новое правило, чтобы указать минимальный размер (1 ширина)
Фелипе Нарди Батиста
@TheLethalCoder и да, рисунок прикуса может быть таким же, как у сэндвича
Фелипе Нарди Батиста

Ответы:

2

Рубин , 103 байта 101 байта

->b,s{[a=s.map(&:reverse),s,s.reverse,a.reverse].any?{|t|b.zip(t).all?{|y,x|y==x.tr(?#,' ').rstrip}}}

Попробуйте онлайн!

Сохранено 2 байта путем перемещения назначения в первое использование a. Очевидно, Ruby достаточно умен, чтобы не перепутать запятые в определении массива и запятые, которые могут возникнуть при одновременном назначении переменной (по крайней мере, в этом случае: D)

Jenkar
источник
2

Python 2 , 134 байта

b,s=input()
a=[''.join(l[::-1])for l in s]
print any(b==[l.replace('#',' ').rstrip()for l in x][:len(b)]for x in(a,a[::-1],s[::-1],s))

Вводит в виде двух списков строк (по одному для каждой строки). Предполагается, что на линиях нет конечных пробелов.

Попробуйте онлайн!

Примеры:

Input: ['..','.'],['#####','.####','..###'] (example 1)
>True

Input: ['..','..'],['...##','..###','.####'] (example 2)
>False

Input: ['',' .'],['#####','#.###','#####'] (no bite in top row)
>True
TFeld
источник
1

Python 2, 173 байта

Попробуйте онлайн

S,b=input()
L=len
B=map(lambda x:[y<'.'and'#'or y for y in x]+['#']*(L(S[0])-L(x)),b+[[]]*(L(S)-L(b)))
R=map(lambda x:x[::-1],B)
print S==B or S==B[::-1]or S==R[::-1]or S==R

Вводит в виде двух списков списков символов.
Первый - бутерброд
Второй - укус

Сначала он расширяет массив укусов до размера сэндвич-массива:

B=map(lambda x:[y<'.'and'#'or y for y in x]+['#']*(L(S[0])-L(x)),b+[[]]*(L(S)-L(b)))

[y<'.'and'#'or y for y in x]заменяет все пробелы для #
(L(S[0])-L(x)),b+[[]]*(L(S)-L(b))расчета количества пропущенных элементов

Затем он сравнивает все 4 вращения этого «расширенного» укуса с сэндвичем:

R=lambda:map(lambda x:x[::-1],B)
print S==B or S==B[::-1]or S==R()or S==R()[::-1]
print any(map(S.__eq__,[B,B[::-1],R(),R()[::-1]])) #longer but pretty

лямбда R используется для зеркального отображения списка списков

В связанном примере бутерброд это:

##.
#.#
###

И укус это:

.
 .
Мертвый Опоссум
источник
1
почему R=Lambda:map...и нетR=map...
Фелипе Нарди Батиста
@FelipeNardiBatista Потому что я пропустил это: D Спасибо!
Мертвый Опоссум
B=[[y<'.'and'#'or y for y in x]+['#']*(L(S[0])-L(x))for x in b+[[]]*(L(S)-L(b))]для -4
овс
И R=[x[::-1]for x in B]для -4 также. В общем, не используйте карту с лямбда - функции
овс