Küçük Ramsey Sayıları


13

Arka plan: Ramsey numarası köşelerin en az sayıda verir tam grafik gibi bir renklendirme bir kırmızı / mavi kenarı bu kırmızı en az bir yer alır veya bir mavi . Daha büyük için sınırlar oluşturmak çok zordur.v K v K v K rR(r,s)vKvKvKrKsr,s

Göreviniz için sayısını çıkarmaktır .R(r,s)1r,s5

Giriş

ve ile iki tamsayısı .r,s1r51s5

Çıktı

R(r,s)Bu tabloda verilen :

  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

ve birbiriyle değiştirilebilir olduğuna dikkat edin : .s R ( r , s ) = R ( s , r )rsR(r,s)=R(s,r)

İçin Eğer arasındaki çıkış herhangi bir tamsayı olabilir ve dahil. Bu sorunun gönderildiği sırada bunlar en iyi bilinen sınırlardır.43 48R(5,5)4348


5,5Bu kolmogorov karmaşıklığı altında (veya sadece girdi olmayan, sabit bir çıktı uyuyor?) ( Aralığı ile bile) düşünüyorum
Jonathan Allan

49 R (5,5) için ne zaman hariç tutuldu? (Zor değilim; Exoo ve McKay ve Radziszowski'nin ardından bir gazeteyi kaçırmışım gibi görünüyor.)
Eric Towers


@qwr: Teşekkürler! Şimdiye kadar keyif alıyorum.
Eric Towers

Yanıtlar:


7

JavaScript (ES6), 51 49 bayt

Körili sözdiziminde girdi alır (r)(s).

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

Çevrimiçi deneyin!

Nasıl?

İlk yaklaşım olarak şu formülü kullanıyoruz:

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

Aksi takdirde, tuşu tarafından tanımlanan bir arama tablosundan seçilen bir değer ekleriz :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

Güzel, İlk iki sıra temiz bir ifadedir.
qwr

5

JavaScript (Node.js) , 56 55 bayt

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

Çevrimiçi deneyin! Tablonun Pascal üçgenine benzediğini, ancak düzeltme faktörleriyle olduğunu fark ettim. Düzenleme: @sundar sayesinde 1 bayt kaydedildi.


1
Evet, Pascal'ın üçgen kimliği Ramsey sayılarının basit bir üst sınırından geliyor (bkz. Jonathan Allan'ın gönderisi)
qwr

1
Sen 1 bayt yerine kaydedebilirsiniz x*y>19ile x+y>8.
sundar - Monica'yı geri

@ sundar Teşekkürler, dizinleme yanlış olduğunu fark etmeden önce orijinal çözümüm 50 bayt oldu ve bunu düzelttikten sonra tekrar golf oynamayı unuttum.
Neil

4

Jöle ,  17  16 bayt

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

Çevrimiçi deneyin! Veya bir test takımına bakın .

Yerine 0sahip +, ,, -, ., veya /resim için için eşit , , , , ya da (yerine sırasıyla burada).43 44 45 46 47 48R(5,5)434445464748

Nasıl?

Yana o olabilir:R(r,s)R(r1,s)+R(r,s1)

R(r,s)(r+s2r1)

Bu ’ScḢƊve üretir:

 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

Dokuz sonuca her girdiğinde bir çıkarırsak, hedefimizle üç tane daha hizalarız (bu ile elde edilir _:¥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

Kalan iki yanlış değer olan ve , Jelly'in atom ve kod sayfası indeksleri kullanılarak çevrilebilir .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

Herhangi bir sayıya ayarlayabilirseniz, McKay, Radziszowski ve Exoo tarafından tahmin edilen 43'ü tavsiye ederim;)
qwr

2

Python 2 , 62 bayt

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

Çevrimiçi deneyin!


Python 2 , 63 bayt

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

Çevrimiçi deneyin!

Bu çok saçma, yakında bunu paylaştığım için pişman olacağım ... Ama ha, ¯ \ _ (ツ) _ / ¯. Bizim tür Jonathan Allan :) sayesinde 1 bayt kapalı traş . Muhtemelen kısa süre içinde yaklaşık 20 bayt tarafından geride bırakılacak ...



2

Julia 0.6 , 71 61 59 57 bayt

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

Çevrimiçi deneyin!

Ungolfed (iyi, biraz daha okunabilir):

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

Bu ne işe yarıyor?

Girdiyi Ar ve s içeren dizi olarak alır . Kullanarak diziyi daha küçük sayı ile r ve s olarak açar (r,s)=sort(A).

R 1 ise, çıktı 1 olmalıdır. R 2 ise, çıktı s olmalıdır. olacak r = 1, ve r = 2 için Yani , daha kısa ya da
s 0 = 1 s 1 = ssr1s0=1s1=s
r<3?s^(r-1)r<3?s^~-r

Diğerleri için, çıktı:

  • r = 3, (sırasıyla s = 3, 4, 5 için). 2×3+[0,3,8]
  • r = 4, (sırasıyla s = 4, 5 için)2×4+  [10,17]
  • r = 5, (s = 5 için)2×5+     [35]

(Başlangıçta kolaylık sağlamak için f (5,5) = 45 ile çalıştım.)

