Số Ramsey nhỏ


13

Bối cảnh: số Ramsey R(r,s) cho số lượng tối thiểu của đỉnh v trong đồ thị đầy đủ Kv như vậy mà một màu đỏ / xanh cạnh màu của Kv có ít nhất một màu đỏ Kr hoặc một màu xanh Ks . Giới hạn cho lớn hơn , sr,s rất khó thiết lập.

Nhiệm vụ của bạn là để sản xuất các số R(r,s) cho 1r,s5 .

Đầu vào

Hai số nguyên với 1 r 51 s 5 .r,s1r51s5

Đầu ra

như được đưa ra trong bảng này: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

Lưu ý rằng s có thể hoán đổi cho nhau: R ( r , s ) = R ( s , r ) .rsR(r,s)=R(s,r)

Đối với bạn có thể xuất bất kỳ số nguyên nào trong khoảng từ 43 đến 48 . Tại thời điểm câu hỏi này được đăng, đây là những giới hạn được biết đến nhiều nhất.R(5,5)4348


Tôi nghĩ (ngay cả với phạm vi cho 5,5) rằng điều này có thể phù hợp với độ phức tạp của kolmogorov (hoặc chỉ không phù hợp với đầu ra, đầu ra cố định?)
Jonathan Allan

Khi nào 49 bị loại trừ cho R (5,5)? (Tôi không thách thức; dường như tôi đã bỏ lỡ một bài báo sau Exoo's và McKay và Radziszowski.)
Eric Towers


@qwr: Cảm ơn! Tôi đang tận hưởng nó cho đến nay.
Tháp Eric

Câu trả lời:


7

JavaScript (ES6), 51 49 byte

Đưa đầu vào theo cú pháp currying (r)(s).

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

Hãy thử trực tuyến!

Làm sao?

Là một xấp xỉ đầu tiên, chúng tôi sử dụng công thức:

(r-1)(S-1)
 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

Nếu chúng ta có , chúng ta chỉ cần thêm 1 :tối thiểu(r,S)<31

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

Mặt khác, chúng tôi thêm một giá trị được chọn từ bảng tra cứu có khóa được xác định bởi:k

k= =(r-1)(S-1)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

Đẹp, hai hàng đầu tiên là một biểu hiện gọn gàng.
qwr

5

JavaScript (Node.js) , 56 55 byte

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

Hãy thử trực tuyến! Tôi nhận thấy rằng bảng giống với tam giác của Pascal nhưng có hệ số hiệu chỉnh. Chỉnh sửa: Đã lưu 1 byte nhờ @sundar.


1
Đúng, danh tính tam giác của Pascal xuất phát từ giới hạn trên đơn giản trên các số Ramsey (xem bài của Jonathan Allan)
qwr 15/07/18

1
Bạn có thể lưu 1 byte thay thế x*y>19bằng x+y>8.
- Phục hồi Monica

@sundar Cảm ơn, giải pháp ban đầu của tôi là 50 byte trước khi tôi nhận ra rằng việc lập chỉ mục của mình là sai và tôi đã quên thử đánh gôn lại sau khi tôi sửa nó.
Neil

4

Thạch ,  17  16 byte

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

Hãy thử trực tuyến! Hoặc xem một bộ thử nghiệm .

Thay thế 0với +, ,, -, ., hoặc /để thiết lập bằng với 43 , 44 , 45 , 46 , hoặc 47 tương ứng (chứ không phải là 48 ở đây).R(5,5)434445464748

Làm sao?

Kể từ chúng ta có thể thấy rằng:R(r,S)R(r-1,S)+R(r,S-1)

R(r,S)(r+S-2r-1)

Đây là ’ScḢƊvà sẽ sản xuất:

 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

Nếu chúng tôi trừ đi một cho mỗi lần chín kết quả, chúng tôi sẽ liên kết ba mục tiêu nữa với mục tiêu của chúng tôi (điều này đạt được với _:¥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

3263y“ ı?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

Nếu bạn có thể đặt nó thành bất kỳ số nào tôi khuyên bạn nên 43 theo phỏng đoán của McKay, Radziszowski và Exoo;)
qwr

2

Python 2 , 62 byte

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

Hãy thử trực tuyến!


Python 2 , 63 byte

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

Hãy thử trực tuyến!

Điều này thật nực cười, tôi sẽ sớm hối hận vì đã đăng bài này ... Nhưng eh, ¯ \ _ () _ /. Cạo sạch 1 byte nhờ loại Jonathan Allan của chúng tôi :). Có lẽ sẽ sớm bị vượt qua khoảng 20 byte mặc dù ...



2

Julia 0,6 , 71 61 59 57 byte

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

Hãy thử trực tuyến!

Ungolfed (tốt, dễ đọc hơn một chút):

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

Nó làm gì?

Lấy đầu vào là mảng Achứa r và s. Giải nén mảng thành r và s với số nhỏ hơn là r, sử dụng (r,s)=sort(A).


Sr-1S0= =1S1= =S
r<3?s^(r-1)r<3?s^~-r

Đối với những người khác, tôi bắt đầu nhận thấy rằng đầu ra là:

  • 2×3+[0,3,số 8]
  • 2×4+  [10,17]
  • 2×5+     [35]

(Ban đầu tôi làm việc với f (5,5) = 45 để thuận tiện.)

