Zarysuj słowa za pomocą ich liter

14

Na potrzeby obecnego wyzwania „obrysowania” słowo oznacza otaczanie go sukcesywnie własnymi literami, zaczynając od ostatniego, a na końcu zamieniając oryginalne słowo w środku spacjami:

       oooooo 
       onnnno 
on ->  on  no 
       onnnno
       oooooo

Zadanie:

Biorąc pod uwagę listę słów, składającą się wyłącznie z małych i / lub wielkich liter angielskich, obrysuj każde słowo i wyświetlaj wszystkie powstałe bloki obok siebie poziomo, oddzielone kolumną pojedynczej spacji, wyrównane pionowo w środku bloków.

Możesz napisać pełny program lub funkcję.

Wejście:

Lista słów lub, jeśli wolisz, łańcuch rozdzielany spacjami lub innymi symbolami

Wynik:

Reprezentacja ASCII bloków dla wyszczególnionych słów. Wiodące / końcowe białe znaki są dozwolone.

Przypadki testowe:

Input 1: ["code", "golf"] (or "code golf")
Output 1:

    cccccccccccc gggggggggggg
    cooooooooooc goooooooooog
    coddddddddoc gollllllllog
    codeeeeeedoc golfffffflog
    code    edoc golf    flog
    codeeeeeedoc golfffffflog
    coddddddddoc gollllllllog
    cooooooooooc goooooooooog
    cccccccccccc gggggggggggg

Input 2: ["I", "am", "just", "a", "man"]  (or "I am just a man")
Output 2: 

           jjjjjjjjjjjj
           juuuuuuuuuuj     mmmmmmmmm
    aaaaaa jussssssssuj     maaaaaaam
III ammmma justtttttsuj aaa mannnnnam
I I am  ma just    tsuj a a man   nam  
III ammmma justtttttsuj aaa mannnnnam
    aaaaaa jussssssssuj     maaaaaaam 
           juuuuuuuuuuj     mmmmmmmmm 
           jjjjjjjjjjjj

Kryteria wygranej:

Najkrótszy kod w bajtach w każdym języku wygrywa. Będę bardzo wdzięczny, jeśli skomentujesz / wyjaśnisz swój kod i podejście.

Galen Iwanow
źródło
Czy możemy założyć, że jest co najmniej jedno słowo?
PurkkaKoodari
@ Pietu1998 Tak, zawsze jest co najmniej jedno słowo
Galen Iwanow
1
@Kevin Cruijssen Transpose?
Galen Iwanow

Odpowiedzi:

7

Płótno , 22 20 bajtów

l *;±21*{;l└*e⟳} ]r⤢

Wypróbuj tutaj!

Wyjaśnienie:

{                 ]    map over the inputs
 l *                     array of length spaces - the canvas of the current word
    ;                    get the word back on top
     ±                   reverse it
      21*                repeat each character twice
         {      }        for each character
          ;l└              push the height of the item below (the canvas)
             *             repeat the character that many times vertically
              e            and encase the canvas in that char column
               ⟳           and rotate it clockwise for encasing the next time
                 ∙      push another space as the separator of words
                   r   center the words
                    ⤢  and transpose the final output (as everything was built vertically)
dzaima
źródło
5

Węgiel drzewny , 35 bajtów

FA«≔LιθMθ↑Fθ«B⁻׳θ⊗κ⊕⊗⁻θκ§ικ↘»M⊕⊗θ→

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

FA«

Pętla nad listą wprowadzania.

≔Lιθ

Uzyskaj długość bieżącego słowa.

Mθ↑

Przejdź do lewego górnego rogu wynikowego konturu.

Fθ«

Zapętlić raz dla każdej postaci.

B⁻׳θ⊗κ⊕⊗⁻θκ§ικ

Narysuj pudełko o odpowiedniej wysokości, szerokości i charakterze.

↘»

Przejdź do lewego górnego rogu następnego pola.

M⊕⊗θ→

Przejdź do następnego konturu.

Neil
źródło
4

Haskell , 188 183 174 171 167 bajtów

-9 -13 bajtów dzięki Laikoni .

