สแควร์นี้สมมาตรหรือไม่


22

เขียนโปรแกรมหรือฟังก์ชั่นที่ใช้ในกริดข้อความ 4 × 4 ซึ่งประกอบด้วย 4 A, 4 B, 4 Cและ 4 Dเช่น:

ACDC
BBCA
BADD
ABCD

ABCD's อาจจะอยู่ในการจัดเรียงใด ๆ แต่มีจะเป็น 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

@ มาร์ตินใช่ใช่เอาล่ะ
งานอดิเรกของ Calvin

4
ฉันเพิ่งอ่านมันและคิดว่า "ไม่" ฮ่า ๆ ๆ
Shaun Wild

ถ้าคุณคิดที่จะปูกระเบื้องสี่เหลี่ยมจากนั้นคุณก็สามารถนำเอาสมการการแปลมาพิจารณาได้เช่นกัน
Neil

1
@ Adámไม่ไม่มีรูปแบบการป้อนข้อมูลเพิ่มเติม ฉันรู้สึกว่าฉันไม่ควรอนุญาตให้มาร์ติน
งานอดิเรกของ Calvin

คำตอบ:


16

CJam, 16 ไบต์

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

บล็อกที่ไม่มีชื่อซึ่งคาดว่าอินพุตเป็นรายการของสี่สตริงที่ด้านบนของสแต็กและปล่อย a 0( เป็นเท็จ) สำหรับอินพุตแบบไม่สมมาตรและจำนวนเต็มบวก (ความจริง) สำหรับอินพุตแบบสมมาตร

ทดสอบที่นี่ หรือเรียกใช้ชุดทดสอบเต็มรูปแบบ

คำอธิบาย

ความสมมาตรของจตุรัสนั้นเป็นองค์ประกอบของกลุ่มไดฮีดรัลลำดับที่ 8 (ซึ่งเป็นเพียงการหมุน 4 ครั้งของสี่เหลี่ยม ไม่สามารถสร้างกลุ่มนี้จากแอปพลิเคชันซ้ำของการเปลี่ยนรูปแบบครั้งเดียว แต่การสะท้อนสองครั้งให้การหมุนเสมอ ดังนั้นทั้งกลุ่มสามารถสร้างขึ้นได้โดยสลับระหว่างการสะท้อนสองครั้งสี่ครั้ง (เราต้องตรวจสอบให้แน่ใจว่าการสะท้อนกลับสองครั้งนั้นให้การหมุน 90 องศาหรือ 270 องศาไม่ใช่ 0 หรือ 180)

ความท้าทายจะถามว่าสแควร์อินพุทเท่ากับ 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.

ในการดูว่าแอปพลิเคชันซ้ำ ๆzและW%สร้างสมมาตรทั้งหมดอย่างไรให้ดูที่ "แผนภาพ" นี้:

     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

ว้าวคุณช่วยอธิบายสิ่งนี้ได้ไหม คุณมี built-in สำหรับการหมุน / การหมุนทั้งหมดหรือไม่?
อดัม

@ Adámฉันจะเพิ่มคำอธิบายแบบเต็ม ๆ เพียงเล็กน้อย แต่zเป็นการแปลงและW%กลับรายการดังนั้นฉันจึงสร้างสมมาตรทั้งหมดโดยใช้ซ้ำ ๆ
Martin Ender

4
แน่นอนไม่มีอะไรพิเศษเกี่ยวกับค่าแรก แต่น่าเศร้ายิ่งกว่าวิธีการนับที่พิถีพิถันยิ่งขึ้นว่าคุณจะได้รับ 8 ค่าที่แตกต่างทำให้เสียค่าใช้จ่ายมากขึ้น
Peter Taylor

8

Pyth, 11 ไบต์

<7.u?%Y2CN_

ชุดทดสอบ

สิ่งนี้ใช้เทคนิคการขนย้ายและย้อนกลับของ Martin แต่ด้วยการบิด ในขณะที่โซลูชันอื่น ๆ ได้สร้างสมมาตรทั้ง 8 อย่างชัดเจนจากนั้นนับจำนวนลักษณะที่ปรากฏของต้นฉบับโปรแกรมนี้ใช้.uฟังก์ชันของ Pyth

.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

5

05AB1E , 13 ไบต์

4Fø€JÂD}\\)¹å

คำอธิบาย

ใช้วิธีการที่เชี่ยวชาญอธิบายโดยมาร์ตินในคำตอบของเขา CJam

4F     }       # 4 times do:
  ø€J          # zip and join each
     ÂD        # bifurcate, duplicate
        \\     # delete the top 2 items on the stack
          )    # wrap stack in list
           ¹å  # check if input is in that list

ลองออนไลน์


4

Perl, 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 symmetries ของอินพุต

    (
        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 ไม่มี build-in สำหรับการหมุนดังนั้นสิ่งนี้จึงรวมอยู่ในโค้ด

แข็งแรงเล่นกอล์ฟ:

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

Ungolfed:

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

Python 2, 154 146 bytes

ตรวจสอบว่าการแปลงใด ๆ ที่จำเป็นนั้นเทียบเท่ากับต้นฉบับโดยใช้ numpy arrays อินพุตถูกใช้เป็นรายการของสี่สตริง

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

ลองออนไลน์

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 ขอบคุณ IDK ฉันคิดถึงสิ่งนั้นอย่างไร
mbomb007

anyใช้นิพจน์ตัวสร้างเพื่อให้คุณสามารถบันทึกไม่กี่ไบต์โดยวางคู่ด้านนอกของวงเล็บเหลี่ยม
TheBikingViking

@TheBikingViking ฉันได้ลองแล้ว ถ้าคุณผ่านตัวสร้างมันก็จะส่งกลับตัวสร้างทำให้printคำสั่งไม่ทำงาน ลองฟอร์กรหัสออนไลน์ของฉันและเรียกใช้วิธีการดู
mbomb007

อาโอเค. printผมไม่ทราบว่ามันจะทำลาย
TheBikingViking

2

Python 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

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

17 ไบต์สามารถลบได้ถ้าคุณผ่านอาร์เรย์ของสตริง 4 สายโดยตรง ฉันลอง bit-twiddling (อินพุตใน"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.