Я сделал сделал космический корабль пасть!


39

Введение:

Вдохновленный комментарием @MagicOctopusUrn к ответу @ Emigna 's 05AB1E на мою задачу « Это была просто ошибка » :

8F9ÝÀNð×ý}».∊Я сделал сделал космический корабль пасть! И я был взволнован предложением 12-байтового редактирования. - Волшебная Осьминог Урна 17 июля 17: 20

Который является 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
Я знал, что узнал этот вывод. Мне нравится, что эта идея все еще продолжается.
Карцигеникат

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 байтов для такой головоломки?
Filip

2
@filip No: существует более 256 ** 6 = 281474976710656 (по крайней мере, наивных) комбинаций. Это как угадать пароль.
Кирилл Булыгин

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

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<-.
Кевин Круйссен,

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-байтовая версия. Хотели бы вы объяснить, как это работает? Какой оператор перекрывает два /с в X?
Кая,

3
@Kaya это последний символ - вертикальный палиндромиз. Палиндромизация Canvas делает классные вещи . Перекрывающаяся часть тоже имеет свой характер .
Дзайма

6

Python 2 , 72 70 68 66 65 байт

-2 байта благодаря Кевину Круйссену
-3 байта благодаря овсу

w=input();c=s=-1
while c:print(' '*~c).join(w);s*=w[:c]>'';c+=s|1

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


c==len(w)-1может быть в гольф на 1 байт с c+2>len(w). РЕДАКТИРОВАТЬ: В вашей новой 70-байтовой версии, 0<cможет быть c.
Кевин Круйссен,

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 байт в прежних версиях, что »может быть опущено.
Emigna

1
Ваш на самом деле работает в наследство в 9 байтов, а также, если вы удалите »и измените цикл vна карту ε.
Кевин Круйссен,

1
Разместил ответ . И в настоящее время я боюсь, что Japt бьет нас 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

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


Dang; Похоже, ты снова ниндзя Дай мне знать, если ты хочешь, чтобы я удалил мою.
Лохматый

1
@ Shaggy нет, оставь свой ответ, ты используешь массив в качестве входных данных, а я использую строку, поэтому они немного различаются xD
Луис Фелипе Де Иисус Муньос

1
SpX-> для сохранения 1 байта.
Лохматый

4

PowerShell , 66 54 байта

-12 байт благодаря маззи

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

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

Принимает ввод через splatting, который в 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(' '*$_)}
Маззи

1
@mazzy Что ... как это Get-Uniqueработает в диапазоне? Это безумие! Благодарность!
AdmBorkBork

4

05AB1E (legacy) , 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

МАТЛ , 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.


Несколько иное ,€⁶$LСŒḄ. Другие, более похожие, 9-е: J’⁶ẋŒḄɓjⱮи J’⁶ẋŒḄjⱮ@(я искал короче, но пока без радости)
Джонатан Аллан

@JonathanAllan Я уверен, что это оптимально, я не думаю, что есть более короткий способ написать LḶ⁶ẋили ŒḄ. Тем не менее, если вам удастся найти сохранение, пингуйте меня. :-)
Эрик Outgolfer

Думая об этом немного, мой ,€⁶$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 ...
Эрик Outgolfer

Я сказал, что превзошел 05AB1E, а? Бах, больше нет. : /
Эрик Outgolfer


3

Stax , 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 байт.
Кевин Круйссен,

@KevinCruijssen Спасибо! :)
Оливье Грегуар

это может быть l-i<0?-i:i?
Quintec

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

3

K (ок) , 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
,:'-> +,
нгн


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 Не посмотрел на результат достаточно близко. Исправлена. (Хотя, по моему мнению, мой предыдущий вывод был больше похож на ракету) ;-)
Titus

Для меня это выглядело как стрела. : D Но +1 теперь, когда это исправлено.
Кевин Круйссен,

Если вместо \ 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=>{до и }после, чтобы сделать его лямбда-функцией. Кроме того, одна вещь для гольфа - это удаление скобок вокруг петли. Попробуйте онлайн.
Кевин Круйссен,

@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 и он работает локально? Кстати, не уверен, использует ли SQL стандартные правила регулярных выражений, но можно (.)ли .его использовать, \0вместо того чтобы использовать его, \1как, например, в Java? РЕДАКТИРОВАТЬ: Неважно, это для $0, а не\0 .. ( пример Java, что я имел в виду ).
Кевин Круйссен

1
@KevinCruijssen Нажмите стрелку вниз рядом с кнопкой «Запустить SQL» и измените вывод на «Вывод открытого текста» или «Вывод уценки», и вы увидите пробелы.
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 онлайн не скомпилировано, но не могли бы вы добавить скриншот вывода для одного из тестовых случаев? Тогда я могу проверить, все ли правильно. :)
Кевин Круйссен

Выполнено. Также сбрил еще один байт :)
user5434231

Спасибо за скриншот! К сожалению, в выводе есть одна маленькая ошибка. Средняя строка теперь содержит lengthколичество пробелов и всего 9 строк, но средняя строка должна содержать length-1количество пробелов, и вместо этого должно быть всего 7 строк (для четырехбуквенного слова «тест») ..: (Я надеюсь, что это не слишком дорого с точки зрения байтов, чтобы исправить?
Кевин Круйссен

1
Ох, я понял. Это исправлено, я даже уменьшил его еще на один байт.
user5434231

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необходимы.
АРУ

Спасибо. И один тестовый случай для TIO в порядке. Главным образом, чтобы проверить, все ли работает так, как ожидалось, и это действительно так. +1 от меня. :)
Кевин Круйссен

1
В вашей новой версии вы можете сыграть в гольф еще 5 байтов, как это . Пробелы после forи doмогут быть удалены. f=1можно изменить на c=f=1. А f=f+cможет быть f+=c.
Кевин Круйссен

1
О, еще одна маленькая вещь для гольфа. Был не уверен , если это возможно , в Bash, но , видимо , это (еще одна причина , почему TIO-ссылка удобно;)), является изменение f!=0в fв течение петли. Так же, как в 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 байт, благодаря floorcat!

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, да!
Конор О'Брайен,

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

Я действительно ценю помощь, я довольно новичок в программировании гольфа и не особо этим занимаюсь, хотя на обычных страницах SO все же скучно. Я действительно думал об использовании, 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, потому что $ чувствовал «естественный» захват, но всегда стоит рассчитывать чистую экономию. Однако вы все равно можете сохранить 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.