Là hình vuông đối xứng?


22

Viết chương trình hoặc chức năng có trong lưới văn bản 4 × 4 bao gồm chính xác 4 A, 4 B, 4 Cvà 4 D, chẳng hạn như:

ACDC
BBCA
BADD
ABCD

Các ABCDcó thể được sắp xếp theo thứ tự nhưng sẽ luôn có 4 cái. Bạn có thể giả sử đầu vào là hợp lệ. Nếu muốn, bạn cũng có thể giả sử nó có một dòng mới và / hoặc nó có dạng một dòng theo thứ tự đọc, vd ACDCBBCABADDABCD. Bạn cũng có thể thay thế các ký tự ABCDbằng 0123hoặc 1234tương ứng, nếu muốn (nhưng đó là tất cả).

Xuất ra một giá trị trung thực nếu lưới văn bản có bất kỳ dạng đối xứng phản xạ hoặc xoay. Đặc biệt:

  • Nếu có một đường ngang đối xứng trung tâm. ví dụ

    BACD
    BACD 
    BACD \___ bottom mirrors top
    BACD /
    
  • Nếu có một đường thẳng đứng đối xứng trung tâm. ví dụ

    BCCB
    DAAD
    CAAC
    BDDB
      \/___ right mirrors left
    
  • Nếu có một đường chéo đối xứng (theo một trong hai hướng). ví dụ

         ___ diagonally mirrored
        /
    ABDC
    BACD
    DCAB
    CDBA
        \___ diagonally mirrored
    
  • Nếu có đối xứng quay 90 °. ví dụ

    BDAB
    ACCD    same if rotated 90 degrees (or 180 or 270)
    DCCA
    BADB
    
  • Nếu có đối xứng quay 180 °. ví dụ

    DBCA
    BDCA    same if rotated 180 degrees
    ACDB
    ACBD
    

(Lưu ý rằng tính đối xứng tịnh tiến không xuất hiện ở đây.)

Xuất ra một giá trị sai lệch nếu lưới không có một trong các đối xứng được đề cập ở trên. ví dụ lưới ví dụ đầu tiên

Mã ngắn nhất tính bằng byte thắng.


Chúng ta có thể lấy một danh sách bốn chuỗi làm đầu vào không?
Martin Ender

@MartinEnder Vâng, được rồi.
Sở thích của Calvin

4
Tôi vừa đọc nó và nghĩ "không" lol
Shaun Wild

Nếu bạn nghĩ để xếp hình vuông thì bạn cũng có thể tính đến tính đối xứng tịnh tiến.
Neil

1
@ Adám số Không có nhiều định dạng đầu vào. Tôi cảm thấy tôi thực sự không nên cho phép Martin.
Sở thích của Calvin

Câu trả lời:


16

CJam, 16 byte

{{z_W%_}4*;])e=}

Một khối không tên dự kiến ​​đầu vào là một danh sách bốn chuỗi trên đầu ngăn xếp và để lại một 0(sai) cho các đầu vào không đối xứng và một số nguyên dương (trung thực) cho các đầu vào đối xứng.

Kiểm tra nó ở đây. Hoặc chạy một bộ thử nghiệm đầy đủ.

Giải trình

Các đối xứng của hình vuông là các yếu tố của nhóm dih thờ của thứ tự 8 (chỉ là 4 góc quay của hình vuông và 4 góc quay tương tự của một số phiên bản phản ánh của hình vuông). Không thể tạo nhóm này từ ứng dụng lặp lại của một hoán vị. Nhưng hai phản xạ luôn luôn cho một số luân chuyển. Do đó, toàn bộ nhóm có thể được tạo bằng cách xen kẽ giữa hai phản xạ bốn lần. (Chúng ta chỉ cần đảm bảo rằng hai phản xạ cho góc xoay 90 độ hoặc 270 độ, không phải 0 hoặc 180.)

Thử thách hỏi xem hình vuông đầu vào có bằng với bất kỳ 7 đối xứng nào khác không. Vì vậy, câu trả lời này chỉ tạo ra tất cả chúng và sau đó kiểm tra xem đầu vào có nằm trong số những cái khác không.

{      e# Run this block 4 times.
  z_   e# Transpose the grid and duplicate it. (This is one type of reflection.)
  W%_  e# Reverse the lines and duplicate it. (This is another type of
       e# reflection. Together they rotate the grid by 90 degrees.)
}4*    e# The last element will be the original grid again.
;      e# Discard one copy of that original grid.
]      e# Wrap all symmetries in a list.
)      e# Pull off the original grid.
e=     e# Count how many times it appears among the other symmetries.

