Diamondize Some Text

20

Diberikan string input yang panjang 2atau lebih panjang yang hanya terdiri dari karakter alfabet [A-Z]atau [a-z](pilihan Anda jika semuanya huruf besar atau semua huruf kecil), menghasilkan string karakter yang berkelanjutan membentuk pola berlian ganda.

String input dimulai pada garis tengah dan memanjang ke bawah dan ke kanan pada diagonal sampai akhir string input tercapai. Kemudian, polanya berlanjut ke atas dan ke kanan pada diagonal hingga Anda berada jauh di atas garis tengah sebagai panjang dari string input minus 1. Lanjutkan ke bawah dan ke kanan kembali ke garis tengah, lalu ke bawah dan- kiri, lalu atas-dan-kiri (pergi "di belakang" karakter tengah), dan akhirnya turun-dan-kiri kembali ke karakter awal.

Itu sedikit bertele-tele, dan itu lebih baik ditunjukkan oleh beberapa contoh:

"YOU"
  U   Y
 Y O U O
Y   O   U
 O Y U Y
  U   O

  ^   ^
 ↙ ↖ ↗ ↘
↘   ↗   >
 ↘ ↗ ↖ ↙
  V   V

Lihat bagaimana YOUmulai di garis tengah dan ikuti ke bawah dan ke kanan, lalu ke atas dan ke kanan, dll., Hingga kembali ke awal. Perhatikan terutama bagaimana Ypada bagian atas dan kiri "belakang" Odan karena itu tidak ditampilkan.

Beberapa contoh lebih lanjut:

"HI"
 I I
H H H
 I I

"TEST"
   E     E
  S T   T S
 T   T T   T
T     S     T
 E   E E   E
  S T   T S
   T     T

"HELLO"
    L       L
   O L     E L
  H   E   H   O
 E     H O     H
H       L       E
 E     L L     L
  L   E   L   L
   L H     E O
    O       H

  • Input dan output dapat diberikan dengan metode apa pun yang mudah .
  • Input dijamin setidaknya terdiri dari dua huruf (yaitu, Anda tidak akan pernah menerima ""sebagai input).
  • Anda dapat mencetaknya ke STDOUT atau mengembalikannya sebagai hasil fungsi.
  • Program lengkap atau fungsi dapat diterima.
  • Berapapun ruang kosong ekstranus dapat diterima, asalkan karakter berbaris dengan tepat (mis., Merasa bebas untuk mengisi sebagai persegi panjang).
  • Celah standar dilarang.
  • Ini adalah sehingga semua aturan golf biasa berlaku, dan kode terpendek (dalam byte) menang.
AdmBorkBork
sumber
Tidak yakin itu penting, sungguh, tetapi mengapa pass kedua (atas kiri) berada di belakang pass pertama (kanan atas)? Masuk akal kurang intuitif dan juga sedikit menjengkelkan untuk melewati atau menggambar ulang surat itu.
BradC
2
@BradC Saya sedang bermain dengan strip Möbius di meja saya ketika saya datang dengan tantangan, dan strip itu agak "belakang" jadi itu sebabnya. Tidak ada alasan lain.
AdmBorkBork
Mungkin ide untuk menyertakan "gambar" jalan menggunakan karakter panah, untuk membantu kami memvisualisasikannya.
Shaggy
@Shaggy Menambahkan gambar.
AdmBorkBork
Nice one, Yang ini lebih menantang dari pandangan pertama ..
booshlinux

Jawaban:

10

Arang , 17 byte

GH<↗↘>↖↙LθθGH<Lθθ

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

GH

Gambarlah sepanjang jalan.

<↗↘>↖↙

Gambarlah ke arah ↘↗↗↘↙↖↖↙ ( <dan >merupakan singkatan untuk kedua pasangan, tetapi pasangan lainnya tidak memiliki singkatan.)

Lθ

Setiap segmen jalur memiliki panjang yang sama, termasuk ujung, dari panjang input.

θ

Gunakan input sebagai teks yang akan ditulis di sepanjang jalan.

GH<Lθθ

Cetak dua bagian pertama dari lintasan lagi sehingga karakter tengah benar.

Neil
sumber
3
Tantangan ini tampaknya dibuat khusus untuk Charcoal
Jonah
@Jonah Sedihnya, perintah jalur teks tidak menggambar karakter terakhir jika jalur ditutup, jadi Anda tidak dapat menggunakan trik menggambar terbalik di sini. (Meskipun jika itu terjadi, toh itu akan menjadi jumlah byte yang sama, karena memutar string membutuhkan biaya 6 byte.)
Neil
9

05AB1E , 12 byte

gIR7._•Íη•Λ

Cobalah online!

           Λ    use the canvas function
g               with the length of input for each segment
 IR7._          the input reversed and rotated left by 7 characters (we will draw this backwards to have the right center character)
      •Íη•     and the directions 1, 3, 3, 1, 7, 5, 5, 7 as a compressed number. 
Dorian
sumber
Apakah maksud Anda 1, 3, 3, 1, 7, 5, 5, 7?
Neil
Oh kamu benar Saya mencampur sedikit angka
Dorian
6

