Два десятки наближення числа цілувань


26

Враховуючи число від 1 до 24, виведіть цілувальний номер, наскільки це відомо сьогодні (деякі цифри матимуть більше одного прийнятного результату). Знання геометрії не є важливим, оскільки результати наведені нижче.

Зі сторінки Вікіпедії на проблему цілуючих номерів :

число цілування визначається як кількість неперекриваються одиничних сфер, які можуть бути розташовані таким чином, що вони торкаються іншої одиничної сфери

Тобто, враховуючи одну одиничну сферу, скільки ще одиничних сфер може торкнутися її, не перекриваючи жодну з них? Питання буде задано в N мірному просторі, де сфера розуміється як розмірна сфера N-1.

Наприклад:

  • у двомірному просторі одиничне коло може торкатися 6 інших одиничних кіл.
  • у тривимірному просторі одинична сфера може торкатися 12 інших одиничних сфер.

Сторінка Вікіпедії перераховує значення для розмірів від 1 до 24. Однак деякі з них ще невідомі точно, тому наведено лише нижню та верхню межі. Таблиця відтворена тут, щоб вона залишалася фіксованою, незалежно від будь-якого майбутнього звуження діапазонів через нові докази. Рішення судяться за цією фіксованою таблицею, навіть якщо сторінка Вікіпедії буде змінена в майбутньому.

Таблиця меж

Dimension   Lower bound     Upper bound
1           2               2
2           6               6
3           12              12
4           24              24
5           40              44
6           72              78
7           126             134
8           240             240
9           306             364
10          500             554
11          582             870
12          840             1357
13          1154            2069
14          1606            3183
15          2564            4866
16          4320            7355
17          5346            11072
18          7398            16572
19          10668           24812
20          17400           36764
21          27720           54584
22          49896           82340
23          93150           124416
24          196560          196560

Вхідні дані

Розмір: Ціле число від 1 до 24 (включно).

Тут «ціле число» вказує на те, що вхід не матиме дробову частину - це може бути 2або 3але ніколи 2.5. Наприклад, рішення може приймати дані як поплавок, або рядок.

Вихідні дані

Число у відповідному діапазоні - від нижньої межі до верхньої межі для цього входу (включно).

Вихід повинен бути детермінованим (завжди однаковим для одного входу).

Вихід повинен бути цілим числом. Наприклад, для введення 5можливих дійсних виходів 40, 41, 42, 43, 44. Зверніть увагу: це обмеження на значення, а не на тип. Прийнятно повертати поплавок, за умови, що він має нульову дробову частину. Наприклад, 41.5не було б дійсним, але 41.0було б дійсним.

Оцінка балів

Це . Ваш бал - кількість байтів у вашому коді. Для кожної мови переможець - це рішення з найнижчою оцінкою.


6
Дійсно класна проблема наближення.
qwr

Відповіді:


11

Джулія 0,6 , 52 байти

n->ceil(n<8?3.7exp(.51n)-5.1:n<24?9exp(.41n):196560)

Спробуйте в Інтернеті!

Як?

Машинне навчання! (Щось. Можливо. Не дуже. )

По-перше, з побудови графіків даних нижньої та верхньої межі проти N та деяких ручних проб і помилок здавалося, що експоненціальна функція може добре підходити для N> = 8. Після деяких спроб вручну знайти цю функцію, я вдався до використання параметра функція настройки для настройки (де K = 8 до 24), щоб знайти a, b і c такі, що вираз дав значення, які лежать у правильному діапазоні для кожного K (з послідовно меншим діапазоном можливих значень і відповідно більших точностей для a, b, c в різних прогонах функції). Такого набору значень було декілька, хоча жодне з них не могло точно відповідати випадку N = 24, тому я пішов з одним, у якого було 0, і жорстко закодовано значення для N = 24.aebK+cc

Для нижчих N, від 1 до 7, я сподівався знайти простіший вираз або поліном, але не зміг знайти жодного, що підходить. Тож повернемось до підключення , на цей раз для K = 1 до 7 (хоча я насправді не думав, що експоненція буде правильним пристосуванням у цьому випадку на основі візуальних тенденцій сюжету). На щастя, були параметри a, b, c, які могли дати правильні значення у всьому діапазоні тут (принаймні, в межах виклику).aebK+cceil


