Małe liczby Ramseya


13

Tło: liczba Ramsey, R(r,s) daje minimalną liczbę wierzchołków v w pełnej wykres Kv tak, że czerwono / niebieski krawędź barwienia Kv ma co najmniej jeden czerwony Kr lub jedna niebieska Ks . Granice dla większej r,s są trudne do ustalenia.

Twoim zadaniem jest wyprowadzenie liczby R(r,s) dla 1r,s5 .

Wejście

Dwie liczby całkowite r,s z 1r5 i 1s5 .

Wynik

R(r,s) jak podano w tej tabeli:

  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

Zauważ, że r i s są wymienne: R(r,s)=R(s,r) .

Dla możesz wypisać dowolną liczbę całkowitą z przedziału od 43 do 48 włącznie. W chwili opublikowania tego pytania są to najbardziej znane granice.R(5,5)4348


Myślę, że (nawet z zakresu dla 5,5), który może zmieścić się pod Kołmogorowa-złożoności (lub nie tylko zakaz wprowadzania, ustaloną wyjściową pasuje?)
Jonathan Allan

Kiedy 49 zostało wykluczone dla R (5,5)? (Nie rzucam wyzwania; wydaje mi się, że przegapiłem gazetę po Exoo, McKay i Radziszowskiego.)
Eric Towers


@qwr: Dzięki! Jak dotąd to mi się podoba.
Eric Towers

Odpowiedzi:


7

JavaScript (ES6), 51 49 bajtów

Pobiera dane wejściowe w składni curry (r)(s).

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

Wypróbuj online!

W jaki sposób?

Jako pierwsze przybliżenie używamy wzoru:

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

W przeciwnym razie dodajemy wartość wybraną z tabeli odnośników, której klucz jest zdefiniowany przez: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

Fajnie, pierwsze dwa rzędy to zgrabne wyrażenie.
qwr

5

JavaScript (Node.js) , 56 55 bajtów

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

Wypróbuj online! Zauważyłem, że tabela przypomina trójkąt Pascala, ale ze współczynnikami korekcji. Edycja: Zapisano 1 bajt dzięki @sundar.


1
Tak, tożsamość trójkąta Pascala pochodzi od prostej górnej granicy liczb Ramseya (patrz post Jonathana Allana)
qwr

1
Można zapisać 1 bajt wymianie x*y>19z x+y>8.
sundar - Przywróć Monikę

@sundar Dzięki, moje oryginalne rozwiązanie miało 50 bajtów, zanim zdałem sobie sprawę, że moje indeksowanie jest nieprawidłowe i zapomniałem spróbować ponownie zagrać w golfa po tym, jak to naprawiłem.
Neil

4

Galaretka ,  17  16 bajtów

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

Wypróbuj online! Lub zobacz zestaw testowy .

Wymienić 0z +, ,, -, .lub /do zadanej równej , , , lub odpowiednio, (zamiast tutaj).43 44 45 46 47 48R(5,5)434445464748

W jaki sposób?

Ponieważ możemy stwierdzić, że:R(r,s)R(r1,s)+R(r,s1)

R(r,s)(r+s2r1)

Jest to ’ScḢƊi spowodowałoby:

 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

Jeśli odejmiemy jeden za każdym razem, gdy dziewięć przejdzie do wyniku, dopasujemy trzy kolejne do naszego celu (osiąga się to za pomocą _:¥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

Pozostałe dwie niepoprawne wartości, i można następnie przetłumaczyć za pomocą atomu Jelly i indeksów strony kodowej za pomocą .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

Jeśli możesz ustawić dowolną liczbę, polecam 43, jak przypuszczają McKay, Radziszowski i Exoo;)
qwr

2

Python 2 , 62 bajty

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

Wypróbuj online!


Python 2 , 63 bajty

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

Wypróbuj online!

To niedorzeczne, wkrótce będę żałować, że to opublikowałem ... Ale eh, ¯ \ _ (ツ) _ / ¯. Ogolono 1 bajt dzięki naszemu miłemu Jonathanowi Allanowi :). Prawdopodobnie wkrótce zostanie obrzucony około 20 bajtami ...



2

Julia 0,6 , 71 61 59 57 bajtów

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

Wypróbuj online!

Niegolfowany (cóż, nieco bardziej czytelny):

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

Co to robi?

Pobiera dane wejściowe jako tablicę Azawierającą r i s. Rozpakowuje tablicę do r i si mniejszą liczbą jako r, używając (r,s)=sort(A).

Jeśli r wynosi 1, wyjście powinno wynosić 1. Jeśli r wynosi 2, wyjście powinno być tym, czym jest s. będzie dla r = 1, a dla r = 2. Tak więc lub krócej,
s 0 = 1 s 1 = ssr1s0=1s1=s
r<3?s^(r-1)r<3?s^~-r

W przypadku innych zacząłem od zauważenia, że ​​dane wyjściowe to:

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

(Początkowo pracowałem dla f (5,5) = 45 dla wygody.)

