चेन शब्द क्रॉसवर्ड-स्टाइल


18

चुनौती

शब्दों के ["Programming", "Puzzles", "Code", "Golf"]उत्पादन की सूची को देखते हुए शब्द क्रॉसवर्ड-शैली:

      P घूमने वाला
      यू
      z
      z
  जी एल
ग ोड
  ls
  च

एल्गोरिथ्म

  • आपको दिए गए क्रम में सूची को संसाधित करना होगा।
  • शब्द क्षैतिज रूप से शुरू करते हुए, वैकल्पिक झुकाव में मुद्रित होते हैं ।
  • दो शब्द पहले शब्द में पहले अक्षर पर प्रतिच्छेद करते हैं जो दूसरे शब्द में भी मौजूद है। यदि यह पत्र कई बार सीऑन शब्द में होता है, तो पहले एक को लें।

    उदाहरण :
    ["no", "on"]बन जाता है:

    o
    n o
    

    और नहीं

    n o
      n
    

अतिरिक्त नोट्स

  • सूची में आसन्न शब्दों में कम से कम एक सामान्य अक्षर होगा। ["Hi", "there"]वैध इनपुट नहीं है।
  • शब्द कभी टकराएंगे नहीं। पहले संभव चौराहे पर एक शब्द को प्रिंट करने के लिए हमेशा पर्याप्त जगह होगी। ["Hello", "there", "end", "hello"]वैध इनपुट नहीं है
  • मिलान केस-संवेदी है।
  • शब्द बाईं ओर और ऊपर तक विस्तृत हो सकते हैं।
  • क्षैतिज शब्दों के अक्षरों को एक स्थान से अलग करना होता है।
  • इनपुट सूची में कम से कम दो शब्द होंगे।
  • सभी शब्द regex से मेल खाएंगे: [A-Za-z]+
  • जब तक आप सही ढंग से जंजीर में जकड़े हुए हैं, आप जितने चाहें उतने ट्रेलिंग व्हाट्सएप या नईलाइन्स प्रिंट कर सकते हैं।
  • दूसरी ओर आप अतिरिक्त प्रमुख व्हाट्सएप नहीं जोड़ सकते हैं। जो शब्द सबसे बाईं ओर तैरता है, उसमें शून्य अग्रणी स्थान होते हैं, दूसरी पंक्तियों में इतने अग्रणी स्थान होते हैं कि यह सभी रेखाएँ सही ढंग से ऊपर उठती हैं।
  • आपको प्रोग्राम को शब्दों की मनमानी मात्रा से निपटने में सक्षम होना चाहिए

नियम

परीक्षण के मामलों

पहली लाइन पर इनपुट सूची, दूसरी लाइन पर आउटपुट शुरू होता है।

["स्टैक", "एक्सचेंज"]
    इ
    एक्स
    सी
    ज
ढेर
    n
    जी
    इ
["यह", "साइट", "स्नातक", "अंत में"]
    च
    है
    n T उसका
स्नातक की उपाधि प्राप्त
    le
    एल
    y


हैप्पी कोडिंग!


उदाहरण 2, के बीच पहली संभव चौराहे siteऔर graduatedहैt
edc65

@ edc65 मुझ पर शर्म करो, इसे ठीक किया। संकेत के लिए धन्यवाद!
डेन्कर

जवाबों:


3

जावास्क्रिप्ट (ईएस 6) 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

एएनएसआई सी, 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

Ungolfed संस्करण:

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 वर्ण: निकालें {} एकल लाइन से for, की जगह k++)putchar(F[k][l]के साथ)putchar[k++][l]
tucuxi
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.