Делать квадратные слова


38

Соревнование

Ваша задача - создать программу, которая принимает любой заданный строковый ввод и выводит ввод в квадрате. Пустые строки должны возвращать пустую строку.

Примеры

Учитывая вход:

golf

Ваша программа должна вывести:

golf
o  l
l  o
flog

Входные данные:

123

Выход:

123
2 2
321

Входные данные:

a

Выход:

a

Входные данные:

Hello, world!

Вывод (обратите внимание на пробел между, и w - пробел не просто перевод строки):

Hello, world!
e           d
l           l
l           r
o           o
,           w

w           ,
o           o
r           l
l           l
d           e
!dlrow ,olleH

счет

Это , поэтому выигрывает самый короткий ответ на каждом языке.


@DJMcMayhem Да, мои извинения я забыл добавить это.
SpookyGengar

2
Не беспокойтесь, просто двойная проверка. Хороший первый вызов, кстати! Добро пожаловать на сайт :)
DJMcMayhem

@SpookyGengar Не могли бы вы добавить контрольный пример для однобуквенного ввода?
musicman523

@ musicman523 у меня его уже нет? Третий пример, включающий только букву «а».
SpookyGengar

1
@SpookyGengar мой плохой, я, видимо, слепой
musicman523

Ответы:


17

Древесный уголь , 7 5 байт

θ‖O↙↘

Попробуйте онлайн! Ссылка на подробную версию кода. Изменить: Сохранено 2 байта благодаря @CarlosAlejo. Объяснение:

θ       Print the input string, making the top row
 ‖O     Reflect with overlap...
   ↙    ... down and left, to create the left side
    ↘   ... down and right, to create the bottom and right sides

(Несколько указаний на команду «Отражать» выполняются последовательно, а не одновременно.)


Ух ты, Иисус, я все еще думаю, что уголь был самой крутой идеей esolang.
Волшебная Осьминог Урна

1
Вы можете сохранить два байта , если вы просто напечатать строку ввода и отражает его downleftwards и downrightwards: θ‖B↙↘. Попробуйте онлайн!
Чарли

Теперь, когда я думаю об этом, возможно, мне следовало бы использовать ReflectOverlapвместо того, ReflectButterflyчтобы избегать переключения символов. :-)
Чарли

1
Это один из редких случаев, когда гольф-ответ на эзотерическом языке легче читать и понимать, чем полные версии без языка популярных языков общего назначения.
Калеб

Ваш ответ здесь также работает на 4 байта.
Оливер

10

MATL , 20 16 11 байт

otYTO6Lt&(c

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

РЕДАКТИРОВАТЬ: код работает в выпуске 20.2.1, который предшествует вызову. Ссылка использует этот выпуск. (В 20.2.2 код был бы короче, но это ставит перед проблемой).

объяснение

o     % Implicitly input a string. Convert chars to ASCII codes
t     % Duplicate
YT    % 2-input Toeplitz matrix
O     % Push 0
6L    % Push predefined literal [2, -1+1j]. When used as an index, this is
      % interpreted as 2:end-1 (indexing is 1-based)
t     % Duplicate
&(    % 4-input assignment indexing. This writes 0 at the square formed by
      % rows 2:end-1 and columns 2:end-1 
c     % Convert to char. Char 0 is shown as space. Implicitly display

Очень впечатляюще! :) Можно ли убрать пустую строку внизу каждого вывода или это необходимо для функциональности?
SpookyGengar

2
@SpookyGengar Очень распространенная просьба разрешить одиночный завершающий перевод строки.
Джонатан Аллан

@SpookyGengar Спасибо! MATL всегда отображает завершающий символ новой строки. Как говорит Джонатан, это обычно разрешено
Луис Мендо

1
@LuisMendo Вы узнаете что-то новое каждый день. :) Спасибо за представление - безусловно, лучшее пока!
SpookyGengar

6

Желе ,  29 22  17 байт

Уголь будет пороть + d этот счет ...

J⁶ẋa0,1¦"ṚṚ;$ṖŒḌY

Монадическая ссылка, берущая и возвращающая списки символов; или полная программа печати результата.

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

Как?

J⁶ẋa0,1¦"ṚṚ;$ṖŒḌY - Link: list of characters, w     e.g. "whole"
 ⁶                - literal space character              ' '
