HexaGolf: Rotatagons

15

Veja também: Wordagons

Desafio

Dado um hexágono e um número ncomo entrada, produza os mesmos ntempos de rotação do hexágono .

Hexágono

O hexágono será uma string assim:

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

O hexágono sempre será regular e sempre conterá apenas os caracteres ASCII imprimíveis:

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

Rotação

Para descobrir quanto girar o hexágono, multiplique npor 60 graus para obter o ângulo de rotação. Por exemplo, usando o hexágono acima, se nfor 2, multiplicamos por 60 para obter 120 graus. Em seguida, giramos o hexágono em 120 graus:

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

Observe que cada lado se moveu dois lados no sentido horário.

Se nfor positivo, você deve girar o hexágono no sentido horário. Se nfor negativo, você deve girar o hexágono no sentido anti-horário.

n sempre será um número inteiro no intervalo de -6 a 6, inclusive.

Exemplos

Entrada:

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

n = 3

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

Entrada:

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

n = -1

Resultado:

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

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

Resultado:

   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

Ganhando

O programa mais curto em bytes vence.

Beta Decay
fonte
2
O que você tem contra triângulos? : P
Conor O'Brien
4
@ ConorO'Brien Você não viu como os pontos deles são perigosos? ;)
Decay Beta
Podemos considerar a entrada como uma lista de linhas? Podemos assumir que a entrada é preenchida com espaço?
Lynn
1
Muito estreitamente relacionado: codegolf.stackexchange.com/q/51964/15599
Level River St
1
Perdi alguns minutos tentando ser um espertinho com CSS ' transform:rotate(x). Acontece que não era uma ideia brilhante, quem saberia?
Aaron

Respostas:

1

Perl, 120 119 113 107 104 102 bytes

Inclui +6 para -0pXi

Corra com o hexágono no STDIN (preenchido com espaços para que todas as linhas tenham o mesmo comprimento) e o número de rotações após -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, a matriz de rotação é mais curta que o antigo loop duplo

Ton Hospel
fonte
Eu tive que adicionar as bandeiras ae npara que isso funcionasse.
Neil
1
@ Neil Isso é necessário apenas nas versões antigas do Perl. Em perls recentes -Fimplica -ae -apor sua vez implica-n
Ton Hospel
14

Python 2, 160 158 156 148 124 bytes

Prepare-se para se surpreender! O texto resultante é desenhado em uma tela ... por aTurtle! : 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

Experimente online - Também suporta rotações decimais!


Se você preferir que a tartaruga tenha o formato de uma, você pode adicionar a linha t.shape("turtle").

Veja o histórico de revisões para ver versões anteriores.

Aliases usados :

up() - penup()

rt() - right()

lt() - left()

fd() - forward()

bk() - backward()

Obrigado a Sherlock9 pelas sugestões !

mbomb007
fonte
2
Mais 7 até vencer o python padrão!
Rɪᴋᴇʀ
@EasterlyIrk Se apenas t.write('\n')trabalhou ...
mbomb007
@EasterlyIrk Se eu pudesse remover t.up(), eu estaria lá.
mbomb007
Parabéns! Você está vencendo o 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)

Exemplo:

% 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
fonte
@ mbomb007 Isso não funcionará por causa da ordem das operações, as subtrações ocorrerão antes do deslocamento de bits.
FryAmTheEggman # 8/16
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, com base na minha resposta para Girar um ladrilho de diamante, embora agora eu possa reescrevê-la de acordo com as linhas desta resposta.

Neil
fonte