Apakah ini gigitan milikku?

12

Kemarin, saya meninggalkan sandwich saya di atas meja. Ketika saya bangun hari ini, ada gigitan di dalamnya ... Apakah itu milik saya? Saya tidak ingat ...

Masalah:

Ambil representasi sandwich dan pola gigitan saya dan beri tahu saya apakah itu gigitan saya atau tidak.

Contoh:

Contoh 1:

Pola gigitan saya:

..
.

Sandwich:

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

Keluaran:

truthy

Contoh 2:

Pola gigitan saya:

..
..

Sandwich:

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

Keluaran:

falsy

Contoh 3:

Jika setidaknya ada 1 rotasi yang dianggap benar, hasilnya benar.

Pola gigitan saya:

.
 .
  .

Sandwich:

##.
#.#
.##

Keluaran:

Dua kemungkinan rotasi (menggigit di sudut timur laut atau barat daya).

truthy

Beberapa gigitan yang valid:

..
.

...
.
.

.
 .
  .

..
. .
 ..

 ..
.
. .

Beberapa gigitan tidak valid:

..

...
.

..
.
 .

Aturan:

  • Orientasi pola gigitan saya akan selalu untuk menggigit sudut barat laut. Dan harus diputar untuk menggigit sudut lainnya;

  • Akan selalu ada 1 dan hanya 1 gigitan di sandwich;

  • Gigitan di sandwich bisa di salah satu dari 4 sudut (diputar sesuai);

  • Pola gigitan akan selalu simetris di sepanjang diagonal utama;

  • Pola gigitan akan selalu setidaknya 1 lebar dan tidak kosong;

  • Sandwich akan selalu berbentuk persegi panjang dengan lebar dan tinggi sama atau lebih besar dari lebar pola gigitan saya;

  • Di input Anda, Anda dapat memilih 2 karakter non-spasi putih yang berbeda untuk mewakili sandwich dan gigitan;

  • Ruang dalam pola gigitan berarti bahwa gigitan saya tidak menyentuh bagian sandwich itu.

Felipe Nardi Batista
sumber
Bisakah pola gigitan lebih besar dari sandwich? Bisakah pola gigitan kosong? Bisakah pola gigitannya sama dengan sandwich? yaitu .., ..?
TheLethalCoder
@TheLethalCoder aturan mengatakan pola gigitan akan selalu sesuai dengan sandwich. saya akan menambahkan aturan baru untuk menentukan ukuran minimum (1 lebar)
Felipe Nardi Batista
@TheLethalCoder dan ya, pola gigitannya bisa sama dengan sandwich
Felipe Nardi Batista

Jawaban:

2

Ruby , 103 byte 101 byte

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

Cobalah online!

Disimpan 2 byte dengan memindahkan penugasan ke penggunaan pertama a. Rupanya Ruby cukup pintar untuk tidak membingungkan koma dalam definisi array dan koma yang akan muncul dari penugasan variabel simultan (setidaknya dalam kasus ini: D)

Jenkar
sumber
2

Python 2 , 134 byte

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

Mengambil input sebagai dua daftar string (satu untuk setiap baris). Mengasumsikan tidak ada spasi spasi di garis.

Cobalah online!

Contoh:

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

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

Input: ['',' .'],['#####','#.###','#####'] (no bite in top row)
>True
TFeld
sumber
1

Python 2, 173 byte

Cobalah online

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

Mengambil input sebagai dua daftar daftar karakter.
Pertama - sandwich
Kedua - gigitan

Pertama-tama ia memperluas bite array ke ukuran sandwich array:

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]mengganti semua spasi untuk #
(L(S[0])-L(x)),b+[[]]*(L(S)-L(b))menghitung jumlah elemen yang hilang

Kemudian membandingkan semua 4 rotasi gigitan "diperpanjang" ini ke sandwich:

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

lambda R digunakan untuk mencerminkan daftar daftar secara horizontal

Dalam contoh sandwich yang ditautkan adalah:

##.
#.#
###

Dan gigitan adalah:

.
 .
Possum Mati
sumber
1
mengapa R=Lambda:map...dan tidakR=map...
Felipe Nardi Batista
@FelipeNardiBatista Karena saya melewatkannya: D Terima kasih!
Dead Possum
B=[[y<'.'and'#'or y for y in x]+['#']*(L(S[0])-L(x))for x in b+[[]]*(L(S)-L(b))]untuk -4
ovs
Dan R=[x[::-1]for x in B]untuk -4 juga. Secara umum, jangan gunakan peta dengan fungsi lambda
ovs