Diamondize algum texto

20

Dada uma sequência de entrada de comprimento 2ou mais, consistindo apenas de caracteres alfabéticos [A-Z]ou [a-z](sua escolha, se todas estiverem em maiúsculas ou minúsculas), imprima uma sequência contínua de caracteres formando um padrão de diamante duplo.

A sequência de entrada começa na linha central e se estende para baixo e para a direita na diagonal até o final da sequência de entrada. Então, o padrão continua na diagonal para cima e para a direita até que você esteja tão acima da linha central quanto o comprimento da string de entrada menos 1. Continue abaixo e à direita de volta à linha central e, em seguida, abaixo e esquerda, depois para cima e para a esquerda (indo "para trás" do personagem central) e, finalmente, para baixo e para a esquerda de volta para o personagem inicial.

Isso é um pouco prolixo e é melhor demonstrado por alguns exemplos:

"YOU"
  U   Y
 Y O U O
Y   O   U
 O Y U Y
  U   O

  ^   ^
 ↙ ↖ ↗ ↘
↘   ↗   >
 ↘ ↗ ↖ ↙
  V   V

Veja como YOUcomeça na linha central e segue para baixo e para a direita, depois para cima e para a direita etc., até voltar ao início. Observe especialmente como a Yparte superior e esquerda está "atrás" do Oe, portanto, não é mostrada.

Alguns exemplos adicionais:

"HI"
 I I
H H H
 I I

"TEST"
   E     E
  S T   T S
 T   T T   T
T     S     T
 E   E E   E
  S T   T S
   T     T

"HELLO"
    L       L
   O L     E L
  H   E   H   O
 E     H O     H
H       L       E
 E     L L     L
  L   E   L   L
   L H     E O
    O       H

  • A entrada e a saída podem ser fornecidas por qualquer método conveniente .
  • É garantido que a entrada tenha pelo menos duas letras (ou seja, você nunca receberá ""como entrada).
  • Você pode imprimi-lo em STDOUT ou retorná-lo como resultado de uma função.
  • Um programa completo ou uma função são aceitáveis.
  • Qualquer quantidade de espaço em branco estranho é aceitável, desde que os caracteres sejam alinhados adequadamente (por exemplo, fique à vontade para preencher como um retângulo).
  • As brechas padrão são proibidas.
  • Isso é portanto todas as regras usuais de golfe se aplicam e o código mais curto (em bytes) vence.
AdmBorkBork
fonte
Não tenho certeza se isso realmente importa, mas por que o segundo passe (acima, à esquerda) fica atrás do primeiro passe (acima, à direita)? Faz menos sentido intuitivo e também um pouco irritante para pular ou redesenhar essa letra.
BradC
2
@BradC Eu estava tocando com uma faixa de Möbius na minha mesa quando tive o desafio, e a faixa meio que ficou "para trás", e é por isso. Nenhuma outra razão.
AdmBorkBork
Pode ser uma idéia incluir um "desenho" do caminho usando caracteres de seta, para nos ajudar a visualizá-lo.
Shaggy
@Shaggy Adicionado um desenho.
AdmBorkBork
Bom, este é mais desafiador do que o primeiro olhar ..
booshlinux

Respostas:

10

Carvão , 17 bytes

GH<↗↘>↖↙LθθGH<Lθθ

Experimente online! Link é a versão detalhada do código. Explicação:

GH

Desenhe ao longo de um caminho.

<↗↘>↖↙

Desenhe nas direções ↘↗↗↘↙↖↖↙ (a < e >são taquigrafia para esses dois pares, mas os outros pares não têm taquigrafia).

Lθ

Cada segmento de caminho tem o mesmo comprimento, incluindo as extremidades, do comprimento da entrada.

θ

Use a entrada como o texto a ser escrito ao longo do caminho.

GH<Lθθ

Imprima as duas primeiras partes do caminho novamente para que o caractere do meio esteja correto.

Neil
fonte
3
Este desafio parece feito sob medida para Charcoal
Jonah
@ Jonah Infelizmente, o comando do caminho de texto não desenha o último caractere se o caminho estiver fechado, então você não pode usar o truque de desenho reverso aqui. (Embora, se o fizesse, seria a mesma contagem de bytes, já que girar a string custa 6 bytes.)
Neil
9

05AB1E , 12 bytes

gIR7._•Íη•Λ

Experimente online!

           Λ    use the canvas function
g               with the length of input for each segment
 IR7._          the input reversed and rotated left by 7 characters (we will draw this backwards to have the right center character)
      •Íη•     and the directions 1, 3, 3, 1, 7, 5, 5, 7 as a compressed number. 
Dorian
fonte
Você quis dizer 1, 3, 3, 1, 7, 5, 5, 7?
Neil
Oh, você está certo. Eu misturei os números um pouco
Dorian
6

JavaScript (ES6),  157155  154 bytes

Retorna uma matriz de caracteres.

