เบอร์แรมซีย์หมายเลขเล็ก


13

ความเป็นมา: หมายเลขแรมซีย์R(r,s)ให้จำนวนจุดยอดต่ำสุดvในกราฟสมบูรณ์Kvซึ่งการระบายสีขอบสีแดง / น้ำเงินของKvมีอย่างน้อยหนึ่งสีแดงKrหรือสีน้ำเงินหนึ่งKsอัน ขอบเขตขนาดใหญ่สำหรับr,sเป็นเรื่องยากมากที่จะสร้าง

งานของคุณคือการส่งออกจำนวนR(r,s)สำหรับ1r,s5 5

อินพุต

สองจำนวนเต็มr,sกับ1r5และ1s5 5

เอาท์พุต

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

โปรดทราบว่าrและsแทนกัน: R(r,s)=R(s,r) )

สำหรับคุณสามารถส่งออกจำนวนเต็มใด ๆ ระหว่าง43ถึง48ได้ ในขณะที่คำถามนี้ถูกโพสต์สิ่งเหล่านี้เป็นขอบเขตที่รู้จักกันดีR(5,5)4348


ฉันคิดว่า (แม้จะมีช่วงสำหรับ5,5) ว่าสิ่งนี้อาจเหมาะสมภายใต้kolmogorov-complex (หรือไม่เพียงเอาท์พุทคงที่ไม่พอดีแบบคงที่?)
Jonathan Allan

เมื่อใดที่ถูกแยกออก 49 สำหรับ R (5,5) (ฉันไม่ได้ท้าทายฉันดูเหมือนจะพลาดกระดาษหลังจาก Exoo's และ McKay และ Radziszowski's)
Eric Towers


@qwr: ขอบคุณ! ฉันสนุกกับมันจนถึงตอนนี้
Eric Towers

คำตอบ:


7

JavaScript (ES6), 51 49 ไบต์

(r)(s)จะเข้าในไวยากรณ์ currying

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

min(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 แต่มีปัจจัยการแก้ไข แก้ไข: บันทึก 1 ไบต์ขอบคุณ @sundar


1
ใช่ตัวตนรูปสามเหลี่ยมของ Pascal มาจากขอบเขตบนแบบง่าย ๆ บนหมายเลข Ramsey (ดูโพสต์ของ Jonathan Allan)
qwr

1
คุณสามารถบันทึก 1 ไบต์แทนที่ด้วยx*y>19 x+y>8
sundar - Reinstate Monica

@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  1  1  1  1
 1  2  3  4  5
 1  3  6  9 14
 1  4  9 18 32
 1  5 14 32 63

ส่วนที่เหลืออีกสองค่าที่ไม่ถูกต้องและนั้นอาจได้รับการแปลโดยใช้เจลลี่ของอะตอมและรหัสหน้าดัชนีมี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

หากคุณสามารถตั้งค่าเป็นหมายเลขใด ๆ ฉันขอแนะนำ 43 ตามที่คาดคะเนโดย McKay, Radziszowski และ Exoo;)
qwr

2

Python 2 , 62 ไบต์

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

ลองออนไลน์!


Python 2 , 63 ไบต์

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

ลองออนไลน์!

นี่มันไร้สาระฉันจะเสียใจที่ได้โพสต์ข้อความนี้ในไม่ช้า ... แต่เอ๊ะ¯ \ _ (ツ) _ / ¯ โกนทิ้งไป 1 ไบต์ขอบคุณJonathan Allan ที่ใจดีของเรา:) อาจจะโตเกิน 20 ไบต์ในไม่ช้าแม้ว่า ...



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

มันทำอะไร?

รับอินพุตเป็นอาร์เรย์Aที่มี r และ s unpacks อาร์เรย์เข้า R และ S กับจำนวนที่มีขนาดเล็กเป็น R (r,s)=sort(A)ใช้

ถ้า r คือ 1 เอาต์พุตควรเป็น 1 หาก r คือ 2 เอาต์พุตควรเป็นอะไรก็ได้ จะเป็นสำหรับ r = 1 และสำหรับ r = 2 ดังนั้นหรือสั้นกว่า
s 0 = 1 s 1 = ssr1s0=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และเอาท์พุทในebxeax

-12 โดยการรวมกรณีต่าง ๆr >= 3ลงในตารางการค้นหา (เดิมเป็นเพียงแค่r >= 4) และใช้คำแนะนำของ Peter Cordes ของ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

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
อย่าแน่ใจว่าตารางกระโดดจะเหมาะสมที่สุด r1: cmp $2, %al/ jae r2จะตั้งธงดังกล่าวที่คุณสามารถใช้โดยไม่ได้อีกr2: jne r3 cmpเป้าหมายกระโดดในr1อาจจะเป็นที่อื่นและตกผ่านไปret r2(ย้อนกลับเงื่อนไข) BTW นี่เป็นคำถามแรกของคำถามกอล์ฟที่ฉันดูหลังจากตอบคำถามการใช้ตารางข้ามทางลัดของคุณใน SO ผมคิดว่าผมเลือกหนึ่งที่เหมาะสมจาก HNQ :)
ปีเตอร์ Cordes

