Я зробив зробив космічний корабель!


39

Вступ:

Натхненний цим коментарем @MagicOctopusUrn на 05AB1E @Emigna відповідь на мій виклик " Це була просто помилка " :

8F9ÝÀNð×ý}».∊Я зробив зробив космічний корабель! І я був дуже радий запропонувати 12-байтну редагування. - Чарівна восьминога урна 17 липня 1717 о 20:10

Яка програма 05AB1E (застаріла), що призводить до цього:

1234567890
1 2 3 4 5 6 7 8 9 0
1  2  3  4  5  6  7  8  9  0
1   2   3   4   5   6   7   8   9   0
1    2    3    4    5    6    7    8    9    0
1     2     3     4     5     6     7     8     9     0
1      2      3      4      5      6      7      8      9      0
1       2       3       4       5       6       7       8       9       0
1      2      3      4      5      6      7      8      9      0
1     2     3     4     5     6     7     8     9     0
1    2    3    4    5    6    7    8    9    0
1   2   3   4   5   6   7   8   9   0
1  2  3  4  5  6  7  8  9  0
1 2 3 4 5 6 7 8 9 0
1234567890

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

Виклик:

Введення: Непорожній рядок

Вихід: Ззовні всередину додайте ще один пробіл між кожним символом кожного рядка, аналогічний тому, що зроблено у висновку вище, рівний знаку length - 1. Отже, для введення 1234567890фактично буде такий результат:

1234567890
1 2 3 4 5 6 7 8 9 0
1  2  3  4  5  6  7  8  9  0
1   2   3   4   5   6   7   8   9   0
1    2    3    4    5    6    7    8    9    0
1     2     3     4     5     6     7     8     9     0
1      2      3      4      5      6      7      8      9      0
1       2       3       4       5       6       7       8       9       0
1        2        3        4        5        6        7        8        9        0
1         2         3         4         5         6         7         8         9         0
1        2        3        4        5        6        7        8        9        0 
1       2       3       4       5       6       7       8       9       0
1      2      3      4      5      6      7      8      9      0
1     2     3     4     5     6     7     8     9     0
1    2    3    4    5    6    7    8    9    0
1   2   3   4   5   6   7   8   9   0
1  2  3  4  5  6  7  8  9  0
1 2 3 4 5 6 7 8 9 0
1234567890

Чому? Довжина 1234567890становить 10. Отже, почнемо з виведення 10 рядків: перший рядок без пробілів; другий з одним роздільником пробілу; третій з двома; і т. д. І тоді (не маючи середньої лінії з length - 1дублюванням пробілів), ми повертаємося до початкового вводу під час спускання.

Правила виклику:

  • Гарантоване введення буде не порожнім (довжина >= 1). (Для одиночних вводів символів ми просто виводимо цей символ.)
  • Дозволено будь-яку кількість проміжних / провідних пробілів / нових рядків, доки правильний висновок (де б це не було на екрані) правильний. (Порожні рядки між вихідними рядками також заборонені.)
  • Введення міститиме лише символи ASCII для друку, за винятком пробілів (діапазон кодових точок [33, 126])
  • Введення / виведення гнучко. Вхід може прийматися як параметр STDIN, аргумент або параметр функції. Може бути список / масив / потік символів замість рядка. Вихідним може бути також список / масив / потік символів замість рядків; може бути надруковано в STDOUT; повертається у вигляді рядка з обмеженим рядком; тощо.

Загальні правила:

  • Це , тому найкоротша відповідь у байтах виграє.
    Не дозволяйте мовам коду-гольфу відштовхувати вас від публікації відповідей з не кодовими гольф-мовами. Спробуйте придумати якомога коротшу відповідь на "будь-яку" мову програмування.
  • Стандартні правила застосовуються до вашої відповіді, тому вам дозволяється використовувати STDIN / STDOUT, функції / метод із відповідними параметрами та повним програмами типу "повернення". Твій дзвінок.
  • Лазівки за замовчуванням заборонені.
  • Якщо можливо, додайте посилання з тестом для вашого коду.
  • Також настійно рекомендується додавати пояснення до своєї відповіді.

Тестові приклади:

Input: @
Output:
@

Input: test
Output:
test
t e s t
t  e  s  t
t   e   s   t
t  e  s  t
t e s t
test

Input: ?!
Output:
?!
? !
?!

Input: Spaceship
Output:
Spaceship
S p a c e s h i p
S  p  a  c  e  s  h  i  p
S   p   a   c   e   s   h   i   p
S    p    a    c    e    s    h    i    p
S     p     a     c     e     s     h     i     p
S      p      a      c      e      s      h      i      p
S       p       a       c       e       s       h       i       p
S        p        a        c        e        s        h        i        p
S       p       a       c       e       s       h       i       p
S      p      a      c      e      s      h      i      p
S     p     a     c     e     s     h     i     p
S    p    a    c    e    s    h    i    p
S   p   a   c   e   s   h   i   p
S  p  a  c  e  s  h  i  p
S p a c e s h i p
Spaceship

