Розгортайте в усі сторони


14

Вхід:

Рядок

Вихід:

1) Спочатку беремо символ видалення в кінці вхідного рядка, поки нам не залишиться довжина, яка є квадратом (тобто 1, 4, 9, 16, 25, 36 і т. Д.)
Отже abcdefghijklmnopqrstuvwxyz(довжина 26) стає abcdefghijklmnopqrstuvwxy( довжина 25).

2) Потім ми ставимо це в квадрат, по черзі, ліворуч праворуч:

abcde
fghij
klmno
pqrst
uvwxy

3) Складаємо його у всіх чотирьох напрямках, як це (ми продовжуємо розгортатися, поки на зовнішньому складеному «блоці» більше немає внутрішніх символів).

      m
     qrs
     l n
     ghi
    abcde
 ihgf   jihg
mn lk   on lm
 srqp   tsrq
    uvwxy
     qrs
     l n
     ghi
      m

Деякі речі, що слід зазначити, коли ми згортаємось назовні, ми в основному дзеркально виглядаємо так (цифри, додані як уточнення, що представляє "індекси" у цих прикладах):

Коли ми складемо ліву сторону:

 123    to:   321 123
fghij         ihgf   j

Коли ми складемо праву сторону:

 123    to:    123 321
fghij         f   jihg

Коли ми згинаємо вгору:

            3q
            2l
            1g
  b   to:    b
 1g         1
 2l         2
 3q         3
  v          v

Коли ми згинаємо вниз:

 b          b
1g         1
2l         2
3q         3
 v   to:    v
           3q
           2l
           1g

Правила виклику:

  • Можна припустити, що вхід завжди матиме щонайменше 1 символ (який також буде вихідним).
  • Формат виводу є гнучким, тому ви можете друкувати на STDOUT або STDERR; повернутися у вигляді рядкового масиву / списку або символу 2D-масиву; одина рядок з новими рядками; тощо.
  • Вхід буде містити лише буквено-цифрові символи ( a-zA-Z0-9)
  • Ви також можете використовувати не алфавітно-цифрові символи для заповнення пробілів у та / або навколо виводу ASCII-арт, як крапка ..
  • Кінцеві пробіли та окремий проміжний новий рядок необов’язкові.
  • Ми продовжуємо розгортатися до тих пір, поки на зовнішньому складеному «блоці» не буде більше розгорнутих центрів.

Загальні правила:

  • Це , тому найкоротша відповідь у байтах виграє.
    Не дозволяйте мовам з кодовим гольфом відштовхувати вас від публікації відповідей з мов, що не кодують гольф. Спробуйте придумати якомога коротшу відповідь на "будь-яку" мову програмування.
  • Стандартні правила застосовуються до вашої відповіді, тому вам дозволяється використовувати STDIN / STDOUT, функції / метод із відповідними параметрами та повним програмами типу повернення. Твій дзвінок.
  • Лазівки за замовчуванням заборонені.
  • Якщо можливо, додайте посилання з тестом для вашого коду.
  • Також, будь ласка, додайте пояснення, якщо це необхідно.

Тестові приклади:

Input: abcdefghijklmnopqrstuvwxy
Output:
      m
     qrs
     l n
     ghi
    abcde
 ihgf   jihg
mn lk   on lm
 srqp   tsrq
    uvwxy
     qrs
     l n
     ghi
      m

Input: A
Ouput:
A

Input: ThisIsATest
Output:
  I
 Thi
Is sI
 ATe
  I

Input: HowAboutAVeryLongExampleWhichIsAlsoAnEvenSquareInsteadOfOddOneAndExceeds64Chars
Output:

               An
               ch
              xamp
              i  I
              o  E
              quar
             steadO
             S    e
             s    v
             h    s
             E    l
             VeryLo
            HowAbout
      oLyreVA      noLyreV
  xampl    Eg      el    Examp
hci  Is    hW      As    hi  Ihc
nAo  Ev    sl      ev    so  EnA
  quare    Sn      Ie    Squar
      Odaetsn      fOdaets
            OddOneAn
             steadO
             S    e
             s    v
             h    s
             E    l
             VeryLo
              xamp
              i  I
              o  E
              quar
               An
               ch