J                 - range(length(w))                     [1,2,3,4,5]
  ẋ               - repeat                               [" ","  ","   ","    ","     "]
         Ṛ        - reverse w                            "elohw"
        "         - zip with:
       ¦          -   sparse application of:
   a              -     and (vectorises)
    0,1           -     to indexes: [0,1] (last and 1st) ["e","ll","o o","h  h","w   w"]
            $     - last two links as a monad:
          Ṛ       -   reverse                            ["w   w","h  h","o o","ll","e"]
           ;      -   concatenate                        ["w   w","h  h","o o","ll","e","e","ll","o o","h  h","w   w"]
             Ṗ    - pop (remove last entry)              ["w   w","h  h","o o","ll","e","e","ll","o o","h  h"]
              ŒḌ  - reconstruct matrix from diagonals    ["whole","h   l","o   o","l   h","elohw"]
                Y - join with newlines                   "whole\nh   l\no   o\nl   h\nelohw"
                  - if running as a full program implicit print

Очень круто! Пока что самое короткое решение, но не работает с односимвольными вводами и строками, состоящими из чисел, т.е. «123».
SpookyGengar

Ах, мне придется обрабатывать случай с одним символом, да. Он работает со строками из цифр и символов, входные данные программы должны быть заключены в кавычки, например 'Hello', «Spooky's» "123"и т. Д. (Python используется для интерпретации ввода).
Джонатан Аллан

@SpookyGengar - исправлено для случая с 1 символом.
Джонатан Аллан

Хорошее сокращение длины!
Луис Мендо

2
Вы правы насчет угля.
Нил

3

C 109 байтов

i,j;f(char*s){for(i=j=printf("%s\n",s)-2;1[++s];)printf("%c%*c\n",*s,i,s[j-=2]);for(;*s*~i--;)putchar(*s--);}

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

Заслуживающие внимания приемы:

  • Вместо того, чтобы тратить байты strlen, мы просто берем длину строки и одновременно печатаем первую строку:

    i=j=printf("%s\n",s)-2

    Это работает, потому что printfвозвращает количество записанных байтов.

  • Для средних строк нам нужно перебрать строку, но исключить как первый, так и последний символ. Это достигается с условием

    1[++s]

    (который короче, чем (++s)[1]), который пропускает первый символ из-за ++нахождения в условии и пропускает последний, останавливаясь, когда находится символ после текущего символа '\0'(а не останавливаясь на '\0' ).

  • В теле первого цикла

    printf("%c%*c\n",*s,i,s[j-=2])

    мы печатаем текущий символ, а затем соответствующий «зеркальный» символ (отслеживая с j, который переходит в отрицательные значения, что приводит к нечетной ситуации индексации в строку с отрицательным числом), дополненную длиной iс пробелами (где iесть удобно strlen(s) - 1).

  • Обратная печать на последней строке довольно проста; единственный трюк - *s*~i--это самый короткий способ получить i+2итерации тела цикла (который не зависит от i; все i, что нужно, это считать). Прикольная *s*часть гарантирует, что цикл не запускается, если *sесть '\0', что происходит на входе length-1.


3

Октава, 40 байт

@(s,t=toeplitz(s),u=t(x=2:end-1,x)=32)t;

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

Это мой ответ, но опубликованный после ответа @Luis MATL


2
Очень хороший ответ. Кстати: ваш код разбил ветку разработки GNU Octave 4.3.1 (b481a9baeb61) и теперь является частью набора тестов :-) hg.savannah.gnu.org/hgweb/octave/rev/c94e9509461b
Энди

1
@ Andy Спасибо и добро пожаловать в Codegolf! Я рад, если это поможет улучшить проект Octave!
rahnema1

3

Haskell , 84 78 байт

f s@(_:x)|_:y<-r x=s:[a:(y>>" ")++[b]|(a,b)<-zip x y]++[r s];f s=[s]
r=reverse

Попробуйте онлайн! Использование: f "test". Возвращает список строк.

Изменить: -6 байт благодаря Дайан!


1
Вы можете сохранить несколько байтов, используя шаблонную защиту в качестве защиты и определив синоним для reverse; r=reverse;f s@(_:x)|_:y<-r x=s:[a:(y>>" ")++[b]|(a,b)<-zip x y]++[r s];f s=[s]составляет 78 байтов.
Даяна



2

05AB1E , 17 16 15 19 байтов

ÂDÂø¦¨Dgú€Ás)˜»Igi¨

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

объяснение

Пример с input = golf