Input: 05AB1E
Output:
05AB1E
0 5 A B 1 E
0  5  A  B  1  E
0   5   A   B   1   E
0    5    A    B    1    E
0     5     A     B     1     E
0    5    A    B    1    E
0   5   A   B   1   E
0  5  A  B  1  E
0 5 A B 1 E
05AB1E

Input: )}/\
Output:
)}/\
) } / \
)  }  /  \
)   }   /   \
)  }  /  \
) } / \
)}/\

1
Отримує всіх просто хитріше !!! СПАСИБО !!!
WallyWest,

1
Я знав, що визнав цей результат. Мені подобається, що ця ідея все ще іде.
Carcigenicate

2
TFW ви розпливчасто розпізнаєте візерунок у запитанні, ಠ_ಠа потім зрозумієте, що це ви зробили випадково рік тому ಠ⌣ಠ.
Чарівна восьминога урна

1
@MagicOctopusUrn Дякую за натхнення. ; D
Кевін Круїссен

3
Дякую @KevinCruijssen за те, що зберегли гучну цитату ха-ха!
Чарівна восьминога урна

Відповіді:


11

Japt , 8 6 байт

Приймає введення як масив символів, виводить масив рядків.

£qYçÃê

Спробуй це


Пояснення

£          :Map each element at (0-based) index Y
 q         :  Join input with
  Yç       :   Space repeated Y times
    Ã      :End Map
     ê     :Palindromise

Оригінал, 8 байт

I / O - рядок. Використовує -Rпрапор. Включає пробіли у кожному рядку.

¬£múYÄÃê

Спробуй це

Пояснення

             :Implicit input of string U
¬            :Split
 £           :Map each character at 0-based index Y
  m          :  Map original U
   ú         :    Right pad with spaces to length ...
    YÄ       :     Y+1
      Ã      :End map
       ê     :Palindromise
             :Implicitly join with newlines

S.ç()FTW ще раз :-)
ETHproductions

1
Серйозне питання: чи було б доцільно повторно провести пошук в усіх рішеннях довжиною від 1 до 6 байт для такої головоломки?
Філіп

2
@filip Ні: існує більше 256 ** 6 = 281474976710656 (принаймні наївних) комбінацій. Це як відгадати пароль.
Кирило Булигін

3
@KirillBulygin, існує понад 37 трлн (37,764,717,485,592) можливих способів поєднання символів, доступних у Japt, у рядок довжиною від 1 до 6 символів. Якщо ви включите всі інші 1-байтні символи, які можна використовувати в рядкових літералах або стислих рядках, це число зростає до більше літеральних 276 трлн (276,024,445,697,280). Отже, ні, написання бота для генерації всіх тих, хто потім відфільтрує дійсні програми Japt, потім знайде ту (якщо така існує), яка працює для вирішення проблеми, ймовірно, не буде можливим. Крім того, де задоволення від того, щоб дозволити боту займатися вашим гольфом ?!
Shaggy

6
@Shaggy: "де задоволення від того, щоб дозволити боту зробити ваш гольф за вас ?!" Що робити, якщо ви зробили бота дійсно, дуже коротко?
Відмінна думка

11

R , 105 99 85 84 79 байт

-6 завдяки @Kevin Cruissen та @Giuseppe

-14 від зміни до методу на основі регулярних виразів

-1 завдяки @Giuseppe

-5 завдяки @digEmALl

function(w,n=nchar(w)-1)write(trimws(Map(gsub,"",strrep(" ",n-abs(n:-n)),w)),1)

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


Ви можете пограти в 1 байт, видаливши місце в in(r<-.
Kevin Cruijssen

1
і ви використовуєте лише sодин раз, щоб ви могли просто використовувати його як аргумент writeбезпосередньо; збивши вас до 99 байт
Джузеппе,

1
це має бути 1скоріше, ніж ""в write? Я копаю ваше використання Map!
Джузеппе


1
Я був переконаний, що можу перемогти це collapseаргументом, pasteале це просто не відбувається ...
JDL


6

Вугілля деревне , 10 байт

Eθ⪫θ× κ‖O↓

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

Eθ          Map over characters of input string
  ⪫θ        Join characters of input string using
    ×       a literal space repeated 
      κ     current index number of times
            Implicitly print each result on its own line
       ‖O↓  Reflect vertically with overlap

Вугілля не відображає речі як [до ]- або це інший окремою командою?
Чарівна восьминога урна

@MagicOctopusUrn Існують окремі команди, якщо ви хочете перетворити відображення. Наприклад, див. Codegolf.stackexchange.com/a/127164
Ніл

Я думав, що бачив, як це відображалося раніше, але не був впевнений. Акуратно!
Чарівна урва восьминога

6

Полотно , 8 байт

┐² ×*]──