Input: Lenght7
Output:
Le
ng

Input: abc
Output:
a

є помилка в тесті на тему "How AboutAVeryLongExampleWhichIsAlsoAnEvenSquareInsteadOfOddOneAndExceeds64Chars": 'h' -> 'i' біля нижньої частини результату
ngn

Відповіді:


5

SOGL V0.12 , 75 байт

l√u²m√lH»{ā;l⁾:A∫Ba{bIwFIWhFbž;FIbI@ž}};}¹K⁴{ē2\⌡±e{@Κ};⁴┼┼};0E{ē2\⌡№:h++}╚

Спробуйте тут!

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

70 байтів √lH»{ā;l⁾:A∫Ba{bIwFIWhFbž;FIbI@ž}};}¹K⁴{ē2\⌡±e{@Κ};⁴┼┼};0E{ē2\⌡№:h++}╚теж працює, але, оскільки я лише зараз реалізований на рядках, і в документації не було зазначено, що це довжина підлоги, я не вважаю це.

Пояснення:

creating a square from the input

l       get the length of the input
 √      get its square root
  u     floor that
   ²    square it
    m   mold the input to that length
     √  convert it to a square

creating the unfoldings of the square - the idea is to cut out the inner squares to a new array

lH»{                              } (length-1)//2 times do
    ā;                                push an empty array below ToS
      l⁾                              push ToS.length - 2 (ToS here is the square or the previous unfolding)
        :A                            save a copy of that in the variable A
          ∫B                    }     repeat that amount of times, saving iteration on B - cutting the inner square to the empty array
            a{                 }        variable A times do
              bIw                         get the b+1th row of the previous unfolding
                 FIW                      get the (current loops iteration + 1)th character of that
                    h                     swap the 2 items below ToS - so the stack now is [..., prevUnfolding, newArray, character]
                     Fbž                  at [current loops iteration; b] insert that character in the array
                        ;                 swap the top 2 items - the stack now is [..., newArray, prevUnfolding]
                         FIbI@ž           at [current loops iteration+1; b+1] insert a space
                                 ;    get the now not empty array ontop of the stack

add the horizontal unfoldings

¹                    wrap the stack in an array
 K                   push the 1st item of that, which will function as the canvas
  ⁴{              }  iterate over a copy of the remaining items
    ē2\⌡               repeat (e++ divides by 2) times (default for the variable E is the input, which defaults to 0)
        ±                reverse the array horizontally
         e{  }         repeat e times
           @Κ            add a space before ToS
              ;⁴┼┼     add that horizontally before and after the canvas

add the veertical unfoldings

;                get the copy of the foldings above the canvas
 0E              reset the variable E to 0
   {         }   iterate the copy of the foldings
    ē2\⌡           repeat (e++ divides by 2) times (default for the variable E is the input, which defaults to 0)
        №            reverse the array vertically
         :h++      add that vertically before and after the canvas
              ╚  center the canvas vertically

Ваша версія 70-байт дійсна, оскільки неконкурентована вже не річ .
Кудлатий

@Shaggy 75-байтна версія діє лише тому, що до цього виклику працювала лише цифра . Причина, чому я не рахую 75-байтну версію, полягає в тому, що мені здається, що вона потрапляє під лазівку додавання вбудованого просто для виклику
dzaima

4

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

AI§⪪IXLθ⁰·⁵.⁰ηFη⊞υ✂θ×ιηF⁴«AυεJ⁰¦⁰F÷⁺¹η²«F⁴«F⁻η⁺κꧧεκ⁺μκ↷A⮌EεEε§ξν嶻A⎇﹪ι²Eε⮌λ⮌εεA⎇‹ι²⁻⁺²⁺κκη⁻η⁺κκκ¿﹪ι²Mκ¹M¹κ