Điều này trông giống như một mô hình có khả năng sử dụng - tất cả chúng đều có 2rđiểm chung, 17 là 8 * 2 + 1, 35 là 17 * 2 + 1, 10 là 3 * 3 + 1. Tôi bắt đầu với việc trích xuất giá trị cơ sở từ [0, 3, 8], vì [0 3 8][s-2](sau này trở thành ngắn hơn (s^2-4s+3)).

Cố gắng để có được các giá trị chính xác cho r = 3, 4 và 5 với điều này đã trải qua nhiều giai đoạn, bao gồm

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

Mở rộng cái sau và đơn giản hóa nó dẫn đến mã được đăng.


2

x86, 49 37 byte

Không được tối ưu hóa lắm, chỉ khai thác các thuộc tính của ba hàng đầu tiên của bảng. Trong khi tôi đang viết điều này, tôi nhận ra rằng mã về cơ bản là một bảng nhảy để một bảng nhảy có thể tiết kiệm nhiều byte. Đầu vào trong eaxebx, đầu ra trong eax.

-12 bằng cách kết hợp các trường hợp r >= 3vào một bảng tra cứu (ban đầu chỉ là r >= 4) và sử dụng đề xuất cmp/ jae/ jnevới các cờ vẫn được đặt để chỉ r1,r2,r3được phân biệt bởi một cmp! Cũng lập chỉ mục vào bảng thông minh bằng cách sử dụng bù không đổi.

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

Hexdump

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
Đừng chắc chắn rằng một bàn nhảy sẽ là tối ưu. r1: cmp $2, %al/ jae r2sẽ đặt cờ sao cho bạn có thể sử dụng r2: jne r3mà không cần cái khác cmp. Mục tiêu nhảy vào r1có thể là một retnơi khác, và rơi vào r2. (Đảo ngược điều kiện). BTW, đây là câu hỏi golf-code đầu tiên tôi đã xem xét sau khi trả lời câu hỏi sử dụng bảng bù nhảy ngắn của bạn trên SO. Tôi đoán tôi đã chọn đúng từ HNQ :)
Peter Cordes

1
r4có thể là một chỉ dẫn : mov table-8(%ebx,%eax), %al. IDK tại sao bạn sử dụng một lệnh riêng để di chuyển địa chỉ bảng vào một thanh ghi. Nhưng một trong những điều quan trọng là việc bù trừ liên tục từ các biểu tượng sẽ không tốn thêm bất kỳ chi phí nào vì nó đã được lắp ráp thành một địa chỉ tuyệt đối 32 bit. Các định dạng tệp đối tượng có thể biểu thị các tham chiếu ký hiệu với phần bù cho khi trình liên kết điền vào địa chỉ cuối cùng để trình biên dịch không phải đặt các nhãn riêng biệt trên mọi trường của một cấu trúc hoặc mọi thành phần mảng ...
Peter Cordes

@PeterCordes Tôi thậm chí không nhận ra điều này làm HNQ. Và có vì một số lý do tôi nghĩ rằng địa chỉ bảng phải được đăng ký trước khi nhận ra tôi đã sai cú pháp. Tôi đã sửa nó ở đây codegolf.stackexchange.com/a/168503/17360 chỉ là một bảng tra cứu. Nhưng tôi không biết về phần bù không đổi rất tiện dụng. Tôi nghĩ rằng tôi sẽ thử một bảng cho 3 hàng cuối cùng thay vì nhân.
qwr

1
Lưu ý đến bản thân: vẫn có thể lưu 1 byte bằng cách sử dụng một byte retcho r1 và r2.
qwr

1
Cập nhật đẹp, ngoại hình đẹp. Điều gì sẽ xảy ra nếu bạn di chuyển mov %ebx, %eaxđến exit, để nó luôn chạy sau r3 và r2 nhảy tới đó hoặc rơi vào r3? Sau đó r3 tạo ra kết quả của nó trong BL với sub %bl, %al/ cmp $10, %al/ jne exit/ add $4, %bl(thay đổi kích thước trung tính: cmp so với add có thể sử dụng dạng ngắn al, im8). Lợi ích là nó cũng loại bỏ retkhỏi r2. Hmm không, nó không hoạt động, có lẽ nếu bạn phủ nhận các mục trong bảng hoặc cái gì đó? Và điều đó có thể làm tắc nghẽn một cái gì đó bạn cần. Tôi đã không nghĩ đến điều này và thật không may là không có thời gian để làm như vậy: /
Peter Cordes


1

MATL, 25 21 byte

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

Dùng thử trên MATL Online

Cố gắng chuyển câu trả lời Jelly của Jonathan Allan sang MATL.

+2-lGqXn(r+S-2r-1)

t8/k - nhân đôi số đó, chia cho 8 và sàn

- - trừ đi kết quả trước đó (Chúng tôi trừ đi số lần 8 đi, thay vì 9 trong câu trả lời Jelly. Kết quả là giống nhau cho tất cả trừ 35 và 70, ở đây đưa ra 31 và 62.)

t20/k - nhân đôi kết quả đó, chia cho 20 và sàn (cho 0 cho kết quả đã đúng, 1 cho 31, 3 cho 62)

6* - nhân số đó với 6

- - trừ đi từ kết quả (31 - 6 = 25, 62 - 18 = 44)


Lớn hơn:

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

Dùng thử trên MATL Online




0

Java 8, 62 byte

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

Hàm Lambda, cổng câu trả lời JavaScript của Arnauld . Hãy thử trực tuyến tại đây .

Java, 83 byte

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);}

Hàm đệ quy, cổng trả lời JavaScript của Neil . Hãy thử trực tuyến tại đây .


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.