Để xem cách ứng dụng lặp đi lặp lại zW%tạo ra tất cả các đối xứng, hãy xem "sơ đồ" này:

     0123
     4567
     89ab
     cdef

     original

 z   048c       W%       37bf
-->  159d  ----------->  26ae
     26ae                159d
     37bf                048c

     diag. refl.         rot. 90 degrees ccw

 z   3210       W%       fedc
-->  7654  ----------->  ba98
     ba98                7654
     fedc                3210

     vert. refl.        rot. 180 degrees

 z   fb73       W%       c840
-->  ea62  ----------->  d951
     d951                ea62
     c840                fb73

     antidiag. refl.     rot. 270 degrees ccw

 z   cdef       W%       0123
-->  89ab  ----------->  4567
     4567                89ab
     0123                cdef

     horiz. refl.        original

Wow, bạn có thể giải thích điều này? Bạn có tích hợp sẵn cho tất cả các phép quay / lật không?
Adám

@ Adám Tôi sẽ thêm một lời giải thích đầy đủ trong một chút, nhưng zlà hoán vị và W%đảo ngược các dòng, vì vậy tôi chỉ tạo ra tất cả các đối xứng bằng cách áp dụng lặp đi lặp lại những điều đó.
Martin Ender

4
Tất nhiên, không có gì đặc biệt về giá trị đầu tiên, nhưng thật đáng buồn là cách tiếp cận thuần túy hơn trong việc đếm xem bạn có nhận được 8 giá trị riêng biệt có giá hơn một char không.
Peter Taylor

8

Bình thường, 11 byte

<7.u?%Y2CN_

Bộ kiểm tra

Điều này sử dụng kỹ thuật chuyển vị và đảo ngược của Martin, nhưng với một bước ngoặt. Mặc dù các giải pháp khác đã tạo ra rõ ràng tất cả 8 đối xứng, sau đó đếm số lần xuất hiện của bản gốc, chương trình này sử dụng .uchức năng của Pyth .

Các .uchức năng là "Áp dụng cho đến khi lặp lại được tìm thấy". Trong trường hợp này, chúng tôi luân phiên hoán vị và đảo ngược cho đến khi sự lặp lại xảy ra, sau đó tích lũy kết quả vào một danh sách. Sau đó, tôi xóa 7 giá trị cuối cùng, do đó sẽ chỉ còn một giá trị nếu không có đối xứng và sự lặp lại đầu tiên xảy ra sau khi tất cả 8 phản xạ và lặp lại được tạo ra.

Giải trình:

<7.u?%Y2CN_
<7.u?%Y2CN_NQ    Implicit variables
                 Q = eval(input())
  .u        Q    Starting with Q, apply the following until a repeat occurs, 
                 then accumulate all values into a list.
    ?%Y2         If the iteration number is odd
        CN       Transpose
          _N     Else reverse
<7               Remove the last 7 results


4

Perl, 61 60 byte

Bao gồm +3 cho -p0a

Đặt hình vuông đầu vào trên STDIN, in 0 không đối xứng, nếu không, một số số dương

./symmetry.pl
DBCA
BDCA
ACDB
ACBD
^D

symmetry.pl:

