নোডের একটি নেটওয়ার্ক আঁকুন


24

সেখানে 26 নোড (নামে পর্যন্ত একটি নেটওয়ার্ক Aথেকে Zবা aকরতে zআপনার ইচ্ছা অনুযায়ী)। নোডগুলির প্রতিটি জুড়ি সংযুক্ত বা সংযোগ বিচ্ছিন্ন হতে পারে। একটি নোড বেশিরভাগ অন্যান্য 4 টি নোডের সাথে সংযুক্ত থাকতে পারে। আপনার কাজটি 2 ডি ডায়াগ্রামে নেটওয়ার্ক অঙ্কন করা। ইনপুটটি এমন দেওয়া হবে যাতে এই কাজটি সম্ভব (আউটপুট বিভাগে আরও সীমাবদ্ধতা দেখুন)।


বিন্যাস

ইনপুট

  • (চিঠি জোড়া Aজন্য Zবা aকরতে zআপনার ইচ্ছা অনুযায়ী)। এগুলি কোনও ক্রমে সাজানো হয় না।
  • Ptionচ্ছিক - জোড়া সংখ্যা

আউটপুট

  • একটি এএসসিআইআই অঙ্কন যা নোডগুলির মধ্যে প্রকৃত লিঙ্কগুলি দেখায়। নোড দ্বারা দেওয়া হয় aকরতে zবা Aকরার Z। ব্যবহার করুন -অনুভূমিক লিঙ্কের জন্য এবং |উল্লম্ব লিঙ্কের জন্য। লিঙ্কগুলি যে কোনও (শূন্য নয়) দৈর্ঘ্যের হতে পারে তবে সেগুলি সোজা অনুভূমিক / উল্লম্ব লাইন হওয়া উচিত যা বাঁক হয় না । স্পেস যুক্ত করা যেতে পারে তবে তারা ছবিটি অক্ষম করবেন না।

আপনি গ্রাফের বিন্যাসে সহায়তা করে এমন বিল্ট-ইন ব্যবহার করতে পারবেন না। অন্যান্য গ্রাফ-সম্পর্কিত বিল্ট-ইনগুলি অনুমোদিত হতে পারে (যদিও বিল্ট-ইনগুলি ছাড়া সমাধানগুলি আরও প্রশংসা করবে)। সংক্ষিপ্ততম কোড জিতেছে।


নমুনা তথ্য

ইনপুট

A B
B F
B L
F K
L K
K R
K S
R P
S J
S P
J A
T V
V N

আউটপুট

A - B - F   T - V
|   |   |       |
|   L - K - R   N
|       |   |
J ----- S - P

ইনপুট

H C
G H
A B
B F
B C
F G
C D
D A

আউটপুট

A - B ----- F
|   |       |
D - C - H - G

1
আমি বিবেচনা করি যে আমার আগের প্রশ্নগুলির যথেষ্ট উত্তর দেওয়া হয়েছে, তবে নোট করুন যে নতুন পরীক্ষার কেসটি ভুল কারণ প্রথম লাইনটি H Aএবং এটি প্রান্তটি প্রদত্ত আউটপুটে নেই। সম্পাদনা করুন: সমস্যা চিহ্নিত এবং সংশোধন করা হয়েছে।
পিটার টেলর

2
সম্ভবত এটি "ফার্স্ট (ওয়ার্কিং) কোড উইনস" এ পরিবর্তন করবেন? ;-) গম্ভীরভাবে, এটি নিজেরাই চ্যালেঞ্জ করছে এমনকি গল্ফ না করেও ...
মার্কো 13

@ মার্কো 13 সম্ভবত এটি চ্যালেঞ্জটিকে বিষয় হিসাবে বন্ধ করে দেবে।
ডেনিস

@Gosts_in_the_code দয়া করে মডারেটরদের প্রশ্ন জিজ্ঞাসা করার জন্য পতাকা ব্যবহার করবেন না। যদি আপনার কোনও বিষয়ে প্রতিক্রিয়া প্রয়োজন হয় তবে সর্বদা উনিশতম বাইট থাকে
ডেনিস

@ ডেনিস ঠিক আছে, দুঃখিত। আমি আগে কখনও আড্ডায় যাইনি, সুতরাং এটি কীভাবে কাজ করে তা আমি জানি না।
ভূত_স_ই_কোড

উত্তর:


3

সিজেম, 142

আপনি একটি অনুকূল, নির্বিচারক বা দ্রুত সমাধানের জন্য জিজ্ঞাসা করেননি, তাই আপনি এখানে যান:

qN%Sf%::c_s_&:Aff#:E;{A{;[DmrDmr]2f*}%:C;E{Cf=~.-:*}%0m1{E{Cf=$~1$.-_:g:T\:+,1>\ff*\f.+T0="-|"=f+~}%CA.++:L2f<__&=!}?}gS25*a25*L{~2$4$=\tt}/N*

এটি অনলাইনে চেষ্টা করুন

