小拉姆齐数


13

背景:Ramsey数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


我认为(即使有的范围也是如此5,5)这可能适合kolmogorov复杂度(或者是否只有非输入,固定输出适合?)
Jonathan Allan

R(5,5)何时被排除49?(我没有挑战性;在Exoo,McKay和Radziszowski之后,我似乎错过了一篇论文。)
Eric Towers


@qwr:谢谢!到目前为止,我很喜欢。
埃里克·塔

Answers:


7

JavaScript(ES6),51 49字节

以currying语法接受输入(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

JavaScript(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)

在线尝试!我注意到该表类似于Pascal的三角形,但具有校正因子。编辑:由于@sundar,节省了1个字节。


1
是的,帕斯卡(Pascal)的三角形恒等式来自Ramsey数的简单上限(请参见Jonathan Allan的文章)
qwr

1
您可以保存1个字节替换x*y>19x+y>8
sundar-恢复莫妮卡

@sundar,谢谢,我原来的解决方案是50个字节,然后才意识到索引错误,并且在解决此问题后忘记再次尝试打高尔夫球了。
尼尔

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的原子和代码页索引来转换其余两个不正确的值和。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

如果可以将其设置为任何数字,我建议使用McKay,Radziszowski和Exoo猜想的43;)
qwr


2

朱0.671个 61 59 57字节

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

在线尝试!

取消高尔夫(嗯,更具可读性):

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

它有什么作用?

将输入作为A包含r和s的数组。使用,将数组解压缩为r和s,其中较小的数字为r (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,2(分别对于s = 3,4,5)。 2×3+[0,3,8]
  • 对于r = 4,2(分别对于s = 4,5)2×4+  [10,17]
  • 对于r =(对于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

86,49 37个字节

不是非常优化,只是利用表的前三行的属性。在编写此代码时,我意识到代码基本上是一个跳转表,因此跳转表可以节省很多字节。在eax和中输入,在中ebx输出eax

通过将的情况合并r >= 3到一个查询表(最初只是r >= 4)中,并使用彼得·科德斯(Peter Cordes)的cmp/ jae/ 建议,同时jne仍设置标志,以便r1,r2,r3仅用一个标志来区分-12 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 r2将设置标志使您可以r2: jne r3不用另一个cmp。的跳跃目标r1可以在ret其他地方,然后跌落到r2。(逆转条件)。顺便说一句,这是在回答您关于SO的短跳转偏移量表使用问题之后,我看到的第一个代码高尔夫球问题。我想我从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
自我注意:仍然可以通过ret在r1和r2中使用1来保存1个字节。
qwr

1
更新很好,看起来不错。如果将mov %ebx, %eaxto移到exit,它总是在r3之后运行,而r2跳到那里或掉进r3会怎样?然后R3产生其结果在BL与sub %bl, %al/ cmp $10, %al/ jne exit/ add $4, %bl(中性尺寸变化:CMP对附加可使用人,的imm8短形式)。好处是它也ret从r2中删除了。嗯,那是行不通的,好吧,如果您否定表条目之类的话?那可能会掩盖您需要的东西。我还没有考虑到这一点,不幸的是没有时间这样做:/
彼得·科德斯


1

MATL,25 21字节

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

在MATL Online上尝试

尝试将Jonathan Allan的Jelly答案移植到MATL。

+2-lGqXn-与该答案相同:计算(r+s2r1)

t8/k -复制该数字,除以8和下限

- -从先前的结果中减去(我们减去数字中的8而不是果冻答案中的9的次数。除35和70外,其余所有结果相同,此处为31和62。)

t20/k -也复制该结果,将其除以20并减去本底(将0表示已经正确的结果,将1表示为31,将3表示为62)

6* -乘以6

- -从结果中减去(31-6 = 25,62-18 = 44)


较旧:

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

在MATL Online上尝试




0

Java 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]

Lambda函数,Arnauld的JavaScript 答案端口。在这里在线尝试。

Java,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 答案端口。在这里在线尝试。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.