#!/usr/bin/perl -p0a
s,.,chop$F[$i++/($j-4?1:4)%4],eg;$\+=$$_++;++$j<8&&redo}{


3

Brachylog , 38 36 byte

@eL:1fbeL
(L;?:raL)(.;L$\.;L$/.;Lr.)

Hãy thử trực tuyến!

Điều này mong đợi một danh sách các chuỗi như đầu vào. Điều này in true.hoặc false..

Giải trình

  • Vị ngữ chính:

    @eL    Split each line into a list of chars ; call that list of lists L
    :1f    Find all symmetries
    b      Remove the first one (the identity)
    eL     L is an element of that list of symmetries
    
  • Vị ngữ 1: Đầu ra là một trong 8 đối xứng của đầu vào.

    (
        L             L = Input
    ;             Or
        ?:raL         L = reverse all lines of the input
    )
    (
        .             Output = L
    ;             Or
        L$\.          Output = transpose of L    
    ;             Or
        L$/.          Output = antitranspose of L
    ;             Or
        Lr.           Output = reverse of L
    )
    

3

TSQL, 229 byte

Lưu ý rằng TSQL không có tích hợp để xoay, do đó, điều này được bao gồm trong mã.

Chơi gôn

DECLARE @1 char(16)=
'BCCBDAADCAACBDDB'

,@i INT=0,@ varchar(16)=''WHILE @i<16SELECT @+=substring(@1,@i*4%16+@i/4+1,1),@i+=1SELECT sign(count(*))FROM(SELECT LEFT(x,8)a,RIGHT(x,4)b,substring(x,9,4)c FROM(values(@1),(@))x(x))x WHERE c+b=reverse(a)or a=reverse(b+c)or a=b+c

Ung dung:

DECLARE @1 char(16)=
'BCCBDAADCAACBDDB'

,@i INT=0,@ varchar(16)=''
WHILE @i<16
  SELECT @+=substring(@1,@i*4%16+@i/4+1,1),@i+=1

SELECT sign(count(*))
FROM
  (SELECT LEFT(x,8)a,RIGHT(x,4)b,substring(x,9,4)c
   FROM(values(@1),(@))x(x))x
WHERE c+b=reverse(a)or a=reverse(b+c)or a=b+c

Vĩ cầm


2

Python 2, 154 146 byte

Kiểm tra nếu bất kỳ biến đổi cần thiết nào tương đương với bản gốc bằng cách sử dụng mảng numpy. Đầu vào được lấy dưới dạng danh sách bốn chuỗi.

from numpy import*
A=array(map(list,input()))
R=rot90
T=transpose(A)
print any([all(A==Z)for Z in(A[:,::-1],A[::-1],R(A),R(A,2),R(A,3),T,R(T,2))])

Dùng thử trực tuyến

Lấy đầu vào là một chuỗi dài hơn một char, với A=array(list(input())).reshape(4,4). A[:,::-1]cũng giống như fliplr(A). A[::-1]cũng giống như flipud(A).


Có thể sử dụng map(list,input())thay vì[list(r)for r in input()]
Cyoce

@Cyoce Cảm ơn. Idk làm thế nào tôi bỏ lỡ điều đó.
mbomb007

anycó một biểu thức trình tạo, do đó bạn có thể lưu một vài byte bằng cách bỏ cặp dấu ngoặc vuông bên ngoài.
TheBikingViking 19/8/2016

@TheBikingViking Tôi đã thử nó rồi. Nếu bạn vượt qua một trình tạo, thì nó trả về một trình tạo, làm cho printcâu lệnh không hoạt động. Hãy thử nhập mã trực tuyến của tôi và chạy nó theo cách đó để xem.
mbomb007

À, được rồi Tôi đã không nhận ra rằng nó sẽ phá vỡ print.
TheBikingViking 19/8/2016

2

Python 3, 99 byte

def f(x):
 t=x;c=[]
 for i in range(7):*t,=[map(''.join,zip(*t)),t[::-1]][i%2];c+=t,
 return x in c

Một hàm lấy đầu vào, thông qua đối số, của một danh sách các chuỗi và trả về Truehoặc Falsecó liên quan.

Điều này sử dụng cách tiếp cận tương tự như câu trả lời của @ MartinEnder .

Làm thế nào nó hoạt động

def f(x)                Function with input list of strings x
 t=x;c=[]               Initilaise temporary square t and combination list c
 for i in range(7):...  For i in range [0,6]:
 [...][i%2]              If i is even:
 zip(*t)                  transpose(t)
 *t,=map(''.join,...)     t = t with each line concatenated (such that t is in the same
                          format as x)
                         Else:
 *t,=t[::-1]              t = reverse(t)
 c+=t,                   Append t to c
 return x in c           Return True if x is in c else return False

Hãy thử nó trên Ideone


2

JavaScript (ES6), 131 byte

s=>[...`0101010`].map(c=>+c?``+b.reverse():`${b=b.map((s,i)=>s.replace(/./g,(_,j)=>b[j][i]))}`,b=a=s.match(/..../g)).includes(``+a)

17 byte có thể bị xóa nếu bạn truyền trực tiếp một mảng gồm 4 chuỗi. Tôi đã thử xoay vòng bit (đầu vào ở "0123301223011230"định dạng) nhưng điều đó khiến tôi mất 199 byte:

s=>[...'0101010'].map(c=>r=+c?r<<24&255<<24|r<<8&255<<16|r>>8&255<<8|r>>>24:r&0xc0300c03|r<<6&806093568|r<<12&3075<<16|r<<18&3<<24|r>>6&0xc0300c|r>>12&49200|r>>18&192,r=n=parseInt(s,4)|0).includes(n)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.