Inscriptio Labyrinthica

22

Di tempat pemakaman Raja Silo dari Asturias ada tulisan yang bertuliskan SILO PRINCEPS FECIT ( Raja Silo membuat ini ).

KEUNGGULAN PRINCEPS SILO

Huruf pertama ditemukan di bagian paling tengah, dan dari sana seseorang membaca dengan pergi ke arah non-diagonal yang memancar keluar. Huruf terakhir ditemukan di keempat sudut. Dalam tantangan ini, Anda akan menggeneralisasi proses untuk membuatnya.

Memasukkan

String ( atau setara ), dan integer. Anda dapat membuat asumsi berikut tentang input:

  • String akan memiliki panjang yang aneh.
  • Bilangan bulat akan menjadi angka ganjil antara 1 dan satu kurang dari dua kali panjang string.

Keluaran

Sebuah labyrinthica inscriptio untuk string, menggunakan bilangan bulat untuk tinggi atau lebar (lihat model untuk contoh tinggi). Output harus setiap huruf tanpa spasi, jeda baris sebagai default untuk sistem / bahasa Anda.

Uji kasus

Perhatikan bahwa input 1 atau (panjang * 2 - 1) akan menghasilkan palindrom horizontal atau vertikal.

 Input: FOO, 3    Input: BAR, 1    Input: BAR, 3    Input: BAR, 5

Output: OOO      Output: RABAR    Output: RAR       Output: R
        OFO                               ABA               A
        OOO                               RAR               B
                                                            A
                                                            R

 Input: ABCDE, 5   Input: ABCDE, 3   Input: *<>v^, 5

Output: EDCDE     Output: EDCBCDE           ^v>v^
        DCBCD             DCBABCD           v><>v
        CBABC             EDCBCDE           ><*<>
        DCBCD                               v><>v
        EDCDE                               ^v>v^

Mencetak gol

Ini adalah sehingga jawaban terpendek dalam byte menang. Celah standar dilarang.

pengguna0721090601
sumber
Bisakah input berisi spasi? Jika demikian, bagaimana mereka harus ditangani?
Nitrodon
1
Bolehkah kita mengambil input sebagai daftar karakter?
Robin Ryder
1
@Charlie jelas Anda telah kehilangan semua jawaban Perl6 saya :-) Saya mengharapkan jawaban dari Anda juga karena itu terinspirasi oleh raja kelima Spanyol (well, dari Asturies, tetapi Asturies ye España, y tolo demá kamu tierra conquistao haha)
user0721090601
1
Bisakah kita mengambil lebar alih-alih tinggi?
attinat

Jawaban:

6

J , 27 byte