Спробуйте тут!

7 байт версія була занадто гарна для цієї проблеми ..


Мені подобається ваша версія 7 байт. Чи готові ви пояснити, як це працює? Який оператор перекриває два /s на a X?
Кая

3
@Kaya це останній символ - - вертикальний паліндроміз. Паліндромізація Canvas робить дуже цікаві речі . Частина, що перекривається, має і власний характер .
dzaima


6

05AB1E , 10 9 байт

Збережено 1 байт завдяки Аднану

εINð×ý}û»

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

Пояснення

ε            # apply to each in input
 I           # push the input
  Nð×        # push <index> spaces
     ý       # merge the input on the spaces
      }      # end loop
       û     # palendromize
        »    # join on newlines

Можна скинути S. Введення гнучко, тому дозволено вводити список як список.
Кевін Круїйсен

1
@KevinCruijssen: Ваша перша версія має 9 байтів у спадщині, хоча це »може бути пропущено.
Емінья

1
Ваш фактично працює у спадщині у 9 байт, а також, якщо ви вилучите »та зміните цикл vна карті ε.
Кевін Круїйсен

1
Опублікував відповідь . І наразі Джапт б’є нас 6 байтами, боюся. Або ви мали на увазі найкоротші в 05AB1E (переписання Elixir) та 05AB1E (спадщина Python)? :)
Кевін Круїссен

2
Чи має εINð×ý}û»працювати?
Аднан


4

Japt , 9 8 байт

-1 байт від @Shaggy

ÊƬqXîÃê

ÊƬqXîÃê        Full program, implicity input U
ÊÆ              Rage from 0 to U length and map
  ¬             split U at ""
   qXîà     join U using " " times range current value
        ê       horizontal mirror

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


Данг; схоже, що ти знову мене ніндзя! Лемме знаю, чи хочете ви видалити шахту.
Кудлатий

1
@Shaggy ні, тримай свою відповідь, ти використовуєш масив як вхідний, тоді як я використовую рядок, щоб вони були різними xD
Luis felipe De jesus Munoz

1
SpX-> для економії в 1 байт.
Кудлатий

4

PowerShell , 66 54 байти

-12 байт завдяки мазі

0..($x=($a=$args).count-1)+$x..0|gu|%{$a-join(' '*$_)}

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

Здійснює введення через бризки, що в TIO проявляється як окремі аргументи командного рядка для кожного символу.

Спочатку наводимо $a=$argsяк вхідний аргумент. Тоді ми ставимо $xрівне до .countцього масиву -1. Потім нам потрібно провести циркулярні букви для побудови космічного корабля. Це робиться, побудувавши діапазон від 0до $x, потім $xповерніть вниз до 0, потім використовуючи Get-Uniqueдля витягування просто відповідного діапазону.

При кожній ітерації ми беремо наші вхідні аргументи та -joinїх разом із відповідною кількістю пробілів. Кожна з цих рядків залишається на конвеєрі, і неявна Write-Outputдає нам нові рядки безкоштовно, коли програма завершується.


Спробуйте це:0..($x=($a=$args).count-1)+$x..0|gu|%{$a-join(' '*$_)}
mazzy

1
@mazzy Що ... як це Get-Uniqueпрацює на дальній гамі? Це божевільно! Спасибі!
AdmBorkBork

4

05AB1E (спадщина) , 9 байт

εINúíJ}û»

Введіть як список символів.

Спробуйте в Інтернеті або перевірте всі тестові випадки .

Пояснення:

ε     }    # Map each character in the input to:
 I         #  Take the input
  Nú       #  Prepend each with the 0-indexed amount of spaces
           #   i.e. ["t","e","s","t"] & 3 → ["   t","   e","   s","   t"]
    í      #  Reverse each item
           #   i.e. ["   t","   e","   s","   t"] → ["t   ","e   ","s   ","t   "]
     J     #  Join them together to a single string
           #   i.e. ["t   ","e   ","s   ","t   "] → "t   e   s   t   "
       û»  # Palindromize the list, and join by newlines
           #  i.e. ["test","t e s t ","t  e  s  t  ","t   e   s   t   "]
           #   → "test\nt e s t \nt  e  s  t  \nt   e   s   t   \nt  e  s  t  \nt e s t \ntest"

