작은 램지 번호


13

배경 : 램지 번호 R(r,s) 꼭지점의 최소 수를 제공 v 완전한 그래프에서 Kv 등 그 색칠 적색 / 청색 에지 Kv 적어도 하나의 레드 갖는 Kr 또는 하나의 청색 Ks . 큰에 대한 경계 r,s 설정하기가 매우 어렵습니다.

당신의 작업은 출력 할 수있다 R(r,s) 에 대한 1r,s5 .

입력

두 정수 r,s1r51s5 .

산출

R(r,s)이 표에 나와있는 R ( r , s ) :

  s   1    2    3    4      5
r +--------------------------
1 |   1    1    1    1      1
2 |   1    2    3    4      5
3 |   1    3    6    9     14
4 |   1    4    9   18     25
5 |   1    5   14   25  43-48

참고 rs 상호 교환 : R(r,s)=R(s,r) .

들면 하면 출력 할 수 사이의 정수 4348 (포함). 이 질문이 게시 될 때 가장 잘 알려진 범위입니다.R(5,5)4348


나는 이것이 kolmogorov-complexity (또는 비 입력, 고정 출력에만 적합합니까?)에 적합 5,5할 수 있다고 생각합니다 (범위가 있음 )
Jonathan Allan

R (5,5)에서 49는 언제 제외 되었습니까? (나는 도전 아니에요, 나는 Exoo의와 맥케이와 Radziszowski의 후 종이를 놓친 것 같다.)
에릭 타워


@qwr : 감사합니다! 지금까지 즐기고 있습니다.
에릭 타워

답변:


7

자바 스크립트 (ES6), 51 49 바이트

카레 구문으로 입력을 (r)(s)받습니다.

r=>s=>--r*--s+[9,1,,13,2,,3,27,6][r<2|s<2||r*s%9]

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

어떻게?

첫 번째 근사값으로 다음 공식을 사용합니다.

(r1)(s1)
 0  0  0  0  0
 0  1  2  3  4
 0  2  4  6  8
 0  3  6  9 12
 0  4  8 12 16

1min(r,s)<31

 1  1  1  1  1
 1  2  3  4  5
 1  3  -  -  -
 1  4  -  -  -
 1  5  -  -  -

그렇지 않으면 키 가 다음에 의해 정의 된 룩업 테이블에서 선택된 값을 추가합니다 .k

k=(r1)(s1)mod9
 k:                    table[k]:           (r-1)(s-1):         output:
 -  -  -  -  -         -  -  -  -  -       -  -  -  -  -       -  -  -  -  -
 -  -  -  -  -         -  -  -  -  -       -  -  -  -  -       -  -  -  -  -
 -  -  4  6  8   -->   -  -  2  3  6   +   -  -  4  6  8   =   -  -  6  9 14
 -  -  6  0  3         -  -  3  9 13       -  -  6  9 12       -  -  9 18 25
 -  -  8  3  7         -  -  6 13 27       -  -  8 12 16       -  - 14 25 43

니스, 처음 두 행은 깔끔한 표현입니다.
qwr

5

자바 스크립트 (Node.js) , 56 55 바이트

f=(x,y)=>x<2|y<2||f(x,y-1)+f(x-1,y)-(x*y==12)-7*(x+y>8)

온라인으로 사용해보십시오! 나는 테이블이 파스칼의 삼각형과 비슷하지만 보정 계수가 있음을 알았습니다. 편집 : @sundar 덕분에 1 바이트가 절약되었습니다.


1
그러나 파스칼의 삼각 정체성은 램지 수의 간단한 상한에서 나옵니다 (조나단 앨런의 포스트 참조)
qwr

1
당신은 1 바이트 교체 절약 할 수 있습니다 x*y>19x+y>8.
sundar-복원 모니카

@ sundar 고마워요, 내 원래 솔루션은 50 바이트 였기 때문에 인덱싱이 잘못되었다는 것을 깨달았습니다.
Neil

4

젤리 ,  17  16 바이트

’ScḢƊ_:¥9“ ı?0‘y

온라인으로 사용해보십시오! 또는 테스트 스위트를 참조하십시오.

바꾸기 0로를 +, ,, -, ., 또는 /세트에 과 동일 , , , 또는 (아닌 각각 여기).43 44 45 46 47 48R(5,5)434445464748

어떻게?

이후 우리가 그것을 찾을 수 있습니다 :R(r,s)R(r1,s)+R(r,s1)

R(r,s)(r+s2r1)

이것은 다음 ’ScḢƊ을 생산할 것입니다.

 1  1  1  1  1
 1  2  3  4  5
 1  3  6 10 15
 1  4 10 20 35
 1  5 15 35 70

9가 결과에 들어갈 때마다 1을 빼면 목표에 3을 더 맞 춥니 다 _:¥9.

 1  1  1  1  1
 1  2  3  4  5
 1  3  6  9 14
 1  4  9 18 32
 1  5 14 32 63

