Chuỗi từ ô chữ


18

Các thách thức

Đưa ra một danh sách các từ ["Programming", "Puzzles", "Code", "Golf"]xuất ra các từ ô chữ kiểu:

      P biểu đồ
      bạn
      z
      z
  G l
Code
  ls
  f

Thuật toán

  • Bạn phải xử lý danh sách theo thứ tự nhất định.
  • Các từ được in theo hướng xen kẽ, bắt đầu theo chiều ngang .
  • Hai từ giao nhau ở chữ cái đầu tiên trong từ đầu tiên cũng có trong từ thứ hai. Nếu chữ này xuất hiện nhiều lần trong từ seond, hãy lấy từ đầu tiên.

    Ví dụ :
    ["no", "on"]trở thành:

    o
    n o
    

    không

    n o
      n
    

Ghi chú bổ sung

  • Các từ liền kề trong danh sách sẽ có ít nhất một chữ cái chung. ["Hi", "there"]không phải là một đầu vào hợp lệ.
  • Lời nói sẽ không bao giờ va chạm. Sẽ luôn có đủ không gian để in một từ ở giao lộ đầu tiên có thể. ["Hello", "there", "end", "hello"]không phải là một đầu vào hợp lệ
  • Sự phù hợp là trường hợp nhạy cảm.
  • Từ có thể mở rộng sang bên trái và trên cùng.
  • Các chữ cái của các từ ngang phải được phân tách bằng một khoảng trắng.
  • Danh sách đầu vào sẽ chứa ít nhất hai từ.
  • Tất cả các từ sẽ khớp với biểu thức chính quy: [A-Za-z]+
  • Bạn có thể in bao nhiêu khoảng trắng theo dấu hoặc dòng mới nếu muốn, miễn là các từ được xâu chuỗi chính xác.
  • Mặt khác, bạn không thể thêm các khoảng trắng hàng đầu bổ sung. Từ nổi bên trái nhiều nhất có không gian hàng đầu bằng không, các dòng khác có rất nhiều khoảng trắng hàng đầu đến nỗi tất cả các dòng chính xác.
  • Chương trình của bạn phải có khả năng xử lý một lượng từ tùy ý

Quy tắc

Các trường hợp thử nghiệm

Danh sách đầu vào trên dòng đầu tiên, đầu ra bắt đầu trên dòng thứ hai.

["Giao dịch cổ phiếu"]
    E
    x
    c
    h
Cây rơm
    n
    g
    e
["Đây", "trang web", "tốt nghiệp", "cuối cùng"]
    f
    Là
    n T của mình
đã tốt nghiệp
    le
    tôi
    y


Chúc mừng mã hóa!


Ví dụ 2, giao điểm đầu tiên có thể có giữa sitegraduatedt
edc65

@ edc65 Xấu hổ với tôi, đã sửa nó. Cảm ơn các gợi ý!
Denker

Câu trả lời:


3

JavaScript (ES6) 253

Là một hàm ẩn danh với một tham số mảng

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 Ký tự

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

Gọi nó như thế này: ./crossword This site graduated finally

Phiên bản bị đánh cắp:

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

Cảm ơn bạn tucuxi cho lời khuyên!


một char: a++)N+=strlen(v[a])=>)N+=strlen(v[a++])
tuc lửa

cái khác: char F[W][H],*p=>char*p,F[W][H]
tucuxi

3 ký tự: xóa {} khỏi dòng đơn for, thay thế k++)putchar(F[k][l]bằng)putchar[k++][l]
tucuxi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.