ASCII зірка зірка


10

Опис введення

Рядок (для найкращих результатів усі символи повинні бути надруковані та мати однакову ширину).

Опис виводу

Зірка персонажа за зразком:

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

де 0, 1... - наступні символи рядка. Вихід не обов'язково повинен бути одним рядком - друк зіркового знака за допомогою char на консолі добре.

Приклад

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

Я думаю, що "рядок" повинен бути трохи чіткішим, ви маєте на увазі рядок, що складається тільки з друкованого ASCII?
FryAmTheEggman

Я думаю, що "струна" є достатньою. Звичайно, для найкращих результатів ви, мабуть, хочете уникати вкладок або інших символів, які б спотворювали форму виводу, але це не означає, що ви не можете їх включати. Проте я оновив опис для ясності.
shooqie

3
Це менш питання про те, чи це дає найприємніші результати, а чи відповіді повинні підтримувати це. Для деяких мов, можливо, доведеться використовувати дещо інший код, якщо, наприклад, повинні підтримуватися символи, що не належать до ASCII (Unicode). Так само деякий код може бути коротшим, якщо ми можемо припустити, що недруковані файли не з’являться (зокрема, стрічкові стрічки).
Мартін Ендер

Ви можете друкувати всі символи чи ні, не має значення. Якщо ви можете зробити свій код коротшим, навіть якщо він обмежує друк певних символів (наприклад, Unicode), так і нехай буде. Я думаю, що це дух кодового гольфу в будь-якому випадку. Поки ваша програма підтримує звичайних персонажів, це добре. Якщо це не так, то я не думаю, що проблема специфікації.
shooqie

Відповіді:



1

Perl, 97 93 + 2 = 95 байт

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

Потрібні -nlEпрапори:

$ 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

Безголівки:

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

1

Серйозно, 57 байт

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

Так, цей новий рядок повинен бути там. Так, серйозно все-таки смокче на маніпуляціях зі струнами. Hexdump (оборотний з 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..+@

Я оновлю це поясненням, як тільки закінчу його писати. Це якось довго.


1

ES6, 153 байти

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`

Безголівки:

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

Альтернативне рішення, також 153 байти:

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`

Безголівки:

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

Примітка: \ninside `s - це буквальний символ нового рядка.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.