এটি প্রতিটি অক্ষরের জন্য এলোমেলো স্থানাঙ্ক উত্পন্ন করে এবং লেআউটটি গ্রহণযোগ্য কিনা তা পরীক্ষা করে (প্রান্ত বর্ণগুলি আস্তরণযুক্ত এবং কোনও ছেদ নেই), যতক্ষণ না এটি হয়। আপনি আরও প্রান্ত যুক্ত করার সাথে সাথে এটি মনের অদ্ভুতভাবে ধীর হয়ে যায়।

Dকোডের দুটি অক্ষর সর্বাধিক x এবং y স্থানাঙ্ক নির্দিষ্ট করে; আমি বাছাই করেছি D(= 13) কারণ আমি মনে করি এটি সব ক্ষেত্রেই যথেষ্ট হওয়া উচিত, আমাকে ভুল প্রমাণ করতে নির্দ্বিধায়। তবে আপনি এগুলি প্রোগ্রামের গতি বাড়ানোর জন্য অন্যান্য মানগুলিতে পরিবর্তন করতে পারেন, উদাহরণস্বরূপ আপনি যদি 3 এবং 4 ব্যবহার করেন তবে দ্বিতীয় উদাহরণটি এক বা দুই মিনিটের মধ্যে শেষ করা উচিত।


আমি দ্রুত সমাধানের জন্য জিজ্ঞাসা করি নি, তবে সম্ভবত আমার একটি নির্বিচারের জন্য জিজ্ঞাসা করা উচিত ছিল। তবে এখন যে প্রশ্নটি এত দিন ধরে চলেছে, আমি এটি পরিবর্তন করব না।
ভূত_স_ই_কোড

@ চেস্টস_ইন_থো_ কোডটি এটিকে নির্বিচারবাদী করে তুলতে খুব বেশি কঠিন হওয়া উচিত নয় - সমন্বয়গুলির সমস্ত সংমিশ্রণ চেষ্টা করে দেখুন। তবে এটি সম্ভবত আরও দীর্ঘ এবং ধীর হতে পারে এবং প্রচুর স্মৃতিও খায়।
আদিতসু

3

সি, 813 বাইট

#include<map>
#include<set>
#include<cstdlib>
typedef int I;typedef char*C;I a,t,s,h;struct p{I x,y;}j,k;std::map<I,std::set<I>>l;std::map<I,p>g;C m,M="  |-";I L(I n,C q,C Q){j=g[n],h=1;for(I o:l[n])if(g.find(o)!=g.end())if(!(a=(k=g[o]).y==j.y)&&k.x^j.x)h=0;else for(I x=j.x,y=j.y,e=k.y*s+k.x,b,d=(k.x<j.x||k.y<j.y)?-1:1;a?x+=d:y+=d,(b=y*s+x)^e;m[b]=q[a])if(m[b]^Q[a]){h=0;break;}}I N(){for(auto i:g)for(I n:l[i.first])if(g.find(n)==g.end())return n;for(auto i:l)if(g.find(a=i.first)==g.end())return a;exit(puts(m));}I f(){for(I n=N(),x,y=0,b;y<s;y+=2)for(x=0;x<s;x+=2)m[b=y*s+x]==*M?g[n]={x,y},m[b]=n,L(n,M+2,M),h&&f(),L(n,M,M+2),m[b]=*M,g.erase(n):0;}I main(I c,C*v){for(;--c;l[a].insert(s),l[s].insert(a))a=v[c][0],s=v[c][1];t=l.size(),s=t|1;memset(m=(C)calloc(s,s),*M,s*s-1);for(a=1;a<s;++a)m[a*s-1]=10;f();}

কমান্ডলাইন আর্গুমেন্ট হিসাবে ইনপুট নেয়, যেমন:

./network AB BF BL FK LK KR KS RP SJ SP JA TV VN

আকার অনুসারে অ্যাডিটসুর উত্তরের সাথে প্রতিযোগিতামূলক কাছাকাছি কোথাও নয়, তবে আরও কার্যকর!

এটি সমস্ত সম্ভাব্য সমাধানকে হিংস্র-জোর করে তুলবে, তবে দ্রুত ব্যর্থতা এটি যেমন স্বীকৃত হবে তত দ্রুত স্বীকৃতি দেবে। দুটি পরীক্ষার ক্ষেত্রে এটি প্রায় সঙ্গে সঙ্গেই শেষ হয়ে যায় এবং আরও বিশ্রীতর ইনপুটগুলিতে এটি কেবল কয়েক সেকেন্ড সময় নেয় বলে মনে হয়। স্বীকৃত নোড নামগুলিরও এটির কোনও সীমাবদ্ধতা নেই (যদিও আপনি একটি জায়গার নাম রাখতে পারবেন না, |বা -) এবং নোডের সংখ্যার কোনও সীমা নেই (যতক্ষণ না সমস্ত নাম একটি বাইটে ফিট করে, তাই ব্যবহারিক সীমা 252 নোড, এবং এটি অনেকের কাছে পৌঁছানোর আগে ধীর হয়ে যাবে)।

