Rozłóż we wszystkich kierunkach

14

Wejście:

Sznurek

Wynik:

1) Najpierw bierzemy znak usuwania na końcu ciągu wejściowego, dopóki nie zostanie nam długość, która jest kwadratem (tj. 1, 4, 9, 16, 25, 36 itd.)
Tak więc abcdefghijklmnopqrstuvwxyz(długość 26) staje się abcdefghijklmnopqrstuvwxy( długość 25).

2) Następnie umieszczamy to w kwadracie, po jednej linii, od lewej do prawej:

abcde
fghij
klmno
pqrst
uvwxy

3) Składamy go we wszystkich czterech kierunkach, w ten sposób (rozkładamy, dopóki zewnętrzny złożony blok nie będzie miał żadnych wewnętrznych znaków do rozwinięcia):

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

Należy zwrócić uwagę na kilka rzeczy: kiedy składamy na zewnątrz, w zasadzie odbijamy w ten sposób (liczby dodawane jako wyjaśnienie, które reprezentują „indeksy” w tych przykładach):

Kiedy rozkładamy lewą stronę:

 123    to:   321 123
fghij         ihgf   j

Kiedy składamy prawą stronę:

 123    to:    123 321
fghij         f   jihg

Kiedy składamy do góry:

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

Kiedy składamy w dół:

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

Zasady konkursu:

  • Możesz założyć, że dane wejściowe zawsze będą miały co najmniej 1 znak (który będzie również danymi wyjściowymi).
  • Format wyjściowy jest elastyczny, dzięki czemu można drukować do STDOUT lub STDERR; zwraca jako tablicę łańcuchową / listę lub tablicę znaków 2D; pojedynczy ciąg z nowymi wierszami; itp.
  • Dane wejściowe będą zawierać tylko znaki alfanumeryczne ( a-zA-Z0-9)
  • Możesz również użyć znaku niealfanumerycznego, aby wypełnić spacje i / lub wokół wyjścia ASCII-art, jak kropka ..
  • Końcowe spacje i pojedyncza nowa linia są opcjonalne.
  • Kontynuujemy rozkładanie, dopóki zewnętrzny złożony blok nie będzie miał więcej centrów do rozwinięcia.

Główne zasady:

  • To jest , więc wygrywa najkrótsza odpowiedź w bajtach.
    Nie pozwól, aby języki gry w golfa zniechęcały Cię do publikowania odpowiedzi w językach niekodujących golfa. Spróbuj znaleźć możliwie najkrótszą odpowiedź na „dowolny” język programowania.
  • Do odpowiedzi mają zastosowanie standardowe reguły , więc możesz używać STDIN / STDOUT, funkcji / metody z odpowiednimi parametrami i zwracanymi typami, pełnych programów. Twoja decyzja.
  • Domyślne luki są zabronione.
  • Jeśli to możliwe, dodaj link z testem swojego kodu.
  • W razie potrzeby dodaj również wyjaśnienie.

Przypadki testowe:

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
Kevin Cruijssen
źródło
w teście występuje błąd „HowAboutAVeryLongExampleWhichIsAlsoAnEvenSquareInsteadOfOddOneAndExceeds64Chars”: „h” -> „i” u dołu wyjścia
ngn

Odpowiedzi:

5

SOGL V0.12 , 75 bajtów

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

Wypróbuj tutaj!

Oczekuje to danych wejściowych na stosie, więc dla łatwości użycia dodałem ,na początku. Może to powodować problemy, jeśli dane wejściowe zawierają tylko liczby, więc tutaj jest zestaw testów do tego.

√lH»{ā;l⁾:A∫Ba{bIwFIWhFbž;FIbI@ž}};}¹K⁴{ē2\⌡±e{@Κ};⁴┼┼};0E{ē2\⌡№:h++}╚Działa też 70 bajtów , ale ponieważ dopiero teraz zaimplementowałem ciągi, a dokumentacja nie wspomniała, że ​​osiągnie długość, nie będę tego liczyć.