s=>(y=n=s.length,y+=i=X=Y=-1,m=[...Array(y+n)].map(_=>r=Array(4*n-3).fill` `),g=x=>x?g(x-=r[m[y][++i==6*n-6||+x]=s[i%n],y-=m[y-Y]?Y:Y=-Y,x-X]?X:X=-X):m)``

Experimente online!

Quão?

nw×h

  • w=4n3
  • h=2n1

(0,n1) e indo para o sudeste, até que retorne à sua posição inicial.

O índice baseado em 0 do caractere central que deve ser ignorado na forma de diamante é:

p=6n6

n=4

insira a descrição da imagem aqui

Comentado

s => (                           // s = input string
  y = n = s.length,              // n = length of s
  y += i = X = Y = -1,           // y = n - 1; i = X = Y = -1
  m =                            // create a matrix m[]:
    [...Array(y + n)].map(_ =>   //   - of height 2n-1
      r = Array(4 * n - 3)       //   - of width 4n-3 (save one of these rows in r[])
          .fill` `               //   - initially filled with spaces
    ),                           //
    g = x =>                     // g is a recursive function taking x
      x ?                        //   if x is truthy:
        g(                       //     do a recursive call:
          x -= r[                //       update x:
            m[y][                //         update m[y][x]:
              ++i == 6 * n - 6   //           unless this is the 2nd pass through the
              || +x              //           center cell, set it to the next character
            ] = s[i % n],        //           in s (otherwise we write to m[y][true]
                                 //           instead, which has no effect)
            y -=                 //         update y:
              m[y - Y] ? Y       //           bounce vertically if m[y - Y] is undefined
                       : Y = -Y, //
            x - X                //         bounce horizontally
          ] ? X                  //         if r[x - X] is undefined
            : X = -X             //
        )                        //     end of recursive call
      :                          //   else:
        m                        //     stop recursion and return m[]
)``                              // initial call to g with x = [''] (zero-ish but truthy)
Arnauld
fonte
Eu tenho uma solução de 136 bytes inspirada em sua solução, embora eu ache que agora seja diferente o suficiente para se qualificar como uma resposta separada.
Neil
@ Neil Você provavelmente deve publicá-lo como uma nova resposta.
Arnauld
3

JavaScript (ES6), 136 bytes

f=
(s,l=s.length-1,z=l*4,a=[...Array(l-~l)].map(_=>Array(z+1).fill` `),g=x=>x--?g(x,a[a[y=(x+l)%z]?y:z-y][x>z?z+z-x:x]=s[x%-~l]):a)=>g(z+z)
<input oninput=o.textContent=f(this.value).map(c=&gt;c.join``).join`\n`><pre id=o>

Retorna uma matriz bidimensional. Funciona desenhando a string na matriz, computando diretamente as coordenadas de destino, trabalhando de trás para frente, para que a célula central seja substituída automaticamente. Explicação:

(s

String de entrada.

,l=s.length-1

Distância entre "devoluções", também metade do índice da última linha e um a menos que o comprimento.

,z=l*4

Índice da última coluna, também metade do comprimento do texto a ser desenhado.

,a=[...Array(l-~l)].map(_=>Array(z+1).fill` `)

Matriz de espaços.

,g=x=>x--

Contagem regressiva da última célula para a primeira.

  ?g(x

Chamada recursiva para processar as células restantes.

    ,a[a[y=(x+l)%z]?y:z-y]

Calcule a linha desta célula.

      [x>z?z+z-x:x]=s[x%-~l])

Calcule a coluna desta célula e o caractere que pertence a ela.

  :a

Conclua retornando a matriz.

)=>g(z+z)

Comece no final do texto.

Neil
fonte
Que bom, +1
Ver Nick diz Reinstate Monica
2

J , 79 77 75 bytes

(|.@$~8*])`([:;/(1,~<:@])+/\@,(_2{&1 _1\#:33495)}.@#~])`(' '$~1+2 4*])}<:@#

Experimente online!

Jonah
fonte
1

C (tinido) , 201 196 188 bytes

x,y,i,v,m,n;f(s,z){char*a=s,o[i=(y=z*2-1)*(x=y+y)];for(v=x*2-2;i;n=m=1)o[--i]=i%x?32:10;for(i=x*--z;v--;i+=x*m+n)o[i]==32?o[i]=*a:0,a=*++a?a:s,n=i%x>x-3?-1:n,m=i/x?i/x<y-1?m:-1:1;puts(o);}

Experimente online!

-13 sugestões @ceilingcat

AZTECCO
fonte
0

Python 2 , 137 bytes

s=input();n=len(s);m=2*n-2
for r in range(m+1):print''.join([s[[x,-8-x][(x<=m)==(m>2*r)]%n],' '][r!=(x+1-n)%m!=m-r]for x in range(4*n-3))

Experimente online!

Um programa completo que recebe uma string como entrada e imprime a versão em diamante.

Chas Brown
fonte