ASCII Данк звезда


10

Описание ввода

Строка (для достижения наилучших результатов все символы должны быть напечатаны и иметь одинаковую ширину).

Описание выхода

Звезда персонажа по шаблону:

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

где 0, 1... являются последующими символами строки. Выходные данные не обязательно должны быть одной строкой - печатать звездный символ за символом в консоль можно.

пример

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

Ungolfed:

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

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

Альтернативное решение, также 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`

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

Примечание: \nвнутри `s это буквальный символ новой строки.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.