Абзац на молнии


21

(Вдохновленный этим вызовом )

Учитывая две входные строки, одна из которых ровно на один символ длиннее другой, упорядочивает строки в ASCII-графику, как если бы они были двумя половинами молнии, которая застегнута только наполовину. Более длинное слово образует нижнюю часть молнии и является первым и последним символом объединенной части на молнии. Поскольку этот абзац трудно понять, взгляните на несколько примеров:

zippered
paragraph

 z
   i
     p
       p
        gerraepdh
      a
    r
  a
p

Обратите внимание, как paragraph(более длинное слово) образует нижнюю застежку-молнию, и g r a p hчасть инкапсулирует e r e dчасть zippered, z i p pа p a r aчасти и смещены относительно друг друга.

вход

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

Выход

Результирующее ASCII художественное представление слов на молнии, как описано выше, снова в любом удобном формате.

правила

  • Начальные или завершающие символы новой строки или пробелы являются необязательными, при условии, что сами символы выстроены правильно.
  • Либо полная программа или функция приемлемы. Если функция, вы можете вернуть вывод, а не распечатать его.
  • Если возможно, укажите ссылку на среду онлайн-тестирования, чтобы другие люди могли опробовать ваш код!
  • Стандартные лазейки запрещены.
  • Это поэтому применяются все обычные правила игры в гольф, и выигрывает самый короткий код (в байтах).

Примеры

ppcg
tests

 p
   p
    sctgs
  e
t

string
strings

 s
   t
     r
      iinnggs
    r
  t
s

Можем ли мы предположить, что входные данные не содержат пробелов?
DJMcMayhem

@DJMcMayhem Да, это справедливое предположение.
AdmBorkBork

1
@Titus one guaranteed to be even in length and the other exactly one character longer. Более короткая строка всегда четная
Baldrickk

Ответы:


7

Japt , 31 28 байт

N®¬£ç iXYm½*Ul
uUo mw
y c ·y

Проверьте это онлайн! Сначала берет более короткую строку.

объяснение

