Diamondize некоторый текст


20

При заданной входной строке длиной 2или более, состоящей исключительно из буквенных символов [A-Z]или [a-z](по вашему выбору, если они все в верхнем или нижнем регистре), выведите непрерывную строку символов, образующую двойной ромбовидный шаблон.

Входная строка начинается с центральной линии и продолжается вниз и вправо по диагонали, пока не будет достигнут конец входной строки. Затем паттерн продолжается вверх и вправо по диагонали, пока вы не окажетесь выше центральной линии до длины входной строки минус 1. Продолжайте движение вниз и вправо до центральной линии, затем вниз и влево, затем вверх и влево («позади» центрального символа) и, наконец, вниз и влево назад к начальному символу.

Это немного многословно, и это лучше продемонстрировать на нескольких примерах:

"YOU"
  U   Y
 Y O U O
Y   O   U
 O Y U Y
  U   O

  ^   ^
 ↙ ↖ ↗ ↘
↘   ↗   >
 ↘ ↗ ↖ ↙
  V   V

Посмотрите, как YOUначинается с центральной линии и следует вниз и вправо, затем вверх и вправо и т. Д., Пока не вернется к началу. Обратите особое внимание Yна то, как верхняя и левая части находятся «позади» Oи поэтому не показаны.

Некоторые дополнительные примеры:

"HI"
 I I
H H H
 I I

"TEST"
   E     E
  S T   T S
 T   T T   T
T     S     T
 E   E E   E
  S T   T S
   T     T

"HELLO"
    L       L
   O L     E L
  H   E   H   O
 E     H O     H
H       L       E
 E     L L     L
  L   E   L   L
   L H     E O
    O       H

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

Не уверен, что это действительно важно, но почему второй (вверху слева) проход позади первого (вверху справа) прохода? Имеет менее интуитивный смысл, а также немного раздражает, чтобы пропустить или перерисовать это письмо.
BradC

2
@BradC Я играл с полосой Мёбиуса за столом, когда я выполнил задание, и полоса вроде как «отстает», вот почему. Нет другой причины.
AdmBorkBork

Может быть, идея включить «рисование» пути, используя символы со стрелками, чтобы помочь нам визуализировать его.
лохматый

@Shaggy Добавил рисунок.
AdmBorkBork

Хороший, этот более сложный, чем первый взгляд ..
booshlinux

Ответы:


10

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

GH<↗↘>↖↙LθθGH<Lθθ

Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:

GH

Нарисуйте вдоль пути.

<↗↘>↖↙

Нарисуйте в направлениях ↘↗↗↘↙↖↖↙ ( <и >являются короткими цепочками для этих двух пар, но другие пары не имеют коротких цепочек.)

Lθ

Каждый сегмент пути имеет одинаковую длину, включая концы, длины входных данных.

θ

Используйте ввод как текст, который будет написан вдоль пути.

GH<Lθθ

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


3
Этот вызов кажется специально для древесного угля
Иона

@Jonah К сожалению, команда текстового пути не рисует последний символ, если путь закрыт, поэтому вы не можете использовать трюк обратного рисования здесь. (Хотя, если бы это было так, в любом случае это было бы одинаковым количеством байтов, поскольку вращение строки стоит 6 байтов.)
Нил

9

05AB1E , 12 байтов

gIR7._•Íη•Λ

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

           Λ    use the canvas function
g               with the length of input for each segment
 IR7._          the input reversed and rotated left by 7 characters (we will draw this backwards to have the right center character)
      •Íη•     and the directions 1, 3, 3, 1, 7, 5, 5, 7 as a compressed number. 

Вы имели в виду 1, 3, 3, 1, 7, 5, 5, 7?
Нил

О, ты прав. Я немного перепутал числа
Дориан

6

JavaScript (ES6),  157 155  154 байта

Возвращает матрицу символов.

