Малі номери Рамзі


13

Передумови: число Рамзі дає мінімальну кількість вершин у повному графіку таким чином, що в червоному / синьому забарвленні краю є щонайменше один червоний або один синій . Межі для більших дуже важко встановити.R(r,s)vKvKvKrKsr,s

Ваше завдання - вивести число для .R(r,s)1r,s5

Вхідні дані

Два цілих числа з і .r,s1r51s5

Вихідні дані

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)

Для ви можете вивести будь-яке ціле число між і включно. На момент опублікування цього питання це найбільш відомі межі.43 48R(5,5)4348


Я думаю (навіть з діапазоном для 5,5), що це може підходити під складність колгорогорів (чи підходить лише невхід , фіксований вихід?)
Джонатан Аллан

Коли було виключено 49 для R (5,5)? (Я не кидаю викликів; я, здається, пропустив папір після Exoo і McKay і Radziszowski.)
Ерік Тауерс


@qwr: Дякую! Мені це подобається поки що.
Ерік Тауерс

Відповіді:


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)

Спробуйте в Інтернеті! Я помітив, що таблиця нагадує трикутник Паскаля, але з корекційними коефіцієнтами. Редагувати: Збережено 1 байт завдяки @sundar.


1
Так, ідентичність трикутника Паскаля походить від простої верхньої межі чисел Рамзі (див. Пост Джонатана Аллана)
qwr

1
Ви можете зберегти 1 байт заміною x*y>19на x+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  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

Якщо ви можете встановити його на будь-яке число, я рекомендую 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 байт завдяки нашому Джонатану Аллану :). Можливо, незабаром буде перевершено приблизно на 20 байт ...



2

Джулія 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. Розпаковує масив у 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, (для 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і ebxвихід у eax.

-12 комбінуючи випадків r >= 3в довідковій таблиці (спочатку тільки r >= 4) і використовуючи пропозицію Пітера Корд -х роках 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

Гексдумп

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 :)
Пітер Кордес

1
r4може бути одна інструкція: mov table-8(%ebx,%eax), %al. IDK, чому ви використовували окрему інструкцію для переміщення адреси таблиці в реєстр. Але однією з ключових речей є те, що постійні зсуви символів не коштують нічого зайвого, оскільки він вже збирається на 32-бітну абсолютну адресу. Формати файлів об'єктів можуть представляти рефлекси символів із зміщенням, коли лінкер заповнює остаточну адресу, тому компіляторам не потрібно ставити окремі мітки на кожному полі структури або на кожному елементі масиву ...
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 vs. add може використовувати коротку форму al, im8). Виграш полягає в тому, що він також видаляє retз r2. Хм, ні, це не працює, може, якщо ви заперечуєте записи таблиці або щось таке? І це, мабуть, клобує щось необхідне. Я цього не продумав і, на жаль, не встигаю цього зробити: /
Пітер Кордес,


1

MATL, 25 21 байт

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

Спробуйте це на MATL Online

Спроба перенести відповідь Джонатана Аллана на желе 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, порт Арно 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);}

Рекурсивна функція, порт Neil JavaScript «s відповідь . Спробуйте його онлайн тут .


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.