ASCII dank Stern

10

Eingabebeschreibung

Eine Zeichenfolge (für beste Ergebnisse sollten alle Zeichen druckbar und gleich breit sein).

Beschreibung der Ausgabe

Ein Charakterstern nach dem Muster:

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

Dabei 0sind 1... nachfolgende Zeichen der Zeichenfolge. Die Ausgabe muss nicht unbedingt eine Zeichenfolge sein - das Drucken des Sternzeichens für Zeichen in die Konsole ist in Ordnung.

Beispiel

>> 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
quelle
Ich denke, "eine Zeichenfolge" sollte etwas klarer sein. Meinen Sie eine Zeichenfolge, die nur aus druckbarem ASCII besteht?
FryAmTheEggman
Ich denke "eine Schnur" ist ausreichend. Um optimale Ergebnisse zu erzielen, möchten Sie wahrscheinlich Tabulatoren oder andere Zeichen vermeiden, die die Form der Ausgabe verzerren würden. Dies bedeutet jedoch nicht, dass Sie sie nicht einschließen können. Trotzdem habe ich die Beschreibung aus Gründen der Übersichtlichkeit aktualisiert.
Shooqie
3
Es geht weniger darum, ob dies die schönsten Ergebnisse liefert, sondern ob Antworten dies unterstützen müssen. Einige Sprachen müssen möglicherweise etwas anderen Code verwenden, wenn z. B. auch Nicht-ASCII-Zeichen (Unicode) unterstützt werden müssen. Ebenso kann ein Teil des Codes kürzer sein, wenn wir davon ausgehen können, dass nicht druckbare Dateien nicht angezeigt werden (insbesondere Zeilenvorschübe).
Martin Ender
Ob Sie alle Zeichen drucken können oder nicht, spielt keine Rolle. Wenn Sie Ihren Code kürzer machen können, auch wenn Sie dadurch bestimmte Zeichen (wie Unicode) nicht drucken können, dann sei es so. Ich denke, das ist sowieso der Geist des Code-Golfens. Solange Ihr Programm allgemeine Zeichen unterstützt, ist dies in Ordnung. Wenn nicht, dann denke ich nicht, dass die Herausforderungsspezifikation das Problem ist.
Shooqie

Antworten:

1

Perl, 97 93 + 2 = 95 Bytes

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

Benötigt -nlEFlags:

$ 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
andlrc
quelle
1

Im Ernst, 57 Bytes

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

Ja, diese Newline soll da sein. Ja, ernsthaft saugt immer noch an der Manipulation von Saiten. Hexdump (reversibel mit 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..+@

Ich werde dies mit einer Erklärung aktualisieren, sobald ich mit dem Schreiben fertig bin. Es ist ein bisschen lang.

Mego
quelle
1

ES6, 153 Bytes

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

Alternative Lösung, auch 153 Bytes:

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

Hinweis: Das \nInnere ist ein wörtliches Zeilenumbruchzeichen.

Neil
quelle