Создание восьмиугольных слов

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
«Что если мы удвоим количество сторон?» <- тогда уголь все равно выиграет
Leaky Nun
Предлагаемый тест:code golf
Дрянная монахиня
@ 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⮌θθ

Исправление Charcoal означает, что теперь работает следующий 10-байтовый код: Подробная версия.

F⁴«θ←↘⮌θ↖⟲
Нил
источник
Похоже, он должен просто сделать это. Lol
Волшебная Осьминог Урна
1
Хм, я не думаю, что code golfработает, не так ли?
Эрик Outgolfer
Ох, и это на самом деле 16 байтов (заменить θθθна θθ»θ).
Эрик Outgolfer
@EriktheOutgolfer Ой, извините, я не думал проверять свое исправление для случая длины 1 ... моя контрольная запись по этому вопросу не очень хорошая, не так ли?
Нил
@Neil Но как насчет проблемы с code golf? Я думаю, что это связано с тем, как древесный уголь получает информацию, которая, к сожалению, полностью исключает его из этой проблемы, поскольку ее нельзя обойти.
Эрик Outgolfer
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 байта!
Нил
О, это много троичных ?:с!
Эрик Outgolfer
@EriktheOutgolfer хорошо, что это не Python или это было бы действительно многословно: P
Стивен
3

Mathematica, 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]])&
J42161217
источник
Вам не нужно, Alignmentи вы бы сохранили байты с помощью delayedset ( :=), чтобы уменьшить количество повторений s[[i]]и. s[[-i]]Вы получите 224 байта с этими идеями: (T = Таблица; q: = s [[i]]; r: = s [[- i]]; k = длина [s = символы @ #]; если [k == 1, #, столбец [Flatten @ {#, 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¬£
ETHпродукция
@ETHproductions Удивительно, спасибо! Не могу поверить, что я забыл о ¬.
Джастин Маринер
1

Python 2 , 220 213 байт

  • Удивительно дольше, чем я себе представлял.
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]]))

Попробуйте онлайн!

officialaimm
источник
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
Titus
источник
1

Mathematica, 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
Метки.
источник