N®¬£ç iXYm½*Ul    First line: Set U to the result.
N®                Map each item (there's exactly 2 of them) in the input to
  ¬                 the item split into chars,
   £                with each item X and index Y mapped to
    ç                 the first input filled with spaces,
      iX              with X inserted at index
        Ym½*Ul          min(Y, 0.5 * U.length).
                  At the end each input is an array like
                  ["p    ", " p   ", "  c  ", "  g  "]
                  ["t    ", " e   ", "  s  ", "  t  ", "  s  "]

uUo mw    Second line: Set V to the result (though that's not important).
 Uo       Pop the last item (the array representing the second string) from U.
    m     Map each item by
     w      reversing.
u         Push the result to the beginning of U.
          At the end we have e.g.
          ["    t", "   e ", "  s  ", "  t  ", "  s  "]
          ["p    ", " p   ", "  c  ", "  g  "]

y c ·y    Last line: Output the result of this line.
y         Transpose: map [[A,B,C,...],[a,b,c,...]] to [[A,a],[B,b],[C,c],...].
  c       Flatten into one array. [A,a,B,b,C,c,...]
    ·     Join on newlines. Now we have the output transposed.
     y    Transpose rows with columns.

6

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

→F²«FL諧θκ→¿‹κ÷Lθ²¿ι↑↓»J⁰LθAηθ

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

→F²«

Переверните каждую строку по очереди.

FLθ«

Зацикливайтесь на каждом символе строки по очереди.

§θκ→

Напечатайте символ и переместите дополнительный квадрат вправо.

¿‹κ÷Lθ²¿ι↑↓»

Для первой половины строки также переместите курсор вниз или вверх, в зависимости от ситуации.

J⁰LθAηθ

После печати первой строки перейдите к начальной точке второй строки и замените первую строку второй, чтобы она была напечатана для второго цикла. (Код выполняется в обоих циклах, но во второй раз он не работает.)



4

Желе ,  27  26 байт

-1 байт благодаря Erik the Outgolfer (используйте repeat,, ¡чтобы заменить if ?, и переданное условие else ¹)

JCḂ¡€ṚH
żµL⁶ẋ;ЀFṙ"ÇZṙÇṀ$Y

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

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

Как?

JCḂ¡€ṚH - Link 1, get rotations: list p        e.g.: ["a1","b2","c3","d4","e5","f6","g"]
J       - range of length of p                       [ 1, 2, 3, 4, 5, 6, 7]
    €   - for €ach:
   ¡    -   repeat link:
  Ḃ     - ...# of times: modulo 2                      1  0  1  0  1  0  1
 C      - ...link: complement (1-x)                    0  2 -2  4 -4  6 -6
     Ṛ  - reverse                                    [-6, 6,-4, 4,-2, 2, 0]
      H - halve                                      [-3, 3,-2, 2,-1, 1, 0]

żµL⁶ẋ;ЀFṙ"ÇZṙÇṀ$Y - Main link: longer (odd length); shorter (even length)
                   -                           e.g.: "abcdefg", "123456"
ż                  - zip them together               ["a1","b2","c3","d4","e5","f6","g"]
 µ                 - monadic chain separation, call that p
  L                - length of p                     7
   ⁶               - literal space character         ' '
    ẋ              - repeat                          "       "
        F          - flatten p                       "a1b2c3d4e5f"
      Ѐ           - map with:
     ;             -   concatenation                 ["       a","       1","       b","       2","       c","       3","       d","       4","       e","       5","       f","       6","       g"]
           Ç       - call last link (1) as a monad with argument p
          "        - zip with (no action on left by trailing values of right):
         ṙ         -   rotate left by                ["  a     ","    1   "," b      ","     2  ","c       ","      3 ","       d","       4","       e","       5","       f","       6","       g"]
            Z      - transpose                       ["    c        ","  b          ","a            ","             "," 1           ","   2         ","     3       ","      d4e5f6g"]
                $  - last two links as a monad:
              Ç    -   call last link (1) as a monad with argument p
               Ṁ   -   maximum                       3
             ṙ     - rotate left by                  ["             "," 1           ","   2         ","     3       ","      d4e5f6g","    c        ","  b          ","a            "]
                 Y - join with newlines            '''             \n
                                                       1           \n
                                                         2         \n
                                                           3       \n
                                                            d4e5f6g\n
                                                          c        \n
                                                        b          \n
                                                      a            '''
                   - as full program: implicit print

C¹Ḃ?->CḂ¡
Эрик Outgolfer


3

V , 47 38 30 27 26 25 байтов

Наконец победить текущий ответ желе \ O /

Принимает ввод с длинным словом сверху

Объяснение не за горами, не думайте, что в гольфе есть что-то еще.

òGxplòxãòd|>HÏpd|>GGÏphl

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

объяснение

ò     ò      ' <M-r>ecursively
             |abc
             def
 Gx          ' (G)oto the last line and (x) the first character
             abc
             |ef
            ' <C-O> Go back to the previous location
             |abc
             ef
    p        ' (p)aste the character cut
             a|dbc
             ef
     l       ' move one character right
             ad|bc
             ef

x                  ' (x) the last extraneous character from the previous loop
 ã                 ' <M-c>enter the cursor
  ò                ' <M-r>ecursively
   d|              ' (d)elete to the first co(|)umn
     >H            ' (>) Indent every line from here to (H)ome (first line)
                   ' this leaves the cursor on the first line
       Ïp          ' <M-O>n a newline above this (the first) (p)aste the deleted section
                   ' this leaves the cursor on the last character
         d|        ' (d)elete to the first co(|)umn
           >G      ' (>) Indent every line from here to the end (G)
                   ' unfortunately the cursor stays on the first line
             G     ' (G)oto the last line
              Ïp   ' <M-O>n a newline above this (the last) (p)aste the deleted section
                hl ' move left and then right (break the loop at the end)

2

V , 79 байтов

ãl}dÍ./ &
XòYf D"0Pr -Y;D"0pr +òGï"1pÓ./&ò
}dGÓ/&ò
{jpògJòÓó
|DÇ./d
MÙ"-pBr 

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

Следующее должно быть прочитано с большим количеством сарказма и воздушных кавычек .

Вот ответ на моем языке игры в гольф, который хорош в коротких ответах на вызовы на основе струн и ASCII-искусства .

Почему я продолжаю делать это для себя?

HexDump:

00000000: e36c 167d 64cd 2e2f 2026 0a58 f259 6620  .l.}d../ &.X.Yf 
00000010: 4422 3050 7220 2d59 3b44 2230 7072 202b  D"0Pr -Y;D"0pr +
00000020: f247 ef22 3170 d32e 2f26 f20a 0f16 7d64  .G."1p../&....}d
00000030: 47d3 2f26 f20a 7b6a 70f2 674a f2d3 f30a  G./&..{jp.gJ....
00000040: 7c44 c72e 2f64 0a4d d922 2d70 4272 20    |D../d.M."-pBr 

У V есть команда "транспонировать строки со столбцами"? Потому что, если нет, вы можете инвестировать в это ...
ETHproductions

2

Желе , 28 байт

HĊ©«Rµ®Ḥ_,Ṗ
ZLÇṬ€a"¥"o⁶ZẎz⁶Y

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

Woo Jelly на самом деле участвует в соревнованиях по и ! \ о /


Главным образом потому, что у любого другого языка также есть проблемы. Говоря об этом, кто-то может
захотеть

Хорошо, мне удалось 27 - но, может быть, вы тоже можете злоупотреблять лидирующим / конечным разрешением пробелов?
Джонатан Аллан

@JonathanAllan К сожалению, я думаю, что это невозможно. Удаление не добавит завершающий пробел, но завершающий 1. И если вы пропустите все, что связано с пробелами, удалится последовательность букв. Как правило, этот алгоритм использует индексирование, чтобы буквы попадали в определенный индекс в столбце, а затем остальные заполнялись пробелами, так что я думаю, что это не может быть дальше. По крайней мере, я рад, что Желе не превзошел CJam. ;)
Эрик Outgolfer

