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!

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⁴«θ←↘⮌θ↖⟲

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


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]])&

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

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


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!


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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.