Desenhar linhas diagonais do texto

46

Dada a entrada de uma lista de palavras, imprima as palavras com suas letras dispostas na diagonal:

p
 r
  o
p  g
 u  r
  z  a
a  z  m
 n  l  m
  d  e  i
c     s  n
 o        g
  d
g  e
 o
  l
   f

(A descrição acima deve ser a saída da entrada programming puzzles and code golf.)

Para ser mais preciso, cada palavra começa na primeira coluna e três linhas abaixo da palavra anterior, e cada letra sucessiva move uma coluna para a direita e uma linha para baixo.

A entrada pode ser fornecida como uma única sequência de palavras, separada por exatamente um espaço, ou como uma lista / matriz de palavras. As palavras serão compostas apenas por letras minúsculas a-z, e sempre terão pelo menos um caractere.

A saída pode ser uma única sequência, uma matriz de linhas ou uma matriz de matrizes de caracteres. O espaço em branco à esquerda ou à direita não é permitido, exceto por uma única nova linha à direita.

Mais casos de teste:

a bcd efgh i j

a


b
 c
  d
e
 f
  g
i  h


j

x

x

verylongword short

v
 e
  r
s  y
 h  l
  o  o
   r  n
    t  g
        w
         o
          r
           d

Como esse é o , o código mais curto em bytes vencerá!

Maçaneta da porta
fonte
Eu sinto que deveria ser capaz de criar um programa Python para isso em 5 minutos, mas sempre parece estar falhando ...; _;
HyperNeutrino
Uau, parece que existem muitos desafios aparentemente projetados para Turtlèd
Destructible Lemon
Os códigos de escape dos terminais são permitidos? :)
Chromium

Respostas:

17

Vim, 85, 76, 66 , 52 pressionamentos de tecla / bytes

Quando olhei pela primeira vez para esse desafio, pensei "Isso é perfeito para o vim!" E então, quando eu tentei, tudo deu errado. Aqui está, em toda a sua glória bagunçada:

:se ve=all|s/ /\r\r\r/g
qqGo<esc>?\<.\S
lDjP@qq@qG?.
jdG

Experimente online, graças ao intérprete V (compatível com versões anteriores).

Explicação:

No começo, pensei que poderia fazer essa versão lindamente simples de 37 bytes:

:se ve=all
qq:g/\S\S/norm ^lDjP
@qq@q

Infelizmente, não é assim tão simples. Vamos levá-lo linha por linha:

:se ve=all

Isso habilita um recurso chamado 'edição virtual'. Permite que o cursor se mova para colunas que ainda não existem. Essa resposta seria basicamente impossível sem ela.

Agora precisamos separar as palavras em linhas diferentes. Então, substituiremos cada espaço por 3 novas linhas. Como esse é um comando ex, podemos executá-lo simultaneamente com nosso último comando ex :se ve=all, separando os dois com uma barra.

|s/ /\r\r\r/g

Agora o buffer fica assim:

Programming


Puzzles


and


code-golf

Aqui é onde a diversão começa. Configuramos a macro recursiva tradicional com: qqe, em seguida, chamamos isso:

G               " Move to the last line
 o<esc>         " Append an extra newline

?               " Search backwards for
 \<.            " Any character at the beginning of a word
    \S          " Followed by a non-space character
l               " Move one character to the right
 D              " Delete eveything until the end of this line
  j             " Move down one line
   P            " Paste what we just deleted

Em seguida, finalizamos a macro recursiva com @qq@q. Neste ponto, temos todas as diagonais, só precisamos fazer um pouco de limpeza.

G                   " Move to the last line
 ?.                 " Search backwards for any character
j                   " Move down one line
 dG                 " Delete until the end of the buffer
DJMcMayhem
fonte
Uau, o JavaScript é (atualmente) mais curto que o Vim. Isso é uma ocorrência rara nos dias de hoje ...
ETHproductions
@ETHproductions Não existe mais. :)
DJMcMayhem
6

Turtlèd , 28 26 bytes