ÂDÂ                  # bifurcate, duplicate, bifurcate
                     # STACK: 'golf', 'flog', 'flog', 'golf'
   ø                 # zip the top 2 items
                     # STACK: 'golf', 'flog', ['fg', 'lo', 'ol', 'gf']
    ¦¨               # remove the first and last element
                     # STACK: 'golf', 'flog', ['lo', 'ol']
      Dg             # get the length of the list
                     # STACK: 'golf', 'flog', ['lo', 'ol'], 2
        ú            # prepend that many spaces to each element
                     # STACK: 'golf', 'flog', ['  lo', '  ol']
         €Á          # rotate each right
                     # STACK: 'golf', 'flog', ['o  l', 'l  o']
           s         # swap the top 2 items
                     # STACK: 'golf', ['o  l', 'l  o'], 'flog'
            )˜       # wrap in a flattened list
                     # STACK: ['golf', 'o  l', 'l  o', 'flog']
              »      # join on newline
               Igi¨  # if input is length 1, remove last char

Исправление для ввода 1 буквы было довольно дорого.
Я чувствую, что другой подход может быть лучше сейчас.


1

Python 2 , 99 88 байт

-4 байта благодаря musicman523.

lambda s:s[1:]and[s]+[s[i]+' '*(len(s)-2)+s[~i]for i in range(1,len(s)-1)]+[s[::-1]]or s

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

Возвращает список строк.


Близко! Вывод не совсем то, что я прошу.
SpookyGengar

1
89 байтов путем перемещения sи s[::-1]вjoin
musicman523

Это не совсем работает для струн 1-й длины
musicman523

2
Просто чтобы отметить, все проблемы были исправлены.
полностью человек

1

Mathematica, 128 байт