([{~]+/&(|@i:)#@[-1+])-:@<:

Cobalah online!

Contoh akan memperjelas pendekatan tingkat tinggi.

Mempertimbangkan 'ABCDE' f 3

Kami perhatikan bahwa yang kami cari hanyalah tabel "lintas tambahan" dari 1 0 1dan 3 2 1 0 1 2 3, yang terlihat seperti ini:

4 3 2 1 2 3 4
3 2 1 0 1 2 3
4 3 2 1 2 3 4

Kami kemudian menarik mereka indeks dari string asli: [{~.

Semua sisa kode aritmatika hanya membosankan dan penggunaan i:untuk membangun argumen 1 0 1dan 3 2 1 0 1 2 3.

Jonah
sumber
6

Jelly , 12 byte

Uṡṛ‘HɗŒBŒḄZY

Cobalah online!

Sebuah diad link mengambil string sebagai kiri dan tingginya sebagai argumen yang tepat. Mengembalikan string dengan jeda baris. Jika daftar string dapat diterima untuk output, saya dapat menghapus Ypenghematan akhir byte. Menariknya "SILO PRINCEPS FECIT" yang asli terlihat bagi saya seperti seni berlian 3D ASCII ketika saya melihatnya di TIO.

Penjelasan

U            | Reverse input
 ṡ   ɗ       | All overlapping substrings of the length given by:
  ṛ          | - The right argument
   ‘         | - Incremented by 1
    H        | - Halved
      ŒB     | Concatenate to the reverse, keeping a single copy of the last character (so creating a palindrome)
        ŒḄ   | Do the same, but this time using the lists of characters generated by the last atom
          Z  | Transpose
           Y | Join with newlines
Nick Kennedy
sumber
2
Saya mengklik coba hanya untuk melihat dan ya, memang, itu 3D. Aneh tapi keren.
user0721090601
6

R , 93 91 87 byte

-2 byte terima kasih kepada Giuseppe. -4 byte dengan memasukkan lebar daripada tinggi, sebagaimana diizinkan oleh OP.

function(s,W,w=W%/%2,h=length(s)-w-1)write(s[1+outer(abs(-w:w),abs(-h:h),`+`)],1,W,,"")

Cobalah online!

Mengambil input sebagai vektor karakter. Bagian kuncinya adalah s[1+outer(abs(-w:w),abs(-h:h),'+')].

wh(2w+1)×(2h+1)

(i,j)1+|ih|+|jw|abs(-w:w)abs(-h:h)abs(-h:h)[h,h1,h2,,2,1,0,1,2,,h1,h]outer(abs(-2:2), abs(-1:1), '+')

32123
21012
32123

(kita kemudian perlu menambahkan 1 karena R adalah 1-diindeks.) 0 di tengah adalah tempat huruf pertama dari input harus pergi.

Sisanya diformat.

Robin Ryder
sumber
5

Arang , 25 19 byte

E⊘⊕η✂θι⁺ι⁻Lθ⊘⊖η‖O←↑

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

E⊘⊕η✂θι⁺ι⁻Lθ⊘⊖η

Gambar seperempat dari prasasti itu.

‖O←↑

Renungkan untuk menyelesaikan tulisan.

Neil
sumber
1
Impresif! Saya baru di situs ini, saya minta maaf sebelumnya jika yang berikut adalah beberapa pertanyaan bodoh. 1. Itu pasti 19 karakter, tetapi apakah mereka juga 19 byte? dan 2. Dalam pengkodean apa teks itu akan membutuhkan 19 byte?
damix911
Ya, disandikan dalam UTF-8 ini akan mengambil 19 karakter , tetapi sebenarnya 51 byte. Dengan UTF-16, ini masih membutuhkan 39 byte untuk disandikan.
ruohola
1
@ damix911 Charcoal memiliki penyandian sendiri, yang dapat ditemukan di wiki-nya. Saya pikir karakter di luar halaman kode biaya 3 byte. Deverbosifier mencoba menghitung panjang yang benar tetapi tidak repot menyalin ke pengkodean yang sebenarnya, yang menjengkelkan.
Neil
1
@Neil Okey, sepertinya sah-sah saja!
ruohola
3

Japt -R , 19 16 byte

z
ò@VÔtXUaVÊ)êÃê

Cobalah

z\nò@VÔtXUaVÊ)êÃê     :Implicit input of integer U & string V
z                     :Floor divide U by 2
 \n                   :Reassign result to U
   ò                  :Range [0,U]
    @                 :Map each X
     VÔ               :  Reverse V
       tX             :  Substring from index X to index ...
         Ua           :    Absolute difference between U and ...
           VÊ         :    Length of V
             )        :  End substring
              ê       :  Palindromise
               Ã      :End map
                ê     :Palindromise
                      :Implicit output, joined by newlines
Shaggy
sumber
2

Bahasa Wolfram (Mathematica) , 57 54 byte

(g=Reverse@Rest@#~Join~#&)@BlockMap[g,#,⌈#2/2⌉,1]&

Cobalah online!

Mengambil lebar sebagai input.

attinat
sumber
1
@ lirtosiast maka yang pertama gtidak dievaluasi saat pertama kali fungsi dipanggil. Cobalah online!
attinat
Menarik, ada ide mengapa tampaknya berfungsi saat Anda menggunakan @@ atau @@@?
lirtosiast
@ lirtosiast Itu berpikir Print/@f[...]-> Print/@Transpose[g[...]]-> Transpose[Print@g[...]], dimana waktu gdidefinisikan.
attinat
2

Japt -R , 10 byte

Ôã°Vz)mê ê

Mengambil lebar alih-alih tinggi.

Cobalah

Pseudocode (U adalah string, V adalah bilangan bulat):

U.Reverse().AllSubstringsOfLength(++V / 2).Map(Palindromize).Palindromize
Perwujudan Ketidaktahuan
sumber
Bagus! Tidak pernah terpikir oleh saya untuk mencoba membangunnya ke samping.
Shaggy
2

Perl 6 , 68 67 byte

{say |$^a.comb[{$_...0...$_}($a.comb-$^b+>1-1)X+.abs]for ^$b-$b+>1}

Cobalah online!

nwellnhof
sumber
2

Python 3, 104 byte

Saya belum bermain golf begitu lama ... Saya yakin ini bisa lebih pendek.

Detail

Kode ini mendefinisikan fungsi yang mengambil dua argumen (string dan tinggi) dan memberikan hasil pada output standar.

Indeks ke dalam string adalah jarak Manhattan dari pusat grid. Untuk kisi lebar wdan tinggi h, jarak sel (x, y)adalah abs(x - (w - 1) / 2) + abs(v - (h - 1) / 2).

Lebar kisi harus sedemikian rupa sehingga jarak sudut Manhattan (katakanlah (0, 0)) adalah satu kurang dari panjang tali. Mengganti (0, 0)menjadi di atas dan menyederhanakan, kami menemukan bahwa lebarnya sederhana 2 * len(s) - h.

Kode

def b(s,h):
 w=2*len(s)-h
 for y in range(h):print(''.join(s[abs(x-w//2)+abs(y-h//2)]for x in range(w)))

Cobalah online!

Tim Pederick
sumber
1

Pyth , 19 byte

L+_btbjyyM.:Q-lQ/E2

Cobalah online!

L+_btbjyyM.:Q-lQ/E2   Implicit: Q=string, E=height
L                     Define a function, y(b):
  _b                    Reverse b
 +  tb                  Append all be first element of b
                      y is now a palindromisation function
              lQ      Length of Q
             -  /E2   Subtract floored division of E by 2
          .:Q         All substrings of Q with the above length
        yM            Palindromise each substring
       y              Palindromise the set
      j               Join on newlines, implicit print
Sok
sumber
1

Python 2 , 95 byte

def f(s,n):
 y=len(s);n//=2
 for i in range(n+1)+range(n)[::-1]:print s[y+~i:n-i:-1]+s[n-i:y-i]

Cobalah online!

wilkben
sumber
1

C # (.NET Core) , 146 byte

s=>n=>{int w=s.Length*2-n,i=0,j;var r=new char[n,w];for(;i<n;i++)for(j=0;j<w;)r[i,j]=s[System.Math.Abs(n/2-i)+System.Math.Abs(w/2-j++)];return r;}

Cobalah online!

Jawaban terpanjang begitu lama. :-) Ini menggunakan jarak Manhattan ke pusat alun-alun. Namun, harus ada cara yang lebih singkat.

Charlie
sumber
1

Tcl , 188 170 162 byte

{{w s} {join [lmap C [lrepeat $w string] {join [$C reverse [set y [$C range $s [set x [expr abs($w/2+1-[incr i])]] end-[expr $w/2-$x]]]][$C range $y 1 end]}] \n}} bytes

Cobalah online!

Tampaknya ada sejuta cara buruk untuk mengatasi masalah ini di TCL. Ini bukan yang terburuk dari mereka.

Disimpan minimum 18 byte dengan mengonversi ke lambda (dapat menyimpan hingga 13 lebih jika nilai pengembalian daftar garis dapat diterima)

Menyimpan tambahan 8 sejak lmap iterator berfungsi sebagai konstanta tambahan

SmileAndNod
sumber
1

Kanvas , 18 byte

±X↕┌L╵┌-Y{x;1y1@]┼

Coba di sini!

Kanvas tidak melakukan substring, jadi saya perlu memperlakukannya seperti benda seni dan mendapatkan subbagian seperti itu. Saya merasa ini menghabiskan 2 byte, tapi hei, apa yang bisa Anda lakukan.

Sepertinya ini sebenarnya tidak berfungsi seperti yang saya kira: Fungsi palindromize Canvas mencerminkan karakter tertentu (mis. V mirroring secara vertikal menjadi ^), dan saya tidak bisa menonaktifkannya ... oh well, saya kira

hakr14
sumber