Задание
Эта задача очень проста. Ваш ввод представляет собой прямоугольный двумерный массив целых чисел размером не менее 1 × 1. Это может быть принято в любом разумном формате. Ваш вывод должен быть входным массивом, но со всеми записями не в первой или последней строке или столбце установлено значение 0
. Он должен быть в том же формате, что и входные данные.
Например, если входной массив
67 4 -8 5 13
9 13 42 4 -7
1 1 3 -9 29
16 99 8 77 0
тогда правильный вывод
67 4 -8 5 13
9 0 0 0 -7
1 0 0 0 29
16 99 8 77 0
Правила и оценки
Вы можете написать полную программу или функцию, и функции могут изменять ввод вместо того, чтобы возвращать его. Побеждает меньшее количество байтов, и стандартные лазейки запрещены.
Контрольные примеры
Они отформатированы как вложенные списки для облегчения вставки копий.
[[3]] -> [[3]]
[[7,2,8]] -> [[7,2,8]]
[[3],[5],[12],[-6]] -> [[3],[5],[12],[-6]]
[[99,98,97],[88,87,86]] -> [[99,98,97],[88,87,86]]
[[6,7],[8,9],[10,11]] -> [[6,7],[8,9],[10,11]]
[[-1,-2,-3],[1,2,3],[5,5,5]] -> [[-1,-2,-3],[1,0,3],[5,5,5]]
[[67,4,-8,5,13],[9,13,42,4,-7],[1,1,3,-9,29],[16,99,8,77,0]] -> [[67,4,-8,5,13],[9,0,0,0,-7],[1,0,0,0,29],[16,99,8,77,0]]
[[0,1,0,1,0],[1,0,1,0,1],[0,1,0,1,0],[1,0,1,0,1],[0,1,0,1,0]] -> [[0,1,0,1,0],[1,0,0,0,1],[0,0,0,0,0],[1,0,0,0,1],[0,1,0,1,0]]
Leaderboard
Вот фрагмент стека, который генерирует как регулярную таблицу лидеров, так и обзор победителей по языкам. Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:
## Language Name, N bytes
Если вы хотите включить несколько чисел (например, потому что вы улучшили свой счет или вы хотите перечислить флаги переводчика отдельно), убедитесь, что фактический результат является последним числом в заголовке:
## Perl, <s>50</s> 43 + 2 (-p flag) = 45 bytes
Вы также можете сделать название языка ссылкой, которая затем будет отображаться во фрагменте списка лидеров:
## [><>](http://esolangs.org/wiki/Fish), 121 bytes
var QUESTION_ID=71591,OVERRIDE_USER=32014;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
Java 7, как полностью названная функция: 85
Вы можете использовать лямбду в Java 8, чтобы удалить несколько байтов, но на самом деле я этого не делаю.
источник
Arrays.fill(a[i],1,a[i].length-1,0);
? Это всего 36 байтов вместо 37. =)for(int i=0,j;++i<a.length-1;)for(j=0;++j<a[i].length-1;)a[i][j]=0;
? Он не сохраняет байты, но более согласуется с тем, что оба цикла одинаковы. :)Желе,
1817159 байтПопробуйте онлайн! или проверьте все контрольные примеры .
Задний план
Этот подход основан на ответе Jelly @ Sp3000 , в частности, на его идее использовать векторизованные операции между списками разной длины.
Мы начинаем с получения побитового И 0 и каждого целого числа в первой строке ввода. Из-за автоматической векторизации это может быть достигнуто путем взятия побитового И из [0] и ввода без последней строки. 0 соединяется с первым рядом, что приводит к ряду нулей. Поскольку оставшиеся строки не имеют аналога в [0] , они остаются нетронутыми.
Теперь мы транспонируем результат, применяем вышеупомянутое преобразование еще раз (эффективно удаляя последний столбец и обнуляя первый), и транспонируем снова.
Для ввода
это приводит к
Теперь мы берем побитовый XOR этого результата и исходную матрицу. XOR целое число с собой дает 0 . XOR целое число с 0 (или не XORing его вообще) дает то же самое целое число. Это опустошает матрицу.
Как это работает
источник
Mathematica, 27 байт
источник
-2
s обозначает второй второй или последний столбец или строку.R ,
3348 байтовЯ знаю, что R не создан для игры в гольф. Но это сделано для позиционной индексации ... Загрузка примера;
Замените значение в любой позиции, кроме краевой строки или столбца, на 0:
Также проверяется тест с двумя столбцами:
Потомство: предыдущая попытка
Тестирование всех примеров:
источник
a
существует. Чтобы соответствовать нашим правилам, вы можете сделать это функцией, которая принимает матрицу, например,function(a){a[-c(1,nrow(a)),-c(1,ncol(a))]=0;a}
для 47 байтов.Mathematica
8176 байтКак это работает
Предположим, что входной массив хранится в
m
. Размерыm
{4,5} `Каждая ячейка в следующем массиве
a
имеет значение True, если ячейка находится либо в первом, либо (||
) в последнем ряду, либо в первом или последнем столбце; иначе это Ложь.Применение функции
Boole
к массиву преобразует True в 1 и False в 0.Умножьте матрицу
m
наb
. Это умножает каждую ячейку в m на соответствующую ячейку в b.источник
||
качестве ИЛИ, чтобы сохранить пару байтов, и я вижу несколько других байтов, которые вы можете сохранить!GNU Sed, 31
Версия 4.2.2 или более ранняя, до этого коммита (обсуждение) .
Оценка включает +1 для
-r
варианта.Входные строки разделены новой строкой. Элементы в каждой строке разделены одной строкой.
объяснение
Попробуйте онлайн.
источник
1n;$n;:;s/ -?\w+ / : /;t;y/:/0/
.Октава, 34 байта
Обратите внимание, что для ввода требуется точка с запятой для разделения строк массива:
Объяснение:
Индексы массива Octave (и MATLAB) основаны на 1. Задание диапазона
Array(1:end)
даст вам все элементы массива (в данном примере одномерного).Array(2:end-1)
даст вам все элементы, кроме первого и последнего.устанавливает для
0
всех элементов не в первой или последней строке или столбце:Если один из размеров меньше или равно 2, диапазон
end-1
составляет меньше , чем 2, поэтому конец диапазона(2:end-1)
меньше , чем в начале. В этом случае Octave игнорирует диапазон и ничего не делает. Это аналогичноfor
циклу:Условие остановки выполняется на первой итерации, поэтому мы выпадаем из цикла.
источник
Желе , 12 байт
Я думаю, что это работает, все еще обнимая мою голову Желе. Попробуйте онлайн!
(Спасибо @Dennis за -2 байта)
Работает путем умножения входного массива на массивы, равные 1 с и 0, которые на одно измерение меньше. Например, для
[[67,4,-8,5,13],[9,13,42,4,-7],[1,1,3,-9,29],[16,99,8,77,0]]
мы умножаем поэлементно наПолное объяснение
источник
ES6,
524846 байтРедактировать: 4 байта сохранены благодаря @ user81655. Сохранено еще 2 байта благодаря @ETHproductions.
источник
g
которого экономится несколько байтов:f=a=>a.map((b,i)=>i&&a[i+1]!=a.x?b.map?f(b):0:b)
f=
), но вы можете уменьшить их до 46:f=a=>a.map((b,i)=>i&&a[i+1]+.5?b.map?f(b):0:b)
f=
. Также я немного удивлен+.5
работой, но я вижу, что она добавляет строку в другом вызове.Javascript,
625956 байтЭтот подход предполагает строку в качестве аргумента. Вы можете увидеть, что делает регулярное выражение здесь: https://regex101.com/r/kC6xA8/3
источник
Mathematica, 55 байт
Прецедент
объяснение
Основная идея этого ответа такая же, как и в ответе DavidC (сначала создайте матрицу маски, а затем умножьте ее на исходную матрицу), но конструкция матрицы маски отличается.
ArrayFilter[f,list,r]
картыf
на каждый элементlist
в радиусеr
.Обратите внимание, что граничные элементы дублируются там, где недостаточно соседей. При
list
двухмерном измерении эта функция хорошо работает вместе с тем,Det
чтобы дать желаемый результат, поскольку дублированные столбцы или строки на четырех границах исчезают из определителей.где
Power~Array~{4,4}
гарантирует, что определители на внутренних позициях не равны нулю. А такжедает матрицу маски.
источник
Python, 50 байт
Принимает список списков и изменяет его на месте. Синтаксис среза Python не является неудобным для этой задачи.
Я узнал, что умножение списка на отрицательное число приводит к пустому списку, который позволяет приведенному выше коду работать с небольшими входами.
источник
Юлия,
5035 байтЭто анонимная функция, которая принимает массив и модифицирует его на месте. Чтобы вызвать его, присвойте его переменной.
Подход здесь довольно прост: для входного массива A размером n на m мы назначаем A ij = 0 для всех i = 2, ..., n -1 и j = 2, ..., m -1 путем построения диапазонов индексов. Диапазоны могут быть пустыми, например, если n или m = 1, в этом случае замена не производится.
Попробуйте онлайн
Благодаря Денису сэкономлено 15 байт!
источник
C, 62 байта
Надеюсь, что в качестве параметров можно использовать длину / ширину массива. Я немного поиграл с memset / bzero, но умножение на
sizeof(int)
резко увеличило размер кода.РЕДАКТИРОВАТЬ: 55 байт, если мы можем еще больше согнуть правила и сохранить наш массив в виде символов, поскольку каждый ввод состоит из одной цифры.
РЕДАКТИРОВАТЬ: Спасибо Вашингтон Guedes за совет!
источник
sizeof(int)
? Вы могли бы использовать4
вместо этого ...sizeof(int) != 4
на моей машине: P-->
оператор aloof ;)Perl 6 , 28 байт
Это изменяет ввод на месте
использование
источник
{.[1..*-2]»[1..*-2]X=0}
сохраняет 2 байтаJavaScript ES6,
696657 байтКак это работает
Это решение отображает каждый y-индекс
y
и x-индексx
на входе и решает, выбрасывать его или нет на основе этих двух индексов. Есть четыре случая, которые нам нужно сохранить:x
это 0y
это 0x
равна длине внутреннего массива, минус 1y
равна длине внешнего массива, минус 1Мы можем позаботиться о первых двух с небольшим умножением:
x*y
возвращает,0
если либоx
либоy
0, либо в противном случае положительное целое число. Теперь для третьего: мы могли бы проверить, еслиX.length>x+1
, но это занимает много байтов. Другой способ сделать это - проверить, не является ли элемент впереди ложным, а именно тоundefined
, что вы получаете, когда пытаетесь получить доступ к несуществующему элементу. Тем не менее, это также соответствует, если следующий элемент0
, поэтому мы добавляем 0,5, чтобы убедиться, что этого не произойдет:Наконец, четвертый пункт: поскольку внешний массив содержит только массивы, а любой массив является правдивым, мы можем просто проверить
Y[y+1]
. Теперь?0:N
мы преобразуем его,0
если все вышесказанное окажется правдивым;N
иначе. Вот и все!источник
Сетчатка ,
31 2422Сохранено 2 байта благодаря randomra
Попробуйте онлайн!
Вероятно, есть лучший способ сделать это, поскольку это просто довольно простая многострочная замена. По сути, мы находим каждое число, которому предшествует символ новой строки, некоторое количество символов и пробел, за которым сразу же следует пробел, а затем и, в конце концов, символ новой строки. Эти цифры затем заменяются на
0
.Это не сохранит заполнение столбцов, но я не думаю, что это проблема.
источник
Java 8, как лямбда-функция:
828395 символов / байтЛямбда Подпись:
int[][] -> (void)
(т.е.Consumer<int[][]>
)РЕДАКТИРОВАТЬ Сделал ошибку, я думал, что [х, у] был X-й ряд и Y-й столбец. Очевидно, что это должно быть [x] [y], хотя!
РЕДАКТИРОВАТЬ Я забыл проверить код, и мне нужно каждый раз возвращать столбец в ноль +12 байт. : /
источник
Haskell,
5958 байтрасширенный
источник
++[last y]
в:(last y)
или:last y
x : map f (…)
уже имеет тип[a]
иlast y
имеет типa
, тогда как(:) :: a -> [a] -> [a]
. Добавление элемента в конец списка в Haskell отстой, так как эти списки являются односвязными форвардными списками.k
в оператор инфиксной, скажем ,#
и переворачивать аргументы , чтобы сохранить один байт:[x]#_=...
,(x:y)#f=...
,f=(#(# \_->0))
и вы можете оставить название вашей основной функции, то естьf=
еще два байта.Pyth, 18 байт
объяснение
Входные массивы разделены символами новой строки
Попробуй здесь
источник
Groovy, 70 байт
Это не очень креативно, но коротко!
объяснение
Закрытие с одним аргументом
Перебирать внутренний массив, пропуская первый и последний элементы
Итерация по средним элементам во внутреннем массиве
Установить элементы
0
и вернутьa
тесты
источник
R,
716457 байтредактировать -7 байтов, явно работая с <2- строчными или <2-столбцовыми матрицами, явно редактировать 2 -7 байтов, назначая размеры матрицы при проверке размера
источник
C ++,
8079 байтОжидает массив как
int**
с заданными размерамиn
иk
:Альтернатива, которая работает для любого типа, который имеет
size()
иvalue_type & operator[](int)
(98 байт):Расширенная версия
источник
PHP
82818071 байтЗапустите так:
count
, что является слишком длинным именем для codegolfисточник
for
безопасно всегда повторять доcount($z[0])-1
1 символа.APL,
17 байт15 байтКак это работает
⍳⍴⍵
генерирует двумерный массив, в котором все ячейки содержат координаты всех ячеек аргумента.1∊¨
ищет в каждой такой ячейке, если есть 1, и возвращает 1, если так, или 0 в противном случае. Это создает матрицу, в которой первая строка и первый столбец равны 1, а все остальные равны 0.(⌽∨⊖)
объединяется с логическим «или» двумя вариантами матрицы, одна перевернутая вдоль первой и одна перевернутая вдоль последней оси.⍵×
это стандартное умножение.источник
Perl, 34 + 2 = 36 байт
Требуется
-p
флаг:Как это работает:
источник
Луа, 69 байт
Если бы у меня были фигурные скобки вместо концов и концов ...
источник
SmileBASIC,
6951 байтЗаполнение 2D-области в массиве обычно требует использования FILL в цикле. Но намного проще работать с 2D-данными на графической странице, поэтому сначала копируется массив.Ой, я думал, что был настолько умен, используя графические команды ... но оказывается, что вызов FILL несколько раз на самом деле короче.
В любом случае, входные данные функции - это массив и ширина / высота (это стандартно в Smilebasic, потому что нет способа проверить размеры массива.)
источник
APL (Dyalog Classic) , 12 байт
Попробуйте онлайн!
⍉⌽⍵
обычно вращение (повернуть горизонтально и транспонировать)здесь мы объединяем его с
0⍪1↓⍵
заменой первой строки нулями (отбрасываем одну строку, затем соединяем 0 сверху) в одну последовательность:⍉0⍪1↓⌽
⍣4
повторяется 4 раза⊢-
вычитает из исходной матрицыисточник