Bu potansiyel olarak kullanılabilir bir desene benziyordu - hepsinin 2rortak noktası var, 17 8 * 2 + 1, 35 17 * 2 + 1, 10 3 * 3 + 1. Taban değerini [0, 3, 8] 'den çıkarmakla başladım, çünkü [0 3 8][s-2](bu daha sonra kısaldı (s^2-4s+3)).

R = 3, 4 ve 5 için doğru değerleri elde etmeye çalışmak, bunun da dahil olduğu birçok aşamadan geçti.

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

ve

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

İkincisini genişletmek ve basitleştirmek, yayınlanan koda yol açtı.


2

x86, 49 37 bayt

Çok optimize edilmemiş, sadece tablonun ilk üç satırının özelliklerinden yararlanılmıştır. Ben bu yazarken bir atlama tablo birçok bayt kaydedebilirsiniz böylece kod temelde bir atlama tablosu olduğunu fark etti. Giriş eaxve ebxçıkış eax.

-12 vakaları r >= 3bir arama tablosunda birleştirerek (başlangıçta sadece r >= 4) ve Peter Cordes'in cmp/ jae/ önerisini jnehala ayarlanmış bayraklarla birlikte kullanarak r1,r2,r3, sadece bir tanesiyle ayırt edilir cmp! Ayrıca sabit bir ofset kullanarak akıllıca tabloya indeksleme.

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
Bir atlama tablosunun en iyi olacağından emin olmayın. r1: cmp $2, %al/ jae r2bayrakları r2: jne r3başka bir tane olmadan kullanabileceğiniz şekilde ayarlar cmp. Atlama hedefi başka r1bir retyerde olabilir ve düşebilir r2. (Durumu tersine çevirin). BTW, bu SO kısa atlama ofset tablo kullanım sorunuzu cevapladıktan sonra baktım ilk kod golf soru . Sanırım HNQ'dan doğru olanı seçtim :)
Peter Cordes

1
r4bir talimat olabilir mov table-8(%ebx,%eax), %al. IDK neden tablo adresini bir kayıt defterine taşımak için ayrı bir talimat kullandınız. Ancak anahtar şeylerden biri, sembollerin sabit ofsetlerinin ekstra bir maliyete sahip olmamasıdır, çünkü zaten 32 bit mutlak bir adrese monte edilir. Nesne dosya formatları, bağlayıcı son adresi doldurduğunda sembol referanslarını temsil edebilir, böylece derleyiciler bir yapının her alanına veya her dizi elemanına ayrı etiketler koymak zorunda kalmaz ...
Peter Cordes

@PeterCordes Bunun HNQ yaptığını bile fark etmedim. Ve evet bazı nedenlerden dolayı sözdiziminin yanlış olduğunu fark etmeden önce tablo adresinin bir kayıtta olması gerektiğini düşündüm. Ben burada sadece bir arama tablosu olan codegolf.stackexchange.com/a/168503/17360 sabit . Ama kullanışlı olan sürekli dengelemeyi bilmiyordum. Sanırım çarpım yerine son 3 satır için bir tablo deneyeceğim.
qwr

1
Kendine not: retr1 ve r2 için bir tane kullanarak 1 bayt kaydetmek hala mümkündür .
qwr

1
Güzel güncelleme, iyi görünüyor. Ya ' mov %ebx, %eaxyı hareket ettirirseniz exit, bu yüzden her zaman r3'ten sonra çalışır ve r2 oraya atlar ya da r3'e düşer? Daha sonra r3 sub %bl, %al/ cmp $10, %al/ jne exit/ ile add $4, %blnötr boyut değişikliği: cmp vs. add al, imm8 short formunu kullanabilir). Kazanç, retr2'den de kaldırılmasıdır . Hmm hayır bu işe yaramıyor, belki de tablo girişlerini ya da bir şeyleri reddederseniz? Ve bu muhtemelen ihtiyacınız olan bir şeyi zorlar. Ben bunu düşünmedim ve ne yazık ki bunu yapmak için zamanım yok: /
Peter Cordes


1

MATL, 25 21 bayt

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

MATL Online'da deneyin

Jonathan Allan'ın Jelly cevabını MATL'ye taşımaya çalışın.

+2-lGqXn(r+s2r1)

t8/k - çoğaltın, 8'e ve zemine bölün

- - önceki sonuçtan çıkartın (Jelly cevabında 9 yerine 8'in kaç kez gittiğini çıkarırız. Sonuç, burada 31 ve 62 veren 35 ve 70 dışındaki herkes için aynıdır.)

t20/k - bu sonucu da çoğaltın, 20'ye ve zemine bölün (zaten doğru sonuçlar için 0, 31 için 1, 62 için 3)

6* - bunu 6 ile çarp

- - sonuçtan çıkarın (31 - 6 = 25, 62 - 18 = 44)


Daha eski:

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

MATL Online'da deneyin




0

Java 8, 62 bayt

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

Lambda fonksiyonu, Arnauld'un JavaScript cevabının limanı . Burada çevrimiçi deneyin .

Java, 83 bayt

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

Özyinelemeli işlev, Neil'in JavaScript yanıtının bağlantı noktası . Burada çevrimiçi deneyin .


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.