Складання восьмикутних слів


14

Минулого четверга користувач @SpookyGengar порадував нас своїм першим викликом щодо складання квадратних слів . Що робити, якщо подвоїти кількість сторін?

Змагання

Візьміть рядок як вхід у будь-якому необхідному вам форматі ( string, charмасив ...) та виведіть восьмикутне подання вводу (також у будь-якому розумному форматі: stringсписок strings, charматриця ...), як у наступних прикладах:

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

Примітки

  • Введення складається з символів, що друкуються ASCII.
  • Провідні та / або проміжні пробіли та нові рядки допускаються до тих пір, поки зберігається восьмикутна форма.
  • Це , тому може виграти найрізноманітніша програма / функція для кожної мови!

5
"Що робити, якщо ми подвоїмо кількість сторін?" <- тоді вугілля все одно переможе
Лина монашка

Рекомендована перевірка:code golf
Leaky Nun

@LeakyNun <Space>вважається для друку?
В. Куртуа

2
@ V.Courtois так
Leaky Nun

@LeakyNun додано тестовий випадок.
Чарлі

Відповіді:


10

Вугілля деревне , 16 байт (10 байт неконкуренто)

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

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Пояснення:

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

Альтернативна поправка довжиною 1, також 16 байт: Докладна версія.

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

Виправлення помилок у вугіллі означає, що зараз працює наступний 10-байтний код: Вербальна версія.

F⁴«θ←↘⮌θ↖⟲

здається, що слід просто це зробити. Lol
Magic Octopus Urn

1
Гм, я не думаю, code golfщо це працює?
Ерік Аутгольфер

О, і це насправді 16 байт (замінити θθθна θθ»θ).
Ерік Аутгольфер

@EriktheOutgolfer На жаль, я не думав перевіряти своє виправлення на випадок довжини 1 ... мій тестовий запис з цього питання не дуже хороший, чи не так?
Ніл

@Neil Але що з проблемою code golf? Я думаю, що це стосується того, як вугілля приймає внесок, який, на жаль, повністю позбавляє його від цього виклику, оскільки цього не можна обійти.
Ерік Аутгольфер

5

JavaScript (ES6), 156 байт

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>

Повертає масив символів.


1
Здається, працює лише з струнами довжиною 4.
Чарлі

1
@CarlosAlejo Вибачте, не перевірив достатньо уважно. Зручно виправити збережені 2 байти!
Ніл

О, це багато потрійних ?:с!
Ерік Аутгольфер

@EriktheOutgolfer добре, що це не пітон, або це було б дійсно багатослівно: P
Stephen

3

Математика, 247 байт

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

Вам не потрібно, Alignmentі ви будете зберігати байти, використовуючи delayedset ( :=), щоб зменшити повторення, s[[i]]і s[[-i]]ви отримаєте до 224 байт з цими ідеями: (T = Таблиця; q: = s [[i]]; r: = s [[- i]]; k = довжина [s = символи @ #]; якщо [k == 1, #, стовпець [згладити @ {#, 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 @ #}, Центр] ]) & Також у мене є альтернативне рішення, яке на момент цього коментаря становило всього 145 байт.
Марк С.


2

Japt , 84 79 байт

-5 байт завдяки @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

Ведучий новий рядок є частиною програми. Приймає рядок як вхідний і повертає масив рядків.

Спробуйте в Інтернеті! з -Rпрапором, щоб приєднати отриманий масив з новими рядками.

Це не моя найгордіша робота, але я її принаймні з ~ 100 байт. Моя ідея тут полягала в тому, щоб створити верхню і середню частини, потім прикріпити верхню частину, повернуту на 180 °.


Приємно. Я не бачу багато поліпшень відразу, але ви могли б змінити , Ul Éщоб UÅlі перемикач V і W , щоб зберегти більше 2 байта: codepen.io/justinm53/full / ...
ETHproductions

Також, AnV ?-> V-A?і Uq £->U¬£
ETHproductions

@ETHproductions Чудовий, дякую! Не можу повірити, що забув ¬.
Джастін Марінер


1

PHP 7.1, 230 156 155 байт

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

Запустіть як трубу -nRабо спробуйте в Інтернеті .

зламатися

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

Математика, 168 166 147 127 байт

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

Це займає список односимвольних рядків і виводить матрицю односимвольних рядків.

Я врятував 18 байт, експлуатуючи симетрію використовувати -lі Cross/@lяка приймає що - щось на зразок перехресного продукту кожної з двох окремих 2D векторів взяти {x,y}на {-y,x}. В основному два початкові напрямки - Схід (верхній край) та Південно-Західний (верхній правий край). Потім додаємо обертання їх на 90 градусів проти годинникової стрілки Cross: Північ для лівого краю та Південний Схід для лівого нижнього краю. Потім додаємо в інші чотири шматки, використовуючи, -lщоб перевернути чотири, які ми накрили.

Ви можете перевірити це на пісочниці з чимось на зразок:

(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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.