ASCII dank star

10

Description d'entrée

Une chaîne (pour de meilleurs résultats, tous les caractères doivent être imprimables et avoir la même largeur).

Description de la sortie

Une étoile de caractère suivant le modèle:

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

0, 1... sont les caractères suivants de la chaîne. La sortie ne doit pas nécessairement être une chaîne - l'impression du caractère étoile par caractère dans la console est très bien.

Exemple

>> 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
la source
Je pense que "une chaîne" devrait être un peu plus claire, voulez-vous dire une chaîne composée uniquement d'ASCII imprimable?
FryAmTheEggman
Je pense que "une chaîne" est suffisante. Bien sûr, pour de meilleurs résultats, vous souhaiterez probablement éviter les tabulations ou autres caractères qui fausseraient la forme de la sortie, mais cela ne signifie pas que vous ne pouvez pas les inclure. Pourtant, j'ai mis à jour la description pour plus de clarté.
shooqie
3
Il s'agit moins de savoir si cela donne les meilleurs résultats mais de savoir si les réponses doivent le soutenir. Certaines langues peuvent devoir utiliser un code quelque peu différent si, par exemple, les caractères non ASCII (Unicode) doivent également être pris en charge. De même, certains codes peuvent être plus courts si nous pouvons supposer que les caractères non imprimables n'apparaîtront pas (en particulier les sauts de ligne).
Martin Ender
Que vous puissiez ou non imprimer tous les caractères est sans importance. Si vous pouvez raccourcir votre code, même s'il vous empêche d'imprimer certains caractères (comme Unicode), alors qu'il en soit ainsi. Je pense que c'est l'esprit du golf de code de toute façon. Tant que votre programme prend en charge les caractères communs, ça va. Si ce n'est pas le cas, je ne pense pas que la spécification du défi soit le problème.
shooqie

Réponses:

1

Perl, 97 93 + 2 = 95 octets

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

Nécessite des -nlEdrapeaux:

$ 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

Non golfé:

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

Sérieusement, 57 octets

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

Oui, cette nouvelle ligne est censée être là. Oui, ça craint toujours la manipulation des cordes. Hexdump (réversible avec 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..+@

Je mettrai à jour cela avec une explication une fois que j'aurai fini de l'écrire. C'est un peu long.

Mego
la source
1

ES6, 153 octets

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`

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

Solution alternative, également 153 octets:

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`

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

Remarque: l' \nintérieur `s est un caractère de nouvelle ligne littéral.

Neil
la source