Складання квадратних слів


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
Не хвилюйтесь, лише подвійна перевірка. Приємний перший виклик BTW! Ласкаво просимо на сайт :)
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

(Кілька напрямків до команди Reflect виконують послідовно, а не одночасно.)


Нічого собі, Ісусе, я все ще думаю, що Вугілля було найкрутішою ідеєю езолангу.
Magic Octopus Urn

1
Ви можете зберегти два байта , якщо ви просто надрукувати рядок введення і відображає його downleftwards і downrightwards: θ‖B↙↘. Спробуйте в Інтернеті!
Чарлі

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

1
Це один з рідкісних випадків, коли відповідь на гольф езотеричною мовою легше читати та розуміти, ніж повні версії популярних мов загального призначення.
Калеб

Ваша відповідь тут також працює на 4 байти.
Олівер

10

MATL , 20 16 11 байт

otYTO6Lt&(c

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

EDIT: Код працює у випуску 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'відбувається, що відбувається на вході довжини-1.


3

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

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

Спробуйте в Інтернеті!

Це моя відповідь, але розміщена після відповіді @Luis MATL


2
Дуже приємна відповідь. Btw: ваш код перервав гілку розвитку 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

Пітон 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

Математика, 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є восьмеричним префіксом.
Пшеничний майстер

Коли я запускаю це, то, здається, не надруковано верхню лінію ... tio.run/##FcoxCsQgEAXQPqeYLk7EwqRL8CRiEVh3Iww/…
Coty Johnathan

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ý

@ 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.
Ніл

@Neil дякую, я поміняю свою рубрику
edc65

Ви можете зберегти байт у вашій версії ES6, використовуючи l+~iце, щоб уникнути необхідності віднімання 1 двічі, замість цього ви можете відняти 2 раз.
Ніл

@Neil це повинно бути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;

Хтось, будь ласка, виправте мене з цього приводу.

Безголовки:

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), оскільки це виглядає приємніше і таке ж число байтів. Ще раз дякую вам.
Grzegorz Puławski

Не хвилюйтесь! Тернарії іноді є, але зазвичай виходять коротшими, тому їх завжди варто спробувати.
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])

Ви впевнені, що це дає правильну відповідь?
Koishore Roy

0

Луа , 104 байти

print(s);for a=2,#s-1 do print(s:sub(a,a)..(" "):rep(#s-2)..s:sub(#s-a+1,#s-a+1)) end;print(s:reverse())

Спробуйте в Інтернеті!


але ви використовували лише pодин раз ...
Leaky Nun

Правда ... я це зміню.

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

Математика, 138 91 байт

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

Ви можете спробувати це в режимі он-лайн, вставивши наступне у хмарний пісочник Wolfram та натиснувши «Оцінити клітинку» або натиснувши 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.