Estrella húmeda ASCII

10

Descripción de entrada

Una cadena (para obtener mejores resultados, todos los caracteres deben poder imprimirse y tener el mismo ancho).

Descripción de salida

Una estrella de personaje siguiendo el patrón:

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

donde 0, 1... son caracteres posteriores de la cadena. La salida no necesariamente tiene que ser una cadena: está bien imprimir la estrella char por char en la consola.

Ejemplo

>> 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
fuente
Creo que "una cadena" debería ser un poco más clara, ¿te refieres a una cadena que consiste solo en ASCII imprimible?
FryAmTheEggman
Creo que "una cadena" es suficiente. Por supuesto, para obtener los mejores resultados, es probable que desee evitar las pestañas u otros caracteres que distorsionen la forma de la salida, pero eso no significa que no pueda incluirlos. Aún así, actualicé la descripción para mayor claridad.
shooqie
3
Se trata menos de si eso da los mejores resultados, sino de si las respuestas tienen que respaldarlo. Es posible que algunos idiomas tengan que usar un código algo diferente si, por ejemplo, los caracteres no ASCII (Unicode) también deben ser compatibles. Del mismo modo, algunos códigos podrían ser más cortos si podemos suponer que no aparecerán los no imprimibles (específicamente los avances de línea).
Martin Ender
Si puede o no imprimir todos los caracteres es irrelevante. Si puede acortar su código, incluso si le limita la impresión de ciertos caracteres (como Unicode), que así sea. Creo que ese es el espíritu del golf de código de todos modos. Mientras su programa sea compatible con caracteres comunes, está bien. Si no es así, entonces no creo que la especificación de desafío sea el problema.
shooqie

Respuestas:

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

Requiere -nlEbanderas:

$ 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

Sin golf:

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

En serio, 57 bytes

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

Sí, se supone que esa nueva línea está allí. Sí, en serio todavía apesta con la manipulación de cuerdas. Hexdump (reversible con 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..+@

Actualizaré esto con una explicación una vez que termine de escribirlo. Es un poco largo

Mego
fuente
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`

Sin golf:

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");
}

Solución alternativa, también 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`

Sin golf:

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: El \n`s interno es un carácter literal de nueva línea.

Neil
fuente