Membuat kata-kata octogonal

14

Pengguna Kamis lalu @SpookyGengar membuat kami senang dengan tantangan pertamanya tentang Membuat Kata Kuadrat . Bagaimana jika kita menggandakan jumlah sisi?

Tantangan

Ambil string sebagai input dalam format wajar apa pun yang Anda butuhkan ( string, chararray ...) dan output representasi octogonal dari input (juga dalam format apa pun yang masuk akal:, stringdaftar strings, charmatriks ...) seperti dalam contoh berikut:

Input: golf
Output:

   golf
  o    l
 l      o
f        g
l        o
o        l
g        f
 o      l
  l    o
   flog


Input: HelloWorld
Output:

         HelloWorld
        e          l
       l            r
      l              o
     o                W
    W                  o
   o                    l
  r                      l
 l                        e
d                          H
l                          e
r                          l
o                          l
W                          o
o                          W
l                          o
l                          r
e                          l
H                          d
 e                        l
  l                      r
   l                    o
    o                  W
     W                o
      o              l
       r            l
        l          e
         dlroWolleH


Input: a
Output:

a


Input: ab
Output:

 ab
b  a
a  b
 ba


Input: code golf
Output:

        code golf
       o         l
      d           o
     e             g

   g                 e
  o                   d
 l                     o
f                       c
l                       o
o                       d
g                       e

e                       g
d                       o
o                       l
c                       f
 o                     l
  d                   o
   e                 g

     g             e
      o           d
       l         o
        flog edoc

Catatan

  • Input hanya akan terdiri dari karakter ASCII yang dapat dicetak.
  • Leading dan / atau trailingpaces dan baris baru dibiarkan selama bentuk octogonal dipertahankan.
  • Ini adalah , jadi semoga program / fungsi yang paling baik untuk setiap bahasa menang!
Charlie
sumber
5
"Bagaimana jika kita menggandakan jumlah sisi?" <- maka arang masih akan menang
Leaky Nun
Testcase yang disarankan:code golf
Leaky Nun
@LeakyNun <Space>dianggap dapat dicetak?
V. Courtois
2
@ V.Courtois ya
Leaky Nun
@LeakyNun menambahkan test case.
Charlie

Jawaban:

10

Arang , 16 byte (10 byte tidak bersaing)

F⁸«✂θ⁰±¹↷¹A⮌θθ»θ

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

F⁸«                 Repeat for each side of the octagon
   ✂θ⁰±    ¹        Print the input except the last character
        ↷¹          Rotate 45° clockwise
          A⮌θθ      Reverse the input string
              »θ    Print the input again, to handle the length 1 case

Alternatif panjang 1 fix, juga 16 byte: Versi Verbose.

PθF⁸«✂θ⁰±¹↷¹A⮌θθ

Perbaikan bug Charcoal berarti bahwa kode 10-byte berikut sekarang berfungsi: Versi Verbose.

F⁴«θ←↘⮌θ↖⟲
Neil
sumber
Sepertinya hanya harus melakukan ini. Lol
Magic Gurita Guci
1
Umm, kurasa code golfitu tidak berhasil?
Erik the Outgolfer,
Oh, dan ini sebenarnya 16 byte (ganti θθθdengan θθ»θ).
Erik the Outgolfer
@EriktheOutgolfer Ups, maaf soal itu, saya tidak berpikir untuk menguji perbaikan saya untuk kasus panjang 1 ... catatan pengujian saya pada pertanyaan belum terlalu bagus, bukan?
Neil
@Neil Tapi bagaimana dengan masalah ini code golf? Saya pikir itu ada hubungannya dengan bagaimana Charcoal mengambil input, yang, sayangnya, mendiskualifikasi sepenuhnya dari tantangan ini karena itu tidak dapat dielakkan.
Erik the Outgolfer
5

JavaScript (ES6), 156 byte

f=
s=>[...Array((l=s.length-1)*3+1)].map((_,i,a)=>a.map((_,j)=>s[i+j-l?l*5-i-j?i+l*2-j?j+l*2-i?i%(l*3)?j%(l*3)?-1:j?i-l:l+l-i:i?l+l-j:j-l:j:l-i:l*3-i:i]||` `))
<input oninput=o.textContent=this.value?f(this.value).map(function(a){return(a.join``)}).join`\n`:``><pre id=o>

Mengembalikan array karakter.

Neil
sumber
1
Tampaknya hanya berfungsi dengan string panjang 4.
Charlie
1
@CarlosAlejo Maaf, tidak cukup hati-hati memeriksa. Nyaman, perbaiki 2 byte yang disimpan!
Neil
Ya ampun, banyak sekali ternary ?:!
Erik the Outgolfer
@EriktheOutgolfer hal yang baik itu bukan python atau itu akan benar-benar verbose: P
Stephen
3

Mathematica, 247 byte