나머지 두 개의 잘못된 값인 와 은 Jelly 's atom 및 코드 페이지 색인을 사용하여 변환 될 수 있습니다 .633263y“ ı?0‘y

’ScḢƊ_:¥9“ ı?0‘y - Link: list of integers [r, s]
’                - decrement              [r-1, s-1]
    Ɗ            - last 3 links as a monad i.e. f([r-1, s-1]):
 S               -   sum                  r-1+s-1 = r+s-2
   Ḣ             -   head                 r-1
  c              -   binomial             r+s-2 choose r-1
        9        - literal nine
       ¥         - last 2 links as a dyad i.e. f(r+s-2 choose r-1, 9):
      :          -   integer division     (r+s-2 choose r-1)//9
     _           -   subtract             (r+s-2 choose r-1)-((r+s-2 choose r-1)//9)
         “ ı?0‘  - code-page index list   [32,25,63,48]
               y - translate              change 32->25 and 63->48

맥케이, Radziszowski 및 Exoo가 추측 한대로 43을 권장합니다.
qwr

2

파이썬 2 , 62 바이트

def f(c):M=max(c);u=M<5;print[48,25-u*7,3*M+~u-u,M,1][-min(c)]

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


파이썬 2 , 63 바이트

def f(c):M=max(c);print[48,M%2*7+18,3*~-M+2*(M>4),M,1][-min(c)]

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

이건 말도 안 돼요, 곧이 글을 올린 것을 후회할 것입니다 ...하지만 ¯ \ _ (ツ) _ / ¯. 우리의 친절한 Jonathan Allan 덕분에 1 바이트를 삭감했습니다 :). 그래도 곧 약 20 바이트만큼 outgolfed 것입니다 ...



2

Julia 0.6 , 71 61 59 57 바이트

A->((r,s)=sort(A);r<3?s^~-r:3r+(s^2-4s+3)*((r==s)+r-2)-3)

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

Ungolfed (더 읽기 가능) :

function f_(A)
  (r, s) = sort(A)

  if r < 3
    result = s^(r-1)
  else
    result = 3*r + 
               (s^2 - 4*s + 3) * ((r == s) + r - 2) -
               3
  end

  return result
end

무엇을합니까?

Ar과 s를 포함하는 배열로 입력을 받습니다. 를 사용하여 배열을 r과 s로 압축을 풉니 다 (r,s)=sort(A).

r이 1이면 출력은 1이되어야합니다. r이 2이면 출력은 s가되어야합니다. 것이다 , R = 1, 및 , R = 2에 대한 그래서 , 짧거나
sr1s0=1s1=s
r<3?s^(r-1)r<3?s^~-r

다른 사람들을 위해, 나는 출력이 다음과 같은 것을 알기 시작했다.

  • r = 3, (각각 s = 3, 4, 5에 대해). 2×3+[0,3,8]
  • r = 4, (s = 4, 5 각각)2×4+  [10,17]
  • r = 5, (s = 5)2×5+     [35]

(처음에는 편의상 f (5,5) = 45로 작업했습니다.)

이것은 잠재적으로 사용 가능한 패턴처럼 보였습니다 2r. 17은 8 * 2 + 1, 35는 17 * 2 + 1, 10은 3 * 3 + 1입니다. [0, 3, 8]에서 기본 값을 추출하는 것으로 시작했습니다 [0 3 8][s-2](나중에 짧게 됨 (s^2-4s+3)).

r = 3, 4 및 5에 대한 올바른 값을 얻으려고 시도하면 다음과 같은 여러 단계를 거쳤습니다.

2r+[0 3 8][s-2]*(r>3?3-s+r:1)+(r-3)^3+(r>4?1:0)

2r+(v=[0 3 8][s-2])+(r-3)*(v+1)+(r==s)v

후자를 확장하고 단순화하면 게시 된 코드가 생겼습니다.


2

x86, 49 37 바이트

테이블의 처음 세 행의 속성을 활용하는 것만으로는 최적화되지 않았습니다. 이것을 작성하는 동안 코드가 기본적으로 점프 테이블이므로 점프 테이블이 많은 바이트를 절약 할 수 있음을 깨달았습니다. 에 입력 eax하고 ebx에 출력 eax합니다.

사례를 결합하여 -12 r >= 3조회 테이블에 (원래 단지 r >= 4) 그리고 피터 코르의 제안 사용 cmp/ jae/ jne플래그와 여전히 있도록 설정 r1,r2,r3하나에 의해 구분됩니다 cmp! 또한 상수 오프셋을 사용하여 테이블에 스마트하게 인덱싱합니다.

start:
        cmp     %ebx, %eax
        jbe     r1
        xchg    %eax, %ebx              # ensure r <= s

r1:
        cmp     $2, %al             
        jae     r2                      # if r == 1: ret r
        ret

r2:     
        jne     r3                      # if r == 2: ret s 
        mov     %ebx, %eax
        ret

r3:
        mov     table-6(%ebx,%eax),%al  # use r+s-6 as index
        sub     %al, %bl                # temp = s - table_val
        cmp     $-10, %bl               # equal if s == 4, table_val == 14
        jne     exit
        add     $4, %al                 # ret 18 instead of 14 