1
Oooooo, також це не діє , тому що дзеркало змінює орієнтацію / к \ , коли дзеркальне відображення, то ж саме з [, ]і (, ). Можливо, захочеться додати ці випадки, щоб також ловити вугілля. (Я перемістив інші коментарі до відповіді Еміньї, тому що він був відповіддю, який я спочатку прокоментував)
Чарівний восьминога Урн

@MagicOctopusUrn Дякую за те, що повідомили мені. Виправлено це за допомогою, û»а не .∊.
Кевін Кройсейсен

4

Haskell , 60 59 байт

(init<>reverse).(scanl(?)<*>tail)
a?_=do u<-a;u:[' '|' '<u]

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

Пояснення

Для рядка (напр. "abc") Ми застосовуємо спочатку

scanl (?) <*> tail

що те саме

\str -> scanl (?) str (tail str)

Це неодноразово застосовується (?)(додає пробіл до кожного символу в діапазоні [33 ..] ) до, strпоки не буде стільки рядків, скільки strмає символи:["abc","a b c ", "a b c "]

Тепер нам залишається лише з'єднати результат (мінус останній елемент) з його зворотною частиною лічильника:

init<>reverse

4

MATL , 25 22 13 байт

zZv"Gtz@he!1e

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

Завдяки Луїсу Мендо за пропозицію гольфу на 5 байтів, який потім надихнув мене відголити ще 4 байти!

Пояснення з прикладом введення 'abc':

         # Implicit input, 'abc'
z        # find number of nonzero elements (length of string)
         # stack: [3]
Zv       # symmetric range
         # stack: [[1 2 3 2 1]]
"        # begin for loop, iterating over [1 2 3 2 1] as the loop indices
G        # push input
         # stack: ['abc']
tz       # dup and push length
         # stack: ['abc', 3]
@        # push loop index, i (for example, 2)
         # stack: ['abc', 3, 2]
h        # horizontally concatenate
         # stack: ['abc', [3, 2]]
e!       # reshape to matrix of 3 rows and i columns, padding with spaces, and transpose
         # stack: [['abc';'   ';'   ']]
1e       # reshape to matrix of 1 row, leaving last value on stack
         # stack: ['a  b  c  ']
         # implicit end of for loop
         # implicit end of program, display stack contents

3

Желе , 9 байт

jⱮLḶ⁶ẋƲŒḄ

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

Повертає список рядків; вихід попередньо попередньо TIO.


Дещо інший 9 : ,€⁶$LСŒḄ. Інші, більш подібні, 9-ті: J’⁶ẋŒḄɓjⱮі J’⁶ẋŒḄjⱮ@(я шукав коротше, але жодної радості)
Джонатан Аллан

@JonathanAllan Я майже впевнений, що це оптимально, я не думаю, що існує коротший спосіб написання LḶ⁶ẋабо ŒḄ. Однак якщо вам вдасться знайти заощадження, не пінг мені. :-)
Ерік Аутгольфер

Думаючи про це трохи, моє ,€⁶$LСŒḄможе бути неправдивим, оскільки воно має шалене гніздування, тому може знадобитися Yповноцінна програма.
Джонатан Аллан

@JonathanAllan Так, звичайно, це не так. ['I', 'f', [[' '], 't', 'h', [['i']], 's'], ' ', 'i', ['s', ' '], 'a', [[' ', 's', 't'], 'r', ['i', 'n', 'g'], ' '], 'w', ['e', ' ', 'a', 'r', 'e'], ' ', 'd', 'o', ['o'], 'm', [[[[['e']]]]], [[[['d']]]], '!']Принаймні, я перевершив 05AB1E ...
Ерік Аутгольфер

Я сказав, що я перевершив 05AB1E, так? Ба, вже не. : /
Ерік Аутгольфер


3

Стакс , 10 байт

Ç·9ƒù▌╘Ä┘e

Запустіть і налагоджуйте його

Виходи з пробілом пробілів на кожному рядку.

Пояснення:

