6
\$\begingroup\$

In this challenge, your task is to input a rectangle ASCII pattern (You may assume only printable characters need to be handled, and you may assume a trailing newline or not), C4_4 symmetrify, and output it.

Here, C4_4 symmetric means symmetric under 90-degree rotation around a corner of the corner character. The corresponding "symmetrify" process is copy and rotate 90-degree clockwise three times, and then put all four copies together. For the precise arrangement, you can look at Test Cases.

Test Cases

Input:
asdf
jkl;

Output:
    ja
    ks
asdfld
jkl;;f
  f;;lkj
  dlfdsa
  sk
  aj


Input:
.O.
..O
OOO

Output:
.O.O..
..OO.O
OOOOO.
.OOOOO
O.OO..
..O.O.


Input:
gc
oo
ld
fe

Output:
  gc    
  oo    
  ldflog
  feedoc
codeef  
golfdl  
    oo  
    cg  

\$\endgroup\$
  • 5
    \$\begingroup\$ I'd suggest to add a test case where the height of the input is strictly greater than its width. \$\endgroup\$ – Arnauld Oct 4 at 13:12
  • \$\begingroup\$ Hmm... emoticons? 4_4 \$\endgroup\$ – JL2210 Oct 5 at 14:51
7
\$\begingroup\$

Charcoal, 6 bytes

A⟲C²⁴⁶

Try it online! Link is to verbose version of code. Explanation: implicitly prints the input, performs the rotation, signifies to keep copies, and ²⁴⁶ represents the numbers of 45-degree rotations to make. (Charcoal defaults to rotating around the bottom-right corner as desired.)

\$\endgroup\$
  • \$\begingroup\$ Yet another fastest gun! Yeah, Charcoal is very suitable for this challenge. Have a +1! \$\endgroup\$ – HighlyRadioactive Oct 4 at 12:39
4
\$\begingroup\$

Python 3, 193 bytes

def f(s):q=len(s[0])-len(s);s=[[" "]*len(s[0])]*q+s;s=[[" "]*-q+l for l in s];j=lambda a,b:[x+y for x,y in zip(a,b)];r=lambda x:[*map(list,zip(*x[::-1]))];return j(s,r(s))+j(r(r(r(s))),r(r(s)))

Try it online!

\$\endgroup\$
  • 1
    \$\begingroup\$ I was not expecting this to happen. Nice work! \$\endgroup\$ – HighlyRadioactive Oct 4 at 13:06
3
\$\begingroup\$

J, 38 bytes

(,|."1@|.)@(,.|:@|.)@((2$_1*>./)@${.])

Try it online!

No doubt it can be golfed much further.

\$\endgroup\$
3
\$\begingroup\$

JavaScript (ES6),  178  173 bytes

Takes input as an array of strings. Returns a string.

m=>(g=x=>~y?(Y=y<w?y:W-y,X=x<w?x:W-x,Z=y<w^x<w?Y:X,(m[Z-z*d]||0)[(X^Y^Z)+!z*d]||' ')+[`
`[x-W]]+g(x<W?x+1:!y--):'')(0,w=m[0].length,h=m.length,d=w-h,(z=d>0)?0:w=h,y=W=w*2-1)

Try it online!

\$\endgroup\$
2
\$\begingroup\$

Red, 217 bytes

func[a][n: max(l: length? a)length? a/1
p: copy""insert/dup p" "n
loop n - l[insert a copy p]forall a[pad/left a/1 n]repeat y n[repeat x n[append
a/:y a/(n - x + 1)/:y]]repeat y n[append a reverse copy a/(n - y + 1)]]

Try it online!

Returns a list of strings

\$\endgroup\$
  • 1
    \$\begingroup\$ pad, append, reverse! This is plain English. I like it. \$\endgroup\$ – HighlyRadioactive Oct 5 at 11:37
  • \$\begingroup\$ @TwilightSparkle Thanks! I like it too :) \$\endgroup\$ – Galen Ivanov Oct 5 at 11:51
  • \$\begingroup\$ I'm curious why Red uses [] unlike lisp. \$\endgroup\$ – HighlyRadioactive Oct 5 at 12:01
  • \$\begingroup\$ @TwilightSparkle I don't know.. [] is a block (list), () is used for grouping \$\endgroup\$ – Galen Ivanov Oct 5 at 12:04
  • 1
    \$\begingroup\$ Thanks for your explanation. I think I will probably get deeper into this language, maybe. \$\endgroup\$ – HighlyRadioactive Oct 6 at 1:37
1
\$\begingroup\$

Icon, 255 206 bytes

procedure f(a)
n:=*a;n<:=t:=*a[1]
1to n-*a&push(a,repl(" ",t))&\z
(!a)[1:1]:=repl(" ",n-t)&\z
i:=1to n&j:=1to n&a[i]||:=a[n-j+1,i]&\z
i:=1to n&put(a,"")&j:=1to 2*n&a[n+i]||:=a[n-i+1,2*n-j+1]&\z
return a
end

Try it online!

\$\endgroup\$
  • 1
    \$\begingroup\$ No Red answer? :P \$\endgroup\$ – HighlyRadioactive Oct 5 at 9:56
  • \$\begingroup\$ @TwilightSparkle Maybe I'll write one :) \$\endgroup\$ – Galen Ivanov Oct 5 at 11:06
  • \$\begingroup\$ I'm waiting for it then LOL \$\endgroup\$ – HighlyRadioactive Oct 5 at 11:07
1
\$\begingroup\$

Python 3, 140 bytes

def f(a):l=len(a[0]);k=len(a)-l;b=[k*' '+i for i in-k*[l*' ']+a];b+=[*map(''.join,zip(*b))][::-1];return[i+j[::-1]for i,j in zip(b,b[::-1])]

Try it online!

Expects and returns a list of lines.

Explanation

def f(a):
 l=len(a[0]);k=len(a)-l;                     # Extract dimensions
 b=[k*' '+i for i in-k*[l*' ']+a];           # Make it square
 b+=[*map(''.join,zip(*b))][::-1];           # Construct left half of the output
 return[i+j[::-1]for i,j in zip(b,b[::-1])]  # Construct the right half and return
\$\endgroup\$
  • \$\begingroup\$ A nice approach! \$\endgroup\$ – HighlyRadioactive Oct 10 at 10:16

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.