Спробуйте в Інтернеті! Зверніть увагу, що з тих пір було змінено на посилання, і це посилання відображає це. Пояснення:

       θ          Input string
      L           Length
     X  ⁰·⁵       Raise to the power 0.5
    I             Cast to string
   ⪪       .      Split on the decimal point
  §         ⁰     Take the first element (integer part)
 I                Cast to integer
A            η    Assign to h

Розраховує h = int(sqrt(len(q))). ( Floorще не було впроваджено ...)

Fη⊞υ✂θ×ιη

Витягує hфрагменти довжини hз введення. ( На самом деле я не турбуюся усічення скибочок довжини h.) Я використовую forцикл , а не Mapтому , що мені потрібно Assignв результаті Mapде - то і це нетривіально , коли має справу з Slice.

F⁴«

Розгортання відбувається 4 рази, по одному в кожному напрямку (вниз, вправо, вгору, вліво як закодовано). Змінна циклу для цього циклу є i.

   Aυε

Візьміть копію нарізаного рядка.

   J⁰¦⁰

Поверніться до початку полотна, так що кожне розгортання починається з квадрата h-by- hв тому самому місці.

   F÷⁺¹η²«

Повторення (h+1)/2разів; один раз за кожне розгортання, плюс один раз для початкового квадрата. Змінна циклу для цього циклу є k.

          F⁴«

Повторіть 4 рази, один раз для кожної сторони розгорнутого квадрата. (Я не використовую змінну циклу l.)

             F⁻η⁺κκ         Loop h-2k times, loop variable `m`
                    §εκ     Take the `k`th row
                   §   ⁺μκ  Take the `k+m`th column
                            Implicitly print the character

Надрукуйте одну сторону розгорнутого квадрата. Оскільки це kрозгортається, сторона квадрата є h-2kі відводить символів kвід краю початкового квадрата.

Згорнутий готовий до друку наступної сторони квадрата.

               Eε       Map over the array (element `m`, index `n`)
                 Eε     Map over the array (element `x`, index `p`)
                   §ξν  Take the `n`th element of `x`
              ⮌         Reverse
             A        ε Replace the array with the result

Оберніть нарізану струну. (Так, це ξ. Я не використовую його часто!) EηТакож працював би для зовнішнього Map. Обертання також має зручний побічний ефект від обрізання ширини масиву до h.

             ¶»

Після друку збоку курсор переміщується від краю квадрата. Друк на один символ менше не вдається для квадратів сторони 1 і в будь-якому випадку є менш гострими. Попередньо поклавши нову лінію, зручно переміщувати курсор назад у кут.

            ﹪ι²         Take `i` modulo 2
           ⎇            Choose either
                   ⮌ε   Reverse the array
               Eε       Map over the array (element `l`, index `m`)
                 ⮌λ     Reverse each element
          A          ε  Replace the array with the result

Переверніть квадрат вертикально або горизонтально, як це доречно.

           ⎇‹ι²                 If `i` < 2
                  ⁺κκ           Double `k`
                ⁺²              Add 2
               ⁻     η          Subtract `h`
                        ⁺κκ     Else double `k`
                      ⁻η        Subtract from `h`
          ≔                κ    Assign back to `k`.

Обчисліть переміщення до наступного розгортання.

           ﹪ι²          Take `i` modulo 2
          ¿             If not zero
              Mκ¹       `k` across and 1 down
                 M¹κ    Else 1 across and `k` down

Перемістіть горизонтально або вертикально до наступного розгортання, якщо це доречно.

Ось посилання на 97-байтну версію, отриману за допомогою всіх останніх функцій деревного вугілля, включаючи Floor: Спробуйте його в Інтернеті! Посилання на багатослівну версію коду.


Ви впевнені, що це працює? TIO просто видає помилку.
LyricLy

@LyricLy Ба, я думав, що я розумний, але не зміг перевірити, чи працює він. Я поверну зміни.
Ніл

1
Crap забув змусити поплавці працювати на скибочках ой
лише для ASCII

@ ASCII-тільки мені не допомагає, мені потрібно усікати до цілого числа, перш ніж множити.
Ніл

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