Вы молодой программист, живущий с двумя другими лучшими друзьями. Каждую неделю один из вас должен выполнять всю работу по дому, и вы решаете, чья это очередь, выбирая палку. Тот, кто выбирает самую короткую палку, проигрывает и выполняет всю работу по дому.
Поскольку вы все программисты и любите создавать головоломки, вы превратили «Выбери самую короткую палку» в компьютерную головоломку.
Вот правила головоломки.
- Вам будет предоставлена 2D-матрица, где каждый столбец представляет палку.
- В каждом столбце 1 представляет часть флешки, а 0 - пустое место
- При переходе сверху вниз в каждом столбце, изначально у вас есть
0
и, как только вы нажмете1
, палка запустилась, и остальная часть столбца будет заполнена1
только - Вы можете написать свою программу, чтобы выбрать один столбец. Размер палки в этом столбце определяет победителя / проигравшего. Размер флешки == количество единиц в этом столбце.
- Однако эта программа может иметь только линейную сложность времени наихудшего случая.
Поскольку вы все программисты, вы будете знать, снимает ли чужая программа ограничение по времени.
Ваша работа заключается в:
- Напишите программу или функцию, которая принимает входные данные в формате 2D или в виде массива строк.
- Ввод может быть взят из STDIN / prompt / console или аргумента функции.
- Если вы читаете входные данные из STDIN / приглашения, вы можете предположить, что чтение входных данных и преобразование их в массив занимает 0 раз (хотя код для этого должен присутствовать в вашем ответе)
- Определите колонку с самой длинной палкой в ней.
- Выход может быть возвращаемым значением функции или STDOUT / console / alert.
- Программа / функция должна иметь линейную сложность времени наихудшего случая,
O(m+n)
гдеm
есть количество строк иn
количество столбцов.
Ввод может быть одним из следующих форматов:
2D массив:
[ [0, 0, 0, 0],
[1, 0, 0, 0],
[1, 1, 0, 1],
[1, 1, 1, 1] ]
Массив строк:
[ "0000", "1000", "1101", "1111" ]
Вход будет иметь следующие свойства:
- Размер массива неизвестен, допустим прямоугольник любого размера
- В любом столбце, идущем сверху вниз, если вы видите 1, то все ниже будет одним
- Пустые-столбцы (т.е. 0-длина) палочки имеют допускается.
Это код-гольф, поэтому выигрывает самый короткий код ! *
Пожалуйста, объясните свой код или дайте неоправданную версию (чтобы проверить сложность времени) вместе с тем, какой из двух форматов ввода вы ожидаете.
ОБНОВЛЕНИЕ Под линейной временной сложностью здесь понимается O (n + m), где n - размер столбца, а m - размер строки. (Для тех, кому было непонятно)
ОБНОВЛЕНИЕ 2 Это определенно может быть сделано за линейное время. И если вы публикуете ответ, не стесняйтесь отложить публикацию логики / алгоритма на пару дней для честной борьбы :)
ОБНОВЛЕНИЕ 3 Я рассмотрю все ответы через пару часов, чтобы проверить сложность времени и программу :)
источник
1
входной информацией является самая последняя ячейка, тогда необходимо прочитать весь ввод. Даже если стандартная библиотека языка подделывает произвольный доступ к стандартному вводу данных, под сценой он буферизует его, и поэтому требуется время Омега (n * m).Ответы:
GolfScript, 45 символов
Принимает входные данные в виде массива строк, возвращает (на основе 0) индекс самого высокого столбца. Он выполняется за O ( строки + столбцы ), и каждая итерация должна занимать по существу постоянное время (по крайней мере, предполагая арифметику с постоянным временем). Единственные операции с массивом / строкой, выполняемые в цикле, - это поиск элементов (
=
) и получение длины строки (,
), которые в GolfScript требуют постоянного времени.Попробуйте онлайн.
Объяснение:
Как и большинство решений здесь, этот код работает, начиная с левого нижнего угла матрицы, перемещаясь вверх или вправо в зависимости от того, равен ли текущий элемент матрицы 1 или 0, и отслеживая столбец, в котором он последний раз перемещался вверх ,
В начале программы я назначаю входной массив переменной
^
, его длина (то есть количество строк)y
и 0x
. Значение 0 также остается в стеке; во время следующего цикла он будет заменен индексом самого высокого столбца.Внутри основного цикла
^y(=x=
извлекаетx
-й символ изy-1
-ой строки в^
. Это на самом деле возвращает ASCII-код символа, поэтому2%
необходимо удалить все, кроме последнего бита. В особом случае, еслиy
равно 0 (что может произойти, если самый высокий столбец, найденный до сих пор, достигает самого верхнего ряда), искомый бит будет фактически поступать из последней строки в матрице (индекс -1), но следующееy*
заставляет его обнулять, тем самым эффективно создавая виртуальную строку из всех нулей в верхней части матрицы.Далее
if
будет выполняться один из двух кодовых блоков, предшествующих ему, в зависимости от того, является ли искомый бит ненулевым (true) или нулевым (false). Если не ноль,y
уменьшается на единицу, и текущее значениеx
заменяет самый высокий индекс столбца в стеке (со старым значением, временно оставленным поверх него). Если ноль,x
просто увеличивается на единицу (и временно остается в стеке, поверх индекса самого высокого столбца).Наконец,
^0=
извлекает первую строку матрицы,,
возвращает ее длину и<
сравнивает ее с индексом столбца, временно оставленным в стеке (который будет равен,x
если он был просто увеличен). Если индекс меньше длины строки, цикл повторы.Ps. Основываясь на моем тестировании, должна быть возможность сократить эту программу на один символ, заменив тест длины строки
,<
в конце цикла на>
, который обрезает строку по заданному индексу и возвращает конечную часть (которая будет пустой, и таким образом, ложно, в конце цикла). Однако, хотя обрезка строки, подобной этой, кажется реализованной как операция постоянного времени в GolfScript (или, точнее, в Ruby, над которым работает GolfScript), я не нашел никакой официальной документации, подтверждающей это. Просто чтобы быть в безопасности, я выбрал немного более длинную, но определенно O (1), версию выше.источник
Рубин,
8375686663 байтаОпределяет функцию,
f
которая принимает форму 2D-массива в качестве входных данных.источник
Python 2 -
71, 69, 73, 7581источник
i
выйдет ли за пределы, если палка займет целую колонку?j
отсчета от0
прерывания условия циклаi*j
.C, 64 байта
Редактировать: я узнал, что вопрос требует расположения самого длинного столбца, а не его длины.
Первая строка - это код для игры в гольф, а остальная часть - это образец вызова.
источник
int
случайно заглушить s в сигнатуре функции или это не работает из-за указателей там?C #: 236 символов
ungolfed:
источник
PHP 5,4 - 108 байт
(113, если вы включите
<?php
)Формат ввода: массив будет читаться как строка JSON.
Добавлены пробелы для удобства чтения - все символы новой строки и начальные пробелы могут быть удалены.
Минимизированная версия:
В некотором смысле здесь можно украсть алгоритм у Мартина, но приятно поиграться с языками, которые не так часто встречаются здесь. XD
источник
$s=json_decode($argv[1]);$t=count($s)-1;
на$t=count($s=json_decode($argv[1]))-1;
(-3 байта).$t--
должен произойти, только если условие выполнено.Кобра - 98
источник
C ++ :: 78
В отличие от другого решения C, это целая программа. (не требуется вызова, нет необходимости сообщать функции размер массива). К сожалению, это означает, что оно длиннее, чем
main
должно быть использовано вместо имени односимвольной функции, я должен интерпретировать ввод и затем вывести ответ, где другое решение обрабатывает это «в другом месте». Также мой первый код гольф.скомпилировано
g++ file.cpp -include iostream
, работает с./a 000 010 110 111
(например) == массивом строк (я полагаю, что это разрешено в спецификации вопроса)Приведенная выше версия выводит текущее значение, наилучшее найденное на каждой итерации Окончательная выходная цифра - это ответ. Переход от обработки снизу слева вместо нижнего правого и
0
индексация сократили это решение на 10 (!) Символов.переключение на c ++ прекращает отправку еще на один символ, так как
std::cout<<
оно короче,putchar(-48)
и оно также должно явно поддерживать более 9 стиков с правильным выводом (хотя это может затруднить дифференцирование каждого вывода).Удаление поля ответа и его вывод напрямую сокращают еще 6 символов. Теперь он выводит ток наилучшим образом только тогда, когда он движется вверх, что, по крайней мере, отключает какой-либо выход.
Весь файл теперь имеет размер всего 78 байт, что приближает решение к функции только по сравнению с другим
C
представление использует. (с большим количеством дополнительного кода для поддержки указанной функции).Как показано ниже, описание устарело:
Могу ли я даже играть в гольф дальше?
Неуправляемый код (с дополнительным выводом):
источник
OCaml - 144 символа
Принимает в
int array array
качестве входных данных и начинает снизу слева, двигаясь вверх или вправо, если видит a1
или a0
. Количество столбцов начинается с0
.использование
Ungolfed
источник
T-SQL -
7164Принимает таблицу A в качестве входных данных
И запрос
SQLFiddle
Это возвращает первую строку из таблицы a, упорядоченную по r, где есть 1 в строке a.
TOP(1)
ограничивает результат первой возвращенной строкой.CHARINDEX('1',A)
возвращает позицию первой 1 в строке или ноль, если она не найдена.WHERE A LIKE'%1%'
фильтрует строки, где A содержит 1ORDER BY R
обеспечивает чтение таблицы сверху внизисточник
Delphi 122 символа
Вздох ... это такой объемный язык.
Обновление: пришлось добавить 6 символов в функцию изменения типа возврата от I до целого числа. Функция все еще скомпилирована, поскольку у тестовой программы было «type I = integer;» заявление осталось от более ранней версии программы.
источник
"0000", "0010", "1111"
во-вторых, ваш ответ не соответствует требованию линейной сложности временисхема - 236 символов
Даже дольше, чем версия Delphi ... возможно, есть способ сделать это гораздо более эффективно с помощью схемы. И что еще хуже - я просто заметил, что это порядок m * n.
l является списком вида '((0 0 0 0) (1 0 0 0) (1 1 0 1) (1 1 1 1)). Я думаю, что это правильное представление входных данных двумерного массива для схемы.
(sl) суммирует n-тые элементы каждого из подсписков списка списков числителей, поэтому (s '((0 0 0 0) (1 0 0 0) (1 1 0 1) (1 1) 1 1))) вернется (3 2 1 2).
(ul) возвращает «индекс» самой большой записи в списке чисел (используя вспомогательную функцию t), поэтому (u '(3 2 1 2)) вернет 1 (как самый большой элемент «3 в списке») (3 2 1 2) находится в положении 1).
источник
Ракетка 70
Golfed:
Предполагается, что input - это двумерный массив, который в Racket будет списком списков:
Ungolfed:
Возвращает индекс столбца с самой длинной палкой.
источник
1
?1
в матрице или только в нижней строке).JavaScript, ES6, 76 символов
Принимает массив ввода массива.
источник
JavaScript ES6, 65 байт
Принимает оба формата ввода
Разъяснение:
Итерирует снизу вверх. Использует
String.prototype.indexOf()
илиArray.prototype.indexOf()
зависит от ввода каждого значения. Находит первый индекс каждой строки с 1 из предыдущего смещения, если он не находит ни одного, то устанавливаетt
переменную на последнее смещение и больше не выполняетindexOf
вызовов.источник
indexOf
работает в любомO(log n)
илиO(n)
, так что общий алгоритм никогда не будетO(m + n)
O(m+n)