Buat yang super akrostik

35

Latar Belakang

Merayakan rilis Dyalog APL 16.0 , di mana solusi untuk masalah ini adalah {⊢⌺(≢⍵)⊢⍵}Penjelasan

Tugas

Diberikan string ASCII yang dapat dicetak dengan panjang ganjil n , buat sebuah n × n persegi dengan string terpusat secara horizontal, diduplikasi untuk dipusatkan secara vertikal, dan dengan akrostik dari string yang sama di setiap baris dan kolom. Perhatikan bahwa semua tapi string yang berpusat akan dipotong untuk menjaga ukuran persegi ini n × n .

Penjelasan kode Anda akan sangat dihargai.

Aturan

  1. Anda mungkin memiliki trailing spasi dan baris baru (ini termasuk segitiga kanan bawah)
  2. Anda dapat mengembalikan daftar string

Contoh menggunakan string ABXCD:

  • n adalah 5. Pertama kita menggambar dua string tengah, satu horizontal dan satu vertikal

    ┌─────┐
    │ A │
    │ B │
    │ABXCD│
    │ C │
    │ D │
    └─────┘
    

    (5 × 5 kotak pembatas ditambahkan untuk kejelasan)

  • Kemudian kami menempatkan semua akrostik yang mungkin, secara horizontal dan vertikal:

           SEBUAH
          AB
      ┌─────┐
      │ ABX│CD
      │ ABXC│D
      │ABXCD│
     A│BXCD │
    AB│XCD │
      └─────┘
       CD
       D
    
  • Akhirnya, kami hanya mengembalikan apa yang ada di dalam kotak pembatas:

      ABX
     ABXC
    ABXCD
    BXCD 
    XCD  
    

Uji kasus

World:

  Wor
 Worl
World
orld
rld

mississippi:

     missis
    mississ
   mississi
  mississip
 mississipp
mississippi
ississippi
ssissippi
sissippi
issippi
ssippi

Pneumonoultramicroscopicsilicovolcanoconiosis:

                      Pneumonoultramicroscopi
                     Pneumonoultramicroscopic
                    Pneumonoultramicroscopics
                   Pneumonoultramicroscopicsi
                  Pneumonoultramicroscopicsil
                 Pneumonoultramicroscopicsili
                Pneumonoultramicroscopicsilic
               Pneumonoultramicroscopicsilico
              Pneumonoultramicroscopicsilicov
             Pneumonoultramicroscopicsilicovo
            Pneumonoultramicroscopicsilicovol
           Pneumonoultramicroscopicsilicovolc
          Pneumonoultramicroscopicsilicovolca
         Pneumonoultramicroscopicsilicovolcan
        Pneumonoultramicroscopicsilicovolcano
       Pneumonoultramicroscopicsilicovolcanoc
      Pneumonoultramicroscopicsilicovolcanoco
     Pneumonoultramicroscopicsilicovolcanocon
    Pneumonoultramicroscopicsilicovolcanoconi
   Pneumonoultramicroscopicsilicovolcanoconio
  Pneumonoultramicroscopicsilicovolcanoconios
 Pneumonoultramicroscopicsilicovolcanoconiosi
Pneumonoultramicroscopicsilicovolcanoconiosis
neumonoultramicroscopicsilicovolcanoconiosis
eumonoultramicroscopicsilicovolcanoconiosis
umonoultramicroscopicsilicovolcanoconiosis
monoultramicroscopicsilicovolcanoconiosis
onoultramicroscopicsilicovolcanoconiosis
noultramicroscopicsilicovolcanoconiosis
oultramicroscopicsilicovolcanoconiosis
ultramicroscopicsilicovolcanoconiosis
ltramicroscopicsilicovolcanoconiosis
tramicroscopicsilicovolcanoconiosis
ramicroscopicsilicovolcanoconiosis
amicroscopicsilicovolcanoconiosis
microscopicsilicovolcanoconiosis
icroscopicsilicovolcanoconiosis
croscopicsilicovolcanoconiosis
roscopicsilicovolcanoconiosis
oscopicsilicovolcanoconiosis
scopicsilicovolcanoconiosis
copicsilicovolcanoconiosis
opicsilicovolcanoconiosis
picsilicovolcanoconiosis
icsilicovolcanoconiosis