এটির গতি বাড়ানোর জন্য প্রচুর সুযোগ রয়েছে; শর্ট সার্কিট থেকে বেরিয়ে আসা অনেকগুলি গল্ফিংয়ের কাছে হারিয়ে গিয়েছিল এবং এমন কিছু অংশ রয়েছে যা হট-লুপের বাইরে চলে যেতে পারে। এছাড়াও প্রতিসাম্যের কিছু পর্যবেক্ষণ অন্যান্য জিনিসগুলির মধ্যে প্রথম 2 টি নোডের অবস্থান নাটকীয়ভাবে হ্রাস করতে পারে।


ভাঙ্গন:

#include<map>
#include<set>
#include<cstdlib>
typedef int I;
typedef char*C;
I a,t,s,h;                // Variables shared between functions
struct p{I x,y;}          // Coord datatype
j,k;                      // Temporary coord references
std::map<I,std::set<I>>l; // Bidirectional multimap of node links
std::map<I,p>g;           // Map of nodes to positions
C m,                      // Rendered grid
M="  |-";                 // Lookup table for output characters

// Line rendering function
// Sets h to 1 if all lines are drawn successfully, or 0 if there is a blocker
I L(I n,C q,C Q){
  j=g[n],h=1;
  for(I o:l[n])                  // For each connection to the current node
    if(g.find(o)!=g.end())       // If the target node has been positioned
      if(!(a=(k=g[o]).y==j.y)&&k.x^j.x)h=0; // Fail if the nodes are not aligned
      else
        for(I x=j.x,y=j.y,             // Loop from node to target
          e=k.y*s+k.x,
          b,d=(k.x<j.x||k.y<j.y)?-1:1;
          a?x+=d:y+=d,(b=y*s+x)^e;
          m[b]=q[a])                   // Render character (| or -)
          if(m[b]^Q[a]){h=0;break;}    // Abort if cell is not blank
}

// Next node selection: finds the next connected node to try,
// or the next unconnected node if the current connected set is complete.
// Displays the result and exits if the entire graph has been rendered.
I N(){
  for(auto i:g)for(I n:l[i.first])  // Search for a connected node...
    if(g.find(n)==g.end())return n; // ...and return the first available
  for(auto i:l)                     // Else search for an unconnected node...
    if(g.find(a=i.first)==g.end())
      return a;                     // ...and return the first available
  exit(puts(m));                    // Else draw the grid to screen and stop
}

// Recursive brute-force implementation
I f(){
  for(I n=N(),x,y=0,b;y<s;y+=2) // Loop through all grid positions
    for(x=0;x<s;x+=2)
      m[b=y*s+x]==*M            // If the current position is available
       ?g[n]={x,y},             // Record the location for this node
        m[b]=n,                 // Render the node
        L(n,M+2,M),             // Render lines to connected nodes
        h&&f(),                 // If line rendering succeeded, recurse
        L(n,M,M+2),             // Un-render lines
        m[b]=*M,g.erase(n)      // Un-render node
       :0;
}

// Input parsing and grid setup
I main(I c,C*v){
  // Parse all inputs into a bidirectional multi-map
  for(;--c;l[a].insert(s),l[s].insert(a))a=v[c][0],s=v[c][1];
  t=l.size(),s=t|1; // Calculate a grid size
  // Allocate memory for the grid and render newlines
  memset(m=(C)calloc(s,s),*M,s*s-1);
  for(a=1;a<s;++a)m[a*s-1]=10;
  f(); // Begin recursive solving
}

অবশেষে! 2 মাস কেটে গেছে। আমি ব্যক্তিগতভাবে এই ধরনের উত্তর গল্ফ করার পক্ষে নই, আমার কেবল এই সাইটের লোকদেরই দরকার ছিল।
ভূত_স_ই_কোড

@ ঘোস্ট_ইন_থ_ কোড আপনি কোড গল্ফ না চাইলে আপনি ব্যবহার করতে পারেন এমন আরও অনেক উদ্দেশ্যমূলক বিজয়ী মানদণ্ড রয়েছে (যদিও স্পষ্টতই, আপনি এখন এই চ্যালেঞ্জটি পোস্ট করতে পারবেন না)। সময় ভিত্তিক উদাহরণগুলি হ'ল: নির্দিষ্ট হার্ডওয়্যার (উদাহরণস্বরূপ ইসি 2 উদাহরণ / রাস্পবেরি পাই / ইত্যাদি) এর ফলাফল উত্সাহিত করার জন্য দ্রুততম, সময়সীমার মধ্যে পরীক্ষার ব্যাটারির জন্য সর্বাধিক কমপ্যাক্ট আউটপুট, পরীক্ষার ব্যাটারি থেকে একটি বৃহত্তম নেটওয়ার্ক সমর্থিত সময়সীমা (উদাহরণস্বরূপ, নির্দিষ্ট হার্ডওয়্যারে নমনীয়তার অনুমতি দেওয়া) day পরের বারে স্যান্ডবক্স ব্যবহার করার চেষ্টা করুন; লোকেরা আপনাকে উদ্দেশ্য বাছতে সহায়তা করতে পারে।
ডেভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.