Діамантуйте текст


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 Я грав зі стрічкою Möbius за моїм робочим столом, коли я зіткнувся з викликом, і стрип ніби йшов «позаду», тому саме тому. Іншої причини немає.
AdmBorkBork

Може бути ідеєю включити "креслення" шляху за допомогою символів стрілки, щоб допомогти нам візуалізувати його.
Кудлатий

@Shaggy Додав малюнок.
AdmBorkBork

Хороший, Цей складніше, ніж перший погляд ..
booshlinux

Відповіді:


10

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

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

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

GH

Малюємо по стежці.

<↗↘>↖↙

Накресліть у напрямках the ( <і >є скорочення для цих двох пар, але інші пари не мають скорочень.)

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)``

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

Як?

нш×год

  • ш=4н-3
  • год=2н-1

(0,н-1)

Індекс, що базується на 0, центрального символу, який слід пропустити у формі алмазу:

p=6н-6

н=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)

Почніть з кінця тексту.





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