%R|pmx{]n(m Full program, unpacked, implicit input
%           Length of input
 R          1-based range
  |p        Palindromize
    m       Map:
     x{   m   Map over characters of input:
       ]        Character -> string
        n(      Right-pad to length given by outer map value
              Implicit flatten and output

3

Java (JDK 10) , 115 байт

s->{for(int l=s.length(),i=-l;++i<l;)System.out.printf(s.replaceAll(".","%-"+(i<0?l+i:l-i)+"s")+"%n",s.split(""));}

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


1
l-Math.abs(i)можна покататися на гольфі до i<0?l+i:l-i-2 байт.
Kevin Cruijssen

@KevinCruijssen Дякую! :)
Олів'є Грегоар

це могло бути l-i<0?-i:i?
Квінтек

@ thecoder16 Вам знадобляться дужки: l-(i<0?-i:i)(12 байт).
Джонатан Фрех

3

K (oK) , 25 24 байти

Рішення:

,/'(1+a,1_|a:!#x)$\:+,x:

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

Пояснення:

Порт мого рішення K4 :

,/'(1+a,1_|a:!#x)$\:+,x: / the solution
                      x: / save input as x
                     ,   / enlist
                    +    / flip
                 $\:     / pad ($) right by each-left (\:)
   (            )        / do this together
              #x         / count length of input,           e.g. 3
             !           / range 0..length,                 e.g. 0 1 2
           a:            / save as a
          |              / reverse it,                      e.g. 2 1 0
        1_               / drop first,                      e.g. 1 0
      a,                 / join to a,                       e.g. 0 1 2 1 0
    1+                   / add 1,                           e.g. 1 2 3 2 1
,/'                      / flatten (,/) each (')

Примітки:

  • -1 байт завдяки ngn

1
,:'-> +,
ngn


2

PHP, 88 89 байт

for(;++$i<2*$e=count($a=str_split($argn));)echo join(str_pad("",~-$e-abs($i-$e)),$a),"\n";

потрібно PHP 5 або пізнішої версії для str_split. Запустіть як трубу -nRабо спробуйте в Інтернеті .


Я боюсь, що ваше посилання на тест-онлайн дає неправильний результат. У вашому висновку всі рядки також мають провідні місця, а не лише символи (або необов'язково). Перший символ повинен бути в одному стовпці на виході.
Кевін Круїссен

1
@KevinCruijssen Не дивився на висновок досить близько. Виправлено. (Хоча imo мій попередній вихід більше нагадував ракету) ;-)
Titus

Це якось схоже на мене головою стріли. : D Але +1 тепер, коли це виправлено.
Kevin Cruijssen

Якщо ви помістите фактичний новий рядок замість \ n, ви збережете байт :)
Martijn

@Martijn я насправді зарахував лише один байт ... забув замінити його, коли я вставив код тут.
Тіт

2

К4 , 23 байти

Рішення:

,/'(1+a,1_|a:!#x)$\:$x:

Приклад:

q)k),/'(1+a,1_|a:!#x)$\:$x:"Spaceship"
"Spaceship"
"S p a c e s h i p "
"S  p  a  c  e  s  h  i  p  "
"S   p   a   c   e   s   h   i   p   "
"S    p    a    c    e    s    h    i    p    "
"S     p     a     c     e     s     h     i     p     "
"S      p      a      c      e      s      h      i      p      "
"S       p       a       c       e       s       h       i       p       "
"S        p        a        c        e        s        h        i        p        "
"S       p       a       c       e       s       h       i       p       "
"S      p      a      c      e      s      h      i      p      "
"S     p     a     c     e     s     h     i     p     "
"S    p    a    c    e    s    h    i    p    "
"S   p   a   c   e   s   h   i   p   "
"S  p  a  c  e  s  h  i  p  "
"S p a c e s h i p "
"Spaceship"

Пояснення:

Має пробіли пробілів у кожному рядку.

,/'(1+a,1_|a:!#x)$\:$x: / the solution
                     x: / save input as x,                 e.g. "abc"
                    $   / string,                          e.g. (,"a";,"b";,"c")
                 $\:    / pad ($) right by each-left (\:)
   (            )       / do this together
              #x        / count length of input,           e.g. 3
             !          / range 0..length,                 e.g. 0 1 2
           a:           / save as a
          |             / reverse it,                      e.g. 2 1 0
        1_              / drop first,                      e.g. 1 0
      a,                / join to a,                       e.g. 0 1 2 1 0
    1+                  / add 1,                           e.g. 1 2 3 2 1
,/'                     / flatten each

2

C #, 113 105 98 байт

s=>{for(int l=s.Length,i=-l;++i<l;)WriteLine(Join("",s.Select(c=>$"{c}".PadRight(i<0?l+i:l-i))));}

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


Привіт там. На даний момент ваша відповідь - фрагмент замість функції або повна програма. Це можна дешево виправити, додавши s=>{до і }після того, щоб зробити його лямбда-функцією. Крім того, одна річ для гольфу - це зняти дужки навколо фор-петлі. Спробуйте в Інтернеті.
Kevin Cruijssen

@KevinCruijssen Дякую! Забув виправити це перед публікацією ...
RobIII,

2

Scala , 82 байти

for(i<-(0 to a.size)union(-a.size to 0))println(a.map(_+" "*Math.abs(i)).mkString)

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

У Scala є багато ярликів, які мені тут допомагають, і це цілком читабельно! Спробуйте Scala


