Bintang ASKII dank

10

Deskripsi input

String (untuk hasil terbaik, semua karakter harus dapat dicetak dan lebarnya sama).

Deskripsi keluaran

Bintang karakter mengikuti pola:

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

di mana 0, 1... adalah karakter selanjutnya dari string. Outputnya tidak harus berupa satu string - mencetak char bintang dengan char ke konsol baik-baik saja.

Contoh

>> 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
sumber
Saya pikir "string" harus sedikit lebih jelas, maksud Anda string yang hanya terdiri dari ASCII yang dapat dicetak?
FryAmTheEggman
Saya pikir "string" sudah cukup. Tentu saja, untuk hasil terbaik, Anda mungkin ingin menghindari tab atau karakter lain yang akan mengubah bentuk output, tetapi itu tidak berarti Anda tidak dapat memasukkannya. Namun, saya memperbarui deskripsi untuk kejelasan.
shooqie
3
Ini bukan pertanyaan apakah itu memberikan hasil terbaik tetapi apakah jawaban harus mendukungnya. Beberapa bahasa mungkin harus menggunakan kode yang agak berbeda jika mis. Karakter non-ASCII (Unicode) juga harus didukung. Demikian juga, beberapa kode mungkin lebih pendek jika kita dapat berasumsi bahwa unsintables tidak akan muncul (khususnya linefeeds).
Martin Ender
Apakah Anda dapat mencetak semua karakter atau tidak tidak relevan. Jika Anda dapat membuat kode Anda lebih pendek, bahkan jika itu membatasi Anda untuk mencetak karakter tertentu (seperti Unicode), maka jadilah itu. Saya pikir itulah semangat golf code. Selama program Anda mendukung karakter umum, tidak masalah. Jika tidak, maka saya tidak berpikir spesifikasi tantangan adalah masalahnya.
shooqie

Jawaban:

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

Membutuhkan -nlEbendera:

$ 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

Tidak Disatukan:

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

Serius, 57 byte

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

Ya, baris baru itu seharusnya ada di sana. Ya, Serius masih mengisap manipulasi string. Hexdump (dapat dibalik dengan 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..+@

Saya akan memperbarui ini dengan penjelasan setelah saya selesai menulisnya. Itu agak panjang.

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

Tidak Disatukan:

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

Solusi alternatif, juga 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`

Tidak Disatukan:

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

Catatan: Bagian \ndalam adalah karakter baris baru literal.

Neil
sumber