У вас есть входной массив размером m * n. Каждая ячейка в массиве заполняется либо P, либо T. Единственная операция, которую вы можете выполнить над массивом, - это перевернуть столбцы. Когда вы переворачиваете столбец, буквы во всех ячейках этого столбца переключаются (P становится T и наоборот). Если у вас есть «х» количество строк с одинаковыми буквами (например, PPPP), то вы получите точку. Разработайте алгоритм, который принимает массив и возвращает решение (какие столбцы нужно перевернуть) так, чтобы результирующий массив имел максимально возможное количество точек.
Примечание. Если существует несколько решений с наибольшим количеством баллов, выберите вариант с наименьшим количеством сальто. Пример:
Входной массив:
PPTPP
PPTPP
PPTTP
PPPTT
PPPTT
Выход:
3
Объяснение:
Решение, которое дает наивысшие баллы: Flip column no. 3
Тогда исходный массив будет:
PPPPP // 1 point
PPPPP // 1 point
PPPTP
PPTTT
PPTTT
//Total: 2 points
Обратите внимание, что можно также перевернуть столбцы 4 и 5, чтобы получить оценку два, но это требует дополнительного переворота.
Вы можете использовать любой удобный формат ввода для представления двумерного массива, а также любые два различных, но фиксированных значения для представления P
и T
.
Это код гольф, поэтому самый короткий ответ (в байтах) выигрывает.
Ответы:
APL, 37
Пример:
Проверено здесь.
источник
Пиф , 28
Принимает ввод в виде вложенного списка, например
Дает вывод 0-indexed, например
^U2lhQ
: Генерирует все возможные списки 0 и 1 правильной длины._osZ
: Упорядочивает эти списки от 1 до 1.+/QN/Qm!dN
: Подсчитывает, сколько раз каждый вход (N
) и его обратные, 0 и 1 с заменены (m!dN
) встречаются на входе. Первое соответствует серии переворотов, оставляющих все нули, второе - всем.eo
: Упорядочивает список по указанному выше ключу и берет его последний элемент, который будет результатом с наиболее подходящими столбцами, и среди них - с наименьшим.f@ ... TUhQ
: Преобразует этот список из 1 и 0 в список индексов, которые необходимо перевернуть.Для 1-индексации измените на
d
ak
, затем поставьтеmhd
в начале.источник
CJam,
5351 байтЭто читает двумерный массив 0 и 1 из STDIN. Например, пример в вопросе будет
Проверьте это здесь.
Сначала он получает все возможные подмножества столбцов в порядке увеличения длины, затем выполняет перевороты для каждого подмножества и сортирует их по количеству строк, в которых по-прежнему есть как 0, так и 1. Наконец, мы просто возвращаем первое такое подмножество. Это зависит от стабильности сортировки, так что начальный порядок увеличения длины заботится о прерывателе связи.
источник
Хаскелл, 98
Формат ввода представляет собой список списка целых. Вы можете использовать строковую версию для тестирования:
о нет пробелов! это больно!
это работает путем итерации по строкам и вычисления количества точек, которые мы получим, если мы перевернем столбцы таким образом, чтобы эта строка получила нам точку.
Первое, на что нужно обратить внимание, это то, что переключение строки на все
True
или на всеFalse
не имеет значения, потому что сетки будут точно противоположны друг другу и, следовательно, будут иметь одинаковую оценку.способ, которым мы вычисляем количество, когда заданная строка получает точку, таков: мы снова итерируем по строкам и суммируем точки, которые дает каждая строка, используя тот факт, что они делают именно тогда, когда строки либо идентичны, либо точны обратные.
например, если строка, которую мы переворачиваем,
TPPTP
и текущая строка, по которой мы перебираем, равнаPTTPT
илиTPPTP
тогда строка получает нам точку, но когда это любая другая строка, она не получает нам никаких точек.источник
CJam, 37
Формат ввода:
источник
Mathematica - 76
источник
Python 2, 234
Вход представляет собой список списков:
Вывод представляет собой кортеж с использованием индексации Python от 0:
Если выходные данные должны быть проиндексированы с 1, то код состоит из 272 символов, причем 0 означает отсутствие переворотов:
источник