Привіт, ласкаво просимо до PPCG! Хоча це приємна відповідь, я боюся, що дві речі трохи невірні. Рядок з більшістю пробілів слід виводити лише один раз посередині, а не двічі. І в даний час друку від 0до lengthкількості прогалин, а НЕ 0доlength-1 кількість пробільних. Я не знаю Scala занадто добре, але, здається, ви можете вирішити обидва питання за допомогою +4 байтів (всього 86 байт), як це: for(i<-(0 to a.size-1)union(-a.size+2 to 0))println(a.map(_+" "*Math.abs(i)).mkString)Знову ласкаво просимо, і насолоджуйтесь своїм перебуванням! :)
Кевін Круїссен

2

Oracle SQL, 115 байт

Не мова про гольф, але ...

SELECT TRIM(REGEXP_REPLACE(v,'(.)',LPAD('\1',1+LENGTH(v)-ABS(LEVEL-LENGTH(v)))))FROM t CONNECT BY LEVEL<2*LENGTH(v)

Якщо припустити, що значення знаходиться в стовпці vтаблиці t:

SQL Fiddle

Налаштування схеми Oracle 11g R2 :

CREATE TABLE t ( v ) AS
  SELECT 'test' FROM DUAL;

Запит 1 :

SELECT TRIM(REGEXP_REPLACE(v,'(.)',LPAD('\1',1+LENGTH(v)-ABS(LEVEL-LENGTH(v)))))
FROM   t
CONNECT BY LEVEL<2*LENGTH(v)

Результати :

(SQLFiddle чомусь друкує значення, вирівняні в стовпці в стовпці ... немає провідних пробілів)

| TRIM(REGEXP_REPLACE(V,'(.)',LPAD('\1',1+LENGTH(V)-ABS(LEVEL-LENGTH(V))))) |
|---------------------------------------------------------------------------|
|                                                                      test |
|                                                                   t e s t |
|                                                                t  e  s  t |
|                                                             t   e   s   t |
|                                                                t  e  s  t |
|                                                                   t e s t |
|                                                                      test |

Здається, у ваших результатів SQL Fiddle є лише пробіли між символами? Дивіться цей скріншот . Я припускаю, що це пов'язано з SQL Fiddle, і він працює локально? Btw, не впевнений, що SQL використовує стандартні правила регулярного вираження, але чи (.)можна гольфу .використовувати, \0замість того, \1як, наприклад, у Java? EDIT: Неважливо, це для $0, не \0.. ( приклад Java з того, що я мав на увазі ).
Кевін Кройсейсен

1
@KevinCruijssen Клацніть по стрілці вниз поруч із кнопкою «Запустити SQL» та змініть вихід на «Plaintext Output» або «Markdown Output», і ви побачите пробіли.
MT0

Спасибі. Це справді добре виглядає в такому випадку!
Кевін Кройсейсен

2

Машинний код 8086, 56 53 байти

00000000  bf 35 01 57 ba 01 00 52  be 82 00 b3 ff ac 59 51  |.5.W...R......YQ|
00000010  aa 3c 0d 74 07 b0 20 e2  f7 43 eb f1 b0 0a aa 59  |.<.t.. ..C.....Y|
00000020  00 d1 e3 08 38 cb d6 08  c2 51 eb dc c6 05 24 5a  |....8....Q....$Z|
00000030  b4 09 cd 21 c3                                    |...!.|
00000035

Зібрано з:

org 0x100
use16
        mov di, buffer
        push di
        mov dx, 1
        push dx
nextl:  mov si, 0x82
        mov bl, -1
nextc:  lodsb
        pop cx
        push cx
stor:   stosb
        cmp al, 0x0d
        je cr
        mov al, ' '
        loop stor
        inc bx
        jmp nextc
cr:     mov al, 0x0a
        stosb
        pop cx
        add cl, dl
        jcxz done
        cmp bl, cl
        salc
        or dl, al
        push cx
        jmp nextl
done:   mov [di], byte '$'
        pop dx
        mov ah, 0x09
        int 0x21
        ret
buffer:

Тестовий випадок:

скріншот


Привіт там. Я думаю, що не існує будь-якого онлайн, складеного для машинного коду 8086, але ви могли б додати скріншот виводу для одного з тестових випадків? Тоді я можу перевірити, чи все правильно. :)
Кевін Круїйсен

Зроблено. Також поголив ще один байт :)
користувач5434231

