Kata rantai bergaya silang


18

Tantangan

Diberikan daftar kata-kata yang ["Programming", "Puzzles", "Code", "Golf"]menghasilkan kata-kata gaya silang:

      P rogramming
      kamu
      z
      z
  G l
C ode
  ls
  f

Algoritma

  • Anda harus memproses daftar dalam urutan yang diberikan.
  • Kata-kata dicetak dalam orientasi bergantian, mulai secara horizontal .
  • Dua kata berpotongan pada huruf pertama dalam kata pertama yang juga hadir dalam kata kedua. Jika huruf ini muncul beberapa kali dalam kata seond, ambil yang pertama.

    Contoh :
    ["no", "on"]menjadi:

    o
    n o
    

    dan tidak

    n o
      n
    

Catatan tambahan

  • Kata-kata yang berdekatan dalam daftar akan memiliki setidaknya satu huruf umum. ["Hi", "there"]bukan input yang valid.
  • Kata-kata tidak akan pernah bertabrakan. Akan selalu ada ruang yang cukup untuk mencetak kata di persimpangan pertama yang mungkin. ["Hello", "there", "end", "hello"]bukan input yang valid
  • Pencocokan ini peka huruf besar-kecil.
  • Kata-kata dapat diperluas ke kiri dan ke atas.
  • Huruf kata horizontal harus dipisahkan oleh satu spasi.
  • Daftar input akan berisi setidaknya dua kata.
  • Semua kata akan cocok dengan regex: [A-Za-z]+
  • Anda dapat mencetak sebanyak mungkin spasi putih atau baris baru yang diinginkan, asalkan kata-katanya dirantai dengan benar.
  • Di sisi lain Anda tidak dapat menambahkan spasi putih tambahan. Kata yang mengapung ke kiri yang paling memiliki nol ruang memimpin, baris lain memiliki begitu banyak ruang terkemuka yang semuanya berbaris dengan benar.
  • Program Anda harus dapat menangani jumlah kata yang berubah-ubah

Aturan

  • Fungsi atau program lengkap diizinkan.
  • Aturan default untuk input / output.
  • Celah standar berlaku.
  • Ini adalah , sehingga byte-count terendah akan menang. Tiebreak adalah pengiriman sebelumnya.

Uji kasus

Daftar input pada baris pertama, output dimulai pada baris kedua.

["Stack", "Exchange"]
    E
    x
    c
    h
S taktik
    n
    g
    e
["Ini", "situs", "lulus", "akhirnya"]
    f
    adalah
    dan miliknya
lulus
    le
    l
    y


Selamat Coding!


Contoh 2, mungkin persimpangan pertama antara sitedan graduatedadalaht
edc65

@ edc65 Malu pada saya, memperbaikinya. Terima kasih atas petunjuknya!
Denker

Jawaban:


3

JavaScript (ES6) 253

Sebagai fungsi anonim dengan parameter array

z=>(z.map((w,i)=>(i&&[...p].some((c,j)=>~(k=w.search(c))?i&1?[y-=k,x+=j]:[y+=j,x-=k]:0),[p=w,x<t?t=x:x,y<u?u=y:y]),t=u=x=y=0).map(([w,x,y],i)=>{x-=t,y-=u;for(c of w)(o[y]=o[y]||[])[x]=c,i&1?y++:x++},o=[]),o.map(r=>[...r].map(x=>x||' ').join` `).join`
`)

F=z=>(z.map((w,i)=>(i&&[...p].some((c,j)=>~(k=w.search(c))?i&1?[y-=k,x+=j]:[y+=j,x-=k]:0),[p=w,x<t?t=x:x,y<u?u=y:y]),t=u=x=y=0).map(([w,x,y],i)=>{x-=t,y-=u;for(c of w)(o[y]=o[y]||[])[x]=c,i&1?y++:x++},o=[]),o.map(r=>[...r].map(x=>x||' ').join` `).join`
`)

// Less golfed
F=z=>(
  z.map( // Step 1, find intersection points and relative position
    (w,i)=>(
      i && // for each word after thw first, find position respect the previous word
      [...p].some((c,j)=> // scan prec word using .some to exit at the first intersection found
         ~(k=w.search(c)) // search current char of p inside w
         ?i&1 // calc position, odd is vertical, even is horizontal
           ?[y-=k, x+=j] // returning an array so to have a truthy value
           :[y+=j, x-=k] // returning an array so to have a truthy value
         :0 // false = not found, continue the scan
      ),
      [p=w, // set preceding word
       x<t?t=x:x, // keep trace of min x
       y<u?u=y:y  // keep trace of min y
      ] // meanwhile, return word, x and y to be used in next step 
    ), t=u=x=y=0 // initializations
  )
  .map(([w,x,y],i)=>{ // Step 2, put char into the output array
      x-=t,y-=u; // normalize position respect to min values
      for(c of w) // for each char in word, set in the output array at the right place
        (o[y]=o[y]||[])[x]=c, 
        i&1?y++:x++ // increment x or y, again odd is vertical, even is horizontal
    }, o=[] // initialization of output array
  ),
  // Step 3, add the missing spaces and newlines
  o.map(r=>[...r].map(x=>x||' ').join` `).join`\n`
)

O.textContent=F(["This", "site", "graduated", "finally"])
<pre id=O></pre>


3

ANSI C, 385 390 Karakter

int N,a=1,x,y,d=1,u,k,l;int main(int c,char**v){for(;a<c;)N+=strlen(v[a++]);int H=N*2,W=N*4,m=H,n=N,q=m,w=n;char*p,F[W][H],*o;memset(F,32,W*H);for(a=1;a<c;a++){q=(x=m)<q?m:q;w=(y=n)<w?n:w;m=-1;for(p=v[a];*p;p++){F[x][y]=*p;if(m<0&&a<c-1&&(o=strchr(v[a+1],*p))){u=o-v[a+1];m=d?x:x-u*2;n=d?y-u:y;}if(d)x+=2;else y++;}d=!d;}for(l=w;l<H;l++){for(k=q;k<W;)putchar(F[k++][l]);putchar(10);}}

Sebut saja seperti ini: ./crossword This site graduated finally

Versi tidak disatukan:

int N,a=1,x,y,d=1,u,k,l;
int main(int c, char **v) {
    for(;a<c;)
        N+=strlen(v[a++]);
    int H = N*2, W = N*4, m = H, n = N, q=m, w=n;
    char *p,F[W][H], *o;
    memset(F, 32, W*H);
    for (a=1; a < c; a++) {
        q=(x=m)<q?m:q;
        w=(y=n)<w?n:w;
        m=-1;
        for (p=v[a]; *p; p++) {
            F[x][y] = *p;
            if (m<0&&a<c-1&&(o = strchr(v[a+1], *p))) {
                u = o-v[a+1];
                m = d ? x : x-u*2;
                n = d ? y-u : y;
            }
            if (d) x+=2; else y++;
        }
        d=!d;
    }
    for (l = w; l < H; l++) {
        for (k = q; k < W;)
            putchar(F[k++][l]);
        putchar(10);
    }
}

Terima kasih tucuxi untuk tipsnya!


one char: a++)N+=strlen(v[a])=>)N+=strlen(v[a++])
tucuxi

lain: char F[W][H],*p=>char*p,F[W][H]
tucuxi

3 karakter: hapus {} dari baris tunggal for, ganti k++)putchar(F[k][l]dengan)putchar[k++][l]
tucuxi
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.