e=[]:e
c#a=k c<$>k(c<$a!!0)a
k c s=c:s++[c]
f w=foldr(#)[p w]w
p=(' '<$)
s w=unlines.map unwords.foldr(zipWith(:))e$until(\a->all((p a>=).p)$f<$>w)(k=<<p.head)<$>f<$>w

Wypróbuj online!

ovs
źródło
\a->and[p a>=p x|x<-f<$>w]może być \a->all((p a>=).p)$f<$>wi k c=(++[c]).(c:)może być k c s=c:s++[c].
Laikoni,
3

Pyth, 34 33 bajty

Jsm+;uCjR*2HG_.iddm\ dQjCm.[lJd;J

Wypróbuj online.

Zrzuca całą masę dodatkowych białych znaków, ale wyzwanie na to pozwala.

Wyjaśnienie

  • mQWykonuje następujące czynności dla każdego słowa dna wejściu Q:

    • m\ dmapuje słowo za pomocą x => " ", zasadniczo tworząc listę [" ", ..., " "]z tyloma elementami, ile słowo ma liter.
    • .iddprzeplata słowo ze sobą, powtarzając dwukrotnie litery tego słowa. _odwraca ten ciąg. wordstaje się ddrrooww.
    • uzaczyna się od G= tablica spacji i stosuje następujące wartości do każdej litery w przeplatanym ciągu w H:
      • *2H powtarza znak dwa razy.
      • jRGUmieszcza każdy ciąg Gmiędzy parą znaków.
      • Czamienia wiersze i kolumny. Gdy te trzy kroki zostaną wykonane dwa razy z tym samym znakiem w H, oznacza to linie Gtego znaku.
    • Mamy teraz kolumny dla zarysowanego słowa d . +;dodaje kolumnę spacji.
  • sspłaszcza tablicę kolumn dla każdego słowa i Jzapisuje ją w zmiennej J.
  • mJWykonuje następujące czynności dla każdej kolumny wyniku:
    • .[lJd;wypełnia obie strony kolumny spacjami, aby długość kolumny była równa liczbie kolumn. Jest to zawsze wystarczające wypełnienie, aby kolumny były wyrównane w pionie.
  • C zamienia kolumny w wiersze i j łączy wiersze z nowymi liniami.

Alternatywne rozwiązanie, 33 bajty

j.tsm.[L\ l+dsQ+;uCjR*2HG_.iddm\ 

Wypróbuj online.

Zauważ, że jest spacja. Przeważnie ten sam algorytm, z wyjątkiem tylko wypełnienia kolumn u góry, a następnie transpozycji z wypełnieniem spacją.

PurkkaKoodari
źródło
3

R 189 bajtów

function(x,S=32,`+`=rbind,`*`=cbind)cat(intToUtf8(Reduce(`+`,Map(function(s,K=utf8ToInt(s),o=S-!K){for(i in rev(K))o=i+i*o*i+i
for(j in(0:(max(nchar(x))-nchar(s)))[-1])o=S*o*S
o+S},x))+10))

Wypróbuj online!

Współpraca między digEmAll a mną na czacie .

function(x){
 S <- 32			# space
 `+` <- rbind			# alias for rbind
 `*` <- cbind			# alias for cbind
 outlineWord <- function(s){	# function to construct the outline for each word
  chars <- utf8ToInt(s)		# convert to code points
  output <- S - !chars		# replace each char with 32 (space)
  for(i in rev(chars))
   o <- i + i * o * i + i	# o <- rbind(i,cbind(i,o,i),i)
  for(j in(0:(max(nchar(x))-nchar(s)))[-1])
   o <- S * o * S		# pad with spaces
   o + S}			# return with an additional row of spaces between words
 outlines <- Map(outlineWord,x)	# apply outlineWord to each element of x
 outlines <- Reduce(`+`,outlines)# reduce by rbind
 outlines <- outlines+10	# add row of newlines
 cat(intToUtf8(outlines))	# convert back to strings and print
}
Giuseppe
źródło
187 z oczywistym pseudonimem
J.Doe
@ J.Doe to wiki społeczności, więc edytuj je w :-)
Giuseppe,
1

05AB1E , 46 bajtów

εg©;ò<Uyη央∍«®>∍}y𫩪®Xиª˜».º.∊}¶«».C.B€SζJ»

Nie jestem zbyt szczęśliwy z tego powodu, ale cieszę się, że to działa.

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie:

ε                             # Map `y` over the (implicit) input-list
 g                            #  Take the length of the current item
  ©                           #  Store it in the register (without popping)
   ;                          #  Halve it
    ò                         #  Ceil and cast to integer at the same time
     <                        #  Decrease it by 1
      U                       #  Pop and store it in variable `X`
 yη                           #  Take the prefixes of the current string `y`
   ε       }                  #  Map over these prefixes:
    ¤                         #   Take the last character of the string
     ®×                       #   Increase it to a size equal to the length from the register
       «                      #   Append it to the current prefix
        ®>                    #   Take the length from the register, and add 1
                             #   Shorten the string to that size
 y                            #  Push the string `y` again
  ð«                          #  Append a space
    ©                         #  Store it in the register (without popping)
     ª                        #  Append it at the end of the list of modified prefixes
      ®                       #  Push the string with space from the register again
       Xи                     #  Repeat it `X` amount of times
         ª                    #  Append them to the list
          ˜                   #  Flatten to remove the empty appended list if `X` was 0
           »                  #  Join by newlines
            .º.∊              #  Intersect mirror both horizontally and vertically
                }             # Close outer map
                 ¶«           # Append a newline after each (for the space delimiters)
                   »          # Join everything by newlines
                    .C        # Centralize it horizontally
                              # (too bad a centralize vertically isn't available..)
                      .B      # Split on newlines again
                        S    # Convert each line to a list of characters
                          ζ   # Zip, swapping rows/columns (with space filler by default)
                           J  # Join the loose characters of every line to a string again
                            » # Join the lines by newlines (and output implicitly)
Kevin Cruijssen
źródło