연쇄 단어 낱말 스타일


18

도전

단어 목록에 단어 ["Programming", "Puzzles", "Code", "Golf"]스타일 의 단어가 출력됩니다.

      프로그램
      유
      지
      지
  G l
코데
  ls
  에프

알고리즘

  • 주어진 순서대로 목록을 처리해야합니다.
  • 단어는 가로 방향으로 교대로 인쇄됩니다 .
  • 두 단어는 두 번째 단어에도있는 첫 번째 단어의 첫 번째 문자와 교차합니다. 이 단어가 다른 단어로 여러 번 나오는 경우 첫 번째 단어를 사용하십시오.

    :
    ["no", "on"]이된다 :

    o
    n o
    

    그리고 아닙니다

    n o
      n
    

추가 사항

  • 목록에있는 인접 단어에는 하나 이상의 공통 문자가 있습니다. ["Hi", "there"]유효한 입력이 아닙니다.
  • 단어가 충돌하지 않습니다. 가능한 첫 번째 교차점에서 단어를 인쇄 할 수있는 충분한 공간이 항상 있습니다. ["Hello", "there", "end", "hello"]유효한 입력이 아닙니다
  • 일치는 대소 문자를 구분합니다.
  • 단어는 왼쪽과 위쪽으로 확장 할 수 있습니다.
  • 가로 단어의 글자는 한 칸씩 분리해야합니다.
  • 입력 목록에는 적어도 두 단어가 포함됩니다.
  • 모든 단어는 정규식과 일치합니다. [A-Za-z]+
  • 단어가 올바르게 연결되어 있으면 원하는만큼의 공백이나 줄 바꿈을 인쇄 할 수 있습니다.
  • 반면에 추가 공백을 추가 할 수 없습니다. 가장 왼쪽에 떠있는 단어에는 선행 공백이 없으며 다른 줄에는 선행 공백이 너무 많아서 모든 줄이 올바르게 정렬됩니다.
  • 프로그램은 임의의 단어를 다룰 수 있어야합니다

규칙

  • 기능 또는 전체 프로그램이 허용됩니다.
  • 입 / 출력의 기본 규칙 .
  • 표준 허점이 적용됩니다.
  • 이것은 이므로 바이트 수가 가장 적습니다. Tiebreaker는 이전에 제출되었습니다.

테스트 사례

첫 번째 줄의 입력 목록, 두 번째 줄에서 출력이 시작됩니다.

[ "스택", "교환"]
    이자형
    엑스
    씨
    h
압정
    엔
    지
    이자형
[ "이것", "사이트", "졸업", "최종"]
    에프
    이다
    아니
졸업
    르
    엘
    와이


행복한 코딩!


실시 예 2의 제 가능한 교차 site하고 graduated있다t
edc65

@ edc65 부끄러운 줄 알았습니다. 힌트 주셔서 감사합니다!
Denker

답변:


3

자바 스크립트 (ES6) 253

배열 매개 변수가있는 익명 함수로

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 문자

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

다음과 같이 호출하십시오. ./crossword This site graduated finally

언 골프 버전 :

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

팁 주셔서 감사합니다 tucuxi!


한 문자 : a++)N+=strlen(v[a])=>)N+=strlen(v[a++])
tucuxi

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

3 자 : 단일 행에서 {}를 제거 하고fork++)putchar(F[k][l])putchar[k++][l]
tucuxi로
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.