JavaScript (ES6),  157 155  154 byte

Mengembalikan matriks karakter.

s=>(y=n=s.length,y+=i=X=Y=-1,m=[...Array(y+n)].map(_=>r=Array(4*n-3).fill` `),g=x=>x?g(x-=r[m[y][++i==6*n-6||+x]=s[i%n],y-=m[y-Y]?Y:Y=-Y,x-X]?X:X=-X):m)``

Cobalah online!

Bagaimana?

nw×h

  • w=4n3
  • h=2n1

(0,n1)

Indeks berbasis karakter pusat 0 yang harus dilewati dalam bentuk berlian adalah:

p=6n6

n=4

masukkan deskripsi gambar di sini

Berkomentar

s => (                           // s = input string
  y = n = s.length,              // n = length of s
  y += i = X = Y = -1,           // y = n - 1; i = X = Y = -1
  m =                            // create a matrix m[]:
    [...Array(y + n)].map(_ =>   //   - of height 2n-1
      r = Array(4 * n - 3)       //   - of width 4n-3 (save one of these rows in r[])
          .fill` `               //   - initially filled with spaces
    ),                           //
    g = x =>                     // g is a recursive function taking x
      x ?                        //   if x is truthy:
        g(                       //     do a recursive call:
          x -= r[                //       update x:
            m[y][                //         update m[y][x]:
              ++i == 6 * n - 6   //           unless this is the 2nd pass through the
              || +x              //           center cell, set it to the next character
            ] = s[i % n],        //           in s (otherwise we write to m[y][true]
                                 //           instead, which has no effect)
            y -=                 //         update y:
              m[y - Y] ? Y       //           bounce vertically if m[y - Y] is undefined
                       : Y = -Y, //
            x - X                //         bounce horizontally
          ] ? X                  //         if r[x - X] is undefined
            : X = -X             //
        )                        //     end of recursive call
      :                          //   else:
        m                        //     stop recursion and return m[]
)``                              // initial call to g with x = [''] (zero-ish but truthy)
Arnauld
sumber
Saya memiliki solusi 136 byte yang terinspirasi oleh solusi Anda, meskipun saya pikir sekarang mungkin cukup berbeda untuk memenuhi syarat sebagai jawaban yang terpisah.
Neil
@Neil Anda mungkin harus mempostingnya sebagai jawaban baru.
Arnauld
3

JavaScript (ES6), 136 byte

f=
(s,l=s.length-1,z=l*4,a=[...Array(l-~l)].map(_=>Array(z+1).fill` `),g=x=>x--?g(x,a[a[y=(x+l)%z]?y:z-y][x>z?z+z-x:x]=s[x%-~l]):a)=>g(z+z)
<input oninput=o.textContent=f(this.value).map(c=&gt;c.join``).join`\n`><pre id=o>

Mengembalikan array dua dimensi. Bekerja dengan menggambar string ke dalam array yang secara langsung menghitung koordinat tujuan yang bekerja mundur dari ujung sehingga sel pusat ditimpa secara otomatis. Penjelasan:

(s

Input string.

,l=s.length-1

Jarak antara "memantul", juga setengah dari indeks baris terakhir dan satu kurang dari panjangnya.

,z=l*4

Indeks kolom terakhir, juga setengah dari panjang teks untuk menggambar.

,a=[...Array(l-~l)].map(_=>Array(z+1).fill` `)

Array ruang.

,g=x=>x--

Hitung mundur dari sel terakhir ke yang pertama.

  ?g(x

Panggilan rekursif untuk memproses sel yang tersisa.

    ,a[a[y=(x+l)%z]?y:z-y]

Hitung baris sel ini.

      [x>z?z+z-x:x]=s[x%-~l])

Hitung kolom sel ini dan karakter yang ada di sana.

  :a

Selesai dengan mengembalikan array.

)=>g(z+z)

Mulai dari akhir teks.

Neil
sumber
Itu bagus, +1
Ver Nick berkata Reinstate Monica
2

J , 79 77 75 byte

(|.@$~8*])`([:;/(1,~<:@])+/\@,(_2{&1 _1\#:33495)}.@#~])`(' '$~1+2 4*])}<:@#

Cobalah online!

Jonah
sumber
1

C (dentang) , 201 196 188 byte

x,y,i,v,m,n;f(s,z){char*a=s,o[i=(y=z*2-1)*(x=y+y)];for(v=x*2-2;i;n=m=1)o[--i]=i%x?32:10;for(i=x*--z;v--;i+=x*m+n)o[i]==32?o[i]=*a:0,a=*++a?a:s,n=i%x>x-3?-1:n,m=i/x?i/x<y-1?m:-1:1;puts(o);}

Cobalah online!

-13 saran @ceilingcat

AZTECCO
sumber
0

Python 2 , 137 byte

s=input();n=len(s);m=2*n-2
for r in range(m+1):print''.join([s[[x,-8-x][(x<=m)==(m>2*r)]%n],' '][r!=(x+1-n)%m!=m-r]for x in range(4*n-3))

Cobalah online!

Program lengkap yang mengambil string sebagai input saat mencetak versi berlian.

Chas Brown
sumber