(c=Column;g=Length[x=Characters@#]-1;If[g==0,#,c@{#,c@Table[""<>{x[[i]],""<>Table[" ",g-1],x[[-i]]},{i,2,g}],StringReverse@#}])&

1

C 96 байтов

i,l;f(char*s){for(i=l=puts(s)-2;--i;)printf("%c%*c\n",s[l-i],l,s[i]);for(;l+1;)putchar(s[l--]);}

Бонусная версия (122 байта):

x,y,i,l;f(char*s){for(i=l=puts(s)-1;++i<l*-~l;putchar(x==l?10:x%~-l*(y%~-l)?32:s[(x*y?l+l-2-x-y:x+y)%l]))x=i%-~l,y=i/-~l;}


1

Python 3, 88 байт

w=input();p=print;l=len(w)-2
[p(w[n+1]+' '*l+w[l-n])for n in range(l)]
l+1and p(w[::-1])

1
Добро пожаловать в PPCG!
Мартин Эндер

Добро пожаловать на сайт! Я считаю, что это l+1 andможет быть переписано, l+1andчтобы сохранить байт.
Пшеничный волшебник

@WheatWizard отредактировано - спасибо! Я был удивлен, что сработало ...
Леви

Это будет работать, за исключением случая 0or, когда python не сможет выполнить синтаксический анализ, поскольку 0oявляется восьмеричным префиксом.
Пшеничный волшебник

Когда я запускаю это, кажется, что верхняя строка не печатается
Коти Джонатан Саксман

1

JavaScript (ES8), 108 112 байт

let f = 

s=>(n=s.length)<2?s:(r=[...s].reverse()).slice(1,-1).reduce((a,v,i)=>a+`
`+s[i+1].padEnd(n-1)+v,s)+`
`+r.join``

o.innerHTML = f("hello folks!")
<pre id="o"></pre>

Менее голф

s=>
   (n=s.length) < 2 ?    // record and check length
   s :                   // s has 0 or 1 char, else
   (r=[...s].reverse())  // reverse characters,
   .slice(1,-1)          // exclude 1st and last
   .reduce((a,v,i)=>     // append inner lines
      a +'\n' +s[i+1].padEnd(n-1) + v
    ,s)                  // to first line
    + '\n' +r.join("")   // append characters reversed

Спасибо Джастину Маринеру за сохранение большого количества байтов, которые потом привыкли добавлять проверку нуля или одного символа, необходимую для выполнения задачи. Вы получаете это :-(


Вы можете сохранить 7 байтов, сделав вторую строку `+s[i+1].padEnd(s.length-1)+v,s)+`и используя r.join``.
Джастин Маринер

Спасибо @JustinMariner за советы String.prototype.padStartи помеченные литералы шаблонов. Мне это нужно, чтобы
свести

Ваш интервал на один символ слишком мал; Вы можете исправить это и сохранить пару больше, делая (n=s.length-1)?(r=<...>+r.join``:sи используя padEnd(n). Если длина 1, length-1это 0(ложь).
Джастин Маринер

Интервал @JustinMariner исправлен, но я сохранил тест длины - насколько я понимаю, и строки нулевой длины, и строки одного символа возвращают себя без возврата каретки или повторения строки.
traktor53

1
padEndэто ES2017.
Нил

1

PHP , 118 байт

echo $s=$argv[1];$l=strlen($r=strrev($s))-1;for($i=$l-1;$l&&$i;)echo "\n".str_pad($r[$i],$l).$s[$i].(--$i?"":"\n$r");

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

echo $s = $argv[1];
$l = strlen($r = strrev($s)) - 1;

for ($i = $l - 1; $l && $i;)
    echo "\n" . str_pad($r[$i], $l) . $s[$i] . (--$i ? "" : "\n$r");

1

APL , 58 байт

{(' ',⍵)[x+(x←∘.{((c-1)=⍺⌈⍵)∨0=⍺⌊⍵}⍨r)×o⌊⌽⊖o←∘.⌈⍨r←⍳c←≢⍵]}

С ⎕IO←0.

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

Как?

c←≢⍵ - длина струны

r←⍳ - диапазон

o←∘.⌈⍨ - внешний продукт с минимумом

123
223
333

o⌊⌽⊖- минимизировать с собой повернутый на 180 o

123  ⌊  333  =  123
223  ⌊  322  =  222
333  ⌊  321  =  321

× - умножить на

x←∘....⍨r - внешний продукт ассортимента с

    ((c-1)=⍺⌈⍵)∨0=⍺⌊⍵ - рамка матрицы

111  ×  123  =  123
101  ×  222  =  202
111  ×  321  =  321

x+ - добавить рамку

111  +  123  =  234
101  +  202  =  303
111  +  321  =  432

(' ',⍵)[...] - получить по индексу строку, соединенную с пробелом


Может ⍉⊖⍉⊖быть ⌽⊖?
Захари

@ Zacharý спасибо
Уриэль

0

JavaScript (ES2017), 87 байт

s=>[...s].reverse(l=s.length-1).map((c,i,z)=>i?l-i?s[i].padEnd(l)+c:z.join``:s).join`
`

Версия ES6: 93 байта

s=>[...s].reverse(l=s.length-1).map((c,i,z)=>i?l-i?s[i]+' '.repeat(l-1)+c:z.join``:s).join`
`

Меньше гольфа

s => (
  l = s.length-1,
  [...s].reverse().map( // scan string backwards
     (c, i, z) => 
     i != 0 // check if top row
     ? l-i != 0 // check if bottom row
       ? s[i].padEnd(l) + c // any middle row
       : z.join`` // bottom row: string reversed
     :s // top row: original string
  ).join`\n`
)

F=
s=>[...s].reverse(l=s.length-1).map((c,i,z)=>i?l-i?s[i].padEnd(l)+c:z.join``:s).join`
`

function update() {
  O.textContent = F(I.value)
}

update()
<input id=I value='Hello, world!' oninput='update()'>
<pre id=O></pre>


padEndэто ES2017.
Нил

@ Нейл спасибо, я
поменяю

Вы можете сохранить байт в своей версии ES6 с помощью l+~iэтого, чтобы избежать необходимости вычитать 1 дважды, вместо этого вы можете вычесть 2 один раз.
Нил

@ Ней это должно бытьl-~-i
edc65

Я думал о, s=>[...s].reverse(l=s.length).map((c,i,z)=>i?l+~i?s[i]+' '.repeat(l-2)+c:z.join``:s).join`\n` но s=>[...s].reverse(l=s.length-2).map((c,i,z)=>i?i+~l?s[i]+' '.repeat(l)+c:z.join``:s).join`\n` также работает.
Нил

0

Java, 191 байт

(s)->{PrintStream o=System.out;int l=s.lenght();o.println(s);for(int i=0;i<l;i++){o.printf("%"+"s%"+(l-1)+"s%n",s.charAt(i),s.charAt(l-1-i));for(int i=0;i<l;i++){o.print(s.charAt(l-1-i));}}};

(s)может быть просто s. У петель с единственными линиями внутри могут быть удалены их фигурные скобки. Вы можете вернуться вместо печати, если это сэкономит вам какие-либо байты. Вы используете int iв обоих циклах, я не могу сказать, находятся ли они в разных областях, но стоит указать. Инициализация одинаковых переменных вместе обычно сохраняет байты. for(int i=0;i<l;i++){o.print(s.charAt(l-1-i));}-> for(int i=0;i<l;){o.print(s.charAt(l-1-i++));}. Вам не нужна конечная точка с запятой.
TheLethalCoder

Спасибо за указание;) (не очень знаком с гольфом). Оптимизируем это позже!
Serverfrog

0

C # (.NET Core) , 179 161 байт

-18 байт благодаря TheLethalCoder

using System.Linq;
s=>{int l=s.Length-1,i=1;var d=s.Reverse().ToArray();while(i<l)s+="\n"+s[i]+new string(' ',l-1)+d[i++];if(l>1)s+="\n"+new string(d);return s;};

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

Я не уверен насчет правил, нужно ли это для подсчета байтов или нет:

using System.Linq;

Кто-нибудь, пожалуйста, поправьте меня по этому поводу.

Ungolfed:

s =>
{
    int l = s.Length - 1, i = 1;
    var d = s.Reverse().ToArray();
    while (i < l)
        s += "\n" + s[i] + new string(' ', l - 1) + d[i++];
    if (l > 1)
        s += "\n" + new string(d);
    return s;
};

Привет и добро пожаловать в PPCG! Вы используете Linq, поэтому вы должны включить usingв свой счетчик байтов. Поскольку вы используете Linq ToCharArray()может быть просто ToArray(), вам действительно нужно, прежде чем Reverse()хотя? Поскольку вы используете, Stringвам нужно либо полностью квалифицировать его, либо включить использование, однако, это можно легко исправить, изменив его тоже string. ifМожет быть короче как трехкомпонентной как s+=l>1?if code:"";. Вы можете удалить i++из цикла и разместить его на d[i++].
TheLethalCoder

Инициализировать iс lлайком int l=s.Length-1,i=1;. И я думаю, что это может быть!
TheLethalCoder

@TheLethalCoder спасибо! Я добавил ваши предложения в код. Несколько замечаний: я полностью забыл, что строка действительно имеет IEnumerable; Строка вместо строки была остатком Java, с которым я до сих пор сражаюсь, троичный был на самом деле так же долго, как это ни удивительно; и после ваших изменений я изменил для (; expr;) на while (expr), так как он выглядит лучше и с тем же количеством байтов. Еще раз спасибо
Гжегож Пулавски

Не стоит беспокоиться! Троицы иногда бывают, но обычно выходят короче, поэтому всегда стоит их попробовать.
TheLethalCoder

0

Сетчатка , 106 байт

..+
$&¶$&
O$^`.(?=.*$)

\G.
$&$%'¶
r`.\G
¶$%`$&
+`(.+)¶¶((.*¶)*).(.*)
¶¶$1$4$2
T`p` `(?<=.¶.).*(?=.¶.)
G`.

Попробуйте онлайн! Объяснение:

..+
$&¶$&

Если есть хотя бы два символа, продублируйте ввод.

O$^`.(?=.*$)

Переверните дубликат.

\G.
$&$%'¶
r`.\G
¶$%`$&

Превратите струны в треугольники. Верхний треугольник начинается с ввода и удаляет первый символ каждый раз, тогда как нижний треугольник начинается с первой буквы обратного ввода и добавляет символ каждый раз.

+`(.+)¶¶((.*¶)*).(.*)
¶¶$1$4$2

Соедините треугольники вместе, перекрывая друг друга так, что последний символ образует /диагональ.

T`p` `(?<=.¶.).*(?=.¶.)

Измените все символы на пробелы, если они находятся на расстоянии не менее одного символа от конца на каждой стороне.

G`.

Удалите все оставшиеся пустые строки.


0

Python 3, 85 байт

Используя вход для верхнего ряда :)

a=input()
b=len(a)
for i in range(b-2):print(a[1+i]+" "*(b-2)+a[-2-i])
print(a[::-1])

Вы уверены, что это дает правильный ответ?
Койшор Рой


0

Python 3, 106 байт

Функциональная версия ...

w=input();p=print;l=len(w)-2
def f(k):p(w[k]+' '*l+w[-k-1]);l-k>0and f(k+1)
l<0 or f(1)or l<1or p(w[::-1])


0

Mathematica, 138 91 байт

(b=Outer[" "&,#,#];Do[l={{1,k},{k,1}};b=ReplacePart[b,Join[l,-l]->#[[k]]],{k,Length@#}];b)&

Вы можете попробовать это онлайн, вставив следующее в Wolfram Cloud Sandbox и нажав «оценить ячейку» или нажав Shift + Enter или Numpad Enter:

(b=Outer[" "&,#,#];Do[l={{1,k},{k,1}};b=ReplacePart[b,Join[l,-l]->#[[k]]],{k,Length@#}];b)&@{"g","o","l","f","y"}//MatrixForm
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.