음의 공간 그래프


13

직무

양의 정수가 주어지며 많은 노드와 함께 " 자체 보완 그래프 "를 출력해야합니다 . 자체 보완 그래프가 무엇인지 모르는 경우 Wikipedia 기사에서 크게 도움이되지 않습니다. 기술 및 비 기술적 두 가지 설명이 아래에 있습니다.

비 기술적

그래프는 선으로 연결된 노드 세트입니다. 각 포인트 쌍은 하나의 라인으로 연결되거나 연결되지 않을 수 있습니다. 그래프의 "보완"은 그래프를 작성하고 연결되지 않은 모든 노드를 연결하고 모든 노드를 연결 해제 한 결과입니다.

자체 보완 그래프는 보완을 원본의 모양으로 재 배열 할 수있는 그래프입니다. 아래는 자체 보완 그래프의 예와 방법에 대한 데모입니다.

다음은 5 개의 노드가있는 그래프입니다.

5 노드 그래프

연결이 빨간색 점선으로 갈 수있는 모든 위치를 강조합니다.

강조 표시된 그래프

이제 빨간색과 검은 색 가장자리를 바꾸어 그래프의 보완을 찾으십시오.

보어

이것은 원래 그래프처럼 보이지 않지만 노드를 이렇게 움직이면 (각 단계에서 두 개의 노드를 교체합니다) :

동형

우리는 원본 그래프를 얻습니다! 그래프와 그 보완은 동일한 그래프입니다

인위적인

자기-상보 그래프는 보수에 동형 인 그래프입니다.

명세서

가장 적합한 방법을 통해 양의 정수를받습니다. 그리고 적절하다고 생각되는 방법으로 그래프를 출력합니다. 여기에는 Adjacency Matrix Form , Adjacency List Form 및 물론 그림이 포함됩니다. 출력 된 그래프는 자체 보완이어야하고 정수 입력만큼 많은 노드를 가져야합니다. 이러한 그래프가 없으면 잘못된 값을 출력해야합니다.

이것은 이며 바이트 수를 최소화하는 것을 목표로해야합니다.

테스트 사례

아래는 몇 n에 대해 가능한 출력 사진입니다

4

5

9


자체 보완 그래프는 전체 그래프의 가장자리 수가 짝수 인 경우에만 존재할 수 있습니다. 우리는 이것을 보장합니까?
xnor

@xnor 나는 그것을 포함하는 것을 잊었다. 지금 수정했습니다.
Ad Hoc Garf Hunter

부정적인 입력을 처리해야합니까?
xnor

@xnor 아니오. 나는 합리적으로 문제를 해결할 것입니다
Ad Hoc Garf Hunter