Дякую за скріншот! На жаль, є одна невелика помилка у виході. Середня лінія має lengthкількість пробілів, і загалом є 9 рядків, але середня лінія повинна містити length-1кількість пробілів, а замість них повинно бути 7 рядків (для 4-літерного слова "тест"): (Я сподіваюся, що це не дорого з точки зору байтів, щоб виправити?
Кевін Круїйсен

1
Ой, бачу. Це зараз виправлено, я навіть зменшив його ще на один байт.
користувач5434231

2

Haskell, 64 60 59 байт

(""#)
a#s|l<-(:a)=<<s,w<-' ':a=l:[x|w<(' '<$s),x<-w#s++[l]]

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

a#s                         -- take a string of spaces 'a' and the input string 's'
 |l<-(:a)=<<s               -- let 'l' be the current line, i.e. the spaces in 'a'
                            -- appended to each char in 's'
  w<-' ':a                  -- let 'w' be 'a' with an additional space   
 =l                         -- return that 'l'
   :[   |w<(' '<$s)   ]     -- and, if 'w' is shorter than 's',
     x  ,x<-w#s++[l]        -- followed by a recursive call with 'w' 
                            -- and by another copy of 'l'

(""#)                       -- start with an empty 'a'

2

Баш , 115 , 109 , 105 , 100 , 97 , 96 , 92 , 91 , 90 байт

-5 і -3 завдяки Кевіну Круссену

read s;for((c=f=1;f;c-=2*(f>=${#s}),f+=c))
{ printf '%-'${f}'.c' `grep -o .<<<"$s"`
echo
}

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


Зверніть увагу , що оскільки \це оболонка втечу символ, то тест )}/\повинен бути введений з додатковим , \як це: )}/\\.


Привіт там. Чи можна додати TIO-посилання з тестовими випадками ? Крім того, я не знаю Bash дуже добре, але чи можна видалити пробіли після inі printfяк у Python?
Кевін Кройсейсен

1
@KevinCruijssen, Спасибі, див. Переглянуту відповідь. Однак я новачок у TIO-посиланні і не знаю, як використовувати кілька тестових випадків, оскільки цей bashкод вводить лише рядок ( тобто лише один рядок). Проте всі тестові справи працюють, хоча вони )}/\ повинні бути цитованими так <<< ')}/\' read s; ...etc. . Пробіли після inі printfпотрібні.
agc

Спасибі. І єдиний тестовий випадок для TIO - це добре. Це головним чином, щоб перевірити, чи все працює так, як очікувалося, що справді здається так. +1 від мене. :)
Кевін Крейссен

1
У новій версії ви можете пограти ще 5 байтів, як це . Проміжки після forі doїх можна видалити. f=1може бути змінено на c=f=1. А f=f+cможе бути f+=c.
Кевін Кройсейсен

1
О, ще одна маленька річ до гольфу. Не був впевнений, чи можливо це в Bash, але, мабуть, це (ще одна причина, чому TIO-посилання є зручним;)), полягає в зміні f!=0на ffor-loop. Так само, як у JavaScript та Python, 0є фальси, і будь-яке інше позитивне / негативне ціле число, очевидно, є правдою в Bash.
Кевін Кройсейсен

2

Perl 6 , 43 байти

{(0....comb-1...0)>>.&{join ' 'x$^a,.comb}}

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

Повертає список рядків.

Пояснення:

 {                                         }  # Anonymous code block
  (0....comb-1...0) # A list from
   0                  # 0
    ...               # to
       .comb-1        # the length of the input string -1
              ...     # back to
                 0    # 0
                   >>.&{                  }  # Map each number to
                        join        ,.comb   # Join the list of characters
                             ' 'x$^a         # With the number of spaces

2

C (gcc) , 131 129 111 байт

i;x;f(k,j)char*k,*j;{x=strlen(k)-1;for(i=0;i<x-~x;i+=puts(""))for(j=k;*j;)printf("%c%*s",*j++,i<x?i:2*x-i,"");}

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

-20 байт завдяки стельовій кішці !

#import<string.h>
i;x;f(k,j)char*k,*j;{x=strlen(k)-1;for(i=0;i<x-~x;i+=puts(""))for(j=k;*j;)printf("%c%*s",*j++,i<x?i:2*x-i,"");}

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

Або, якщо довжина може бути прийнята як параметр:

C (gcc), 105 102 байт

-1 байт завдяки стельовій кішці!

i;x;f(k,x,j)char*k,*j;{for(i=!x--;i<x-~x;i+=puts(""))for(j=k;*j;)printf("%c%*s",*j++,i<x?i:2*x-i,"");}

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


@ceilingcat так!
Conor O'Brien

1
У вашому гольфі довгим 102 байти, я думаю, що глобальний xє тіньовим і, таким чином, надмірно оголошеним.
Джонатан Фрех

2

PHP, 148 146 143 141 байт

