이 사각형은 대칭입니까?


22

정확히 4 A, 4 B, 4 C및 4 로 구성된 4 × 4 텍스트 그리드를 취하는 프로그램 또는 함수를 작성하십시오 D.

ACDC
BBCA
BADD
ABCD

ABCD배치는 가능하지만 항상 4 개가 있습니다. 입력이 유효하다고 가정 할 수 있습니다. 원하는 경우 줄 바꿈 줄이 있거나 읽기 순서에서 한 줄로 표시되는 것으로 가정 할 수도 있습니다 (예 :) ACDCBBCABADDABCD. 원하는 경우 문자 ABCD를 각각 0123또는로 바꿀 수도 있습니다 1234(그러나 그게 전부입니다).

텍스트 격자에 반사 또는 회전 대칭 형식이있는 경우 정확한 값을 출력하십시오. 구체적으로 :

  • 중심 수평 대칭 선이있는 경우. 예 :

    BACD
    BACD 
    BACD \___ bottom mirrors top
    BACD /
    
  • 중앙의 수직 대칭 선이있는 경우. 예 :

    BCCB
    DAAD
    CAAC
    BDDB
      \/___ right mirrors left
    
  • 대각선의 대칭 선이있는 경우 (양방향). 예 :

         ___ diagonally mirrored
        /
    ABDC
    BACD
    DCAB
    CDBA
        \___ diagonally mirrored
    
  • 90 ° 회전 대칭이있는 경우 예 :

    BDAB
    ACCD    same if rotated 90 degrees (or 180 or 270)
    DCCA
    BADB
    
  • 180 ° 회전 대칭이있는 경우 예 :

    DBCA
    BDCA    same if rotated 180 degrees
    ACDB
    ACBD
    

(번역 대칭은 여기서 작동하지 않습니다.)

그리드에 위에서 언급 한 대칭 중 하나가없는 경우 잘못된 값을 출력합니다. 예를 들어 첫 번째 예제 그리드.

바이트 단위의 가장 짧은 코드가 이깁니다.


네 개의 문자열 목록을 입력으로 사용할 수 있습니까?
Martin Ender

@MartinEnder 그렇습니다.
Calvin 's Hobbies

4
난 그냥 읽고 "아니오"롤 생각
숀 와일드

정사각형을 타일로 생각하면 변환 대칭도 고려할 수 있습니다.
Neil

1
@ Adám No. 더 이상 입력 형식이 없습니다. 나는 정말로 Martin 's를 허락해서는 안된다고 생각한다.
Calvin 's Hobbies

답변:


16

CJam, 16 바이트

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

이름이없는 블록은 입력을 스택의 맨 위에 4 개의 문자열 목록으로 예상하고 0비대칭 입력의 경우 (거짓), 대칭 입력의 경우 양의 정수 (거짓)를 남겨 둡니다.

여기에서 테스트하십시오. 또는 전체 테스트 스위트를 실행하십시오.

설명

정사각형의 대칭은 8 차 그룹의 8 면체 그룹의 요소입니다 (정사각형의 4 회전과 정사각형의 반사 된 버전의 동일한 4 회전). 단일 순열을 반복적으로 적용하여이 그룹을 생성 할 수 없습니다. 그러나 두 개의 반사는 항상 약간의 회전을 제공합니다. 따라서, 두 개의 반사를 네 번 번갈아 가면서 전체 그룹을 생성 할 수 있습니다. (두 반사가 0도 또는 180 도가 아닌 90도 또는 270도 회전하는지 확인해야합니다.)

챌린지는 입력 사각형이 다른 7 개의 대칭과 같은지 묻습니다. 따라서이 답변은 모든 것을 생성 한 다음 입력이 다른 것들 사이에 있는지 확인합니다.

