Абзац з блискавкою


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. Коротша струна завжди рівна
Балдрікк

Відповіді:


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 (використовуйте повтор ¡, для заміни if ?, та пропущений інший пункт ¹)

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



3

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

Нарешті перемігте поточну відповідь Jel \ \ /

Здійснює введення з довшим словом зверху

Пояснення, що приходить, не думайте, що гольфу є набагато більше.

ò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 "транспоніровать рядки зі стовпцями"? "Якщо ні, то ви можете
захотіти

2

Желе , 28 байт

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

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

Woo Jelly насправді конкурує у виклику та ! \ o /


Головним чином через те, що і будь-яка інша мова також має проблеми. Якщо говорити про це, хтось може
захотіти

Приємно, мені вдалося 27 - але, можливо, ви також можете зловживати провідними / відстаючими надбавками пробілу?
Джонатан Аллан

@JonathanAllan На жаль, я думаю, що це неможливо. Вилучення заходу не додасть проміжного простору, а відсталого 1. А якщо пропустити будь-що, що стосується пробілів, то це викреслює лінійку літер. Як правило, цей алгоритм використовує індексацію, так що літери потрапляють до певного індексу в стовпці, а потім решта заповнюється пробілами, тому я думаю, що це більше не можна займатися в гольфі. Принаймні я радий, що Джелі не перевершив CJam. ;)
Ерік Покірник

: | Желе - гольфіст, ніж вугілля
лише

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
Використовуйте currying, щоб зберегти байт ( 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: ні, тому що ми виконуємо метод повторення просто на пробілі, а не на новій лінії + пробіл.
Лука

0

Математика, 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.