ASCII stella umida


10

Descrizione dell'input

Una stringa (per risultati ottimali, tutti i caratteri devono essere stampabili e avere la stessa larghezza).

Descrizione dell'output

Una stella del personaggio che segue il modello:

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

dove 0, 1... sono i caratteri successivi della stringa. L'output non deve necessariamente essere una stringa: la stampa del carattere a stella tramite char nella console va bene.

Esempio

>> 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

Penso che "una stringa" dovrebbe essere un po 'più chiara, intendi una stringa composta solo da ASCII stampabile?
FryAmTheEggman,

Penso che "una stringa" sia sufficiente. Ovviamente, per ottenere i migliori risultati, probabilmente vorrai evitare schede o altri caratteri che distorcono la forma dell'output, ma ciò non significa che non puoi includerli. Tuttavia, ho aggiornato la descrizione per chiarezza.
shooqie,

3
È meno una questione se questo dà i risultati più belli ma se le risposte devono supportarlo. Alcune lingue potrebbero dover utilizzare un codice leggermente diverso se, ad esempio, devono essere supportati anche caratteri non ASCII (Unicode). Allo stesso modo, un po 'di codice potrebbe essere più breve se possiamo ipotizzare che non vengano visualizzati gli stampabili (in particolare gli avanzamenti di riga).
Martin Ender,

La possibilità di stampare tutti i caratteri è irrilevante. Se riesci ad accorciare il tuo codice, anche se ti impedisce di stampare determinati caratteri (come Unicode), allora così sia. Penso che sia comunque lo spirito del code-golf. Finché il tuo programma supporta caratteri comuni, va bene. In caso contrario, non credo che la specifica della sfida sia il problema.
shooqie,

Risposte:



1

Perl, 97 93 + 2 = 95 byte

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

Richiede -nlEbandiere:

$ 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

1

Scherzi a parte, 57 byte

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

Sì, quella newline dovrebbe essere lì. Sì, seriamente fa ancora schifo alla manipolazione delle stringhe. Hexdump (reversibile 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..+@

Lo aggiornerò con una spiegazione una volta terminato di scriverlo. È un po 'lungo.


1

ES6, 153 byte

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

Soluzione alternativa, anche 153 byte:

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: L' \ninterno è un carattere letterale di nuova riga.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.