Wyglądało to na potencjalnie użyteczny wzór - wszystkie mają 2rze sobą wspólnego, 17 to 8 * 2 + 1, 35 to 17 * 2 + 1, 10 to 3 * 3 + 1. Zacząłem od wyodrębnienia wartości podstawowej z [0, 3, 8], ponieważ [0 3 8][s-2](to później stało się krótsze (s^2-4s+3)).

Próba uzyskania poprawnych wartości dla r = 3, 4 i 5 przeszła przez wiele etapów, w tym

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

i

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

Rozszerzenie tego ostatniego i uproszczenie doprowadziło do opublikowania kodu.


2

x 86, 49 37 bajtów

Niezbyt zoptymalizowany, po prostu wykorzystując właściwości pierwszych trzech wierszy tabeli. Podczas pisania tego zdałem sobie sprawę, że kod jest w zasadzie tabelą skoków, dzięki czemu tabela skoków może zaoszczędzić wiele bajtów. Wejście eaxi ebxwyjście eax.

-12 poprzez połączenie przypadków z r >= 3tabelą odnośników (pierwotnie tylko r >= 4) i użycie sugestii Petera Cordesa o cmp/ jae/ jnez ustawionymi flagami, tak aby r1,r2,r3można je było odróżnić tylko jednym cmp! Również inteligentnie indeksuje do tabeli za pomocą stałego przesunięcia.

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
Nie bądź pewien, że stół do skoków byłby optymalny. r1: cmp $2, %al/ jae r2ustawi flagi tak, abyś mógł ich używać r2: jne r3bez innego cmp. Cel skoku r1może być retgdzieś indziej i wpaść do r2. (Odwróć warunek). BTW, to jest pierwsze pytanie o golfa kodowego, na które patrzyłem po odpowiedzi na pytanie dotyczące użycia stołu do skoku krótkiego na SO. Chyba wybrałem właściwy z HNQ :)
Peter Cordes

1
r4może być jedna instrukcja: mov table-8(%ebx,%eax), %al. IDK, dlaczego użyłeś osobnej instrukcji, aby przenieść adres tabeli do rejestru. Ale jedną z kluczowych rzeczy jest to, że stałe przesunięcia od symboli nie kosztują nic dodatkowego, ponieważ już się składa do 32-bitowego adresu bezwzględnego. Formaty obiekt może reprezentować bibl symbol offset dla kiedy wypełnia łącznika w końcowej adres więc kompilatory nie trzeba umieścić osobne etykiety na każdym polu struct lub każdego elementu tablicy ...
Peter Cordes

@PeterCordes Nawet nie zdawałem sobie sprawy, że to zrobiło HNQ. I tak z jakiegoś powodu pomyślałem, że adres tabeli musi znajdować się w rejestrze, zanim zdam sobie sprawę, że źle miałem składnię. Naprawiłem to tutaj codegolf.stackexchange.com/a/168503/17360, który jest tylko tabelą odnośników. Ale nie wiedziałem o przydatnym stałym przesunięciu. Myślę, że spróbuję tabeli dla ostatnich 3 wierszy zamiast mnożenia.
qwr

1
Uwaga do siebie: nadal można zapisać 1 bajt, używając jednego retdla r1 i r2.
qwr

1
Ładna aktualizacja, wygląda dobrze. Co jeśli przesuniesz mov %ebx, %eaxdo exit, więc zawsze biegnie po r3, a r2 tam skacze lub spada do r3? Następnie r3 daje wynik w BL za pomocą sub %bl, %al/ cmp $10, %al/ jne exit/ add $4, %bl(neutralna zmiana rozmiaru: cmp vs. add może użyć krótkiej formy al, imm8). Zysk polega na tym, że usuwa również retz R2. Hmm nie, to nie działa, może jeśli zignorujesz wpisy w tabeli lub coś takiego? I to prawdopodobnie blokuje coś, czego potrzebujesz. Nie przemyślałem tego i niestety nie mam na to czasu: /
Peter Cordes,


1

MATL, 25 21 bajtów

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

Wypróbuj na MATL Online

Próba przeniesienia galaretki Jonathana Allana na MATL.

+2-lGqXn(r+s2r1)

t8/k - powiel to, podziel przez 8 i piętro

- - odejmij to od poprzedniego wyniku (odejmujemy, ile razy 8 liczb zamiast 8 w odpowiedzi Galaretki. Wynik jest taki sam dla wszystkich oprócz 35 i 70, które tutaj dają 31 i 62).

t20/k - zduplikuj również ten wynik, podziel go przez 20 i piętro (daje 0 dla już poprawnych wyników, 1 dla 31, 3 dla 62)

6* - pomnóż to przez 6

- - odejmij to od wyniku (31 - 6 = 25, 62 - 18 = 44)


Starsze:

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

Wypróbuj na MATL Online




0

Java 8, 62 bajty

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

Funkcja Lambda, port odpowiedzi JavaScript Arnaulda . Wypróbuj online tutaj .

Java, 83 bajty

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

Funkcja rekurencyjna, port odpowiedzi JavaScript Neila . Wypróbuj online tutaj .


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.