এই বর্গ কি প্রতিসম হয়?


22

একটি প্রোগ্রাম বা ফাংশন লিখুন যা 4 4 A, 4 B's, 4 C' s এবং 4 Dএর গুলি সমন্বিত 4 × 4 পাঠ্য গ্রিডে লাগে যেমন:

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
    

(দ্রষ্টব্য যে এখানে অনুবাদমূলক প্রতিসাম্যটি কার্যকর হয় না))

যদি গ্রিডের উপরে উল্লিখিত একটি প্রতিসাম্য না থাকে তবে একটি মিথ্যা মান আউটপুট দেয়। যেমন খুব প্রথম উদাহরণ গ্রিড।

বাইটের মধ্যে সংক্ষিপ্ততম কোডটি জয়ী।


আমরা কি ইনপুট হিসাবে চারটি স্ট্রিংয়ের একটি তালিকা নিতে পারি?
মার্টিন এন্ডার

@ মার্টিনএন্ডার হ্যাঁ, ঠিক আছে।
ক্যালভিনের শখ 8 ই

4
আমি কেবল এটি পড়েছি এবং "নাহ" লোল ভেবেছিলাম
শান ওয়াইল্ড

আপনি যদি স্কোয়ারটি টাইল করার কথা ভেবে থাকেন তবে আপনি অনুবাদমূলক প্রতিসাম্যটিও অ্যাকাউন্টে নিতে পারতেন।
নিল

1
@ অ্যাডম নং। আর কোনও ইনপুট ফর্ম্যাট নেই। আমার মনে হয় মার্টিনের আসলেই আমার অনুমতি দেওয়া উচিত হয়নি।
ক্যালভিনের শখ 12

উত্তর:


16

সিজেম, 16 বাইট

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

একটি নামবিহীন ব্লক যা স্ট্যাকের শীর্ষে চারটি স্ট্রিংয়ের তালিকা হিসাবে ইনপুটটি প্রত্যাশা করে এবং 0অসম্পূর্ণ ইনপুটগুলির জন্য একটি (ফালসি) এবং প্রতিসম ইনপুটগুলির জন্য ধনাত্মক পূর্ণসংখ্যা (সত্যবাদী) ছেড়ে যায়।

এটি এখানে পরীক্ষা করুন। অথবা একটি সম্পূর্ণ পরীক্ষার স্যুট চালান।

ব্যাখ্যা

স্কোয়ারের প্রতিসাম্যগুলি হ'ল অর্ডার 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.

কিভাবে বার বার আবেদন দেখার জন্য zএবং W%সব symmetries জেনারেট করে, এই "ডায়াগ্রাম" কটাক্ষপাত আছে:

     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

বাহ, আপনি এই ব্যাখ্যা করতে পারেন? আপনার সমস্ত ঘূর্ণন / ফ্লিপগুলির জন্য অন্তর্নির্মিত কি আছে?
অ্যাডম

@ অ্যাডাম আমি কিছুটা পূর্ণ বিবরণ যোগ করব, তবে zএটি পরিবর্তন করে এবং W%লাইনগুলি উল্টে দেয়, তাই আমি বারবার প্রয়োগ করে সমস্ত প্রতিসাম্য তৈরি করছি।
মার্টিন এন্ডার

4
অবশ্যই প্রথম মান সম্পর্কে বিশেষ কিছু নেই, তবে দুঃখের বিষয় যে আপনি 8 টি স্বতন্ত্র মান পাচ্ছেন কিনা তা গণনার আরও বিশুদ্ধবাদী পদ্ধতির জন্য আরও একটি চরের দাম পড়বে।
পিটার টেলর

8

পাইথ, 11 বাইট

<7.u?%Y2CN_

পরীক্ষা স্যুট

এটি মার্টিনের ট্রান্সপোজ এবং বিপরীত কৌশলটি ব্যবহার করে তবে একটি পাক দিয়ে। অন্য সমাধানগুলি সমস্ত 8 টি প্রতিসাম্যগুলি পরিষ্কারভাবে তৈরি করেছে, তারপরে মূলটির উপস্থিতির সংখ্যা গণনা করেছে, এই প্রোগ্রামটি পাইথের .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

5

05 এ বি 1 ই , 13 বাইট

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

ব্যাখ্যা

মার্টিন তার সিজেএম উত্তরে দক্ষতার সাথে ব্যাখ্যা করা পদ্ধতিটি ব্যবহার করেন ।

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

পার্ল, 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

ব্র্যাচল্যাগ , 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

টিএসকিউএল, 229 বাইট

সচেতন থাকুন ঘোরার জন্য টিএসকিউএলের কোনও বিল্ড-ইন নেই, তাই এটি কোডের অন্তর্ভুক্ত।

Golfed:

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

পাইথন 2, 154 146 বাইট

প্রয়োজনীয় ট্রান্সফরমেশনগুলির কোনওটি আঙ্কুল অ্যারে ব্যবহার করে মূলের সমান কিনা তা পরীক্ষা করে। চারটি স্ট্রিংয়ের তালিকা হিসাবে ইনপুট নেওয়া হয়।

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()]
সাইওস

কুইস ধন্যবাদ আমি কীভাবে তা মিস করেছি missed
mbomb007

anyএকটি জেনারেটর এক্সপ্রেশন নেয়, তাই আপনি স্কয়ার বন্ধনীগুলির বাইরের জোড়া ফেলে রেখে কয়েকটি বাইট সংরক্ষণ করতে পারেন।
দি বাইকিংভিকিং

@ দ্য বাইকিংভিাইকিং আমি ইতিমধ্যে এটি চেষ্টা করেছিলাম। আপনি যদি কোনও জেনারেটর পাস করেন, তবে এটি কোনও জেনারেটর ফিরিয়ে দেয়, printবিবৃতিটি কার্যকর না করে। আমার অনলাইন কোডটি কাঁটাচামচ করে দেখার চেষ্টা করুন running
mbomb007

আহ, ঠিক আছে. আমি বুঝতে পারি নি যে এটি ভেঙে যাবে print
দ্য বাইকিংভিকিং

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প্রাসঙ্গিক হিসাবে তালিকার মাধ্যমে ইনপুট নেয় এমন একটি ফাংশন ।

এটি @ মার্টিনএেন্ডারের উত্তর হিসাবে একই পদ্ধতির ব্যবহার করে ।

কিভাবে এটা কাজ করে

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

আইডিয়নে চেষ্টা করে দেখুন


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"ফর্ম্যাটে ইনপুট ) তবে এটি আমার ১৯৯ বাইট নিয়ে গেছে:

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.