6
Я б не вважав, що пошук сетки є машинним навчанням. Це жорстока сила, якщо що.
qwr

5
Але це в MLBase!!! J / k, лінії навколо МЛ розмиті, як завжди, але це, мабуть , занадто базово, щоб заслужити машинне вивчення етикетки. Знову ж таки, завжди корисно вводити казкове слово!
sundar

коли ми говоримо про машинне навчання, ми в основному думаємо про поліноми з n = 2 або регулярними виразами
aaaaa говорить про відновлення Моніки

2
коли я кажу про машинне навчання, я думаю про нейронні мережі, дерева рішень, HMM, перцептрон ...
qwr

@qwr Я дуже пізно, але регрес насправді вважається частиною машинного навчання, крім усіх цих речей. (І більше! SVMs тощо)
Quintec

7

x86, 62 59 53 50 байт

У моєму рішенні використовується таблиця пошуку байтів і зсув на 2 (без FP обчислень). Розміри від 9 до 23 забезпечують достатню свободу для переключення. Вхід eaxі вихід у ecx.

-3 шляхом заміни eaxі ecxоскільки cmp $imm, %alкоротше, ніж cmp $imm, %cl.

-4, не розглядаючи випадок N = 24 окремо, але застосовуючи коригування до всіх 1024 випадків.

-2, не повертаючись рано (дурно)

-3, використовуючи таблицю як зміщення і movzblзамість нулю зxor

start:
        dec     %eax                # 1-indexed table

        movzbl  table(%eax), %ecx   # return byte directly
        cmp     $8, %al
        jl      exit

        sal     $6, %ecx            # * 64 
        cmp     $19, %al
        jl      exit

        sal     $4, %ecx            # * 16
        sub     $48, %ecx

exit:   
        ret

#.data
table:  .byte   2, 6, 12, 24, 40, 72, 126, 240              # * 1
        .byte   5, 8, 10, 14, 19, 26, 41, 68, 84, 116, 167  # * 64  
        .byte   18, 28, 49, 92, 192                         # * 1024 - 48

Hexdump (таблиця .textзамість .data)

00000502  48 0f b6 88 1c 05 00 00  3c 08 7c 0d c1 e1 06 3c  |H.......<.|....<|
00000512  13 7c 06 c1 e1 04 83 e9  30 c3 02 06 0c 18 28 48  |.|......0.....(H|
00000522  7e f0 05 08 0a 0e 13 1a  29 44 54 74 a7 12 1c 31  |~.......)DTt...1|
00000532  5c c0                                             |\.|

1
Таблиця доступна лише для читання, тому, як правило, ви б її .rodataне помістили .data. (Або в Windows, мабуть .rdata). .rodataРозділ компонується як частина текстового сегмента.
Пітер Кордес

1
І BTW, звичайні люди пишуть shl, особливо коли ваш номер не підписаний (ви раніше movzblйого завантажували, ні movsbl). Звичайно, salце просто інша назва цього ж коду. gcc випромінює sal, але це досить рідко можна побачити в рукописному коді.
Пітер Кордес

7

JavaScript (ES6), 60 байт

f=(n,k=2)=>n<24?--n?f(n,k*24/(17+~'_8443223'[n])):~~k:196560

Спробуйте в Інтернеті!

Як?

a24=196560

Усі інші терміни обчислюються рекурсивно, використовуючи:

