HexaGolf: Rotatagons

15

2

See also: Wordagons

Challenge

Given a hexagon and a number n as input, output the same hexagon rotated n times.

Hexagon

The hexagon will be a string like so:

  a b c
 d d e e
f f o g g
 h h i i
  j k l

The hexagon will always be regular and will only ever contain the printable ASCII characters:

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

Rotation

To find how much to rotate the hexagon by, multiply n by 60 degrees to get the angle of rotation. For example, using the above hexagon, if n is 2, we multiply that by 60 to get 120 degrees. Then, we rotate the hexagon by 120 degrees:

  j h f
 k h f d
l i o d a
 i g e b
  g e c

Note that each side has moved two sides clockwise.

If n is positive, you should rotate the hexagon clockwise. If n is negative, you should rotate the hexagon anticlockwise.

n will always be an integer in the range -6 to 6 inclusive.

Examples

Input:

  . u .
 .  |  .
l - + - r
 .  |  .
  . d .

n = 3

  . d .
 .  |  .
r - + - l
 .  |  .
  . u .

Input:

  - - -
 /     \
<       >
 \     /
  - - -

n = -1

Output:

  - \ >
 -     /
-       -
 /     -
  < \ -

Input:

   h e x a
  g o n s a
 n d t r i a
n g l e s m a
 k e m e s a
  d l y m a
   d d e r

n = 6

Output:

   h e x a
  g o n s a
 n d t r i a
n g l e s m a
 k e m e s a
  d l y m a
   d d e r

Winning

The shortest program in bytes wins.

Beta Decay

Posted 2016-09-06T22:57:37.023

Reputation: 21 478

2What do you have against triangles? :P – Conor O'Brien – 2016-09-06T23:08:59.347

4@ConorO'Brien Haven't you seen how dangerous their points are? ;) – Beta Decay – 2016-09-06T23:11:42.817

Can we take input as a list of lines? Can we assume input is space-padded? – Lynn – 2016-09-06T23:36:51.703

@Lynn Yep, a list of lines is fine and it will be padded – Beta Decay – 2016-09-06T23:40:42.027

1

Very closely related: http://codegolf.stackexchange.com/q/51964/15599

– Level River St – 2016-09-06T23:43:37.987

@LevelRiverSt This challenge does support negative integers though – Beta Decay – 2016-09-06T23:53:16.873

Well, you can just repeat the code n%6 times. – Lynn – 2016-09-07T00:20:09.617

1I lost a few minutes trying to be a smartass with CSS' transform:rotate(x). Turns out that wasn't a bright idea, who would have known? – Aaron – 2016-09-07T14:28:35.583

I know you have space in your possible character list, but do we really need to support characters that are the same as the background character ? Having to use coordinates makes all my solutions a lot longer – Ton Hospel – 2016-09-08T12:21:17.657

@TonHospel Yes, you need to support hexagons like this and this

– Beta Decay – 2016-09-08T13:00:11.760

@BetaDecay Would I be allowed to remove t.up() in my program? It leaves extra "pen lines" on the canvas where the turtle moves. – mbomb007 – 2016-09-09T15:13:02.723

@mbomb007 Hm, sorry, but since it's an ascii art challenge, no – Beta Decay – 2016-09-09T15:14:53.953

Answers

1

Perl, 120 119 113 107 104 102 bytes

Includes +6 for -0pXi

Run with the hexagon on STDIN (padded with spaces so all lines have the same length) and the number of rotations after -i.

perl -0pXi1 rotagon.pl 
  a b c
 d d e e
f f o g g
 h h i i
  j k l
^D

rotagon.pl

s!(.)!$X=(3*($w=y/
//*2)/4+($-="@-"/$w)-"@+"%$w)/2*--$w+2*$--.25;/^\C{$X}(.)/;$1!eg while$^I--%6

Finally got the rotation matrix to be shorter than the old double loop

Ton Hospel

Posted 2016-09-06T22:57:37.023

Reputation: 14 114

I had to add the a and n flags to get this to work. – Neil – 2016-09-08T19:02:23.357

1@Neil That is only needed on old perl versions. In recent perls -F implies -a and -a in turn implies -n – Ton Hospel – 2016-09-08T20:29:03.273

14

Python 2, 160 158 156 148 124 bytes

Prepare to be amazed! The resulting text is drawn on a canvas... by a Turtle! :D

from turtle import*
h,n=input()
up()
rt(n*60)
l=0
for c in h:
 write(c);fd(9);l-=1
 if" ">c:fd(9*l);rt(90);fd(15);lt(90);l=0

Try it online - Supports decimal rotations as well!


If you would prefer the turtle to be shaped like one, you can add the line t.shape("turtle").

View the revision history to see past versions.

Aliases used:

up() - penup()

rt() - right()

lt() - left()

fd() - forward()

bk() - backward()

Thanks to Sherlock9 for the suggestions!

mbomb007

Posted 2016-09-06T22:57:37.023

Reputation: 21 944

27 more until you beat standard python! – Rɪᴋᴇʀ – 2016-09-08T20:40:47.730

@EasterlyIrk If only t.write('\n') worked... – mbomb007 – 2016-09-09T14:42:36.937

@EasterlyIrk If I could remove t.up(), I'd be there. – mbomb007 – 2016-09-09T15:15:01.307

Congrats! You are beating normal python! – Rɪᴋᴇʀ – 2016-09-09T22:17:36.307

6

Python 2.7, 151 bytes

h,n=input()
s=1-len(h)
e=enumerate
exec n%6*"h=[''.join(c>' 'and h[y-x-3*s/2>>1][x*2+y*6+s>>2]or c for x,c in e(l))for y,l in e(h)];"
print'\n'.join(h)

Example:

% python2.7 hexarot.py <<<'[["   h e x a   ","  g o n s a  "," n d t r i a ","n g l e s m a", " k e m e s a ","  d l y m a  ","   d d e r   "],-1]'
   a a a a   
  x s i m a  
 e n r s s a 
h o t e e m r
 g d l m y e 
  n g e l d  
   n k d d

Lynn

Posted 2016-09-06T22:57:37.023

Reputation: 55 648

@mbomb007 That won't work because of the order of operations, the subtractions will happen before the bitshift. – FryAmTheEggman – 2016-09-08T20:39:59.733

1

JavaScript (ES6), 130 127 bytes

f=(s,n)=>n%6?f(s.split`
`.map((s,i,a)=>s.replace(/./g,(c,j)=>(a[(i+z-j)/2+z]||c)[(i+j-z)/2+i]||c,z=a.length>>1)).join`
`,n-1):s

Originally based on my answer to Rotate a diamond tiling although I might now be able to rewrite that answer along the lines of this answer.

Neil

Posted 2016-09-06T22:57:37.023

Reputation: 95 035