(T=Table;k=Length[s=Characters@#];If[k==1,#,Column[Flatten@{#,T[""<>{s[[i]],T["  ",k/2-2+i],s[[-i]]},{i,2,k}],T[""<>{s[[-i]],T["  ",k+k/2-2],s[[i]]},{i,2,k}],T[""<>{s[[i]],T["  ",3k/2-1-i],s[[-i]]},{i,2,k-1}],StringReverse@#},Alignment->Center]])&
J42161217
sumber
Anda tidak perlu Alignmentdan Anda akan menyimpan byte dengan menggunakan menunda set ( :=) untuk mengurangi pengulangan s[[i]]dan s[[-i]], Anda turun ke 224 byte dengan ide-ide ini: (T = Tabel; q: = s [[i]]; r: = s [[- i]]; k = Panjang [s = Karakter @ #]; Jika [k == 1, #, Kolom [Ratakan @ {#, T ["" <> {q, T ["",, k / 2-2 + i], r}, {i, 2, k}], T ["" <> {r, T ["", k + k / 2-2], q}, {i, 2, k}], T ["" <> {q, T ["", 3k / 2-1-i], r}, {i, 2, k-1}], StringReverse @ #}, Tengah] ]) & Juga, saya punya solusi alternatif yang hanya 145 byte pada saat komentar ini.
Mark S.
2

Pyth , 79 69 65 byte

j++K+]+*dJtlzzm+++*;-Jd@zd*;+ytdlz@z_hdSJjL*;t*3tlztC_B_zt__MC.tK

Suite uji .

Biarawati Bocor
sumber
2

Japt , 84 79 byte

-5 byte terima kasih kepada @ETHproductions.


Ål
VoA{A?(UÅw +Uê)£Y¥V*2+AªY¥V-A?X:SÃ:Vç +U+Vç
Wf cU¬£V?(V*3 ç hUg~Y)+X:XÃcWz2

Memimpin baris baru adalah bagian dari program. Mengambil string sebagai input dan mengembalikan array string.

Cobalah online! dengan -Rbendera untuk bergabung dengan array yang dihasilkan dengan baris baru.

Bukan pekerjaan paling bangga saya, tapi saya turun dari ~ 100 byte, setidaknya. Ide saya di sini adalah membuat bagian atas dan tengah, kemudian menambahkan bagian atas, diputar 180 °.

Justin Mariner
sumber
Bagus. Saya tidak melihat banyak perbaikan segera, tetapi Anda bisa berubah Ul Émenjadi UÅl, dan beralih V dan W untuk menyimpan 2 byte lagi: codepen.io/justinm53/full/…
ETHproductions
Juga, AnV ?-> V-A?, dan Uq £->U¬£
ETHproduksi
@ EHProduk Hebat, terima kasih! Tidak percaya saya lupa tentang¬ .
Justin Mariner
1

Python 2 , 220 213 byte

  • Mengejutkan lebih lama dari yang saya bayangkan.
a=input()
l=len(a)
r=range(l)
print'\n'.join(p.center(l*3-2)for p in[a]+(l>1)*([a[i]+(2*i-2+l)*' '+a[~i]for i in r[1:-1]]+[a[~i]+(l*3-4)*' '+a[i]for i in r]+[a[i]+(3*l-2*i-4)*' '+a[~i]for i in r[1:-1]]+[a[::-1]]))

Cobalah online!

officialaimm
sumber
1

PHP 7.1, 230 156 155 byte

for($x=$e=strlen($s=$argn)-1;$n<9;$r[$y][$x+=$n+1&3?$n&4?-1:1:0]=$s[$i],$i+=($n+=!$i||$i==$e)&1?:-1)$r[$y+=$n-1&3?$n<6?:-1:0]=$r[$y]?:"";echo join("
",$r);

Jalankan sebagai pipa dengan -nRatau coba online .

kerusakan

for($x=$e=strlen($s=$argn)-1;   # import to $s, set $e to length-1, init $x
    $n<9;                       # loop through 8 repetitions of string
    $r[$y][
        $x+=$n+1&3?$n&4?-1:1:0      # 3. increment/decrement $x depending on $n
    ]=$s[$i],                       # 4. copy character to current position
    $i+=(
        $n+=!$i||$i==$e             # 5. if first or last character of string, increment $n
    )&1?:-1                         # 6. if odd repetition next, else previous character
)
    $r[
        $y+=$n-1&3?$n<6?:-1:0       # 1. increment/decrement $y depending on $n
    ]=$r[$y]?:"";                   # 2. if empty, init row to string
echo join("\n",$r);             # output
Titus
sumber
1

Mathematica, 168 166 147 127 byte

(n=Length@#;b=Array[" "&,3{n,n}-2];Do[l={{1,n+k-1},{k,n-k+1}};l=Join[l,Cross/@l];b=ReplacePart[b,Join[l,-l]->#[[k]]],{k,n}];b)&

Ini mengambil daftar string satu karakter dan mengeluarkan matriks string satu karakter.

Saya menghemat 18 byte dengan mengeksploitasi simetri untuk digunakan -ldan Cross/@lyang mengambil sesuatu seperti produk silang dari masing-masing dari dua vektor 2D tunggal untuk dibawa {x,y}ke {-y,x}. Pada dasarnya, dua arah awal adalah Timur (tepi atas) dan Barat Daya (tepi kanan atas). Kemudian kami menambahkan rotasi 90 derajat berlawanan arah jarum jam dengan Cross: Utara untuk tepi kiri dan Tenggara untuk tepi kiri bawah. Kemudian kita tambahkan empat bagian lainnya menggunakan -luntuk membalik empat yang kita bahas.

Anda dapat mengujinya di kotak pasir dengan sesuatu seperti:

(n=Length@#;b=Array[" "&,3{n,n}-2];Do[l={{1,n+k-1},{k,n-k+1}};l=Join[l,Cross/@l];b=ReplacePart[b,Join[l,-l]->#[[k]]],{k,n}];b)&[{"H","e","l","l","o"," ","G","o","l","f"}]//MatrixForm
Tanda.
sumber