Развернуть во всех направлениях


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-art, как точка ..
  • Завершающие пробелы и одна завершающая новая строка необязательны.
  • Мы продолжаем разворачиваться до тех пор, пока у внешнего свернутого «блока» больше не будет центров для раскрытия.

Основные правила:

  • Это , поэтому выигрывает самый короткий ответ в байтах.
    Не позволяйте языкам кода-гольфа отговаривать вас от публикации ответов на языках, не относящихся к кодексу. Попробуйте найти как можно более короткий ответ для «любого» языка программирования.
  • К вашему ответу применяются стандартные правила , поэтому вы можете использовать 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

есть ошибка в тесте для "HowAboutAVeryLongExampleWhichIsAlsoAnEvenSquareInsteadOfOddOneAndExceeds64Chars": '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цикл, а не a, Mapпотому что мне нужен Assignрезультат Mapгде-то, и это нетривиально при работе с a Slice.

F⁴«

Развертывание происходит 4 раза, по одному для каждого направления (вниз, вправо, вверх, влево, как закодировано). Переменная цикла для этой петли i.

   Aυε

Возьмите копию нарезанной строки.

   J⁰¦⁰

Вернитесь к началу холста, чтобы каждое разворачивание hначиналось с hквадрата -by в том же месте.

   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-байтовую версию, полученную благодаря использованию всех последних функций Charcoal, включая Floor: Попробуйте онлайн! Ссылка на подробную версию кода.


Вы уверены, что это работает? Просто кажется, что TIO вызывает ошибку.
LyricLy

@LyricLy Бах, я думал, что был умен, но не смог на самом деле проверить, что это работает. Я верну изменения.
Нил

1
Дерьмо забыл заставить поплавки работать в ломтиках упс
только ASCII

@ ASCII-only Мне не помогает, мне нужно все равно усечь до целого числа перед тем, как умножить.
Нил

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