小さなラムジー番号


13

背景:ラムジー数頂点の最小数を与えるV完全グラフでK Vの発色赤/青のエッジようにKのvは少なくとも一つの赤色有するK個のR又は一つの青色K 。より大きなr sの境界を確立することは非常に困難です。R(r,s)vKvKvKrKsr,s

あなたの仕事を出力する数である用の1つのR sは5R(r,s)1r,s5

入力

二つの整数1つのR 51 S 5r,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

sは交換可能であることに注意してください:R r s = R s r rsR(r,s)=R(s,r)

以下のためのR(5,5)あなたを出力してもよいとの間の任意の整数48、包括。この質問が投稿された時点で、これらは最もよく知られた境界です。4348


私は(これはの範囲であっても5,5kolmogorov-complexityの下に収まるかもしれないと思います(または、非入力、固定出力のみに収まりますか?)
ジョナサンアラン

R(5,5)で49が除外されたのはいつですか?(私は挑戦していません。ExooとMcKayとRadziszowskiの後に論文を見逃したようです。)
Eric Towers


@qwr:ありがとう!今まで楽しんでいます。
エリックタワーズ

回答:


7

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

いいですね、最初の2行はきちんとした表現です。
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)

オンラインでお試しください!テーブルはパスカルの三角形に似ていますが、補正係数があります。編集:@sundarのおかげで1バイト保存されました。


1
うん、パスカルの三角形のアイデンティティは、ラムジー数の単純な上限に由来します(ジョナサンアランの投稿を参照)
qwr

1
あなたは、1つのバイトを交換し保存することができますx*y>19x+y>8
スンダ

@sundarありがたいことに、私のインデックス作成が間違っていることに気付く前の私の元の解決策は50バイトであり、それを修正した後にもう一度ゴルフを試みることを忘れました。
ニール

4

ゼリー 17  16 バイト

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

オンラインでお試しください!またはテストスイートを見る

0+,-./R(5,5)434445, 46, or 47 respectively (rather than the 48 here).

How?

Since R(r,s)R(r1,s)+R(r,s1) we may find that:

R(r,s)(r+s2r1)

This is ’ScḢƊ and would produce:

 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

If we subtract one for each time nine goes into the result we align three more with our goal (this is achieved with _:¥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

The remaining two incorrect values, 32 and 63 may then be translated using Jelly's y atom and code-page indices with “ ı?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

If you can set it to any number I recommend 43 as conjectured by McKay, Radziszowski and Exoo ;)
qwr


2

Julia 0.6, 71 61 59 57 bytes

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

Try it online!

Ungolfed (well, a bit more readable):

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

What does it do?

Takes input as array A containing r and s. Unpacks the array into r and s with the smaller number as r, using (r,s)=sort(A).

If r is 1, output should be 1. If r is 2, output should be whatever s is.
sr1 will be s0=1 for r=1, and s1=s for r = 2.
So, r<3?s^(r-1) or shorter, r<3?s^~-r

For the others, I started with noticing that the output is:

  • for r = 3, 2×3+[0,3,8] (for s = 3, 4, 5 respectively).
  • for r = 4, 2×4+  [10,17] (for s = 4, 5 respectively)
  • for r = 5, 2×5+     [35] (for s = 5)

(I initially worked with f(5,5)=45 for convenience.)

This looked like a potentially usable pattern - they all have 2r in common, 17 is 8*2+1, 35 is 17*2+1, 10 is 3*3+1. I started with extracting the base value from [0, 3, 8], as [0 3 8][s-2] (this later became the shorter (s^2-4s+3)).

Attempting to get correct values for r = 3, 4, and 5 with this went through many stages, including

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

and

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

Expanding the latter and simplifying it led to the posted code.


2

x86, 49 37 bytes

Not very optimized, just exploiting the properties of the first three rows of the table. While I was writing this I realized the code is basically a jump table so a jump table could save many bytes. Input in eax and ebx, output in eax.

-12 by combining cases of r >= 3 into a lookup table (originally just r >= 4) and using Peter Cordes's suggestion of cmp/jae/jne with the flags still set so that r1,r2,r3 are distinguished by only one cmp! Also indexing into the table smartly using a constant offset.

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
Don't be so sure a jump table would be optimal. r1: cmp $2, %al / jae r2 will set flags such that you can use r2: jne r3 without another cmp. The jump target in r1 can be a ret somewhere else, and fall through to r2. (Reverse the condition). BTW, this is the first code-golf question I looked at after answering your Short jump offset table usage question on SO. I guess I picked the right one from HNQ :)
Peter Cordes

1
r4 can be one instruction: mov table-8(%ebx,%eax), %al. IDK why you used a separate instruction to mov the table address into a register. But one of the key things is that constant offsets from symbols don't cost anything extra because it already assembles to a 32-bit absolute address. Object file formats can represent symbol refs with an offset for when the linker fills in the final address so compilers don't have to put separate labels on every field of a struct, or every array element...
Peter Cordes

@PeterCordes I didn't even realize this made HNQ. And yes for some reason I thought the table address had to be in a register before realizing I had the syntax wrong. I fixed it here codegolf.stackexchange.com/a/168503/17360 which is just a lookup table. But I didn't know about the constant offset which is handy. I think I'll try a table for the last 3 rows instead of the multiplication.
qwr

1
Note to self: it is still possible to save 1 byte by using one ret for r1 and r2.
qwr

1
Nice update, looks good. What if you move the mov %ebx, %eax to exit, so it always runs after r3, and r2 jumps there or falls through into r3? Then r3 produces its result in BL with sub %bl, %al / cmp $10, %al / jne exit / add $4, %bl (neutral size change: cmp vs. add can use the al,imm8 short form). The gain is that it removes the ret from r2 as well. Hmm no that doesn't work, well maybe if you negate the table entries or something? And that probably clobbers something you need. I haven't thought this through and unfortunately don't have time to do so :/
Peter Cordes


1

MATL, 25 21 bytes

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

Try it on MATL Online

Attempt to port Jonathan Allan's Jelly answer to MATL.

+2-lGqXn - same as that answer: compute (r+s2r1

t8/k -それを複製し、8で割って床

- -前の結果からそれを減算します(ゼリーの回答では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

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]

ArnauldのJavaScript アンサーのポートであるLambda関数。こちらからオンラインでお試しください。

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 回答のポート。こちらからオンラインでお試しください。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.