1
r4mov table-8(%ebx,%eax), %alสามารถเป็นหนึ่งในการเรียนการสอน: IDK เหตุใดคุณจึงใช้คำสั่งแยกต่างหากเพื่อย้ายที่อยู่ตารางไปยังการลงทะเบียน แต่สิ่งสำคัญอย่างหนึ่งก็คือการปรับค่าคงที่จากสัญลักษณ์ไม่ได้มีค่าใช้จ่ายเพิ่มเติมเพราะมันประกอบไปยังที่อยู่สัมบูรณ์แบบ 32 บิตแล้ว รูปแบบไฟล์ออบเจกต์สามารถแสดงการอ้างอิงสัญลักษณ์ด้วยออฟเซ็ตเมื่อตัวเชื่อมโยงเติมที่อยู่สุดท้ายเพื่อให้คอมไพเลอร์ไม่จำเป็นต้องใส่ป้ายกำกับแยกต่างหากในทุกฟิลด์ของ struct หรือองค์ประกอบอาร์เรย์ ...
Peter Cordes

@PeterCordes ฉันไม่ได้ตระหนักถึงสิ่งนี้ทำให้ HNQ และใช่ด้วยเหตุผลบางอย่างฉันคิดว่าที่อยู่ตารางต้องอยู่ในการลงทะเบียนก่อนที่จะรู้ตัวว่าฉันมีไวยากรณ์ผิด ฉันแก้ไขที่นี่codegolf.stackexchange.com/a/168503/17360ซึ่งเป็นเพียงตารางการค้นหา แต่ฉันไม่รู้เกี่ยวกับการชดเชยค่าคงที่ซึ่งมีประโยชน์ ฉันคิดว่าฉันจะลองตารางสำหรับ 3 แถวสุดท้ายแทนการคูณ
qwr

1
หมายเหตุถึงตนเอง: ยังคงสามารถบันทึก 1 ไบต์โดยใช้หนึ่งretสำหรับ r1 และ r2
qwr

1
การปรับปรุงที่ดีดูดี ถ้าคุณย้ายmov %ebx, %eaxไปยังexitดังนั้นมันจะทำงานหลังจาก r3 เสมอและ r2 จะกระโดดไปที่นั่นหรือเข้าสู่ r3 เสมอ จากนั้น r3 จะสร้างผลลัพธ์เป็น BL ด้วยsub %bl, %al/ cmp $10, %al/ jne exit/ add $4, %bl(การเปลี่ยนขนาดที่เป็นกลาง: cmp กับการเพิ่มสามารถใช้รูปแบบสั้น ๆ แบบ imm8 ได้) กำไรก็คือมันจะลบretr2 เช่นกัน อืมไม่ได้ผลบางทีถ้าคุณปฏิเสธรายการในตารางหรืออะไรบางอย่าง และนั่นอาจขัดขวางสิ่งที่คุณต้องการ ฉันไม่ได้คิดเรื่องนี้มาก่อนและน่าเสียดายที่ไม่มีเวลาทำเช่นนั้น: /
Peter Cordes


1

MATL, 25 21 ไบต์

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

ลองใช้กับ MATL Online

พยายามที่จะพอร์ต Jonathan Jonathan Allan Jelly ตอบกลับ MATL

+2-lGqXn- เหมือนกับคำตอบนั้น: คำนวณ(r+s2r1)

t8/k - ทำซ้ำนั้นหารด้วย 8 และพื้น

- - ลบออกจากผลลัพธ์ก่อนหน้า (เราลบจำนวน 8 ครั้งในจำนวนแทนที่จะเป็น 9 ในคำตอบของ Jelly ผลลัพธ์จะเหมือนกันสำหรับทั้งหมดยกเว้น 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]

ฟังก์ชั่นแลมบ์ดาท่าเรือArnauld JavaScript 's คำตอบ ลองออนไลน์ได้ที่นี่

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

ฟังก์ชั่นซ้ำพอร์ตของนีล JavaScript 's คำตอบ ลองออนไลน์ได้ที่นี่


0

C (gcc), 57 ไบต์

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

ฟังก์ชั่นซ้ำพอร์ตของนีล JavaScript 's คำตอบ ลองออนไลน์ได้ที่นี่

C (gcc), 63 ไบต์

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

ท่าเรือArnauld JavaScript 's คำตอบ ลองออนไลน์ได้ที่นี่


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.