: | Желе в гольф, чем древесный уголь
только ASCII

2

05AB1E , 26 23 байта

øS2ä`JIθ«¸«vyNúr})2äR˜»

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

объяснение

С примером ввода = ppcg, tests

ø                           # zip the input strings
                            # STACK: ['tp', 'ep', 'sc', 'tg']
 S                          # split to a list of characters
                            # STACK: ['t', 'p', 'e', 'p', 's', 'c', 't', 'g'
  2ä                        # divide the list into 2 parts
    `                       # push them as separate to stack
                            # STACK: ['t', 'p', 'e', 'p'], ['s', 'c', 't', 'g']
     J                      # join the second part to a single string
      Iθ«                   # append the tail of the second input
         ¸«                 # concatenate the 2 lists
                            # STACK: ['t', 'p', 'e', 'p', 'sctgs']
           v                # for each y,N (element, index) in the list
            yNú             # prepend N spaces to y
               r            # reverse the stack
                })          # end loop and wrap the stack in a list
                            # STACK: ['    sctgs', '  e', 't', ' p', '   p']
                  2ä        # split the list into 2 parts
                    R       # reverse the list
                            # STACK: [[' p', '   p'], ['    sctgs', '  e', 't']]
                     ˜»     # flatten the list and join on newlines

1
Я очень старался в этом вопросе, как неделю назад, и ты должен был просто пойти и ... побить меня. +1 за то, что заставил меня попробовать еще немного!
nmjcman101

@ nmjcman101: Надеюсь, ты сможешь получить немного больше. Некоторое дружеское соревнование всегда весело :)
Emigna

1

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

(l,s)=>{var o="";int i=0,k=s.Length;for(;i<k;)o+=i<k/2?s[i++]+"\n"+"".PadLeft(i):l[i]+""+s[i++];o+=l[i]+"\n";for(i=k/2;i>0;)o+="".PadLeft(--i)+l[i]+"\n";return o;}

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

Вероятно, здесь много игры в гольф, но вот начальная попытка без LINQ. Лямбда-функция, которая сначала берет более длинное слово и возвращает строку с выходным значением.


