Döndürme değişmez parmak izi


15

Bazı polyomino'muz olduğunu ve bunları benzersiz bir şekilde tanımlamak istediğimizi düşünün , ancak polyominolar döndürülebilir, bu yüzden onları körü körüne hash etmek bize bir parça ve bir rotasyon için aynı parmak izini vermez (genel olarak).

Örneğin, L-tetromino'muz varsa

x
x
xx

bunlardan herhangi biriyle aynı parmak izine sahip olmasını istiyoruz:

         xx
  x       x      xxx
xxx  ,    x  or  x

Not: Sadece düzlemde rotasyonlara izin veriyoruz (yani, tek taraflı polyominos'lardır) ve bu nedenle aşağıdaki polyomino farklı olacaktır:

 x
 x
xx 

Meydan okuma

Bu zorluğun görevi, mxn Boolean / 0,1 değerli bir matris / liste / string / .. alan bir parmak izi fonksiyonu / programı uygulamaktır. . Parmak izi, olası tüm rotasyonlar için eşit olmalıdır (genel olarak 4).

Giriş çıkış

  • m1 ven1 (yani boş bir polomino yok)
  • m,n olabildiğince küçük olduğu garanti edilir (yani, 0 tümü m ve n'ye uyacak şekilde kesilirn
  • girdinin
    • basitçe bağlandı
    • deliği yok
  • çıktı bir polyomino'nun olası her dönüşü için aynı olan bir dize olmalıdır

Örnekler

İşte bazı denklik sınıfları, her sınıf için parmak izi aynı olmalı ve iki farklı sınıftan herhangi iki poliomino için farklı olmaları gerekir.

L-tetromino'nun örnekten dönüşleri:

[[1,0],[1,0],[1,1]]
[[0,0,1],[1,1,1]]
[[1,1],[0,1],[0,1]]
[[1,1,1],[1,0,0]]

J-tetromino:

[[0,1],[0,1],[1,1]]
[[1,1,1],[0,0,1]]
[[1,1],[1,0],[1,0]]
[[1,0,0],[1,1,1]]

Birim polikomino:

[[1]]

Bir 5x1 bar:

[[1,1,1,1,1]]
[[1],[1],[1],[1],[1]]

Bir 2x2 köşe:

[[1,1],[1,0]]
[[1,0],[1,1]]
[[0,1],[1,1]]
[[1,1],[0,1]]

W Pentomino:

[[1,0,0],[1,1,0],[0,1,1]]
[[0,0,1],[0,1,1],[1,1,0]]
[[1,1,0],[0,1,1],[0,0,1]]
[[0,1,1],[1,1,0],[1,0,0]]


Her zaman çıktı veririm ""(boş dize), tüm gereksinimleri karşıladım mı?
Daniel Wagner

@DanielWagner: "[..] iki farklı sınıftan [parmak izleri] farklı iki polimino için farklı olmalıdır " - yani hayır, bu geçersiz olur.
ბიმო

Bir dizinin tüm olası rotasyonlarının çıktısı sürekli olarak sıralanıyor mu? Örnek
Shaggy

1
@Shaggy: Evet, bu tüm kriterleri karşılayacaktı.
ბიმო

Yanıtlar:


7

Python 2 , 48 bayt

f=lambda l,z=5:z and max(l,f(zip(*l)[::-1],z-1))

Çevrimiçi deneyin!

Liste karşılaştırması açısından dört rotasyonun en büyüğünü alır. Dayanarak FlipTack çözümüyle .

Kod, Python 2'nin farklı türdeki nesneleri karşılaştırma yeteneğini kullanır. Temel vaka değeri herhangi bir listeden daha küçük olduğu 0için zararsızdır max. Ayrıca, zipgiriş bir liste listesindeyken bir tuples listesi üretir, ancak tuples listelerden daha büyüktür, bu nedenle giriş listelerinin listesi asla bir rakip değildir. Bu yüzden 4 yerine 5 kez döndürüyoruz, böylece ilk listenin geliştirilmiş bir sürümüne geri dönüyoruz. (İzin verilen bir girdi biçimi ise, tuples listesini almak da işe yarayacaktır.)


4

Python 3 , 63 bayt

def f(m):M=[];exec("m=[*zip(*m[::-1])];M+=m,;"*4);return min(M)

Çevrimiçi deneyin!

Dönüşü en az lexografik olarak bulur ve yazdırır.

Bir lambda formu aynı bayt sayısında gelir:

lambda m,M=[]:exec("m=[*zip(*m[::-1])];M+=m,;"*4)or min(M[-4:])

Çevrimiçi deneyin!


Olarak yeniden yazmak lambdasizi 58'e götürebilir lambda m,M=[]:exec("m=[*zip(*m[::-1])];M+=m,;"*4)or min(M). Çalışır, çünkü execher zaman geri döner None.
nedla2004

@ nedla2004 Bu sadece bir kez çalıştırılabilir ve daha sonra Mzaten doldurulmuş gibi tehlikeli olur ...
FlipTack

@ nedla2004 ... ancak sorunun hesaplanması M[-4:]sizi aynı bayt sayısına götürebilir.
FlipTack

Görüyorum ki, kullandığım test sadece aynı "hash" ile girişleri kontrol ediyordu, bu yüzden hiç karşılaşmadım. Mantıklı.
nedla2004

2

Jöle , 5 bayt

ZU$ƬṂ

Çevrimiçi deneyin!

Tam program.

Sadece tüm olası dönüşleri üretir ve sözlük minimumunu seçer.

Tekton listelerinin kaydırılmadığını unutmayın [] çıktıya . Girişte singleton listelerinin var olacağı tek durum, aynı boyuttaki yatay bir çizgi ile aynı olan dikey bir çizgi (birim poliomino dahil) olacağından, ). Dış []tarafın da bulunmayacağı tek durum birim poliminondur.


Ben meydan okuduğumda bunun olacağını biliyordum :)
ngn