function s($s){for(;$i<strlen($s);++$i)f($i,$s);for(--$i;--$i>=0;)f($i,$s);}function f($i,$s){echo chunk_split($s,1,str_repeat(' ',$i))."
";}

Ви можете перевірити його так:

<?php
error_reporting(0);

$s = 1234567890;
function s($s){for(;$i<strlen($s);++$i)f($i,$s);for(--$i;--$i>=0;)f($i,$s);}function f($i,$s){echo chunk_split($s,1,str_repeat(' ',$i))."
";}

Вихідні дані

1234567890
1 2 3 4 5 6 7 8 9 0 
1  2  3  4  5  6  7  8  9  0  
1   2   3   4   5   6   7   8   9   0   
1    2    3    4    5    6    7    8    9    0    
1     2     3     4     5     6     7     8     9     0     
1      2      3      4      5      6      7      8      9      0      
1       2       3       4       5       6       7       8       9       0       
1        2        3        4        5        6        7        8        9        0        
1         2         3         4         5         6         7         8         9         0         
1        2        3        4        5        6        7        8        9        0        
1       2       3       4       5       6       7       8       9       0       
1      2      3      4      5      6      7      8      9      0      
1     2     3     4     5     6     7     8     9     0     
1    2    3    4    5    6    7    8    9    0    
1   2   3   4   5   6   7   8   9   0   
1  2  3  4  5  6  7  8  9  0  
1 2 3 4 5 6 7 8 9 0 
1234567890

Пісочниця

Розширена версія

 function s($s){
    //loop upwards 0-10
    for(;$i<strlen($s);++$i) f($i,$s);
     //decrement so it's odd, from 9 loop downwards to 0
    for(--$i;--$i>=0;)f($i,$s);
 }
 //2nd function to save space
 function f($i,$s){
     //chunk it, split 1 char, insert $i number of spaces
     echo chunk_split($s,1,str_repeat(' ',$i))."
";}

Спроба 2, 92 байти

побачивши відповідь @Titus, я скоротив свою:

for(;++$i<2*$e=strlen($s=$argn);)echo chunk_split($s,1,str_repeat(' ',~-$e-abs($i-$e)))."
";

Я намагався придумати спосіб використання 1 циклу, а не 2 ... Вірити чи ні, я майже ніколи не використовую forцикл у "реальному" коді. Це був той~ побито Не, що я пропав безвісти ...

Це підвіконня трохи довше, 92так що я не відчуваю себе так погано. Але я все одно поставлю це як другу спробу.

$argn - це вхід з командного рядка

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

Пісочниця


Мені здається, що ваша перша версія була б на 4 байти коротшою, якщо ви використовували іменовану функцію fзамість того, щоб призначити анонімну функцію $f- function f(зберігає 2 байти $f=function(, і ви зберігаєте інший байт кожен раз, коли ви дзвоните f(...)замість $f(...). Крім того, ви можете зафіксувати $sзбереження 2 байтів - ($i)use($s)це на 4 байти довше ($i,$s), але ви збережете 3 байти на кожен виклик $f($i)замість $f($s,$i); в мовах з автоматичним захопленням, як-от JS, це частіше є життєздатним заощадженням, оскільки ви не сплачуєте штраф за useзаяву.
IMSoP

Я вдячний за допомогу, я досить новачок в коді гольфу і насправді не так багато роблю, хоч на нудних сторінках регулярно нудьгує. Я думав про використання, useале відчуває себе довше, для цього сенс $iє динамічним, його потрібно було б передати через посилання. Отже, це має бути, use(&$i)і його $iпотрібно визначити, перш ніж передавати його посиланням на $f. Що означає встановити його в батьківській функції, або перед будь-якою іншою. Для функції, якою вона могла бути, function s($s,$i)і просто знати, що її потрібно викликати, s($s,0) але вона здається некрасивою, і це навколо11 bytes, use(&$i),$i
ArtisticPhoenix

Ми могли б використовувати, $sхоча і змінити \nреальне повернення рядка. Це отримує 143 2 до кінця рядка та 1 до використання
ArtisticPhoenix

Так, я навіть не розглядав можливість використання $ i у використанні, оскільки $ s відчував "природне" захоплення, але завжди варто обчислити чисту економію. Однак ви можете зберегти 2 байти, просто оголосивши названу функцію fзамість закриття. function s($s){for(;$i<strlen($s);++$i)f($i,$s);for(--$i;--$i>=0;)f($i,$s);}function f($i,$s){echo chunk_split($s,1,str_repeat(' ',$i))." ";}Додаткові функції, подібні цій, дозволені відповідно до цього мета-повідомлення: codegolf.meta.stackexchange.com/questions/7614/…
IMSoP

Оновлено, врятували пару
ArtisticPhoenix
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.