Одиночные ходы
Доска представляет собой бесконечную двумерную квадратную сетку, похожую на безграничную шахматную доску. Часть со значением N ( движущая сила N ) может переместиться в любой квадрат, который является расстоянием ровно квадратного корня из N от его текущего квадрата (евклидово расстояние, измеренное от центра до центра).
Например:
- Двигатель 1 может двигаться к любому квадрату, который расположен горизонтально или вертикально
- 2-движитель может двигаться на любой квадрат, который находится по диагонали
- 5-ходовой как шахматный рыцарь
Обратите внимание, что не все N-двигатели могут двигаться. Трехходовой никогда не может покинуть свой текущий квадрат, потому что ни один из квадратов на доске не находится точно на расстоянии корня 3 от текущего квадрата.
Несколько ходов
Если разрешено перемещаться несколько раз, некоторые фигуры могут достигать любого квадрата на доске. Например, 1-движитель и 5-движитель могут сделать это. 2-движитель может двигаться только по диагонали и может достигать только половины квадратов. Часть, которая не может двигаться, как 3-движитель, не может достичь ни одного из квадратов (начальный квадрат не считается "достигнутым", если не происходит движение) .
Изображения показывают, какие квадраты могут быть достигнуты. Подробнее о наведении. Нажмите для увеличения изображения.
- Квадраты, достижимые за 1 или более ходов, отмечены черным
- Квадраты, достижимые ровно за 1 ход, показаны красными фигурами
(кроме 3-ходового, который не может двигаться)
Какую пропорцию доски может достичь данный N-движитель?
вход
- Положительное целое число N
Выход
- Доля доски, которую может достичь N-движитель
- Это число от 0 до 1 (оба включительно)
- Для этой задачи допускается вывод в виде дроби в наименьших значениях, например 1/4
Так что для ввода 10
, оба 1/2
и 0.5
являются приемлемыми выходами. Вывод в виде отдельного числителя и знаменателя также допустим, поскольку он включает языки, которые не поддерживают ни плавающие, ни дробные числа. Например, 1 2
или [1, 2]
.
Для целочисленных выходных данных (0 и 1) допустимы любые из следующих форматов:
- При 0:
0
,0.0
,0/1
,0 1
,[0, 1]
- для 1:
1
,1.0
,1/1
,1 1
,[1, 1]
счет
Это код гольф. Оценка - это длина кода в байтах. Для каждого языка выигрывает самый короткий код.
Контрольные примеры
В формате input : output as fraction : output as decimal
1 : 1 : 1
2 : 1/2 : 0.5
3 : 0 : 0
4 : 1/4 : 0.25
5 : 1 : 1
6 : 0 : 0
7 : 0 : 0
8 : 1/8 : 0.125
9 : 1/9 : 0.1111111111111111111111111111
10 : 1/2 : 0.5
13 : 1 : 1
16 : 1/16 : 0.0625
18 : 1/18 : 0.05555555555555555555555555556
20 : 1/4 : 0.25
25 : 1 : 1
26 : 1/2 : 0.5
64 : 1/64 : 0.015625
65 : 1 : 1
72 : 1/72 : 0.01388888888888888888888888889
73 : 1 : 1
74 : 1/2 : 0.5
80 : 1/16 : 0.0625
81 : 1/81 : 0.01234567901234567901234567901
82 : 1/2 : 0.5
144 : 1/144 : 0.006944444444444444444444444444
145 : 1 : 1
146 : 1/2 : 0.5
148 : 1/4 : 0.25
153 : 1/9 : 0.1111111111111111111111111111
160 : 1/32 : 0.03125
161 : 0 : 0
162 : 1/162 : 0.006172839506172839506172839506
163 : 0 : 0
164 : 1/4 : 0.25
241 : 1 : 1
242 : 1/242 : 0.004132231404958677685950413223
244 : 1/4 : 0.25
245 : 1/49 : 0.02040816326530612244897959184
260 : 1/4 : 0.25
261 : 1/9 : 0.1111111111111111111111111111
288 : 1/288 : 0.003472222222222222222222222222
290 : 1/2 : 0.5
292 : 1/4 : 0.25
293 : 1 : 1
324 : 1/324 : 0.003086419753086419753086419753
325 : 1 : 1
326 : 0 : 0
360 : 1/72 : 0.01388888888888888888888888889
361 : 1/361 : 0.002770083102493074792243767313
362 : 1/2 : 0.5
369 : 1/9 : 0.1111111111111111111111111111
370 : 1/2 : 0.5
449 : 1 : 1
450 : 1/18 : 0.05555555555555555555555555556
488 : 1/8 : 0.125
489 : 0 : 0
490 : 1/98 : 0.01020408163265306122448979592
520 : 1/8 : 0.125
521 : 1 : 1
522 : 1/18 : 0.05555555555555555555555555556
544 : 1/32 : 0.03125
548 : 1/4 : 0.25
549 : 1/9 : 0.1111111111111111111111111111
584 : 1/8 : 0.125
585 : 1/9 : 0.1111111111111111111111111111
586 : 1/2 : 0.5
592 : 1/16 : 0.0625
593 : 1 : 1
596 : 1/4 : 0.25
605 : 1/121 : 0.008264462809917355371900826446
610 : 1/2 : 0.5
611 : 0 : 0
612 : 1/36 : 0.02777777777777777777777777778
613 : 1 : 1
624 : 0 : 0
625 : 1 : 1
источник
Ответы:
JavaScript (Node.js) ,
144138125747370 байтПопробуйте онлайн!
-4 байт, спасибо @Arnauld!
Оригинальный подход, 125 байт
Попробуйте онлайн!
Вдохновленный видео Pi, скрывающимся в главных закономерностях от 3Blue1Brown.
Умножьте все эти значения функций, вот и мы.
Обновить
Благодаря усилиям участников Math.SE алгоритм теперь подкреплен доказательством
источник
Mathematica, 80 байт
Этот код в основном зависит от математической теоремы. Основная идея состоит в том, что код запрашивает плотность решетки для некоторого порождающего множества.
Точнее, нам дан некоторый набор векторов, а именно тех, чья длина квадрата равна N, и мы просим вычислить плотность множества возможных сумм этих векторов по сравнению со всеми целочисленными векторами. Математика в игре заключается в том, что мы всегда можем найти два вектора (и их противоположность), которые «генерируют» (то есть, чьи суммы) тот же набор, что и исходная коллекция. LatticeReduce делает именно это.
Если у вас есть только два вектора, вы можете представить, что рисуете идентичный параллелограмм с центром в каждой достижимой точке, но длина ребер которого является заданными векторами, так что плоскость полностью выложена этими параллелограммами. (Представьте, например, решетку «ромбовидной» формы для n = 2). Площадь каждого параллелограмма является детерминантом двух порождающих векторов. Требуемая пропорция плоскости является обратной величиной этой области, поскольку в каждом параллелограмме есть только одна достижимая точка.
Код представляет собой довольно простую реализацию: сгенерируйте векторы, используйте LatticeReduce, возьмите определитель, затем возьмите обратную величину. (Хотя, возможно, лучше играть в гольф)
источник
d@n_:=Boole[#!={}]/Det@LatticeReduce@#&@Select[Range[-n,n]~Tuples~2,#.#==n&]
Чистый ,
189185172171 байтПопробуйте онлайн!
Находит каждую позицию, достижимую в
n
квадрате длины стороны, повернутом в начало координат в первом квадранте, а затем делится на,n^2
чтобы получить доступную часть всех ячеек.Это работает потому что:
n
квадрата со стороны стороны, каждая из которых расположена в точке достижимости от начала координат, как если бы она была началом координат.++ +- -+ --
, позволяющими распространять перекрывающуюся плитку через три других сектора путем зеркального отражения и вращения.источник
Retina 0.8.2 ,
12682 байтаПопробуйте онлайн! Ссылка включает в себя тестовые случаи. Объяснение:
Преобразовать в одинарный.
Неоднократно делить на простые факторы формы
4k+1
.Если результат не квадрат или дважды квадрат, то результат равен нулю.
Вычислить обратное в виде десятичной дроби.
источник
Regex (ECMAScript, взаимный выход),
256163157948382 байта-93 байта благодаря Нейлу
-6 байтов еще раз благодаря Нейлу
-63 байта путем деления без захвата делителя
-11 байтов благодаря одновременному необязательному делению на константу и квадратному корню Грими
байта -1 -1 путем перемещения условия конечного совпадения и захват значения возврата в цикл в качестве второй альтернативы, благодаря Грими
Здесь используется та же математика, что и в ответе Сиеру Асакото на JavaScript .
Вход в одинарный. Поскольку чистое регулярное выражение может возвращать в качестве выходных данных только подстроку из входных данных (т. Е. Натуральное число, меньшее или равное входному значению), или "нет совпадения", это регулярное выражение возвращает обратную пропорцию платы, на которой N-движитель может достигать. Поскольку обратное значение 0 равно бесконечности, в этом случае возвращается «нет совпадения».
ПРЕДУПРЕЖДЕНИЕ О СПОЙЛЕРЕ : для квадратного корня это регулярное выражение использует вариант обобщенного алгоритма умножения, который неочевиден и может быть полезной головоломкой для самостоятельной разработки. Для получения дополнительной информации см. Объяснение этой формы алгоритма в « Найти число Рокко» .
^(?=((?=(x+)(?!(\2+)(\2\3)+$)((\2{4})+$))\5|((xx?)(\8*))(?=(\7*)\9+$)\7*$\10)+$)\1
Попробуйте онлайн!
Попробуйте онлайн! (только тестовые случаи)
Regex (ECMAScript + (? *), Обратный вывод),
207138132байтаУстранено делением без захвата делителя (то есть теперь идентично вышеописанному).
Regex (ECMAScript 2018, обратный вывод),
212140134байтаУстранено делением без захвата делителя (то есть теперь идентично вышеописанному).
Regex (ECMAScript, вывод дроби), 80 байтов
В этой версии числитель возвращается в
\10
(ноль, если unset / NPCG) и знаменатель в\7
.В отличие от обратной версии вывода:
Большим недостатком выходной спецификации, подобной этой, является то, что она не содержится в самой программе.
((?=(x+)(?!(\2+)(\2\3)+$)((\2{4})+$))\5)*((((x)x?)(\9*))(?=(\8*)\11+$)\8*$\12|x)
Попробуйте онлайн!
Попробуйте онлайн! (только тестовые случаи)
источник
(((xx?)(\9*))(?=(\8*)\10+$)\8*$\11)
для проверки, если N или N / 2 является квадратом.Желе ,
2524 байтаМонадическая ссылка, использующая основной факторный маршрут.
Попробуйте онлайн!
Как?
Предыдущие 25 были:
Полная программа brute forcer
; возможно,более длинный код,чем основной фактор (я мог бы попробовать это позже).Попробуйте онлайн!
Начинается с создания одиночных ходов в качестве координат затем неоднократно перемещается из всех достигнутых мест , аккумулирующих результатов, принимая по модулю
n
каждой координаты (ограничитьсяn
поn
квадранте) и сохранение тех , которые различны , пока фиксированная точка не будет достигнута; затем, наконец, делит счет наn^2
источник
05AB1E ,
272625 байтовПорт @ShieruAsakoto в ответ на JavaScript , так что не забудьте также поддержать его!
Попробуйте онлайн или проверьте все контрольные примеры .
Объяснение:
источник
APL (Dyalog Extended) , 21 байт
Эта программа использует основной фактор маршрута. Я в долгу перед Адамом, Дзаймой, Х.П. Визом, Ж. Салле и нгн. APL Orchard - отличное место для изучения APL, и они всегда готовы помочь
Попробуйте онлайн!
Ungolfing
Часть 2 этого кода такая же, как и в версии Dyalog Unicode ниже, и поэтому в этом объяснении я остановлюсь на
⍭*1≠4|⍭
APL (Dyalog Unicode) ,
41403635 байт SBCSЭта программа использует основной фактор маршрута. Изучив несколько трюков во время написания этой статьи, я глубоко признателен Адаму, Дзайме, Х.П. Визу, Ж. Салле и нгн. APL Orchard - отличное место для изучения APL, и они всегда готовы помочь (или этот пост никогда бы не сдвинулся с мертвой точки :)
Редактировать: -1 байт от ngn. -2 байта от Адама и еще 2 от нгн. -1 байт от ngn.
Попробуйте онлайн!
Ungolfing
Это программа из двух частей:
источник