{      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.

방법의 반복 응용 프로그램을 확인하려면 zW%이 "도"를 보라, 모든 대칭을 생성합니다 :

     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

와우, 당신은 이것을 설명 할 수 있습니까? 모든 회전 / 플립에 대해 내장되어 있습니까?
Adám

아담 @ 나는 비트에 대한 자세한 설명을 추가 할 수 있지만 것 z전치이고 W%난 그냥 사람들의 반복 응용 프로그램에서 모든 대칭을 생성하는거야, 그래서 선을 반전시킵니다.
Martin Ender

4
물론 첫 번째 가치에는 특별한 것이 없지만 슬프게도 8 개의 고유 한 가치를 얻는 지 계산하는 더 순수한 접근 방식은 1 문자를 더 소비합니다.
피터 테일러

8

Pyth, 11 바이트

<7.u?%Y2CN_

테스트 스위트

이것은 Martin의 조옮김과 역전 기술을 사용하지만 꼬임이 있습니다. 다른 솔루션은 8 개의 대칭을 모두 명시 적으로 생성 한 다음 원본의 출현 횟수를 세지 만이 프로그램은 Pyth의 .u기능을 사용 합니다.

그만큼 .u기능은이 "반복 찾을 때까지 적용"입니다. 이 경우 반복이 발생할 때까지 번갈아 바꾸고 결과를 목록에 누적합니다. 그런 다음 마지막 7 개의 값을 제거하므로 대칭이 없으면 남아있는 값만 남고 8 개의 반사와 반복이 모두 생성 된 후 첫 번째 반복이 발생했습니다.

설명:

<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

펄, 61 60 바이트

에 +3 포함 -p0a

STDIN에 입력 사각형을 제공하고 대칭이 없으면 0을 인쇄하고 그렇지 않으면 양수

./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 바이트

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

온라인으로 사용해보십시오!

이것은 문자열 목록을 입력으로 예상합니다. 이 중 하나를 인쇄 true.하거나 false..

설명

  • 주요 술어 :

    @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
    
  • 술어 1 : 출력은 입력의 8 가지 대칭 중 하나입니다.

    (
        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 바이트

TSQL에는 회전을위한 기본 제공 기능이 없으므로 코드에 포함되어 있습니다.

골프 :

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

언 골프 드 :

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

깡깡이


2

파이썬 2, 154 146 바이트

필요한 변환이 numpy 배열을 사용하는 원본과 동일한 지 확인합니다. 입력은 네 개의 문자열 목록으로 사용됩니다.

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

온라인으로 사용해보십시오

을 사용하여 단일 문자열로 입력하는 것이 1 문자 더 깁니다 A=array(list(input())).reshape(4,4). A[:,::-1]와 동일합니다 fliplr(A). A[::-1]와 동일합니다 flipud(A).


map(list,input())대신 사용[list(r)for r in input()]
Cyoce

@Cyoce 감사합니다. 내가 그것을 놓친 방법.
mbomb007

any생성기 표현식을 사용하므로 대괄호의 바깥 쪽 쌍을 삭제하여 몇 바이트를 절약 할 수 있습니다.
TheBikingViking

@ TheBikingViking 나는 이미 그것을 시도했다. 생성기를 전달하면 생성기가 반환되어 print명령문이 작동하지 않습니다. 온라인 코드를 찾아보고 그런 식으로 실행하십시오.
mbomb007

그래. 나는 그것이 깨질 것이라는 것을 몰랐다 print.
TheBikingViking

2

파이썬 3, 99 바이트

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

인수 및 문자열 목록의 입력을 가져 True오거나 False관련 있는 함수입니다 .

이것은 @MartinEnder와 같은 접근법을 사용합니다. 답변 .

작동 원리

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

Ideone에서 사용해보십시오


2

자바 스크립트 (ES6), 131 바이트

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)

4 개의 문자열 배열을 직접 전달하면 17 바이트를 제거 할 수 있습니다. 비트 트위들 링 (입력 "0123301223011230"형식)을 시도했지만 199 바이트가 걸렸습니다.

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)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.