Ucapan Terima Kasih

Berkat dzaima , Leaky Nun , Tn. Xcoder untuk semuanya kecuali gagasan tantangan ini.

Adm
sumber
1
Apakah spasi-triange di kanan bawah harus dimasukkan atau tidak?
flawr
1
@ flawr OP: may
Adám

Jawaban:

5

MATL , 8 byte

nXyPGZ+c

Cobalah online!

Penjelasan

n    % Implicit input. Number of elements
Xy   % Identity matrix of that size
P    % Flip vertically
G    % Push input again
Z+   % 2D convolution, maintaining size
c    % Convert to char (char 0 is displayed as space). Implicitly display
Luis Mendo
sumber
1
Siapa yang mengira saya ingin jawaban ini: D
flawr
1
@ flawr Ya, siapa sangka
Luis Mendo
4

Retina , 70 59 byte

.
$.'$* $_$.`$* ¶
(?=((....))+)(?<-1>.)+(.*?)(?<-2>.)+¶
$3¶

Cobalah online! Sunting: Disimpan 11 byte dengan bantuan dari @MartinEnder. Penjelasan: Tahap pertama mengulang input sekali untuk setiap karakter, padding dengan tepat pada setiap baris untuk mendapatkan geser. Tahap terakhir kemudian menghilangkan 25% dari masing-masing sisi untuk menghasilkan hasil yang diinginkan.

