Buat garis besar kata-kata dengan surat-surat mereka

14

Untuk keperluan tantangan saat ini untuk "menguraikan" sebuah kata berarti mengelilinginya secara berurutan dengan hurufnya sendiri, dimulai dengan yang terakhir, dan akhirnya untuk mengganti kata asli di tengah dengan spasi:

       oooooo 
       onnnno 
on ->  on  no 
       onnnno
       oooooo

Tugas:

Diberikan daftar kata-kata, yang hanya terdiri dari huruf Inggris kecil dan / atau besar, garis besar setiap kata dan tampilkan semua blok yang dihasilkan bersebelahan secara horizontal, dipisahkan oleh kolom ruang tunggal, selaras secara vertikal di tengah-tengah blok.

Anda dapat menulis program lengkap, atau suatu fungsi.

Memasukkan:

Daftar kata-kata, atau jika Anda lebih suka - string spasi atau simbol-dibatasi lainnya

Keluaran:

Representasi ASCII dari blok untuk kata-kata yang diuraikan. Ruang putih terkemuka / trailing diizinkan.

Kasus uji:

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

Kriteria pemenang:

Kode terpendek dalam byte di setiap bahasa menang. Saya akan sangat menghargai jika Anda mengomentari / menjelaskan kode dan pendekatan Anda.

Galen Ivanov
sumber
Bisakah kita berasumsi setidaknya ada satu kata?
PurkkaKoodari
@ Pietu1998 Ya, selalu ada setidaknya satu kata
Galen Ivanov
1
@Kevin Cruijssen Transpose?
Galen Ivanov

Jawaban:

7

Kanvas , 22 20 byte

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

Coba di sini!

Penjelasan:

{                 ]    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
sumber
5

Arang , 35 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

FA«

Ulangi daftar input.

≔Lιθ

Dapatkan panjang kata yang sekarang.

Mθ↑

Pindah ke sudut kiri atas garis yang dihasilkan.

Fθ«

Ulangi satu kali untuk setiap karakter.

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

Gambarlah kotak dengan tinggi, lebar, dan karakter yang sesuai.

↘»

Pindah ke sudut kiri atas kotak berikutnya.

M⊕⊗θ→

Pindah ke garis selanjutnya.

Neil
sumber
4

Haskell , 188 183 174 171 167 byte

-9 -13 byte, terima kasih kepada 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

Cobalah online!

ovs
sumber
\a->and[p a>=p x|x<-f<$>w]bisa \a->all((p a>=).p)$f<$>wdan k c=(++[c]).(c:)bisa k c s=c:s++[c].
Laikoni
3

Pyth, 34 33 byte

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

Cobalah online.

Buang banyak ruang putih ekstra, tapi itu diizinkan oleh tantangan.

Penjelasan

  • m... Qapakah yang berikut ini untuk setiap kata ddalam input Q:

    • m\ dmemetakan kata dengan x => " ", pada dasarnya membuat daftar [" ", ..., " "]dengan item sebanyak kata memiliki huruf.
    • .iddinterleaves kata itu dengan dirinya sendiri, mengulangi kata-kata kata itu dua kali. _membalikkan string ini. wordmenjadi ddrrooww.
    • udimulai dengan G= array spasi, dan menerapkan yang berikut dengan setiap huruf dalam string yang disisipkan diH :
      • *2H mengulangi karakter tersebut dua kali.
      • jR... Gmenempatkan setiap string di Gantara pasangan karakter.
      • Cmenukar baris dan kolom. Ketika tiga langkah ini dilakukan dua kali dengan karakter yang sama H, ini menguraikan garis Gdengan karakter itu.
    • Kami sekarang memiliki kolom untuk kata yang diuraikan d. +;menambahkan kolom spasi.
  • smeratakan array kolom untuk setiap kata, dan Jmenyimpannya dalam variabel J.
  • m... Japakah yang berikut ini untuk setiap kolom output:
    • .[lJd;mengisi kedua sisi kolom dengan spasi sehingga panjang kolom sama dengan jumlah kolom. Ini selalu padding yang cukup untuk membuat kolom sejajar secara vertikal.
  • Cmengubah kolom menjadi baris dan jbergabung dengan baris dengan baris baru.

Solusi alternatif, 33 byte

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

Cobalah online.

Perhatikan bahwa ada spasi tambahan. Sebagian besar algoritma yang sama, kecuali hanya bantalan kolom di atas dan kemudian transpos dengan spasi.

PurkkaKoodari
sumber
3

R , 189 byte

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

Cobalah online!

Kolaborasi antara digEmAll dan saya di chat .

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
sumber
187 dengan alias yang jelas
J.
@ J.Apakah itu komunitas wiki, jadi silakan mengeditnya di :-)
Giuseppe
1

APL (Dyalog Classic) , 57 51 50 byte

{⍉⊃⍪/,/((⊢-⌈/)≢¨⍵)⌽↑{⍪¨↓0 1↓⍕,∘⍉∘⌽⍣4/⍵,⊂⍉⍪¯1/⍵}¨⍵}

Cobalah online!

ngn
sumber
1

05AB1E , 46 byte

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

Tidak terlalu senang tentang itu, tapi aku senang itu berhasil.

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

ε                             # 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
sumber