Введение
Все знают игру в крестики-нолики, но в этой задаче мы собираемся внести небольшой поворот. Мы будем использовать только крестики . Первый человек, который ставит три креста подряд, проигрывает. Интересным фактом является то, что максимальное количество крестов, прежде чем кто-то проиграет, равно 6 :
X X -
X - X
- X X
Это означает, что для доски 3 x 3 максимальная сумма равна 6 . Поэтому для N = 3 нам нужно вывести 6.
Другой пример, для N = 4 или для доски 4 x 4:
X X - X
X X - X
- - - -
X X - X
Это оптимальное решение, вы можете видеть, что максимальное количество крестов равно 9 . Оптимальное решение для доски 12 x 12:
X - X - X - X X - X X -
X X - X X - - - X X - X
- X - X - X X - - - X X
X - - - X X - X X - X -
- X X - - - X - - - - X
X X - X X - X - X X - -
- - X X - X - X X - X X
X - - - - X - - - X X -
- X - X X - X X - - - X
X X - - - X X - X - X -
X - X X - - - X X - X X
- X X - X X - X - X - X
Это приводит к 74 .
Задание
Задача проста, учитывая целое число больше 0, вывести максимальное количество крестов, которые могут быть размещены без трех X рядом в строке вдоль строки, столбца или по диагонали.
Контрольные примеры
N Output
1 1
2 4
3 6
4 9
5 16
6 20
7 26
8 36
9 42
Более подробную информацию можно найти по адресу https://oeis.org/A181018 .
правила
- Это код-гольф , поэтому выигрывает представление с наименьшим количеством байтов!
- Вы можете предоставить функцию или программу.
Ответы:
Pyth,
575149 байтКак и решение CJam @ PeterTaylor, это грубая сила, поэтому оно выполняется за O (n 2 2 n 2 ) времени. Онлайн переводчик не заканчивает работу в течение минуты при n = 4.
Попробуйте здесь для N <4.
Попробуйте функцию диагоналей .
источник
CJam (
5856 байт)Это невероятно медленно и использует много памяти, но это код-гольф для вас.
рассечение
источник
O(n a^n)
гдеa ~= 5.518
.C,
460456410407362351318 байтЭто действительно плохой ответ. Это невероятно медленный подход грубой силы.
Я пытаюсь играть в гольф немного больше, комбинируяfor
петли.Тестовые случаи
Ungolfed
Редактировать: объявить переменные типа int как неиспользуемые параметры; удалить координату y, просто используйте индекс; Переместить переменную в список параметров, а не в глобальный, исправить ненужные параметры, передаваемые
s()
; объединить для циклов, убрать лишние скобки; заменить&&
на*
,||
с+
; macro-ify проверка 3-в-рядуисточник
#define d(x,y)b[x]*b[x+y]*b[x+y+y]
; путем изменения начала ,s
чтобыs(i,m){for(m=n-2;
и заменить все экземплярыn-2
; а также путем измененияb[x]++
к ,b[x++]++
а затем заменитьx==n*n-1
сx==n*n
,x+1
сx
, иx
вx-1
.С 263
264 283 309Редактировать Несколько байтов, спасенных Тхэс @ Питер Тейлор - меньше, чем я надеялся. Тогда 2 байта использовались, чтобы выделить немного больше памяти, теперь я могу попробовать больший размер, но это становится очень трудоемким.
Примечание При добавлении объяснения я обнаружил, что я трачу байты, сохраняя сетку в массиве R, чтобы вы могли увидеть найденное решение ... оно не запрашивается для этой задачи !!
Я удалил это в версии для гольфа
Гольф-программа на C, которая может найти ответ для n = 1..10 за разумное время.
Мой тест:
Меньше в гольфе и пытаюсь объяснить
источник
buildRows
метод; может быть целых 20, еслиfor(scanf("%d",&n);(v=2*V[i++])<1<<n;v%8<6&&V[++j]=v+1)v&&V[++j]=v;
это действительно. (У меня нет доступа к компилятору C сейчас).999
означает, что вы хотели бы игнорировать эту часть. Хотя, возможно, вам действительно стоит сделать это не жестко, так что в принципе вы можете работать с большими входами, чем 11 или 12.Рубин, 263 байта
Это также грубое решение проблемы, и оно сталкивается с теми же проблемами, что и ответ С Коул Кэмерон, но еще медленнее, поскольку это рубин, а не C. Но, эй, он короче.
Контрольные примеры
Ungolfed
источник
Haskell, 143 байта
В некотором смысле это не сделано, но мне было весело, так что здесь идет:
Вот код:
источник