Neil
sumber
Saya pikir saya punya 59 sebelumnya. Tidak punya waktu untuk menggali rincian sekarang, tapi pada dasarnya dalam tahap pertama saya hanya empuk input dengan n/2ruang kiri dan kanan (menggunakan sesuatu seperti (..)+.-> $#1$* $&$#1$*dengan ruang tambahan) dan kemudian hanya melakukan !&`...di mana ...pertandingan npersis nkarakter.
Martin Ender
Pendekatan Anda setidaknya dapat dipersingkat menjadi 63: tio.run/##K0otycxL/…
Martin Ender
@ MartinEnder Terima kasih, dan saya bermain golf sebanyak 4 byte!
Neil
Apakah Anda membutuhkan yang kedua $*sp?
CalculatorFeline
@CalculatorFeline Ya, saya membutuhkan semua garis dengan panjang yang sama, jadi saya bisa membaginya dengan 4.
Neil
3

Java 8, 120 103 byte

s->{int l=s.length(),i=l/2;for(;i-->0;s=" "+s+" ");for(;++i<l;System.out.println(s.substring(i,l+i)));}

-17 byte terima kasih kepada @ OlivierGrégoire .

Penjelasan:

Coba di sini.

s->{                      // Method with String parameter and no return-type
  int l=s.length(),       //  Length of the input-String
      i=l/2;              //  Temp index-integer (starting at halve the length floored)
  for(;i-->0;             //  Loop (1) from `l/2` to 0 (exclusive)
    s=" "+s+" "           //   Add spaces before and after the input-String
  );                      //  End of loop (1)
                          //  (If the input was "World", it is now "  World  ")
  for(;++i<l;             //  Loop (2) from 0 to `l` (exclusive)
    System.out.println(   //   Print:
      s.substring(i,      //    Substring of the modified input from `i`
                    l+i)  //    to `l+i` (exclusive)
    )                     //   End of print
  );                      //  End of loop (2)
}                         // End of method
Kevin Cruijssen
sumber
i=l/2+1dan i-->1dan for(;i<lmenyimpan byte.
Olivier Grégoire
1
Dan ... benar-benar bermain golf: s->{int l=s.length(),i=l/2;while(i-->0)s=" "+s+" ";while(++i<l)System.out.println(s.substring(i,l+i));}(103 byte). Satu-satunya perubahan signifikan adalah bahwa string dengan spasi dihasilkan sekali dan untuk semua alih-alih "on the fly" (dan tentu saja cetak alih-alih kembali).
Olivier Grégoire
3

Haskell, 64 62 byte

f s|l<-length s=take l$take l<$>scanr(:)""(([2,4..l]>>" ")++s)

Cobalah online! Bagaimana itu bekerja:

l<-length s               -- let l be the length of the input string

      ([2,4..l]>>" ")     -- take l/2 spaces and
                     ++s  -- append s
    scanr(:)""            -- make a list of the inits of the above string, e.g.
                          -- "  world" -> ["  world"," world","world","orld"...]
  take l <$>              -- take the first l chars of each string
take l                    -- and the first l strings
nimi
sumber
3

Prolog SWI, 234 byte

h(_,0,_,_,[]).
h(T,N,S,L,[H|U]):-sub_string(T,S,L,_,H),M is N-1,A is S+1,h(T,M,A,L,U).
s(T,R):-string_length(T,L),findall('_',between(1,L,_),A),string_chars(B,A),
                   string_concat(B,T,C),string_concat(C,B,D),S is L-((L-1)/2),h(D,L,S,L,R).

Mungkin coba online di sini: http://swish.swi-prolog.org/p/hEKigfEl.pl

NB.

  1. Baris terakhir adalah satu baris panjang, saya menambahkan linebreak dan spasi di sini hanya untuk menghindari scrollbar horizontal dalam jawaban ini.
  2. Pertanyaannya melibatkan ruang untuk pelipatan, tetapi Swish online tidak menunjukkannya dengan bersih karena interaksi rendering HTML, Anda harus melihat sumber di perangkat pengembang peramban untuk memeriksa keberadaannya (ada). Saya telah mengubah padding untuk berada di _sini, karena itu menunjukkan itu berfungsi dan tidak mempengaruhi jumlah byte.

Contoh berjalan di Swish:

Uji kasus

Pendekatan, pada dasarnya hal pertama yang saya bisa lakukan, dan tidak diragukan lagi pengguna Prolog yang ahli dapat mempersingkatnya:

  • Diberikan string panjang L, output akan memiliki garis L, dan setiap baris akan menjadi karakter L panjang, sehingga 'L' muncul banyak. Hitung mundur dari L ke 0 untuk jumlah garis, L untuk panjang substring untuk setiap baris.
  • Buat string padding dari spasi L (garis bawah) yang panjang, tambahkan ke kedua ujung string input, karena itu adalah panjang sederhana yang pasti akan menjadi padding yang cukup.
  • Hitung offset awal ke string tiga-panjang ini dan berulang, menghasilkan substring setiap kali, ke dalam daftar hasil.

Kode yang dijelaskan dan dikomentari (mungkin tidak berjalan), baca dari superacrostic()bawah, lalu helper()badan utama, lalu helper()huruf besar:

% helper function recursive base case, 
% matches when counter is 0, other input has any values, and empty list 'output'.
helper(_,0,_,_,[]). 



% helper function recursively generates substrings
% matching a padded input Text, a line Counter
% a substring starting Offset, a line Length,
% and an output list with a Head and a Tail
helper(Text, Counter, Offset, LineLength, [Head|Tail]):-

    sub_string(Text, Offset, LineLength, _, Head),    % The list Head matches
                                                      % a substring of Text starting 
                                                      % from Offset, of LineLength chars 
                                                      % and

    NextCounter is Counter-1,                         % decrement the Counter

    NextOffset is Offset+1,                           % increment the offset

    helper(Text, NextCounter, NextOffset, LineLength, Tail).  % Recurse for list Tail



% Result is a superacrostic for an input string Text, if
superacrostic(Text, Result):-
    string_length(Text, Length),                   % Length is length of input, 
                                                   % Text = 'ABXCD', Length = 5
                                                   % and

    findall('_',between(1,Length,_),PaddingList),  % PaddingList is a list of padding
                                                   % chars Length items long, 
                                                   % ['_', '_', '_', '_', '_']
                                                   % and

    string_chars(PaddingString, PaddingChars),     % PaddingString is the string from 
                                                   % joining up that list of chars
                                                   % '_____'
                                                   % and

    string_concat(PaddingString, Text, Temp),      % Temp is Text input with a
                                                   % padding prefix
                                                   % Temp = '_____ABXCD'
                                                   % and

    string_concat(Temp, PaddingString, PaddedText), % PaddedText is Temp with 
                                                    % a padded suffix
                                                    % Temp = '_____ABXCD_____'
                                                    % and


    S is Length - ((Length - 1) / 2),              % Starting offset S for the substring
                                                   % is just past the padding,
                                                   % then half the input length back
                                                   % '_____ABXCD_____'
                                                   %     |
                                                   % to start the first line,
                                                   % and


    helper(PaddedText, Length, S, Length, Result). % Result is the list generated from 
                                                   % the helper function, 

    % to recurse Length times for that many output rows, S starting offset, 
    % Length linelength, and Result 'output'.
TessellatingHeckler
sumber
2

05AB1E , 11 byte

g;úIvDIg£,À

Cobalah online!

Penjelasan

g;ú           # prepend len(input)/2 spaces to input
   Iv         # for each char of input do
     D        # duplicate current string
      Ig£     # take the first len(input) chars
         ,    # print
          À   # rotate the string to the left
Emigna
sumber
2

JavaScript (ES6), 75 byte

f=(s,k=1,l=s.length)=>k>l?'':(' '.repeat(l)+s).substr(l/2+k,l)+`
`+f(s,k+1)

console.log(f("World"))

Arnauld
sumber
72 byte . Atau 70 byte jika Anda ingin menggunakan ES8, seperti yang saya lakukan.
Shaggy
2

APL (Dyalog Unicode) , 10 karakter = 22 byte

{⊢⌺(≢⍵)⊢⍵}

Cobalah online!

{... } fungsi anonim di mana argumen diwakili oleh

 berikan area tertutup saat

⌺(... ) menggeser stensil ukuran

   panjang dari

   argumen

 di

 argumen

Cara kerjanya adalah dengan membiarkan setiap karakter membentuk bagian tengah string dengan panjang yang sama dengan input, padding ke kiri atau kanan sesuai kebutuhan. Ambil contoh ABXCD:

String memiliki lima karakter, sehingga stensil akan memiliki "pembuka" yang lebar lima karakter.

┌──↓──┐     pembukaan stensil dengan penanda tengah
│ ABX│CD   biarkan Aberada di tengah
 │ ABXC│D   kemudian B
  │ABXCD|   dll
  A|BXCD | 
  AB|XCD  |
    └──↑──┘ posisi stensil akhir

Adm
sumber
2

PHP , 98 byte

for(;~($a=$argn)[$i++];)$i&1?$t.=substr($a,$i/2)."
":$t=($s.=" ").substr($a,0,-$i/2)."
$t";echo$t;

Cobalah online!

Jörg Hülsermann
sumber
2

JavaScript (ES8), 66 63 62 byte

Mengembalikan array.

s=>[...s].map((_,x)=>s.padStart(l*1.5).substr(x,l),l=s.length)

Cobalah

o.innerText=(f=
s=>[...s].map((_,x)=>s.padStart(l*1.5).substr(x,l),l=s.length)
)(i.value="Pneumonoultramicroscopicsilicovolcanoconiosis").join`\n`;oninput=_=>o.innerText=f(i.value).join`\n`
<input id=i><pre id=o>


Penjelasan

s=>

Fungsi anonim mengambil string sebagai argumen melalui parameter s.

[...s]

Pisahkan string ke array karakter individu.

l=s.length

Dapatkan panjang string dan tetapkan ke variabel l.

.map((_,x)=>                                        )

Peta di atas array, melewati setiap elemen melalui fungsi, di mana xadalah indeks elemen saat ini.

s.padStart(l*1.5)

Untuk setiap elemen, kembalikan string asli dengan spasi diawali hingga panjangnya 1,5 kali dari panjang aslinya.

.substr(x,l)

Dapatkan substring panjang lmulai dari indeks elemen saat ini.

Shaggy
sumber
2

V , 14 , 11 byte

òlÙxHÄ$x>>ê

Cobalah online!

3 byte disimpan berkat @nmjmcman!

Hexdump:

00000000: f26c d978 48c4 2478 3e3e ea              .l.xH.$x>>.

Pendekatan asli (18 byte):

ø..
Duu@"ñLÙxHÄ$x>

Penjelasan:

ò           " Recursively:
 l          "   Move one char to the right (this will break the loop if we move too far
  Ù         "   Duplicate this line down
   x        "   Delete the first character on this line
    H       "   Move to the first line
     Ä      "   Duplicate this line up
      $     "   Move to the end of this line
       x    "   And delete a character
        >>  "   Put one space at the beginning of this line
          ê "   And move to this column on the last line
            " (implicit) ò, end the loop.
DJMcMayhem
sumber
Simpan beberapa byte: Cobalah online!
nmjcman101
@ nmjcman101 Ah, itu jenius! Saya benar-benar lupa ê. Terima kasih :)
DJMcMayhem
2

PowerShell Core , 68 byte

0..($L=($a="$args").Length-1)|%{-join(' '*($L/2)+$a)[($_..($_+$L))]}

Cobalah online!

Penjelasan yang tidak disatukan

# Input string ABXCD
# -> indexes  0,1,2,3,4  string indexing and num of output lines.
# -> Pad with half-len of spaces __ABXCD.
# -> sliding window array of chars:
# __ABXCD
# |    |       0..4
#  |    |      1..5
#   |    |     2..6
#    |    |    3..7   (selecting indexes past the end returns $nulls, no error)
#     |    |   4..8

# joining those chars into a line


$Text = "$args"                            # script args array to string.
$L    = $Text.Length - 1                   # useful number

$Offsets = 0..$L                           # range array 0,1,2,3,.. to last offset

$Offsets | ForEach-Object {                # Offsets doubles as number of output lines

    $LinePadding = ' ' * ($L / 2)          # lead padding string __
    $PaddedText  = $LinePadding + $Text    # -> __ABXCD

    $Chars = $_..($_+$L)                   # windows 0..4, then 1..5, then 2..6, etc.
    $Line  = $PaddedText[$Chars]           #_,_,A,B,X then _,A,B,X,C then A,B,X,C,D etc.

    -join $Line                            # __ABX  then _ABXC then ABXCD etc.

}
TessellatingHeckler
sumber
1
Ingin ungolf bergabung [($_..($_+$L))]?
root
@root jawaban singkat, (tidak pergi dengan bergabung, itu dilakukan -join ($Padding + $Text)[0,1,2,3,4]untuk memilih beberapa karakter dari string empuk untuk jalur output, dan bergabung dengan mereka menjadi string untuk menjadi cara yang lebih singkat untuk dilakukan .SubString(). dan itu menghasilkan padding di tempat dan berbagai karakter di tempat. Penjelasan ungolf lengkap ditambahkan ke jawaban saya.
TessellatingHeckler
2

Japt , 19 17 14 byte

Disimpan 5 byte berkat @ETHproduksi dan @Shaggy

¬£iSp½*Ul¹tYUl

Uji secara online! -Rpanji ditambahkan untuk bergabung dengan baris baru (tujuan visibilitas)

Penjelasan

¬£iSp½*Ul¹tYUl
                U = Implicit input
¬               Split the input into an array of chars
 £              Map; At each char:
  i               Insert:
   S                Space " "
    p               repeated(
     ½*Ul           .5 * U.length times 
         ¹          )
          t        Substring(
           Y         Index,
            Ul       U.length) 
Oliver
sumber
1
Seharusnya ada cara yang jauh lebih singkat untuk menghasilkan Sp½*Ul, tetapi saya tidak berpikir ada satu atm ... BTW, Anda biasanya dapat berubah sXX+Ymenjadi tXY( s == .slice, t == .substr)
ETHproduksi
@ ETHproductions Oh yeah, terima kasih!
Oliver
16 byte
Shaggy
Atau, mengingat pengembalian array diizinkan, 14 byte .
Shaggy
1

Arang , 26 byte

A⁺¹÷Lθ²δFδ⟦✂θι⁺ιδ⟧F∕θ²C¹±¹

Cobalah online! Tautan adalah untuk mengucapkan versi kode.

Neil
sumber
1

Jelly , 11 byte

LH⁶ẋ;ṫJḣ€LY

Cobalah online!

Bagaimana itu bekerja

LH⁶ẋ;ṫJḣ€LY   "ABXCD"
L             5
 H            2.5
  ⁶ẋ          "  "
    ;         "  ABXCD"
     ṫJ       ["  ABXCD"
               " ABXCD"
               "ABXCD"
               "BXCD"
               "XCD]
        ḣ€L   ["  ABX"
               " ABXC"
               "ABXCD"
               "BXCD"
               "XCD]
           Y  "  ABX
                ABXC
               ABXCD
               BXCD
               XCD"
Biarawati Bocor
sumber
1

QBIC , 32 byte

_L;|A=space$(a'\`2)+A[a|?_sA,b,a    

Sobat, sudah waktunya bagi saya untuk menambahkan space$ ke QBIC ...

Penjelasan

  ;             Read a cmd line parameter as A$
_L |            And take its length as 'a'
A=space$        Set A$ to a number of spaces
(a'\`2)           equal to its own length halved
+A                prepended to itself
[a|             FOR b= 1 to the length of A$
?_sA,b,a        Print a substring of our space-padded A$, starting at the b'th character, running for a chars

Contoh dijalankan

Command line: acknowledgement
       acknowle
      acknowled
     acknowledg
    acknowledge
   acknowledgem
  acknowledgeme
 acknowledgemen
acknowledgement
cknowledgement
knowledgement
nowledgement
owledgement
wledgement
ledgement
edgement
steenbergh
sumber
1

Mathematica, 88 byte

T=Table;Column@Reverse@T[T[" ",i]<>StringDrop[s=#,-i],{i,d=-⌊StringLength@s/2⌋,-d}]&
J42161217
sumber
1

Haskell , 86 70 byte

Ini (masih) terlalu lama, tapi terima kasih @bartavelle untuk mengingatkan saya bahwa mengeluarkan daftar string juga dapat diterima!

f s|m<-div(length s)2=take(2*m+1).(`drop`((*>)s" "++s))<$>[m+1..3*m+1]

Cobalah online!

cacat
sumber
Saya hanya bisa mencapai 82: Cobalah online!
bartavelle
@ Bartarta Itu tidak beres. Sisi kanan Anda tidak terpotong.
Adám
Yap, saya memperkenalkan bug! Anda bisa mendapatkan sedikit dengan menjatuhkan concat Anda: Cobalah online!
bartavelle
Dan dengan memotongnya 84, membuat pendekatan Anda lebih baik! Cobalah online!
bartavelle
Dan Anda dapat menyimpan lebih banyak, karena Anda tidak perlu mengembalikan satu string, daftar string juga OK!
bartavelle
1

Python 3 , 68 byte

a=input()
c=len(a)
b=a.center(c*2)
for i in range(c):print(b[i:i+c])

Cobalah online!

CalculatorFeline
sumber
1

PowerShell , 133 119 byte

$a="$args";$L=$a.Length;$m=($L+1)/2;$s=" "*($m-1)+$a+" "*($m-1);for($h=0;$h-lt$L;$h++){$r="";0..$L|%{$r+=$s[$_+$h]};$r}

Cobalah online!

Tidak disatukan

$a="$args"
$L=$a.Length                        # the length of the input
$m=($L + 1) / 2                     # the midpoint of the input
$s=" " * ($m-1) + $a + " " * ($m-1) # create a string using the input and padded on both sides with spaces

for($h=0;$h -lt $L;$h++) {          # the height, matching the length of the input
    $r=""                           # init/reset the output string

    0..$L | % {                     # number range to represent each character in the string
        $r+=$s[$_+$h]               # append the output string with the next character
    }

    $r                              # write the output
}
akar
sumber
1
Jawaban bagus! Selamat datang di situs ini. :)
DJMcMayhem
1

Python 2 ,76 74 73 byte

-1 terima kasih kepada @FelipeNardiBatista

Tentu saja, tidak sependek jawaban Python yang lain, tetapi ada baiknya mencoba metode yang sama sekali berbeda:

n=input();x=len(n)
for i in range(x):print((2*x-~i)*' '+n)[x+x/2:2*x+x/2]

Cobalah online!(dengan versi 74 byte)

Ini pertama menghasilkan String penuh, dan kemudian mengirisnya agar sesuai dengan kuadrat.


Penjelasan

n = input (); - mengambil input dan menugaskannya ke variabel n
          x = len (n) - menetapkan panjang input ke variabel x
untuk i dalam kisaran (x): - beralih pada kisaran 0 ... x, dengan variabel i
                   print - menampilkan hasilnya
                         ((2 * xi-1) * '' + n) - membuat string "berlian"
                                          [x + x / 2: 2 * x + x / 2] - memotong string agar sesuai dengan kotak

sumber
(2*x+~i)untuk menyimpan byte
Felipe Nardi Batista
@FelipeNardiBatista Terima kasih.
1

J , 19 byte

|.!.' '"{~2%~#\-#\.

Cobalah online!

Penjelasan

|.!.' '"{~2%~#\-#\.  Input: string S
             #\      Length of each prefix of S, [1, 2, ..., len(S)]
                #\.  Length of each suffix of S, [len(s), ..., 2, 1]
               -     Subtract elementwise
          2%~        Divide by 2
                     We now have a range [(1-len(S))/2, ..., -1, 0, 1, ..., (len(S)-1)/2]
       "{~           Use each value to operate on S
|.!.' '                Perform a shift while replacing characters with ' '
mil
sumber
Bekerja dengan ''sebagai penggantinya.
FrownyFrog
0

C # (.NET Core) , 101 byte

(a)=>{int L=a.Length,l=L/2;for(;l-->0;)a=" "+a+" ";for(;++l<L;)Console.WriteLine(a.Substring(l,L));};

Pada dasarnya jawaban @ KevinCruijssen. Menghemat 2 byte karena string.Lengthtidak perlu () dan 2 byte lainnya karena argumen kedua string.Substring()adalah panjang daripada indeks akhir, tetapi kemudian kehilangan 2 byte karena Console.WriteLine()lebih panjang. Saya memiliki implementasi yang lebih naif, tapi itu sekitar dua kali lebih lama jadi ...

Kamil Drakari
sumber
0

Excel VBA, 68 Bytes

Golf

Fungsi jendela langsung VBE anonim yang mengambil input dari sel [A1]dan output ke jendela langsung VBE

l=[Len(A1)]:For i=Int(-l/2)+2To l/2+1:?Mid(Space(l-i)&[A1],l,l):Next

Tidak disatukan

Sub C(ByVal s As String)
    Let l = Len(s)
    For i = Int(-l / 2) + 2 To l / 2 + 1 Step 1
        Debug.Print Mid(Space(l - i) & s, l, l)
    Next i
End Sub
Taylor Scott
sumber