HexaGolf: Rotatagons

15

Ver también: Wordagons

Desafío

Dado un hexágono y un número ncomo entrada, genera el mismo hexágono rotado nveces.

Hexágono

El hexágono será una cadena así:

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

El hexágono siempre será regular y solo contendrá los caracteres ASCII imprimibles:

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

Rotación

Para saber cuánto girar el hexágono, multiplique npor 60 grados para obtener el ángulo de rotación. Por ejemplo, usando el hexágono anterior, si nes 2, multiplicamos eso por 60 para obtener 120 grados. Luego, rotamos el hexágono 120 grados:

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

Tenga en cuenta que cada lado se ha movido dos lados en sentido horario.

Si nes positivo, debe girar el hexágono en sentido horario. Si nes negativo, debe girar el hexágono en sentido antihorario.

n siempre será un número entero en el rango de -6 a 6 inclusive.

Ejemplos

Entrada:

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

n = 3

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

Entrada:

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

n = -1

Salida:

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

Entrada:

   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

Salida:

   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

Victorioso

El programa más corto en bytes gana.

Decaimiento Beta
fuente
2
¿Qué tienes contra los triángulos? : P
Conor O'Brien
44
@ ConorO'Brien ¿No has visto lo peligrosos que son sus puntos? ;)
Beta Decay
¿Podemos tomar la entrada como una lista de líneas? ¿Podemos suponer que la entrada está rellena con espacio?
Lynn
1
Muy relacionado: codegolf.stackexchange.com/q/51964/15599
Level River St
1
Perdí unos minutos tratando de ser inteligente con CSS ' transform:rotate(x). Resulta que no era una idea brillante, ¿quién lo hubiera sabido?
Aaron

Respuestas:

1

Perl, 120 119 113 107 104 102 bytes

Incluye +6 para -0pXi

Corre con el hexágono en STDIN (rellenado con espacios para que todas las líneas tengan la misma longitud) y el número de rotaciones después de -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

Finalmente conseguí que la matriz de rotación fuera más corta que el viejo doble bucle

Ton Hospel
fuente
Tuve que agregar las banderas ay npara que esto funcione.
Neil
1
@Neil Eso solo es necesario en versiones antiguas de Perl. En perls recientes -Fimplica -ay -aa su vez implica-n
Ton Hospel
14

Python 2, 160 158 156 148 124 bytes

¡Prepárate para sorprenderte! El texto resultante se dibuja en un lienzo ... por aTurtle! :RE

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

Pruébelo en línea : ¡también admite rotaciones decimales!


Si prefiere que la tortuga tenga la forma de una, puede agregar la línea t.shape("turtle").

Ver el historial de revisiones para ver versiones anteriores.

Alias ​​utilizados :

up() - penup()

rt() - right()

lt() - left()

fd() - forward()

bk() - backward()

¡Gracias a Sherlock9 por las sugerencias !

mbomb007
fuente
2
¡7 más hasta vencer a Python estándar!
Rɪᴋᴇʀ
@EasterlyIrk si solo t.write('\n')funcionara ...
mbomb007
@EasterlyIrk Si pudiera eliminar t.up(), estaría allí.
mbomb007
¡Felicidades! ¡Estás superando a Python normal!
Rɪᴋᴇʀ
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)

Ejemplo:

% 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
fuente
@ mbomb007 Eso no funcionará debido al orden de las operaciones, las restas sucederán antes del cambio de bits.
FryAmTheEggman
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

Originalmente basado en mi respuesta a Rotar un mosaico de diamantes, aunque ahora podría reescribir esa respuesta en la línea de esta respuesta.

Neil
fuente