1
Используйте выделки , чтобы сохранить байты ( l=>s=>) , то есть Func<input1, Func<input2, output>>.
TheLethalCoder

1

Java 8, 216 байт

Лямбда с карри: принимает Stringи возвращает лямбду из Stringв String. Параметр для внешней лямбды - это более короткая строка.

Невозможность индексировать в Strings с синтаксисом массива ... неудачно.

s->t->{int l=s.length(),i=l/2;String o="",p=o,n="\n";for(;i<l;p+="  ")o=o+t.charAt(i)+s.charAt(i++);o=p+o+t.charAt(i)+n;for(;i-->0;)o=p.substring(l-i--)+s.charAt(i/2)+n+o+p.substring(l-i)+t.charAt(i/2)+n;return o;}

Неуправляемая лямбда

s ->
    t -> {
        int
            l = s.length(),
            i = l / 2
        ;
        String
            o = "",
            p = o,
            n = "\n"
        ;
        for (; i < l; p += "  ")
            o = o + t.charAt(i) + s.charAt(i++);
        o = p + o + t.charAt(i) + n;
        for (; i-- > 0; )
            o =
                p.substring(l-i--)
                + s.charAt(i / 2)
                + n
                + o
                + p.substring(l-i)
                + t.charAt(i / 2)
                + n
            ;
        return o;
    }

объяснение

lявляется длиной более короткого ввода и iявляется многоцелевым индексом, инициализированным для ссылки на первый символ второй половины более короткого ввода. oнакапливает результат, в pконечном итоге хранит места для заполнения и nявляется псевдонимом для "\n".

Первый цикл перемежает вторые половины двух строк (исключая последний символ более длинного ввода) и создает pправильное количество отступов для средней строки.

Следующая строка завершает среднюю строку вывода.

Я хотел бы извиниться перед Джеймсом Гослингом за второй цикл. Это добавляет линии выше и ниже средней линии изнутри. Ввод цикла, iявляется l - 1, таким образом один символ заполнения предваряется вместе с последним символом первой половины короткой строки.iуменьшается, так что следующий отступ (добавленный к результату) будет короче символа. Посредством целочисленного деления добавляется тот же символ позиции для более длинной строки. Это повторяется, и завершенный результат возвращается.

Классная вещь

Линия 13 раньше была

o+=t.charAt(i)+""+s.charAt(i++);

потому что без пустой строки, +добавил значения символов вместе и добавил числовую строку. Путем расширения составного присваивания сначала выполняется конкатенация oи t.charAt(i), что дает желаемый результат без необходимости в пустой строке, сохраняя 2 байта. Это первый раз, когда я вижу составное назначение, которое ведет себя не так, как его расширение.


0

Javascript (ES6), 140 137 133 байта

A=(a,b,c=0)=>a[c/2]?` `[d=`repeat`](c+1)+a[0]+`
`+A(a.slice(1),b.slice(1),c+2)+`
`+` `[d](c)+b[0]:` `[d](c)+[...a].map((e,f)=>e+b[f])

Вполне уверен, что это может быть дальше


Например, нельзя `<newline>`+` `объединить `<newline> `? (Я не знаю JS).
Каз

@Kaz: нет, потому что мы выполняем метод repeat только для пробела, а не для новой строки + пробел.
Люк

0

Mathematica, 174 байта

(a=(c=Characters)@#;b=c@#2;T=Table;Column[Join[T[T["  ",i]<>a[[i]],{i,g=Length@a/2}],{T["  ",g+1]<>Riffle[b[[-g-1;;]],a[[-g;;]]]},Reverse@T[T["  ",i]<>b[[i+1]],{i,0,g-1}]]])&


вход

["молнии", "абзац"]


0

TXR Lisp , 126 байт

(defun f(a b :(n 0))(if(<(/ n 2)(length a))` @{""n}@[a 0]\n@(f(cdr a)(cdr b)(+ n 2))\n@{""n}@[b 0]``@{""n}@{(zip b`@a `)""}`))


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.