Шестнадцать груд сыра кладут на квадрат 4х4. Они помечены от до . Наименьшая куча равна а самая большая - .
Голодная мышь настолько голодна, что всегда идет прямо к самой большой куче (то есть ) и ест ее сразу же.
После этого он идет к самой большой соседней куче и быстро ее тоже съедает. (Да ... Это действительно голодно.) И так до тех пор, пока больше нет соседней кучи.
Куча может иметь до 8 соседей (по горизонтали, вертикали и диагонали). Там нет обернуть.
пример
Начнем со следующих грудок сыра:
Голодная мышь сначала съедает , а затем свою самую большую соседнюю кучу, которая составляет .
Его следующие ходы - , , , , , , , , и в этом точном порядке.
Вокруг голодной мыши больше нет сыра, поэтому он останавливается там.
Соревнование
Учитывая исходную конфигурацию сыра, ваш код должен напечатать или вернуть сумму оставшихся куч, как только голодная мышь перестанет их есть.
Для приведенного выше примера ожидаемый ответ .
правила
- Поскольку размер входной матрицы фиксирован, вы можете принять его как двумерный массив или одномерный массив.
- Каждое значение от до гарантированно появится ровно один раз.
- Это код-гольф .
Контрольные примеры
[ [ 4, 3, 2, 1], [ 5, 6, 7, 8], [12, 11, 10, 9], [13, 14, 15, 16] ] --> 0
[ [ 8, 1, 9, 14], [11, 6, 5, 16], [13, 15, 2, 7], [10, 3, 12, 4] ] --> 0
[ [ 1, 2, 3, 4], [ 5, 6, 7, 8], [ 9, 10, 11, 12], [13, 14, 15, 16] ] --> 1
[ [10, 15, 14, 11], [ 9, 3, 1, 7], [13, 5, 12, 6], [ 2, 8, 4, 16] ] --> 3
[ [ 3, 7, 10, 5], [ 6, 8, 12, 13], [15, 9, 11, 4], [14, 1, 16, 2] ] --> 12
[ [ 8, 9, 3, 6], [13, 11, 7, 15], [12, 10, 16, 2], [ 4, 14, 1, 5] ] --> 34
[ [ 8, 11, 12, 9], [14, 5, 10, 16], [ 7, 3, 1, 6], [13, 4, 2, 15] ] --> 51
[ [13, 14, 1, 2], [16, 15, 3, 4], [ 5, 6, 7, 8], [ 9, 10, 11, 12] ] --> 78
[ [ 9, 10, 11, 12], [ 1, 2, 4, 13], [ 7, 8, 5, 14], [ 3, 16, 6, 15] ] --> 102
[ [ 9, 10, 11, 12], [ 1, 2, 7, 13], [ 6, 16, 4, 14], [ 3, 8, 5, 15] ] --> 103
[[9, 10, 11, 12], [1, 2, 7, 13], [6, 16, 4, 14], [3, 8, 5, 15]]
Ответы:
Python 2 ,
133130 байтПопробуйте онлайн!
Принимает уплощенный список из 16 элементов.
Как это устроено
источник
a[i+x]for x in[-6,-5,-4,-1,1,4,5,6]
может быть сокращено доa[i+j+j/3*2-6]for j in range(9)
(нулевая запись безвредна). Python 3, безусловно, может сделать короче, жестко закодировав строку длиной 8, но Python 2 может быть лучше в целом.a=[0]*5
for r in input():a=r+[0]+a
. Возможно, есть еще более короткое решение для нарезки строк, которое не требует итерации.Python 2 , 111 байт
Попробуйте онлайн!
Метод и контрольные примеры адаптированы из Bubbler . Принимает плоский список на STDIN.
Код проверяет, являются ли два плоских индекса
i
иj
представляют собой соприкасающиеся ячейки, проверяя, что как строки, так и различияi/4-j/4
столбцовi%4-j%4
строго между -2 и 2. При первом проходе эта проверка автоматически завершается успешно, так что самая большая запись обнаруживается без учета смежности.источник
MATL ,
504947 байтВвод представляет собой матрицу, используя в
;
качестве разделителя строк.Попробуйте онлайн! Или проверьте все тестовые случаи .
объяснение
источник
PHP,
177 174171 байтЗапустите с
-nr
, предоставьте матричные элементы в качестве аргументов или попробуйте онлайн .источник
JavaScript, 122 байта
Я сделал несколько неправильных поворотов на этом и теперь у меня не хватает времени для дальнейшего игры в гольф, но, по крайней мере, это работает. Вернусь завтра (или, зная меня, в поезд домой домой сегодня вечером!), Если я найду минуту.
Попробуйте онлайн
источник
flatMap()
: рR ,
128124123112110 байтПопробуйте онлайн!
Он создает матрицу 4x4 (которая помогла мне визуализировать вещи), дополняет ее нулями, затем начинает с 16 и ищет в ближайших «кучах» следующий по величине и т. Д.
В заключение выводится предупреждение, но оно не имеет значения и не меняет результат.
РЕДАКТИРОВАТЬ: -4 байта, сжимая инициализацию матрицы в 1 строку.
РЕДАКТИРОВАТЬ: -1 благодаря Роберту Хакену
РЕДАКТИРОВАТЬ: -13 байт, объединяющих предложения Джузеппе и Робина Райдера.
источник
r==16
для заменыr>15
.which
.m
как логическое, а не целое число, и, следовательно, нужно вызыватьwhich
только один раз вместо двух.X%o%Y
это псевдоним дляouter(X,Y,'*')
.outer
это одна из самых удобных функций, так как она может функционировать как «широковещательная» функция Octave / MATLAB / MATL с aribtrary (векторизованными) операторами. Смотрите здесь ; также в редких случаях удобно то,kronecker
что связано на этой странице.Древесный уголь , 47 байт
Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:
Преобразуйте введенные числа в буквенные символы (A = 0 .. Q = 16) и напечатайте их в виде сетки 4x4.
Начните с еды Q, то есть 16.
Повторите, пока есть что поесть.
Найдите, где находится куча. Это линейный вид в главном порядке строк.
Преобразовать в координаты и перейти к этому месту.
Найдите самую большую соседнюю кучу.
Съешь текущую кучу.
Преобразуйте груды в целые числа и возьмите сумму.
Очистите холст и выведите результат.
источник
Powershell,
143141136130122121 байтМенее гольф тестовый скрипт:
Выход:
Объяснение:
Сначала добавьте верхнюю и нижнюю границы 0 и создайте одномерный массив:
Powershell возвращается,
$null
если вы попытаетесь получить значение за концом массива.Во-вторых , цикл
biggest neighbor pile
начался с 16 до ненулевого максимума. И аннулируйте это (Голодная Мышь ест это).В-третьих , сумма оставшихся куч.
источник
SAS,
236219 байтВвод на перфокартах, одна строка на сетку (через пробел), вывод в журнал.
Эта проблема немного усложняется некоторыми ограничениями массивов в SAS:
Обновления:
infile cards;
утверждение (-13)a:
для определения массива, а неa1-a16
(-4)Golfed:
Ungolfed:
источник
Haskell , 163 байта
Попробуйте онлайн!
f
Функция принимает входные данные в виде списка из 4 списков 4 целых чисел.Слегка разгульный
источник
JavaScript (ES7), 97 байт
Принимает ввод как плоский массив.
Попробуйте онлайн!
комментарии
источник
APL (Dyalog Unicode) ,
4241 байт SBCSПопробуйте онлайн!
источник
Java 10,
272248 байтКлетки проверяются так же , как в моем ответе за все одиночные восьмерки вызова .
-24 байта благодаря @ OlivierGrégoire .
Попробуйте онлайн.
Объяснение:
источник
int r,c,R=4,M=1,x,y,X,Y;for(r=c=X=Y=0;
, так что спасибо. :)J, 82 байта
Попробуйте онлайн!
Я планирую гольф это более завтра, и , возможно , написать больше J-иш решение , подобное этому одному , но я решил попробовать сплющенный подход , так как я не сделал этого раньше.
источник
]
вg
?Красный , 277 байт
Попробуйте онлайн!
Это действительно длинное решение, и я не доволен им, но я потратил так много времени на то, чтобы установить его на работу в TIO (очевидно, между Win и Linux стабильными версиями Red много различий), поэтому я все равно выкладываю его ...
Более читабельно:
источник
Желе ,
31 3029 байтТак как метод слишком медленный, чтобы запускаться в течение 60-х годов с включенной мышью,
16
это9
приводит к тому, что она начинает работать и ограничивает свои возможности, так что она может есть только9
меньше или меньше. Попробуйте онлайн! (при этом здесь она ест9, 2, 7, 4, 8, 6, 3
уходя97
).Как?
источник
Не моя лучшая работа. Есть некоторые определенные улучшения, которые, вероятно, будут фундаментальными для используемого алгоритма - я уверен, что его можно улучшить, используя только an
int[]
, но я не мог понять, как эффективно перечислить соседей таким образом. Мне бы очень хотелось увидеть решение PowerShell, которое использует только одномерный массив!PowerShell Core , 348 байт
Попробуйте онлайн!
Более читаемая версия:
источник
(array|sort)[-1]
вместо того, чтобыMeasure -max
работать в PSv5, но получала неверные результаты в ядре. Понятия не имею почему.(0..10|sort)[-1]
но он возвращает 10 на PSv5 и 9 на PS Core. Это потому, что он рассматривает это в лексикографическом порядке вместо числового. Позор, это.C (gcc), 250 байт
Попробуйте онлайн!
Примечание. Это представление изменяет входной массив.
s()
это функция, вызываемая с аргументом изменяемой переменнойint[16]
(которая является той же самой в памяти, что и переменнаяint[4][4]
, котораяg()
интерпретирует ее как).s()
находит местоположение16
в массиве, затем передает эту информациюg
, которая является рекурсивной функцией, которая принимает местоположение, устанавливает число в этом месте равным 0, а затем:Если рядом с ним есть положительное число, выполните рекурсию с расположением наибольшего соседнего числа
Иначе, верните сумму чисел в массиве.
источник
s(int*a){for(i=0;a[i]<16;++i);return g(a,i%4,i/4);}
Wolfram Language (Mathematica) , 149 байтов
Попробуйте онлайн!
источник
Добавить ++ , 281 байт
Попробуйте онлайн!
Ох, это сложный.
Проверьте все контрольные примеры
Как это устроено
Для этого объяснения мы будем использовать вход
Это реализует две вспомогательные функции:
Наконец, выведите t , то есть оставшиеся, не собранные значения.
источник
C # (.NET Core) , 258 байт
Без LINQ. Использование System.Collections.Generic предназначено для форматирования после - функция не требует этого.
Попробуйте онлайн!
источник
Perl 6 ,
151136126125119 байтСупер потертый раствор. Принимает ввод как плоский массив.
Попробуйте онлайн!
источник
Perl 5
-MList::Util=sum -p
, 137 байтПопробуйте онлайн!
источник
K (нгн / к) , 49 байтов
Попробуйте онлайн!
input (
x
) является массивом 1d(+!4 4)!x
словарь, который отображает пары координат в значенияx
h::
присваивать глобальной переменнойh
*>
ключ, соответствующий максимальному значению{
}\
повторять до схождения, собирая промежуточные значения в спискеh[,x]:0
обнулять текущую позицию+x+0,'1-!3 3
соседние позиции(
)#h
отфильтровать их изh
словаря меньшего размера*>
какой сосед имеет максимальное значение? становится текущей позицией для новой итерации+/h
наконец, вернуть суммуh
оставшихся значенийисточник
Wolfram Language (Mathematica) ,
124115 байтовПопробуйте онлайн!
Это берет 2D-массив, дополняет его с каждой стороны, а затем немедленно выравнивает, чтобы нам не пришлось тратить байты на индексацию. Единственная цена для этого,
Join@@
чтобы сгладить. После этого это продолжается, как показано ниже.124-байтовая версия для 2D-массива: попробуйте онлайн!
Главным образом моя собственная работа, немного полученная из 149-байтового ответа J42161217 .
Ungolfed:
источник