s=>(y=n=s.length,y+=i=X=Y=-1,m=[...Array(y+n)].map(_=>r=Array(4*n-3).fill` `),g=x=>x?g(x-=r[m[y][++i==6*n-6||+x]=s[i%n],y-=m[y-Y]?Y:Y=-Y,x-X]?X:X=-X):m)``

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

Как?

nw×h

  • w=4n3
  • h=2n1

(0,n1)

Основанный на 0 индекс символа центра, который должен быть пропущен в форме ромба:

p=6n6

n=4

введите описание изображения здесь

комментарии

s => (                           // s = input string
  y = n = s.length,              // n = length of s
  y += i = X = Y = -1,           // y = n - 1; i = X = Y = -1
  m =                            // create a matrix m[]:
    [...Array(y + n)].map(_ =>   //   - of height 2n-1
      r = Array(4 * n - 3)       //   - of width 4n-3 (save one of these rows in r[])
          .fill` `               //   - initially filled with spaces
    ),                           //
    g = x =>                     // g is a recursive function taking x
      x ?                        //   if x is truthy:
        g(                       //     do a recursive call:
          x -= r[                //       update x:
            m[y][                //         update m[y][x]:
              ++i == 6 * n - 6   //           unless this is the 2nd pass through the
              || +x              //           center cell, set it to the next character
            ] = s[i % n],        //           in s (otherwise we write to m[y][true]
                                 //           instead, which has no effect)
            y -=                 //         update y:
              m[y - Y] ? Y       //           bounce vertically if m[y - Y] is undefined
                       : Y = -Y, //
            x - X                //         bounce horizontally
          ] ? X                  //         if r[x - X] is undefined
            : X = -X             //
        )                        //     end of recursive call
      :                          //   else:
        m                        //     stop recursion and return m[]
)``                              // initial call to g with x = [''] (zero-ish but truthy)

У меня есть 136-байтовое решение, которое вдохновлено вашим решением, хотя я думаю, что к настоящему моменту оно может быть достаточно другим, чтобы считаться отдельным ответом.
Нил

@Neil Возможно, вы должны опубликовать его как новый ответ.
Арно

3

JavaScript (ES6), 136 байт

f=
(s,l=s.length-1,z=l*4,a=[...Array(l-~l)].map(_=>Array(z+1).fill` `),g=x=>x--?g(x,a[a[y=(x+l)%z]?y:z-y][x>z?z+z-x:x]=s[x%-~l]):a)=>g(z+z)
<input oninput=o.textContent=f(this.value).map(c=&gt;c.join``).join`\n`><pre id=o>

Возвращает двумерный массив. Работает, рисуя строку в массиве, непосредственно вычисляя координаты назначения, работая в обратном направлении от конца, так что центральная ячейка автоматически перезаписывается. Объяснение:

(s

Строка ввода.

,l=s.length-1

Расстояние между "отскоками", также половина индекса последней строки и один меньше, чем длина.

,z=l*4

Последний индекс столбца, также половина длины текста для рисования.

,a=[...Array(l-~l)].map(_=>Array(z+1).fill` `)

Массив пробелов.

,g=x=>x--

Обратный отсчет от последней ячейки до первой.

  ?g(x

Рекурсивный вызов для обработки оставшихся ячеек.

    ,a[a[y=(x+l)%z]?y:z-y]

Рассчитайте строку этой ячейки.

      [x>z?z+z-x:x]=s[x%-~l])

Рассчитайте столбец этой ячейки и принадлежащий ей символ.

  :a

Готово, возвращая массив.

)=>g(z+z)

Начните в конце текста.





0

Python 2 , 137 байт

s=input();n=len(s);m=2*n-2
for r in range(m+1):print''.join([s[[x,-8-x][(x<=m)==(m>2*r)]%n],' '][r!=(x+1-n)%m!=m-r]for x in range(4*n-3))

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

Полная программа, которая принимает строку в качестве входных данных для распечатки ромбовидной версии.

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