3
누구나 답을 기반으로 생각하기 전에 Wolfram의 데이터베이스에서 GraphData@{"SelfComplementary",{#,1}}&low에 대한 몇 가지 예를로드하기 때문에 n임의로 큰 입력에는 작동하지 않는다고 생각합니다.
Martin Ender 2012 년

답변:


9

하스켈 , 77 바이트

f n=[(a,b)|b<-[1..n],a<-[1..b-1],mod n 4<2,mod(a+(last$b:[a|odd n,n==b]))4<2]

온라인으로 사용해보십시오!

이것은 계산하기 쉬운 명시 적 기준을 사용하여 모서리 (a,b)가 그래프에 속 하는지 여부를 결정합니다 . 모듈로 값 사이의 순열 순환 으로이 알고리즘을 인스턴스화 합니다.

4*m -> 4*m+1 -> 4*m+2 -> 4*m+3 -> 4*m

우리는 두 개의 끝점 정점이 0 또는 1 모듈로 4에 추가되는 모서리를 포함합니다. 이것은 모서리를 보완하는 정점의 순열을 제공합니다.

그래프에 4의 배수를 초과하는 추가 노드가 있으면 주기만 적용됩니다. 다른 정점이 고르면 가장자리를 포함시킵니다. 꼭짓점을 바꾸면 패리티가 뒤집 히므로 그래프는 자체적으로 보완됩니다.

꼭짓점 수가 0 또는 1 모듈로 4가 아닌 경우 전체 그래프에 가장자리 수가 홀수이므로 자체 보완 그래프를 사용할 수 없습니다.

전반적인 조건은 다음과 같습니다.

  • 입력 n이 0 또는 1 모듈로 4가 아닌 경우 빈 목록을 출력하십시오.
  • n이 짝수 그렇지 않은 경우, 모든 에지 등 (a,b)으로을 a<b하고 a+b0 또는 1 모듈 (4)와 동일.
  • 그렇지 않으면 n이 홀수이면 동일하게 수행하지만 (a,n)a가 짝수 인 경우 양식의 가장자리를 포함하십시오 .

코드는 조건을 바꾸어 두 번째 및 세 번째 경우를 결합 mod(a+b)4<2가진 mod(a+a)4<2경우 모두 odd nb==n.


5

Brachylog 2 , 24 바이트

{⟦₁⊇Ċ}ᶠpḍ.(\\ᵐcdl?∨?<2)∧

온라인으로 사용해보십시오!

이것은 두 개의 인접리스트로 구성된 한 쌍을 리턴 하는 함수 입니다. 하나는 그래프 용이고 다른 하나는 보수 용 그래프입니다. (TIO의 Brachylog 인터프리터에서 Z명령 행 인수로 제공하여 전체 프로그램이 아닌 함수를 평가하도록 요청할 수 있습니다 .) 예를 들어 입력 출력 5은 다음과 같습니다.

[[[1,2],[1,3],[1,5],[3,5],[4,5]],[[2,5],[2,3],[2,4],[3,4],[1,4]]]

다음은 이미지처럼 보이는 것입니다 (두 개의 그래프 표시).

5 가지 요소에 대한 그래프와 동일한 보완

프롤로그 기반 언어에서와 마찬가지로이 함수는 둘 이상의 호출 패턴을 지원합니다. 특히 발전기로 사용하려고하면 주어진 수의 정점으로 가능한 모든 자체 보완 그래프를 출력합니다 (이 경우를 유용하게 만들려고 노력하지 않았지만 특히 각 경우를 출력합니다) 각각 여러 번 그래프).

설명

이것은 기본적으로 문제에 대한 설명 일 뿐이며 Prolog 구현을 통해 문제를 해결하는 가장 좋은 방법을 찾습니다. (그러나이 특정 경우에는 무차별 대입보다 알고리즘을 사용하는 것이 의심 스럽기 때문에 상당히 비효율적이며 테스트에서이를 확인하여 그래프가 클수록 성능이 훨씬 나빠지는 것으로 보입니다.)

{⟦₁⊇Ċ}ᶠpḍ.(\\ᵐcdl?∨?<2)∧
 ⟦₁                       The range [1, 2, …, ?], where ? is the input
   ⊇                      A subset of that range…
    Ċ                     …which has exactly two elements
{    }ᶠ                   A list of everything that fits the above description
{⟦₁⊇Ċ}ᶠ                   All edges that could exist in a ?-element graph
       p                  Find a permutation of these…
        ḍ                 …so that splitting it into two equal parts…
          (       ∨   )   …either:
               dl?          produces ? distinct elements
           \                after transposing it
            \ᵐ              and transposing its elements
              c             and flattening one level;
                          or:
                   ?<2      ? was less than 2
         .             ∧  Once you've found it, . specifies what to output

덧붙여서, 나는 (∨?<2)0과 1의 특별한 경우를 다루는 전체 6 바이트 (프로그램의 1/4, 문자 ) 를 소비해야했습니다 . 실망 스럽지만, 그것은 특별한 경우의 본질입니다.

\\ᵐcdl?섹션은 이해하기 조금 어렵 기 때문에 여기에 효과적인 예가 있습니다. 그 목적은 그래프의 해당 모서리와 보완이 목록 내에서 동일한 순서로 그래프와 그 보완 물인지 확인하는 것입니다. 그래프 / 보완 쌍은 프로그램의 최종 출력이됩니다. 사례는 다음과 같습니다.

[[[1,2],[1,3],[1,5],[3,5],[4,5]],[[2,5],[2,3],[2,4],[3,4],[1,4]]]

이를 바꾸면 그래프와 보체 사이의 해당 가장자리 쌍 목록이 제공됩니다.

[[[1,2],[2,5]],[[1,3],[2,3]],[[1,5],[2,4]],[[3,5],[3,4]],[[4,5],[1,4]]

다음으로 목록 요소 내부를 바꾸고 한 수준을 평평하게 만듭니다. 그래프와 보수 사이에 대응하는 요소 쌍의 목록을 제공합니다.

[[1,2],[2,5],[1,2],[3,3],[1,2],[5,4],[3,3],[5,4],[4,1],[5,4]]

분명히 우리가 원하는 것은 각 요소에서 시작하여 1 쌍을 넘지 않는 것입니다 (그래서 그래프와 보완 요소가 1 대 1 대응임을 증명합니다). 우리는리스트가 정확히 ?다른 요소 (즉, 꼭짓점의 수와 같은 여러 개의 고유 한 요소)를 가지고 있다고 말함으로써 거의 확인할 수 있습니다 . 이 경우 테스트가 성공합니다. 고유 한 요소는 다음과 같습니다.

[[1,2],[2,5],[3,3],[5,4],[4,1]]

그러나 이것은 잠재적 인 문제의 여지를 남겨둔다. 원본 그래프에서 정점이 완전히 연결 해제 된 경우 해당 정점에 대해서는 언급하지 않으므로 다른 정점과 중복 된 대응을위한 공간을 남겨 둡니다. 이 경우, 보수 그래프가 정점 사이의 가장자리가 있어야합니다 (일반성의 손실없이을의 그것의 가정 해 봅시다 1), 그리고 다른 모든 정점 및 대응의 목록이 포함됩니다, 그래서 [1,2], [1,3], ..., [1, ?]. 이 값 ?이 크면 다른 것보다 더 많은 총 통신이 이루어 지므로 아무런 문제가 없습니다. 유일한 문제 ?는 3 이하일 때 발생합니다 .이 경우 우리는 하나의 추가 서신 만 추가합니다 (하나를 제거하는 동안)1입력에 나타나지 않음); 그러나 실제로는 문제가되지 않습니다. 3 원소 그래프에는 홀수 인 3 개의 가능한 모서리가 있고 (2 요소 그래프에서 1 개의 가능한 모서리도 홀수입니다) \단계 에서 테스트가 실패합니다 (비정형 목록, 즉 요소의 길이가 다른 목록은 바꿀 수 없음).


차이 z\z그 의미 환상 지퍼이다 [[1,2,3],["a"]]끝나게 것이다 [[1,"a"],[2,"a"],[3,"a"]]으로 z는 실패 할 것이다 반면 \. \지금은 정사각 행렬에서만 작동합니다. 미래의 구현은 z주기적으로 그렇지 않은 것을 제외 하고는 처럼 작동하게합니다 .
Fatalize

나는 실제로 차이점을 알아 냈지만 설명을 작성한 후에 만 ​​나타났습니다. 이 특정 솔루션은``직사각형에서만 작동하지만 (이 단계를 이용할 수 없으면 2 바이트 만 더 필요하지만)에 따라 다릅니다.

2

BBC 기본, 161 바이트

토큰 화 된 파일 크기 140 바이트

http://www.bbcbasic.co.uk/bbcwin/bbcwin.html 에서 통역사 다운로드

I.m:IF2ANDm ORm<4P.0:END
r=400n=-2A.m:t=2*PI/n:F.i=1TOn*n:a=i DIVn:b=i MODn:c=b:IFa+b A.2a*=t:b*=t:L.r+r*SINa,r+r*COSa,r+r*SINb,r+r*COSb:IF 1A.m A.c DRAWr*3,0
N.

Ungolfed 코드

  INPUTm                           :REM get input
  IF2ANDm ORm<4PRINT0:END          :REM if m=4x+2 or 4x+3 or less than 4, print 0 and exit
  r=400                            :REM radius of diagram
  n=-2ANDm                         :REM n = m truncated to an even number
  t=2*PI/n                         :REM t = 1/n turns
  FORi=1TOn*n                      :REM for each combination of vertices
    a=i DIVn                       :REM extract a and b
    b=i MODn                       :REM make a copy of c
    c=b                            :REM if a+b MOD 4 = 2 or 3, convert a and b to angles and draw edge.
    IFa+b AND2 a*=t:b*=t:LINEr+r*SINa,r+r*COSa,r+r*SINb,r+r*COSb:IF 1ANDm ANDc DRAWr*3,0
  NEXT                             :REM if m is odd and c is odd, draw a line to the additional vertex for m=4x+1 input.

설명

이것은 Xnor와 동일한 알고리즘을 사용하지만 다이어그램 출력을 생성합니다.

가장자리의 수가 홀수이므로 n형태가 어디 4x+2이거나 4x+3해결책이 없습니다.

어디 n우리가 원의 모든 정점을 배열하고 그 가장자리를 그릴 4 배 형태이다 (a+b) mod 42 또는 3 (이유를 골프를 들어, XNOR의 경우와 같이하지 0 또는 1을.이 때문에 XNOR에 의해 주어진 솔루션의 보완.)

좀 더 사진적인 의미로 이것을보기 위해, 우리는 매 두 번째 정점을 가져 와서 반 시계 방향으로 정점 1과 2 지점으로 가장자리를 그립니다. 이것은 n총 절반의 평행 방향을 정의합니다 . 그런 다음 다른 모든 모서리를 이와 평행하게 추가합니다.

각 엣지 사양에서 a와 b 모두에 1을 더하거나 그림을 회전하여 다이어그램을 회전시켜 보완을 찾을 수 있습니다 1/n.

어디 n형태 4 배 + 1이다 우리는 4 배 그래프의 모든 초 정점에 연결된 다른 정점을 추가합니다. 중심에 배치하면 다이어그램의 대칭이 유지되지만 명확성을 위해 점의 주요 원 외부에 배치하기로 선택했습니다.

산출

다음은 4x + 1의 처음 몇 가지 경우입니다. 오른쪽 하단의 정점과 관련 가장자리를 삭제하면 4 배의 사례를 볼 수 있습니다.

여기에 이미지 설명을 입력하십시오


1

자바 스크립트 (ES6), 191 바이트

f=(n,a=[],v=n*~-n/4)=>v%1?0:eval(n>5?f(n-=4,a)&&'for(i=0;i<n;)a.push([i,n+1],[i++,n+2]);a.push([n,++n],[n,++n],[n,++n])-v':'for(l=x=0;x<n;x++)for(y=x;y<n;y++)l<v&y>>x&1?l=a.push([x,y]):a')||a

이 함수는 인접 목록을 반환합니다. 이 알고리즘은 두 개의 알고리즘을 사용하며 존재하지 않을 때 0대신 에 반환하여 빈 보완 그래프와 비 출력을 구분 []합니다. 첫 번째 알고리즘은 BIT 술어를 사용하여 구성된 Rado Graphs를 기반으로 하며 유효한 0, 1, 4 및 5 차 보완 그래프를 작성합니다. 수학 에서 친구들이 찾은 다른 알고리즘 은 유효한 V 꼭짓점 보완 그래프에 4-path 추가 를 적용하여 유효한 V + 4 꼭짓점 보완 그래프를 구성 합니다.

입력을 검증하여 유효한 보완 그래프의 존재를 확인하고 (사용 n*~-n/4%1), 실패하면를 반환합니다 0. 그런 다음 유효한 하위 솔루션을 구성 n>5하기 위해 n-4사례 와 재귀를 확인한 다음 재귀 체인을 백업하는 동안 반환 된 인접성 목록에 4 추가를 적용합니다. 경우 마지막으로, n>5사실이 아니다, 그것은에서 반복 처리 0n-1대한 xy(가) 경우, 및 확인 (y>>x)&1사실이다. 그렇다면 해당 노드가 쌍을 이루는 것입니다.

다음은 if-else 문으로 확장되고 eval()인라인 된 삼항 연산자를 사용하여 더 읽기 쉬운 함수 형식입니다 .

// precalculate amount of required vertices in v
f = (n, a = [], v = n*~-n / 4) => {
  // if amount is non-integer
  if (v % 1) {
    // no valid complementary graph
    return 0;
  } else {
    if (n > 5) {
      // generate valid (n-4)-order complementary graph
      f(n -= 4, a);
      // apply 4-path addition
      for (i = 0; i < n;)
        a.push([i, n+1],[i++, n+2]);
      a.push([n, ++n], [n, ++n], [n, ++n]);
    } else {
      // construct Rado graph using BIT predicate
      for(l = x = 0; x < n; x++)
        for(y = x; y < n; y++)
          // if amount of pairs is less than required and xth bit of y is high
          if (l < v && (y>>x & 1))
            // vertices x and y should be paired
            a.push([x,y]);
    }
    return a;
  }
};

데모

f=(n,a=[],v=n*~-n/4)=>v%1?0:eval(n>5?f(n-=4,a)&&'for(i=0;i<n;)a.push([i,n+1],[i++,n+2]);a.push([n,++n],[n,++n],[n,++n])-v':'for(l=x=0;x<n;x++)for(y=x;y<n;y++)l<v&y>>x&1?l=a.push([x,y]):a')||a
<input type="number" onchange="o.textContent=JSON.stringify(f(this.value))"><pre id="o"></pre>

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.