2

Temiz , 136 bayt

import StdEnv,Data.List
r=reverse;t=transpose;f=flatten
$l=[if((a==b)==(c==d))'x''X'\\a<-f l&b<-f(r(map r l))&c<-f(r(t l))&d<-f(t(r l))]

Çevrimiçi deneyin!

Test doğrulayıcıyı içerir.


2

K (ngn / k) , 16 bayt

{a@*<a:3{+|x}\x}

Çevrimiçi deneyin!

dönme dakikası

{ } argüman ile işlev x

{+|x}döndür, yani ters ( |) ve transpoze ( +)

3{ }\ara sonuçları koruyarak 3 kez uygulayın; bu 4 rotasyonun bir listesini döndürür

a: atamak a

< ascend (sıralama artan permütasyonu hesapla)

* ilk

a@abununla dizin


1

Japt -g, 6 bayt

4Æ=zÃñ

Dene

           :Implicit input of 2d-array U
4Æ         :Map the range [0,4)
   z       :  Rotate U 90 degrees
  =        :  Reassign to U
    Ã      :End map
     ñ     :Sort
           :Implicit output of first element

-gbayrak gerekli? Sıralama, tüm ilk rotasyonların aynı listeyle sonuçlandığı anlamına gelmelidir, böylece bir şey eksik olmadıkça tam listenin parmak izi ile iyi çalışması gerekir.
Kamil Drakari

@KamilDrakari, haklı olabilirsin - dediğim gibi , meydan okumayı tam olarak anladığımdan emin değilim . Bununla birlikte, hiçbir zararın bayt maliyeti yoktur.
Shaggy

@KamilDrakari: Gerekli değil, ancak bayt hesabında sayılmadığından da bir zararı yok.
ბიმო

1

J , 16 bayt

Shaggy sayesinde -2 bayt

[:/:~|.@|:^:(<4)

Çevrimiçi deneyin!

J , 18 bayt

0{[:/:~|.@|:^:(<4)

Çevrimiçi deneyin!

Polyomino'nun lexicograpically sort rotasyonları listesindeki ilk öğeyi döndürür.

Açıklama:

            ^:(<4)  - do the verb on the left 4 times, storing all the steps
       |.@|:        - tranpose and reverse
    /:~             - sort up the 4 matrices
  [:                - cap the fork
0{                  - take the first matrix  

@Shaggy Teşekkürler!
Galen Ivanov

0

05AB1E , 10 8 bayt

3FÂø})Σ˜

@Shaggy sayesinde -2 bayt .

Çevrimiçi deneyin veya tüm test senaryolarını doğrulayın .

Açıklama:

3F  }       # Loop 3 times
  Â         #  Bifurcate (short for Duplicate & Reverse) the top of the stack
            #  (which is the input-matrix implicitly the first iteration)
   ø        #  Transpose: swap rows/columns
     )      # After the loop, wrap everything on the stack in a list
      Σ˜    # Sort this list of matrices by their flattened array (and output implicitly)

NOT: Minimum ile almak ßveya Wdolaylı olarak düzleştirmek, böylece çıktı0 . Ve sıralama, {bir matris listesi için işe yaramaz gibi görünüyor, bu yüzden Σ˜bunun yerine kullanıyorum.


1
@Shaggy Teşekkürler! :) Bu durumda, son iki bayt kaldırılabilir, çünkü }bundan sonra hiçbir şey gelmezse örtük olarak yapılır.
Kevin Cruijssen

1
Bugün 05AB1E hakkında bir şeyler öğrendim! :) Japt için de aynı şey geçerli.
Shaggy
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.