Wyjaśnienie:

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
dzaima
źródło
Twoja 70-bajtowa wersja jest ważna, ponieważ niekonkurowanie nie jest już niczym .
Shaggy
@Shaggy 75-bajtowa wersja jest ważna tylko dlatego, że wcześniej to wyzwanie działało tylko na liczbach. Powodem, dla którego nie liczę wersji 75-bajtowej, jest to, że czuję, że mieści się w niej luka polegająca na dodaniu wbudowanego tylko dla wyzwania
dzaima
4

Węgiel drzewny , 120 109 bajtów

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

Wypróbuj online! Uwaga: od tego czasu zmieniono na i link to odzwierciedla. Wyjaśnienie:

       θ          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

Oblicza h = int(sqrt(len(q))). ( Floormiał dopiero zostać wdrożony ...)

Fη⊞υ✂θ×ιη

Wydobywa hplasterki długości hz danych wejściowych. (Właściwie nie zawracam sobie głowy przycinaniem plastrów na długość h.) Używam forraczej pętli niż a, Mapponieważ potrzebuję gdzieś Assignwyniku, Mapa to nie jest łatwe, gdy mam do czynienia z Slice.

F⁴«

Rozkładanie odbywa się 4 razy, raz dla każdego kierunku (w dół, w prawo, w górę, w lewo zgodnie z kodowaniem). Zmienna pętli dla tej pętli to i.

   Aυε

Weź kopię pociętego sznurka.

   J⁰¦⁰

Skocz z powrotem do pochodzenia płótna tak, że każdy zaczyna Unfold z h-by- hplacu w tym samym miejscu.

   F÷⁺¹η²«

Powtórz (h+1)/2czasy; raz dla każdego rozwinięcia, plus raz dla oryginalnego kwadratu. Zmienna pętli dla tej pętli to k.

          F⁴«

Powtórz 4 razy, raz dla każdej strony rozłożonego kwadratu. (Nie używam zmiennej pętli l.)

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

Wydrukuj jedną stronę rozłożonego kwadratu. Ponieważ jest to krozwinięcie th, bok kwadratu jest h-2ki zabiera postacie kz krawędzi oryginalnego kwadratu.

Obróć gotowy do wydrukowania następnej strony kwadratu.

               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

Obróć pokrojony sznurek. (Tak, to a ξ. Nie często go używam!) EηDziałałoby również na zewnętrzne Map. Obrót ma również wygodny efekt uboczny skracania szerokości tablicy do h.

             ¶»

Po wydrukowaniu boku kursor zsuwa się z krawędzi kwadratu. Drukowanie jednego znaku mniej nie powiedzie się dla kwadratów strony 1 i jest mniej golfa. Po uprzednim obróceniu drukowanie nowego wiersza wygodnie przesuwa kursor z powrotem do rogu.

            ﹪ι²         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

Odwróć kwadrat pionowo lub poziomo, stosownie do potrzeb.

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

Oblicz przesunięcie do następnego rozwinięcia.

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

Przejdź odpowiednio poziomo lub pionowo do następnego rozłożenia.

Oto link do 97-bajtowej wersji uzyskanej dzięki wykorzystaniu wszystkich najnowszych funkcji węgla drzewnego, w tym Floor: Wypróbuj online! Link jest do pełnej wersji kodu.

Neil
źródło
Jesteś pewien, że to działa? Wydaje się, że TIO powoduje błąd.
LyricLy
@LyricLy Bah, myślałem, że jestem sprytny, ale nie sprawdziłem, czy to działa. Cofam zmianę.
Neil
1
Bzdury zapomniały, aby pływaki działały w plasterkach, ups
tylko ASCII,
@ Tylko ASCII Nie pomaga, muszę obciąć liczbę całkowitą przed pomnożeniem.
Neil
Dobrze. Cóż, wkrótce dodam podłogę, żeby nie stanowiło to większego problemu: P
tylko ASCII