{a1=2an+1=an×24qn

qn

{q1=8q2=12q3=12q4=13q5=14q6=14q7=13qн=16,для н>7

що призводить до таких співвідношень:

3,2,2,2413,127,127,2413,32,32,,32

Кінцевий результат врешті-решт повертається і повертається.

Підсумок результатів

Орієнтовні результати даються з 2 десятковими знаками.

  n |   a(n-1) | multiplier |      a(n) | output |          expected
----+----------+------------+-----------+--------+-------------------
  1 |      n/a |        n/a |         2 |      2 |                2
----+----------+------------+-----------+--------+-------------------
  2 |        2 |          3 |         6 |      6 |                6
  3 |        6 |          2 |        12 |     12 |               12
  4 |       12 |          2 |        24 |     24 |               24
  5 |       24 |      24/13 |     44.31 |     44 |        [40,..,44]
  6 |    44.31 |       12/7 |     75.96 |     75 |        [72,..,78]
  7 |    75.96 |       12/7 |    130.21 |    130 |      [126,..,134]
  8 |   130.21 |      24/13 |    240.39 |    240 |              240
  9 |   240.39 |        3/2 |    360.58 |    360 |      [306,..,364]
 10 |   360.58 |        3/2 |    540.87 |    540 |      [500,..,554]
 11 |   540.87 |        3/2 |    811.31 |    811 |      [582,..,870]
 12 |   811.31 |        3/2 |   1216.97 |   1216 |     [840,..,1357]
 13 |  1216.97 |        3/2 |   1825.45 |   1825 |    [1154,..,2069]
 14 |  1825.45 |        3/2 |   2738.17 |   2738 |    [1606,..,3183]
 15 |  2738.17 |        3/2 |   4107.26 |   4107 |    [2564,..,4866]
 16 |  4107.26 |        3/2 |   6160.89 |   6160 |    [4320,..,7355]
 17 |  6160.89 |        3/2 |   9241.34 |   9241 |   [5346,..,11072]
 18 |  9241.34 |        3/2 |  13862.00 |  13862 |   [7398,..,16572]
 19 | 13862.00 |        3/2 |  20793.01 |  20793 |  [10668,..,24812]
 20 | 20793.01 |        3/2 |  31189.51 |  31189 |  [17400,..,36764]
 21 | 31189.51 |        3/2 |  46784.26 |  46784 |  [27720,..,54584]
 22 | 46784.26 |        3/2 |  70176.40 |  70176 |  [49896,..,82340]
 23 | 70176.40 |        3/2 | 105264.59 | 105264 | [93150,..,124416]
----+----------+------------+-----------+--------+-------------------
 24 |           (hard-coded)            | 196560 |           196560 

1
Перше, що я побачив - це побітні оператори в рамках рекурсивної функції JavaScript; перше, що я подумав: «Що таке
Арнаульд

Дійсно гарний стіл. Ви зробили це вручну?
qwr

1
@qwr Так, це переважно редагування блокнота ++. Я просто використав сценарій для створення значень у перших 4 стовпцях.
Арнольд

4

Желе , 29 26 байт

“~D=ⱮziEc+y’Dḣ+⁵÷7PĊ«“£#;’

Спробуйте в Інтернеті!

Як це працює

“~D=ⱮziEc+y’Dḣ+⁵÷7PĊ«“£#;’  Main link. Argument: n

“~D=ⱮziEc+y’                Set the return value to 485523230101001100011122.
            D               Decimal; convert the return value to base 10.
             ḣ              Head; take the first n elements of the digit list.
              +⁵            Add 10 to each element.
                ÷7          Divide the sums by 7.
                  P         Take the product.
                   Ċ        Ceil; round up to the nearest integer.
                     “£#;’  Yield 196560.
                    «       Take the minimum.

1

JavaScript (Node.js) , 120 99 байт

Випав 21 байт. Велике зменшення завдяки пропозиції tsh додати дірку до початку масиву (збереження двох байтів, що йдуть від n-1до n, і націлювання на круглі числа в нижній та верхній межах, тим самим стискаючи їх від позначення фіксованої точки, як 1154експоненціальні позначення як 2e3.

Знову ж таки, моя первісна мета полягала в тому, щоб показати, наскільки легким буде "німий" спосіб (наприклад, не використовуючи реальну математику, як, наприклад, відповідь Арнальда. Вражає те, що все ще було можливість зменшити її без будь-яких перетворень чи розрахунків.

n=>[,2,6,12,24,40,72,126,240,306,500,582,840,2e3,2e3,3e3,5e3,6e3,8e3,2e4,2e4,3e4,5e4,1e6,196560][n]

Спробуйте в Інтернеті!

Удвічі довша відповідь Арнальда, 0 кількість складності.

JavaScript (Node.js) , 129 128 байт

(-1 байт завдяки пропозиції скористатися бітшифтингом)

f=(n)=>[2,6,12,24,40,72,126,240].concat([5,8,10,14,19,26,41,68,84,116,167].map(x=>x<<6),[17,28,49,91].map(x=>x<<10),196560)[n-1]

Спробуйте в Інтернеті!

Щоб задовольнити вимоги бути цікавими, я вкрав логіку з відповіді x86 і створив з цього масив. Зробити це на 9 байт довше. Але трохи цікавіше.


позіхає хоча б спробуйте щось цікаве
qwr

Я вважав, що демонстрація найпростішого підходу (а технічно найдовша розумна довжина) - досить цікава. Arnauld's цілком можливо найкоротший, який можна отримати в JS, але найдовший - лише вдвічі більше байт.
Ентоні

1
Суть таблиці пошуку в байті полягає в тому, щоб, можливо, використовувати байтінгрінг або просто щось на зразок "02060c1828487ef0", де кожен запис - один байт або два символи в шістнадцятковій формі, якщо ви хочете. Зберігання чисел безпосередньо в десятковій формі займає до 3 символів. Також використовуйте
бітсіфтинг

2
Ви повинні , по крайней мере , усунення f=, зміна (x)до x, додати отвір і зміна x-1в x. ТІО ; і, можливо, округніть
tsh

5
Ласкаво просимо до PPCG! :)
Shaggy

1

Рунічний, 173 байт

>i:8(?D5X1+1C,*212,+16,+1c2*,+1cX,+Sp3X7+a,*5X1+a,-1+kn$;
      R:c2*(?D4X1+1C,*212,+16,+1c2*,+Sp9*1+:4XY(?Dkn$;
             R`196560`r@;              ;$*C1nk,C1L

(Зверніть увагу, що нижній правий кут слід вважати байтами: вони неявно заповнені пробілами.)

Екс-офіс TIO потребує оновлення, на яке покладається ця відповідь (і я латаю деякі інші діри, перш ніж просити Деніса відновити). Але підключення значення (не забудьте додати пробіли у рядках 2 та 3, якщо для першого значення використовується більше одного символу). Ось найпростіший спосіб записати необхідні значення:

0-9,a-f  ->  1-15
2Xn+     ->  20+n

Спробуйте в Інтернеті!

Функціонально це порт відповіді Джулії Сундара (але у Runic немає команди для натискання eна стек (або насправді будь-яке десяткове значення), тому потрібне було наближення). Наближення для eвходів менше 8 є більш точним, оскільки втрата точності призвела до значень, що лежать поза допустимим діапазоном виходів (наприклад, 7отримали б 125). Ceil()було досягнуто перетворенням символу, а потім поверненням до числа (це не вдалося для виключно великих значень, тому в 40k я мав його ділити на 100, зробити перетворення на і назад, а потім помножити на 100 знову).

Напевно, є місце для спрощення розташування (наприклад, запуск точки входу вертикально, внизу, або пошук способу стиснення наближень для e), але я щасливий, що тільки зможу зробити розрахунок.

/?D5X1+1C,*212,+16,+1c2*,+1cX,+Sp3X7+a,*5X1+a,-1+kn$;
  R:c2*(?D4X1+1C,*212,+16,+1c2*,+Sp9*1+:4XY(?Dkn$;
\(8:i<   R`196560`r@;              ;$*C1nk,C1L

161 байт.

Оновлення перекладача:

Завдяки вхідному читанню фіксації натисканням , Runic тепер має кілька математичних функцій та можливість аналізувати рядки як подвійні. Це значно спростить цю відповідь, але я залишу це так, як демонструвати зусилля, які я вклав у неї (я додав одноаргументні математичні функції та розбір рядків незабаром після публікації: у мене вже був Sin / Cos / Tan мій список справ, але не враховував Exp, Abs, Log тощо і не вистачало символів). TIO має оновлюватися протягом наступних 24-48 годин, залежно від того, коли це побачить Денніс.

212,+16,+1c2*,+1cX,+зменшиться до -> за 1'eAдопомогою цього оновлення інтерпретатора. Aз'являється символ і значення і виконує операцію Math на цьому значенні на основі символу, що з'явився ( eу цьому випадку є Exp()і Exp(1)повертається e ).

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