exit:
        ret                        

table:
        .byte   6, 9, 14, 25, 43

육각 덤프

00000507  39 d8 76 01 93 3c 02 73  01 c3 75 03 89 d8 c3 8a  |9.v..<.s..u.....|
00000517  84 03 21 05 00 00 28 c3  80 fb f6 75 02 04 04 c3  |..!...(....u....|
00000527  06 09 0e 19 2b                                    |....+|

2
점프 테이블이 최적인지 확신하지 마십시오. r1: cmp $2, %al/ jae r2r2: jne r3다른 플래그 없이 사용할 수 있도록 플래그를 설정합니다 cmp. 점프 대상은 다른 곳에있을 r1수 있으며로 ret넘어갑니다 r2. (조건을 반대로). BTW, 이것은 SO에 대한 Short jump offset table 사용법 질문에 대답 한 후 처음 본 코드 골프 질문 입니다. HNQ에서 올바른 것을 고른 것 같습니다 :)
Peter Cordes

1
r4하나의 명령이 될 수 있습니다 mov table-8(%ebx,%eax), %al. IDK가 별도의 명령을 사용하여 테이블 주소를 레지스터로 옮기는 이유. 그러나 핵심 사항 중 하나는 심볼의 상수 오프셋은 이미 32 비트 절대 주소로 어셈블되므로 추가 비용이 들지 않는다는 것입니다. 링커가 최종 주소를 채울 때 객체 파일 형식은 오프셋을 사용하여 심볼 참조를 나타낼 수 있으므로 컴파일러는 구조체의 모든 필드 또는 모든 배열 요소에 별도의 레이블을 넣을 필요가 없습니다 ...
Peter Cordes

@PeterCordes 나는 이것이 HNQ를 만들지조차 몰랐습니다. 그리고 어떤 이유로 든 구문이 잘못되었다는 것을 깨닫기 전에 테이블 주소가 레지스터에 있어야한다고 생각했습니다. 여기에 코드 테이블 인 codegolf.stackexchange.com/a/168503/17360 을 수정했습니다 . 그러나 편리한 상수 오프셋에 대해서는 몰랐습니다. 나는 곱셈 대신 마지막 3 행에 대한 테이블을 시도 할 것이라고 생각합니다.
qwr

1
자체 참고 사항 : retr1 및 r2에 1 을 사용하여 1 바이트를 절약 할 수 있습니다 .
qwr

1
좋은 업데이트, 좋아 보인다. mov %ebx, %eaxto 를 이동하여 exit항상 r3 이후에 실행되고 r2가 점프하거나 r3으로 넘어 가면 어떻게됩니까? 그런 다음 r3은 sub %bl, %al/ cmp $10, %al/ jne exit/를 사용 하여 BL로 결과를 생성합니다 add $4, %bl(중립 크기 변경 : cmp 대 add는 al, imm8 짧은 형식을 사용할 수 있음). 이득은 retr2에서도를 제거한다는 것 입니다. 흠 아니요, 작동하지 않습니다. 테이블 항목이나 무언가를 부정하면 어떨까요? 그리고 그것은 아마도 당신이 필요로하는 무언가를 방해합니다. 나는 이것을 통해 생각하지 않았고 불행히도 그렇게 할 시간이 없다 : /
Peter Cordes


1

MATL, 25 21 바이트

+2-lGqXnt8/k-t20/k6*-

MATL Online에서 사용해보십시오

Jonathan Allan의 Jelly 답변 을 MATL 로 이식 하려고합니다.

+2-lGqXn-해당 답변과 동일 : 계산(r+s2r1)

t8/k -8로 나누고 바닥으로 나눕니다.

- -이전 결과에서 빼기 (Jelly 답변에서 9가 아니라 9가 아닌 8을 몇 번 뺀지를 뺍니다. 결과는 35와 70을 제외하고 모두 같으며 여기서 31과 62를 나타냅니다.)

t20/k -결과를 복제하고 20으로 나눈 값으로 나눕니다 (이미 정확한 결과는 0, 31은 1, 62는 3)

6* -6 곱하기

- -결과에서 빼기 (31-6 = 25, 62-18 = 44)


더 오래된 :

+t2-lGqXntb9<Q3w^/k-t20>+

MATL Online에서 사용해보십시오




0

자바 8, 62 바이트

(r,s)->--r*--s+new int[]{9,1,0,13,2,0,3,27,6}[r<2|s<2?1:r*s%9]

람다 기능, 포트 Arnauld 의 자바 스크립트 대답 . 여기에서 온라인으로 사용해보십시오 .

자바, 83 바이트

int f(int x,int y){return x<2|y<2?1:f(x,y-1)+f(x-1,y)-(x*y==12?1:0)-7*(x+y>8?1:0);}

재귀 함수, Neil 의 JavaScript 응답 포트 . 여기에서 온라인으로 사용해보십시오 .


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