Estrela úmida ASCII

10

Descrição da entrada

Uma sequência (para obter melhores resultados, todos os caracteres devem ser imprimíveis e ter a mesma largura).

Descrição da saída

Uma estrela de personagem seguindo o padrão:

0  0  0
 1 1 1 
  222  
0123210
  222  
 1 1 1 
0  0  0

onde 0, 1... são caracteres subsequentes da sequência. A saída não precisa necessariamente ser uma sequência - imprimir o caractere estrela por caractere no console é bom.

Exemplo

>> star('overflow')
>>
o      o      o
 v     v     v 
  e    e    e  
   r   r   r   
    f  f  f    
     l l l     
      ooo      
overflowolfrevo
      ooo      
     l l l     
    f  f  f    
   r   r   r   
  e    e    e  
 v     v     v 
o      o      o
shooqie
fonte
Eu acho que "uma string" deve ser um pouco mais clara, você quer dizer uma string que consiste apenas em ASCII imprimível?
FryAmTheEggman 22/02
Eu acho que "uma string" é suficiente. Obviamente, para obter melhores resultados, você provavelmente deseja evitar tabulações ou outros caracteres que distorcem a forma da saída, mas isso não significa que você não possa incluí-los. Ainda assim, atualizei a descrição para maior clareza.
22616 shooqie
3
É menos uma questão de saber se isso dá os melhores resultados, mas se as respostas precisam dar suporte. Alguns idiomas podem precisar usar código um pouco diferente se, por exemplo, caracteres não ASCII (Unicode) também tiverem de ser suportados. Da mesma forma, algum código pode ser mais curto se pudermos supor que não imprimíveis não serão exibidos (especificamente feeds de linha).
Martin Ender
Se você pode ou não imprimir todos os caracteres, é irrelevante. Se você pode tornar seu código mais curto, mesmo que o impeça de imprimir certos caracteres (como Unicode), que assim seja. Eu acho que esse é o espírito do código-golfe de qualquer maneira. Contanto que seu programa suporte caracteres comuns, tudo bem. Caso contrário, não acho que a especificação do desafio seja o problema.
22616 shooqie

Respostas:

1

Perl, 97 93 + 2 = 95 bytes

$i=y///c-2;push@a,map{$"x$j++.$_.($"x$i--.$_)x2}/.(?!$)/g;say for@a,s/.$//r.reverse,reverse@a

Requer -nlEsinalizadores:

$ perl -nlE'$i=y///c-2;push@a,map{$"x$j++.$_.($"x$i--.$_)x2}/.(?!$)/g;say for@a,s/.$//r.reverse,reverse@a' <<< 'overflow'
o      o      o
 v     v     v
  e    e    e
   r   r   r
    f  f  f
     l l l
      ooo
overflowolfrevo
      ooo
     l l l
    f  f  f
   r   r   r
  e    e    e
 v     v     v
o      o      o

Ungolfed:

$i=y///c-2;
push @a, map{
  $" x $j++ . 
  $_ . 
  ($" x $i-- . $_)x2
} /.(?!$)/g;
say for @a, s/.$//r.reverse, reverse@a
andlrc
fonte
1

Sério, 57 bytes

╩╜#dXΣR;╝;lr;R3Z`i' *;(;;))@(((@)' *;)kΣ`M;R@k`'
j`Mi╛╜+@

Sim, essa nova linha deveria estar lá. Sim, seriamente ainda é uma droga na manipulação de cordas. Hexdump (reversível com xxd -r):

00000000: cabd 2364 58e4 523b bc3b 6c72 3b52 335a  ..#dX.R;.;lr;R3Z
00000010: 6069 2720 2a3b 283b 3b29 2940 2828 2840  `i' *;(;;))@(((@
00000020: 2927 202a 3b29 6be4 604d 3b52 406b 6027  )' *;)k.`M;R@k`'
00000030: 0a6a 604d 69be bd2b 40                   .j`Mi..+@

Vou atualizar isso com uma explicação assim que terminar de escrevê-lo. É meio longo.

Mego
fonte
1

ES6, 153 bytes

s=>[...a=(t=[...s.slice(0,-1)]).map((c,i)=>(a=Array(t.length).fill` `,a[i]=c,a.join``+c+a.reverse().join``)),s+t.reverse().join``,...a.reverse()].join`\n`

Ungolfed:

function star(s) {
    r = [];
    h = s.length - 1;
    for (i = 0; i < h; i++) {
        a = [...' '.repeat(h)];
        a[i] = s[i];
        a = a.concat(s[i]).concat(a.reverse());
        r.push(a.join(''));
    }
    return r.concat(s + [...s.slice(0,h)].reverse().join('')).concat(r.reverse()).join("\n");
}

Solução alternativa, também 153 bytes:

s=>[...a=(t=[...s].reverse().slice(1)).map((c,i)=>(a=Array(l+l+1).fill` `,a[i]=a[l]=a[l+l-i]=c,a.join``),l=t.length),s+t.join``,...a.reverse()].join`\n`

Ungolfed:

function star(s) {
    r = [];
    h = s.length - 1;
    for (i = 0; i < h; i++) {
        a = [...' '.repeat(h + h + 1)];
        a[i] = s[i];
        a[h] = s[i];
        a[h + h - i] = s[i];
        r.push(a.join(''));
    }
    return r.concat(s + [...s].reverse().slice(1).join('')).concat(r.reverse()).join("\n");
}

Nota: O \ninterior `s é um caractere literal de nova linha.

Neil
fonte