Oh, parece que estou batendo em um idioma projetado especificamente para jogar golfe. Este é um grande dia.

!_4[*.[ rd+.]ul[ ul]r;_+]_

Experimente online!

Explicação

(escrever significa escrever para a célula na grade, char apontado significa char na entrada que o ponteiro da string aponta)

!                         Take string input into variable
 _                        Normally conditional, with >1 input (there will be), write ' '
  4                       set register to 4
   [*                   ] until the current cell is *
     .                    Write pointed char, initially first char
      [     ]             Until space is written on cell
        rd+.              move right, down, string pointer++, write pointed char
             ul[ ul]      Move back up to the top of the word
                    r;    Move right, down 4 (because this is register value)
                      _+  write * if end of input, else ' ', increment string pointer
                        _ will always write ' ', since it will always point at start char

observe o espaço à direita.

A entrada também precisa de espaço à direita. como o python pode fazer uma lista, é como fazer uma lista em Turtlèd

Limão destrutível
fonte
5

MATL , 28 bytes

c!t&n:q3_*ts_b+5M4$XdZ!cZ{Zv

Input é uma matriz de células, com vírgulas como separadores opcionais:

{'programming' 'puzzles' 'and' 'code' 'golf'}

ou

{'programming', 'puzzles', 'and', 'code', 'golf'}

Experimente online! Ou verifique todos os casos de teste: 1 , 2 , 3 , 4 .

Explicação

Considere a seguinte entrada como um exemplo:

{'aaaa' 'bb' 'ccc'}

Você pode visualizar os resultados parciais (conteúdo da pilha) inserindo o símbolo de comentário %em qualquer ponto do código. Por exemplo, visualize o conteúdo da pilha após a quarta função ( &n).

c        % Input cell array of strings implicitly. Convert to 2D char array,
         % right-padding with spaces
         % STACK: ['aaaa'; 'bb  '; 'ccc']
!        % Transpose
         % STACK: ['abc'
                   'abc'
                   'a c'
                   'a  ']
t        % Duplicate
         % STACK: ['abc'
                   'abc'
                   'a c'
                   'a  '],
                  ['abc'
                   'abc'
                   'a c'
                   'a  '],
&n       % Number of rows and of columns
         % STACK: ['abc'
                   'abc'
                   'a c'
                   'a  '], 4, 3
:q       % Range, subtract 1
         % STACK: ['abc'
                   'abc'
                   'a c'
                   'a  '], 4, [0 1 2]
3_*      % Multiply by -3
         % STACK: ['abc'
                   'abc'
                   'a c'
                   'a  '], 4, [0 -3 -6]
ts_      % Duplicate, sum, negate
         % STACK: ['abc'
                   'abc'
                   'a c'
                   'a  '], 4, [0 -3 -6], 9
b        % Bubble up in stack
         % STACK: ['abc'
                   'abc'
                   'a c'
                   'a  '], [0 -3 -6], 9, 4
+        % Add
         % STACK: ['abc'
                   'abc'
                   'a c'
                   'a  '], [0 -3 -6], 13
5M       % Push second input of last function again
         % STACK: ['abc'
                   'abc'
                   'a c'
                   'a  '], [0 -3 -6], 13, 4
4$Xd     % Buld numerical sparse matrix from the above four arguments. The
         % columns of the first input argument will be the diagonals of the
         % result, with indices given bu the second input (negative is below
         % main diagonal). The matrix size is the third and fourth arguments
         % STACK: [97  0  0  0
                    0 97  0  0
                    0  0 97  0
                   98  0  0 97
                    0 98  0  0
                    0  0 32  0
                   99  0  0 32
                    0 99  0  0
                    0  0 99  0
                    0  0  0 32
                    0  0  0  0
                    0  0  0  0
                    0  0  0  0]
Z!c      % Convert from sparse to full, and then to char. Character 0 is
         % displayed as space
         % STACK: ['a   '
                   ' a  '
                   '  a '
                   'b  a'
                   ' b  '
                   '    '
                   'c   '
                   ' c  '
                   '  c '
                   '    '
                   '    '
                   '    '
                   '    ']
Z{       % Split into cell array, with each row in a cell
         % STACK: {'a   ', ' a  ', '  a ', 'b  a', ' b  ', '    ', 'c   ', ' c  ', '  c ', '   ', '   ', '   ', '   '}
Zv       % Deblank: remove trailing space from each string. Implicitly display,
         % each string on a different line. Empty strings do not generate
         % a newline
         % STACK: {'a   ', ' a', '  a', 'b  a', ' b', '', 'c', ' c', '  c', '', '', '', ''}
Luis Mendo
fonte
4

JavaScript (ES6), 118 109 84 bytes

Recebe a entrada como uma matriz de palavras. Retorna uma matriz de matrizes de caracteres.

s=>s.map((w,y)=>[...w].map((c,x)=>(a[p=y*3+x]=a[p]||Array(x).fill(' '))[x]=c),a=[])&&a

Versão alternativa, 109 bytes

Retorna uma string.

Arnauld
fonte
2

Lisp comum, 673 668 597 bytes

Solução terrível, eu sei. Provavelmente vou editar isso mais depois de dormir.

(defun f(&rest z)(let((l)(a 0)(s)(o)(b)(c 0))(loop(setf b(length l))(setf l"")(loop for w in z for i from 0 do(if(>(+(length w)(* i 3))c)(setf c(+(length w)(* i 3))))(setf s(+(* i -3)a))(when(and(>= s 0)(< s(length w)))(setf o(format nil"~v@{~a~:*~}"s" "))(if(and(>=(- s 3)0)(not(equal i(-(length z)1))))(setf o(subseq o(- s 2))))(setf l(concatenate'string o(string(char w s))l)))(when(>= s(length w))(setf l(concatenate'string"   "l))))(if(<=(length l)b)(setf l(concatenate'string(format nil"~v@{~a~:*~}"(- b(length l)-1)" ")l)))(print(string-right-trim" "l))(if(>= b c)(return))(setf a(1+ a)))))

Uso:

* (f "ppcg" "is" "pretty" "ok")

"p" 
" p" 
"  c" 
"i  g" 
" s" 
"" 
"p" 
" r" 
"  e" 
"o  t" 
" k  t" 
"     y" 
""
NIL

Isso percorre todas as palavras da lista fornecida e adiciona caracteres apropriados à linha atual. O preenchimento apropriado é fornecido pelo meu uso subpar de format.

Nota: Eu sou novo no Common Lisp, mas sei o suficiente para perceber que isso poderia usar muitas melhorias.

artificialnull
fonte
2
> :( "ppcg ... ok" !?
Destructible Lemon
2

C #, 336 bytes:

Golfe:

string D(string[]s){int x=0,y=0,r=0,q=2*(s.Max().Length+s.Length)+1;var a=new char[q, q];for(int i=0;i<s.Length;i++){y=r;for(int j=0;j<s[i].Length;j++){a[y,x]=s[i][j];x+=1;y+=1;}x=0;r+=3;}var o="";for(x=0;x<q;x++){var t="";for(y=0;y<q;y++)t+=a[x,y];o+=t==string.Join("",Enumerable.Repeat('\0',q))?"":(t.TrimEnd('\0')+"\r\n");}return o;}

Ungolfed:

public string D(string[] s)
{
  int x = 0, y = 0, r = 0, q = 2 * (s.Max().Length + s.Length) + 1;
  var a = new char[q, q];
  for (int i = 0; i < s.Length; i++)
  {
    y = r;
    for (int j = 0; j < s[i].Length; j++)
    {
      a[y, x] = s[i][j];
      x += 1;
      y += 1;
    }
    x = 0;
    r +=3;
  }
  var o = "";
  for (x = 0; x < q; x++)
  {
    var t = "";
    for (y = 0; y < q; y++)
      t += a[x, y];
    o += t == string.Join("", Enumerable.Repeat('\0', q)) ? "" : (t.TrimEnd('\0') + "\r\n");
  }
  return o;
}

Testando:

  var codeGolf = new DrawDiagonalLinesOfText();
  Console.WriteLine(codeGolf.E(new string[] { "programming", "puzzles", "and", "code", "golf" }));
  Console.WriteLine(codeGolf.E(new string[] { "a", "bcd", "efgh", "i", "j" }));
  Console.WriteLine(codeGolf.E(new string[] { "verylongword", "short" }));

p
 r
  o
p  g
 u  r
  z  a
a  z  m
 n  l  m
  d  e  i
c     s  n
 o        g
  d
g  e
 o
  l
   f


a
b
 c
  d
e
 f
  g
i  h
j


v
 e
  r
s  y
 h  l
  o  o
   r  n
    t  g
        w
         o
          r
           d
Pete Arden
fonte
Isso parece gerar um espaço em branco à direita no final das linhas, o que não é permitido pela especificação de desafio. Além disso, exigir cadeias de espaços para separar as palavras na matriz de entrada não é um formato de entrada permitido.
Maçaneta
@Doorknob Opa, desculpe ... fixo, só me custou 2 Bytes :)
Pete Arden
1
Compile para Func<string[], string>s=>{int i=0,x=0,y=0,r=0,l=s.Length,q=2*(s.Max().Length+l)+1,j;var a=new char[q,q];for(;i<l;i++){y=r;for(j=0;j<s[i].Length;)a[y++,x++]=s[i][j++];x=0;r+=3;}var o="";for(;x<q;x++){var t="";for(y=0;y<q;)t+=a[x,y++];o+=t==string.Join("",Enumerable.Repeat('\0',q))?"":(t.TrimEnd('\0')+"\n");}return o;};using System.Linq;
ae
Graças @TheLethalCoder, mas eu realmente não quiser levar a sua solução completa :)
Pete Arden
Não é meu seu seu Eu apenas golfed algumas das coisas afastado ou seja, movendo thwe ie jà declaração int no topo e movendo-se alguns dos ++que eles são utilizados no último uso da variável
TheLethalCoder
2

Python 2, 146 bytes

s=input()
k=max(map(len,s))
a=[k*[' ']for x in range(k+len(s)*3+3)]
for x in range(len(s)):
 for y in range(len(s[x])):a[x*3+y][y]=s[x][y]
print a

Nota: os recuos das duas últimas linhas são <space>e <tab>, o que economiza um byte, pois não preciso recuar duas vezes.

A entrada deve ser inserida como uma matriz de seqüências de caracteres da seguinte forma: ["hello", "world"]ou ['hello', 'world']. Saída é uma matriz de matrizes de caracteres.

Provavelmente existe uma maneira melhor de fazer isso ...

EDIT Agradecimentos à maçaneta da porta por apontar um colchete fechado faltando. Coloquei antes *k...da terceira linha.

HyperNeutrino
fonte
Há um erro de sintaxe no seu código na terceira linha; há dois colchetes abertos, mas apenas um colchete próximo. No entanto, eu o corrigi (adicionando um suporte de fechamento extra ou removendo o suporte de abertura extra), o programa apresenta um erro ao executar.
Maçaneta
Agora, isso parece gerar um espaço em branco à direita no final das linhas e no final da saída, o que não é permitido pela especificação de desafio.
Maçaneta
jogadores triviais
Leaky Nun
@LeakyNun Thanks. Você está apenas jogando golfe todas as minhas respostas? : P
HyperNeutrino
1

Mathematica, 146 bytes

P=PadRight;T=Transpose;R=Riffle;Select[Rest@T@P@MapIndexed[""~Table~#2~Join~#1&,T@P@R[Characters/@#~R~{},{},3]]//.{0->"",{x__,""}->{x}},#!={""}&]&

Estou desapontado com esse número, mas tudo bem.

Define uma função anônima que pega uma lista de palavras (por exemplo {"this","that","these"}) e retorna uma matriz bidimensional de caracteres. Para visualizar em forma de grade, adicione a //Gridno final.

Converte as strings em uma matriz, adiciona linhas extras, transpõe a matriz, precede os turnos necessários e depois transpõe novamente.

Exemplo de resultado (formatado como grade): Resultado de exemplo

DanTheMan
fonte
1

Gelatina , 24 bytes

z⁶j€⁾  µJ’⁶ẋ;"z⁶œr€⁶Yœr⁷

Experimente online!

Quão?

z⁶j€⁾  µJ’⁶ẋ;"z⁶œr€⁶Yœr⁷ - Main link: a list of strings
z                        - transpose with filler...
 ⁶                       -     space character
  j€                     - join €ach with
    ⁾                    -     two spaces
       µ                 - monadic chain separation, call the result x
        J                - range(length(x)) [1,2,...,x]
         ’               - decrement (vectorises) [0,1,...x-1]
           ẋ             - repeat (vectorises)
          ⁶              - a space ['', ' ',...,'x spaces']
             "           - zip with
            ;            - concatenation (prefixes with the space strings)
              z          - transpose with filler...
               ⁶         -     space character
                œr€⁶     - trim spaces from the right of €ach
                    Y    - join with line feeds
                     œr⁷ - trim line feeds from the right
                         - implicit print
Jonathan Allan
fonte
1

Python 2, 182 bytes

def f(s):
 M=max(map(len,s));p=' '*M;L=[p]+s+M*[p];r='';k=0
 while k/M<len(s)*3+M:
  i=k%M;w=k/M-i+1;r+=(L[(w/3+1)*(w%3==1)]+p)[i];k+=1
  if i==M-1:r=r.rstrip()+'\n'
 return r.strip()

Um pouco longo, mas no lado positivo, ele retorna uma sequência sem espaço em branco à direita em cada linha e sem espaço em branco à direita ou retorna no final; restrições que algumas outras entradas não obedecem.

Uma lista de palavras é passada para a função; alguns 'espaços em branco' são adicionados a esta lista e, em seguida, o algoritmo mapeia uma linha, par de colunas para um wordNumber, characterNumber na lista expandida. (Isso é um pouco da inversa da estratégia usual vista em outras soluções).

Se permitirmos o espaço em branco à direita em todas as linhas, exceto a última, podemos melhorar um pouco (163 bytes):

def f(s):
 M=max(map(len,s));p=' '*M;L=[p]+s+M*[p];r='';k=0
 while k/M<len(s)*3+M:i=k%M;w=k/M-i+1;r+=(L[(w/3+1)*(w%3==1)]+p)[i]+'\n'*(i==M-1);k+=1
 return r.strip()
Chas Brown
fonte
1

q / kdb +, 130 109 94 90 86 84 bytes

Solução:

f:{-1(+)a rtrim(til(#)E){raze(x#" "),y,\:"  "}'E:(+)(a:{(max(#:)each x)$x})" "vs x;}

Exemplos:

q)f "programming puzzles and code golf"
p          
 r         
  o        
p  g       
 u  r      
  z  a     
a  z  m    
 n  l  m   
  d  e  i  
c     s  n 
 o        g
  d        
g  e       
 o         
  l        
   f 
q)f "a bcd efgh i j"
a   


b   
 c  
  d 
e   
 f  
  g 
i  h


j  
q)f (),"x"
x
q)f "verylongword short"
v           
 e          
  r         
s  y        
 h  l       
  o  o      
   r  n     
    t  g    
        w   
         o  
          r 
           d

Explicação (não destruída):

A essência básica é criar um monte de strings de comprimento igual a partir da string de entrada, girá-los (girá-los) e adicionar espaços em branco apropriados para obter algo parecido com isto:

"p  p  a  c  g   "
" r  u  n  o  o  "
"  o  z  d  d  l "
"   g  z     e  f"
"    r  l        "
"     a  e       "
"      m  s      "
"       m        "
"        i       "
"         n      "
"          g     "

que é invertido novamente e impresso em stdout.

Aqui está um detalhamento linha a linha do conceito:

A:"programming puzzles and code golf"; // original input
B:" " vs A;                            // split on " "
C:max count each B;                    // find length of the longest string
D:C$B;                                 // pad each string to this length
E:flip D;                              // flip (rotate) string
F:{raze(x#" "),y,\:"  "};              // appends each char with "  " and prepends an increasing number of " "
G:(til count E)F'E;                    // execute function F with each pair of 0..n and item in list E
H:max count each rtrim G;              // find longest string (ignoring right whitespace)
I:H$G;                                 // pad each of the strings to this length
J:flip I;                              // flip to get result
-1 J;                                  // print to stdout, swallow return value

Notas:

Algumas maneiras de eliminar alguns (11) bytes fáceis se realmente quisermos :

  • Pode salvar 2 bytes soltando f:e deixando como uma função anônima
  • Poderia salvar 3 bytes, largando o -1e ;e retornando uma lista de strings em vez de imprimir para stdout
  • Poderia salvar 6 bytes se passássemos em uma lista de cadeias em vez de cadeia separada por espaço

Editar% s:

  • -11 bytes, use rtrimpara encontrar o comprimento máximo a ser preenchido, removendo a necessidade de armazenar Cvariáveis
  • -15 bytes, alternando para a max count eachfunção lambda aque é criada uma vez e usada duas vezes
  • -4 bytes, movendo a razefunção lambda para salvar umraze each
  • -4 bytes, simplificou a função lambda principal que adiciona o espaço em branco
  • -2 bytes, use (+)como abreviação paraflip
rua
fonte
1

Carvão , 16 9 bytes

WS«P↘ιM³↓

Minha primeira resposta de carvão. Graças a @DLosc pela sugestão e, em vez de usar e (Jump), volte para o início da linha (e três para baixo).

Experimente online (detalhado) ou Experimente online (puro) .

Explicação:

Faça um loop enquanto ainda houver uma próxima string de entrada:

While(InputString()){ ... }
WS« ...

Imprima esta sequência sem mover o cursor na direção inferior direita:

Multiprint(:DownRight, i);
P↘ι

E então mova três posições para baixo para a próxima iteração:

Move(3, :Down);
M³↓
Kevin Cruijssen
fonte
Quando o desafio precisa de uma única entrada que consiste em uma matriz, o Charcoal falha ao dividir a sequência de entrada, tendo cada palavra como uma entrada separada. Mas em Charcoal a θvariável representa a primeira entrada, então apenas atribuo a entrada de teste a essa variável no cabeçalho e depois escrevo o restante do código, para que você possa se livrar da αvariável e iterar nos itens divididos de θ. Experimente online! (Não-concorrente devido aos principais espaços).
Charlie
Pelo menos, ninguém reclamou quando eu usei esse truque aqui . :-)
Charlie
@CarlosAlejo De fato, encontrei sua resposta quando procurava inspiração nas respostas existentes sobre o carvão. :)
Kevin Cruijssen
IDK, o método I geralmente uso é apenas cordas + cadeia vazia no final, se houver alguma, em seguida, várias linhas de entrada como uma matriz pitão
ASCII somente
@CarlosAlejo Já faz um tempo, mas eu apenas usei várias linhas agora com uma linha vazia para interromper o tempo (e joguei 7 bytes ao mesmo tempo). Vi isso sendo usado em uma das respostas de Neil e agora vejo apenas o ASCII sugerido a mesma coisa (de alguma forma, perdi esse comentário).
Kevin Cruijssen
1

Japonês -Rx, 17 16 13 bytes

Recebe a entrada como uma matriz de palavras. Se o espaço em branco à direita em cada linha for permitido, os 4 últimos caracteres poderão ser removidos para vincular à solução de carvão vegetal.

yÈmú3)iYçÃmx1

Experimente ou execute todos os casos de teste


Explicação

y                 :Transpose
 È                :Map each word at 0-based index Y
  m               :  Map each character
   ú3             :    Right pad with spaces to length 3
     )            :  End mapping
      i           :  Prepend
       Yç         :   Space repeated Y times
         Ã        :End mapping and transpose
          m       :Map
           x1     :  Trim right
                  :Implicitly join with newlines, trim and output
Shaggy
fonte
1

K4 , 58 bytes

Solução:

+(|/{0+/|\|~^x}@'x)$x:(2-(!c)+3*#x)$"  "/:'$+(c:|/#:'x)$x:

Exemplos:

q)k)+(|/{0+/|\|~^x}@'x)$x:(2-(!c)+3*#x)$"  "/:'$+(c:|/#:'x)$x:("programming";"puzzles";"and";"code";"golf")
"p          "
" r         "
"  o        "
"p  g       "
" u  r      "
"  z  a     "
"a  z  m    "
" n  l  m   "
"  d  e  i  "
"c     s  n "
" o        g"
"  d        "
"g  e       "
" o         "
"  l        "
"   f       "
q)k)+(|/{0+/|\|~^x}@'x)$x:(2-(!c)+3*#x)$"  "/:'$+(c:|/#:'x)$x:(,"a";"bcd";"efgh";,"i";,"j")
"a   "
"    "
"    "
"b   "
" c  "
"  d "
"e   "
" f  "
"  g "
"i  h"
"    "
"    "
"j   "
q)k)+(|/{0+/|\|~^x}@'x)$x:(2-(!c)+3*#x)$"  "/:'$+(c:|/#:'x)$x:("verylongword";"short")
"v           "
" e          "
"  r         "
"s  y        "
" h  l       "
"  o  o      "
"   r  n     "
"    t  g    "
"        w   "
"         o  "
"          r "
"           d"

Explicação:

Cordas do teclado direito para que tenham o mesmo comprimento, transponham, juntem " "-se ao teclado esquerdo para gerar diagonais e, em seguida, teclado direito para corrigir comprimentos e voltar a transpor. Pega uma lista de cadeias e retorna uma lista de cadeias. Provavelmente jogável, mas ainda mais curto que minha solução q / kdb +.

+(|/{0+/|\|~^x}@'x)$x:(2-(!c)+3*#x)$"  "/:'$+(c:|/#:'x)$x:
                                                        x:      / save as variable x
                                                       $        / pad
                                             (        )         / do this together
                                                  #:'x          / count (#:) each (') x
                                                |/              / max
                                              c:                / save as variable c
                                            +                   / flip / transpose
                                           $                    / string ($)
                                    "  "/:'                     / join each with "  "
                                   $                            / pad
                      (           )                             / do this together
                                #x                              / count (#) x
                              3*                                / multiply by 3
                             +                                  / add to
                         (  )                                   / do this together
                          !c                                    / range 0..c
                       2-                                       / subtract from 2
                    x:                                          / save as x:
                   $                                            / pad
 (                )                                             / do all this together
    {         }@'x                                              / apply (@) lambda {} to each x
            ^x                                                  / null (^) x (" " is considered null)
           ~                                                    / not
          |                                                     / reverse
        |\                                                      / max (|) scan (\), maxs
     0+/                                                        / sum (+) over (/) starting with 0
  |/                                                            / max (|) over (/), max
+                                                               / transpose
rua
fonte
0

Perl 6 , 73 bytes

{my@t;for .kv ->\i,\w{for w.comb.kv {@t[3*i+$^a][$^a]=$^b}};@t »||»" "}

Experimente online!

O argumento de entrada é uma lista de palavras. A saída é uma matriz de matriz de caracteres.

Sean
fonte
0

PHP , 100 bytes

<?foreach($_GET as$k=>$v)for($x=0;$y=$v[$x];$t[$x++]=$y)($t=&$s[$k*3+$x])?:$t=" ";echo join("
",$s);

Experimente online!

Jörg Hülsermann
fonte