노드 네트워크를 그립니다.


24

(라는 이름의 26 개 노드까지의 네트워크가 AZa에게 z당신의 소원에 따라가). 모든 노드 쌍이 연결되거나 연결이 끊어 질 수 있습니다. 노드는 최대 4 개의 다른 노드에 연결될 수 있습니다. 당신의 임무는 2D 다이어그램으로 네트워크를 그리는 것입니다. 이 작업이 가능하도록 입력이 제공됩니다 (출력 섹션의 추가 제한 사항 참조).


체재

입력

  • (문자 쌍 AZa에 대한 z당신의 소원에 따라). 순서대로 정렬되지 않습니다.
  • 선택 사항-쌍 수

산출

  • 노드 간의 실제 링크를 보여주는 ASCII 도면. 노드가 주어진다 azAZ. -가로 링크 및 |세로 링크에 사용하십시오 . 링크의 길이는 0이 아닌 길이 일 수 있지만 구부러지지 않는 직선 수평 / 수직선이어야합니다 . 그림을 나타내지 않으면 공백을 추가 할 수 있습니다.

그래프 레이아웃에 도움이되는 내장 기능을 사용할 수 없습니다. 다른 그래프 관련 내장 기능이 허용 될 수 있습니다 (내장 기능이없는 솔루션이 더 높이 평가됩니다). 가장 짧은 코드가 승리합니다.


샘플 데이터

입력

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
어쩌면 "첫 번째 (작동) 코드 승리"로 변경 하시겠습니까? ;-) 진지하게, 이것은 골프 없이도 스스로 도전하고 있습니다 ...
Marco13

@ Marco13 그것은 아마도 주제가 아닌 도전을 끝내게 될 것입니다.
Dennis

@ghosts_in_the_code 중재자에게 질문을하기 위해 플래그를 사용하지 마십시오. 무언가에 대한 피드백이 필요하면 항상 The Nineteenth Byte가 있습니다.
Dennis

@Dennis 알겠습니다. 죄송합니다. 나는 전에 채팅을 한 적이 없으므로 작동 방식을 모르겠습니다.
ghosts_in_the_code

답변:


3

CJam, 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를 대신 사용하는 경우 두 번째 예제는 1 ~ 2 분 안에 완료됩니다.


나는 빠른 해결책을 요구하지 않았지만 결정적인 해결책을 요구했을 수도 있습니다. 그러나 이제 질문이 너무 오래 지속되었으므로 변경하지는 않을 것입니다.
ghosts_in_the_code

@ghosts_in_the_code 너무 결정적이어서 어렵지 않아야합니다-모든 좌표 조합을 시도하십시오. 그러나 아마도 더 길고 느리며 많은 메모리를 소비합니다.
aditsu

3

C, 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

크기에 따른 aditsu의 대답과 경쟁이 거의 없지만 훨씬 더 효율적입니다!

이렇게하면 가능한 모든 솔루션이 무력화되지만 장애가 발생하면 신속하게 인식됩니다. 두 가지 테스트 사례의 경우 거의 즉시 완료되며 더 어색한 입력에 몇 초 밖에 걸리지 않습니다. 또한 허용되는 노드 이름에 제한이 없으며 (하나의 공백 |이나 이름을 지정할 수 -는 없지만) 노드 수에 제한이 없습니다 (모든 이름이 1 바이트에 들어가면 실제 제한은 252 개입니다. 그리고 많은 사람들에게 도달하기 전에 오래 느려질 것입니다).

속도를 높일 수있는 범위가 충분합니다. 많은 단락 회로가 골프로 빠져 나갔으며, 핫 루프 밖으로 이동할 수있는 부품이 있습니다. 또한 대칭에 대한 일부 관찰은 무엇보다도 처음 두 노드의 위치를 ​​획기적으로 줄일 수 있습니다.


고장:

#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 개월이 지났습니다. 나는 개인적으로 그러한 대답을 골프에 찬성하지 않으며, 나는이 사이트의 사람들에 의해서만 요구되었습니다.
ghosts_in_the_code

@ghosts_in_the_code 만약 당신이 코드 골프를 원하지 않는다면 당신이 사용할 수있는 다른 객관적인 승리 기준이 많이 있습니다 (물론, 게시 된이 도전을 변경할 수는 없습니다). 시간 기반의 예는 다음과 같습니다. 특정 하드웨어 (예 : 특정 EC2 인스턴스 / 라즈베리 파이 등)에서 가장 빠른 결과 생성, 시간 제한 내 테스트 배터리에 대한 가장 작은 출력, 테스트 배터리 내에서 지원되는 최대 네트워크 시간 제한 (예 : 하루, 특정 하드웨어에 대한 유연성 허용) 다음에 샌드 박스를 사용해보십시오. 사람들이 목표를 선택하도록 도울 수 있습니다.
Dave
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.