A tarefa
Esse desafio é muito simples. Sua entrada é uma matriz 2D retangular de números inteiros, dimensionada pelo menos 1 × 1. Pode ser tomado em qualquer formato razoável. Sua saída deve ser a matriz de entrada, mas com todas as entradas que não estiverem na primeira ou na última linha ou coluna configuradas como 0
. Ele deve estar no mesmo formato da entrada.
Por exemplo, se a matriz de entrada for
67 4 -8 5 13
9 13 42 4 -7
1 1 3 -9 29
16 99 8 77 0
então a saída correta é
67 4 -8 5 13
9 0 0 0 -7
1 0 0 0 29
16 99 8 77 0
Regras e pontuação
Você pode escrever um programa completo ou uma função, e as funções têm permissão para modificar a entrada no lugar em vez de devolvê-la. A menor contagem de bytes vence e as brechas padrão não são permitidas.
Casos de teste
Eles são formatados como listas aninhadas para facilitar a colagem de cópias.
[[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]]
Entre os melhores
Aqui está um snippet de pilha para gerar uma classificação regular e uma visão geral dos vencedores por idioma. Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:
## Language Name, N bytes
Se você deseja incluir vários números (por exemplo, porque você melhorou sua pontuação ou deseja listar sinalizadores de intérpretes separadamente), verifique se a pontuação real é o último número no cabeçalho:
## Perl, <s>50</s> 43 + 2 (-p flag) = 45 bytes
Você também pode transformar o nome do idioma em um link que será exibido no snippet da tabela de classificação:
## [><>](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, como uma função totalmente nomeada: 85
Você pode lambda isso no Java 8 para remover alguns bytes, mas eu realmente não faço isso.
fonte
Arrays.fill(a[i],1,a[i].length-1,0);
? É somente 36 bytes em vez de 37. =)for(int i=0,j;++i<a.length-1;)for(j=0;++j<a[i].length-1;)a[i][j]=0;
? Ele não salva bytes, mas é mais consistente com os dois loops iguais. :)Geléia,
1817159 bytesExperimente online! ou verifique todos os casos de teste .
fundo
Essa abordagem é baseada na resposta Jelly do @ Sp3000 , especificamente em sua idéia de aproveitar as operações vetorizadas entre listas de diferentes comprimentos.
Começamos pegando o AND bit a bit de 0 e todo número inteiro na primeira linha da entrada. Devido à vetorização automática, isso pode ser conseguido tomando o AND bit a bit de [0] e a entrada sem sua última linha. 0 é emparelhado com a primeira linha, resultando em uma linha de zeros. Como as linhas restantes não têm contrapartida em [0] , elas permanecem intocadas.
Agora, transpomos o resultado, aplique a transformação acima mais uma vez (efetivamente removendo a última coluna e zerando a primeira) e transponha novamente.
Para a entrada
isto resulta em
Agora, tomamos o XOR bit a bit desse resultado e a matriz original. XORing um número inteiro em si produz 0 . XORing um número inteiro com 0 (ou nenhum XORing) gera o mesmo número inteiro. Isso esvazia a matriz.
Como funciona
fonte
Mathematica, 27 bytes
fonte
-2
s indicam a segunda e a última coluna ou linha.R ,
3348 bytesEu sei, R não é feito para jogar golfe. Mas é feito para indexação posicional ... Carregando um exemplo;
Substitua o valor em qualquer posição que não esteja na linha ou coluna da borda, com 0:
Também verificando um teste de duas colunas:
Posteridade: tentativa anterior
Testando todos os exemplos:
fonte
a
existe. Para estar em conformidade com nossas regras, você pode transformá-lo em uma função que requer uma matriz, comofunction(a){a[-c(1,nrow(a)),-c(1,ncol(a))]=0;a}
por 47 bytes.Mathematica
8176 bytesComo funciona
Suponha que a matriz de entrada esteja armazenada
m
. As dimensões dem
são {4,5} `Cada célula na matriz a seguir
a
, é True se a célula estiver na primeira ou (||
) na última linha ou na primeira ou na última coluna; caso contrário, é falso.A aplicação da função
Boole
à matriz converte True em 1 e False em 0.Multiplique a matriz
m
porb
. Isso multiplica cada célula em m pela célula correspondente em b.fonte
||
como seu OR para salvar alguns bytes, e eu posso ver alguns outros bytes que você também pode salvar!GNU Sed, 31
Versão 4.2.2 ou anterior, antes deste commit (discussão) .
A pontuação inclui +1 para a
-r
opção.As linhas de entrada são separadas por nova linha. Os elementos em cada linha são separados por linha única.
Explicação
Experimente online.
fonte
1n;$n;:;s/ -?\w+ / : /;t;y/:/0/
.Oitava, 34 bytes
Observe que a entrada requer ponto e vírgula para separar as linhas da matriz:
Explicação:
Os índices de matriz de oitava (e MATLAB) são baseados em 1. A especificação de um intervalo de
Array(1:end)
fornecerá todos os elementos da matriz (unidimensional, neste exemplo).Array(2:end-1)
fornecerá todos os elementos, exceto o primeiro e o último.define para
0
todos os elementos que não estão na primeira ou na última linha ou coluna:Se uma das dimensões for menor ou igual a 2, o intervalo
end-1
será menor que 2, portanto, o final do intervalo(2:end-1)
será menor que o início. Nesse caso, o Octave ignora o intervalo e não faz nada. Isso é análogo aofor
loop:A condição de parada é verdadeira na primeira iteração, então caímos fora do loop.
fonte
Gelatina , 12 bytes
Eu acho que isso funciona, ainda envolvendo minha cabeça em volta de Jelly. Experimente online!
(Obrigado a @Dennis por -2 bytes)
Funciona multiplicando a matriz de entrada por matrizes de 1s e 0s, uma dimensão menor em cada sentido. Por exemplo, porque
[[67,4,-8,5,13],[9,13,42,4,-7],[1,1,3,-9,29],[16,99,8,77,0]]
multiplicamos em elementos porExplicação completa
fonte
ES6,
524846 bytesEditar: salvou 4 bytes graças a @ user81655. Economizou mais 2 bytes graças a @ETHproductions.
fonte
g
qual salva alguns bytes:f=a=>a.map((b,i)=>i&&a[i+1]!=a.x?b.map?f(b):0:b)
f=
), mas você podef=a=>a.map((b,i)=>i&&a[i+1]+.5?b.map?f(b):0:b)
f=
. Também estou um pouco surpreso com os+.5
trabalhos, mas vejo que ele adiciona uma string na outra chamada.Javascript,
625956 bytesEssa abordagem espera uma string como argumento. Você pode ver o que a regex faz aqui: https://regex101.com/r/kC6xA8/3
fonte
Mathematica, 55 bytes
Caso de teste
Explicação
A idéia principal desta resposta é a mesma que a resposta de DavidC (primeiro construa uma matriz de máscara e depois multiplique-a pela matriz original), mas a construção da matriz de máscara é diferente.
ArrayFilter[f,list,r]
mapeiaf
todos os elementoslist
dentro de um raio der
.Observe que os elementos de limite são duplicados quando há vizinhos insuficientes. Quando
list
é de duas dimensões, esse recurso funciona bem em conjuntoDet
para fornecer o resultado desejado, pois colunas ou linhas duplicadas em quatro limites desaparecem os determinantes.onde
Power~Array~{4,4}
garante que os determinantes nas posições internas sejam diferentes de zero. Edá a matriz da máscara.
fonte
Python, 50 bytes
Aceita uma lista de listas e a modifica no local. A sintaxe de fatia do Python não é inconveniente para esta tarefa.
Aprendi que multiplicar uma lista por um número negativo resulta em uma lista vazia, o que permite que o código acima funcione em pequenas entradas.
fonte
Julia,
5035 bytesEsta é uma função anônima que aceita uma matriz e a modifica no local. Para chamá-lo, atribua-o a uma variável.
A abordagem aqui é bastante simples: para a matriz de entrada n por m A , atribuímos A ij = 0 para todos i = 2, ..., n -1 ej = 2, ..., m -1 construindo intervalos de índices. Os intervalos podem estar vazios, como se n ou m = 1, caso em que nenhuma substituição é feita.
Experimente online
Economizou 15 bytes graças a Dennis!
fonte
C, 62 bytes
Espero que seja bom considerar o comprimento / largura da matriz como parâmetros. Eu brinquei um pouco com o memset / bzero, mas a multiplicação
sizeof(int)
aumentou drasticamente o tamanho do código.EDIT: 55 bytes se pudermos dobrar ainda mais as regras e armazenar nossa matriz como caracteres, pois a entrada é apenas um dígito cada.
EDIT: Obrigado Washington Guedes pela dica!
fonte
sizeof(int)
? Você poderia usar4
...sizeof(int) != 4
na minha máquina: P-->
operador;)Perl 6 , 28 bytes
Isso modifica a entrada no local
Uso
fonte
{.[1..*-2]»[1..*-2]X=0}
salva 2 bytesJavaScript ES6,
696657 bytesComo funciona
Essa solução mapeia cada índice y e índice
y
xx
na entrada e decide se deve ou não descartá-lo com base nesses dois índices. Há quatro casos que precisamos manter:x
é 0y
é 0x
é igual ao comprimento da matriz interna, menos 1y
é igual ao comprimento da matriz externa, menos 1Podemos cuidar dos dois primeiros com um pouco de multiplicação:
x*y
retorna0
sex
ouy
é 0 e um número inteiro positivo, caso contrário. Agora, o terceiro: poderíamos verificar seX.length>x+1
, mas isso leva muitos bytes. Outra maneira de fazer isso é verificar se o item à frente é falso, ou sejaundefined
, o que você obtém ao tentar acessar um item inexistente. No entanto, isso também corresponde se o próximo item for0
, portanto, adicionamos 0,5 para garantir que isso não aconteça:Finalmente, o quarto ponto: como a matriz externa possui apenas matrizes internas e qualquer matriz é verdadeira, podemos apenas verificar
Y[y+1]
. Agora com?0:N
, nós o convertemos para0
se todas as opções acima resultassem verdadeiras;N
de outra forma. E é isso!fonte
Retina ,
31 2422Guardado 2 bytes graças a randomra
Experimente online!
Provavelmente existe uma maneira melhor de fazê-lo, pois essa é apenas uma substituição de várias linhas bastante básica. Essencialmente, encontramos cada número que é precedido por uma nova linha, algum número de caracteres e um espaço, e é imediatamente seguido por um espaço e, em seguida, e eventualmente seguido por uma nova linha. Esses números são todos substituídos por
0
.Isso não preservará o preenchimento da coluna, mas não acho que seja um problema.
fonte
Java 8, como uma função lambda:
828395 caracteres / bytesAssinatura Lambda:
int[][] -> (void)
(ieConsumer<int[][]>
)EDIT Cometi um erro, eu pensei que a [x, y] era a décima linha e a ya coluna. Claramente, deve ser um [x] [y]!
EDIT Esqueci de testar o código e preciso definir a coluna de volta a zero todas as vezes dentro do loop, +12 bytes. : /
fonte
Haskell,
59.58 bytesExpandido
fonte
++[last y]
em:(last y)
ou:last y
x : map f (…)
já é do tipo[a]
elast y
tem tipoa
, enquanto(:) :: a -> [a] -> [a]
. A adição de um elemento no final de uma lista no tipo Haskell é uma porcaria, pois essas listas são listas de encaminhamento vinculadas por um único.k
em um operador infix, vamos dizer#
e virar os argumentos para salvar um byte:[x]#_=...
,(x:y)#f=...
,f=(#(# \_->0))
e você pode soltar o nome da sua função principal, ou seja,f=
por mais dois bytes.Pitão, 18 bytes
Explicação
Matrizes de entrada são separadas por novas linhas
Experimente aqui
fonte
Groovy, 70 bytes
Isso não é muito criativo, mas é curto!
Explicação
Encerramento com um argumento
Iterar sobre a matriz interna, pulando o primeiro e o último elementos
Iterar sobre itens do meio na matriz interna
Defina os elementos para
0
e retornea
Testes
fonte
R,
716457 bytesedite -7 bytes lidando explicitamente com matrizes <2 linhas ou <2 colunas edite explicitamente 2-7 bytes atribuindo dimensões da matriz enquanto verifica o tamanho
fonte
C ++,
8079 bytesEspera a matriz como
int**
em determinados tamanhosn
ek
:Uma alternativa que funciona para qualquer tipo que tenha
size()
evalue_type & operator[](int)
(98 bytes):Versão expandida
fonte
PHP,
82818071 bytesExecute assim:
count
, que é um nome muito longo para codegolffonte
for
é seguro iterar sempre atécount($z[0])-1
poupar 1 caractere.APL,
17 bytes15 bytesComo funciona
⍳⍴⍵
gera uma matriz 2D em que todas as células contêm as coordenadas de todas as células do argumento.1∊¨
procura em cada célula se houver 1 e retorna 1 se houver, ou 0 caso contrário. Isso cria uma matriz em que a primeira linha e a primeira coluna são 1s e o restante é 0.(⌽∨⊖)
combina com "ou" duas versões lógicas da matriz, uma invertida ao longo da primeira e outra invertida ao longo do último eixo.⍵×
é a multiplicação padrão.fonte
Perl, 34 + 2 = 36 bytes
Requer a
-p
bandeira:Como funciona:
fonte
Lua, 69 bytes
Se ao menos eu tivesse aparelho em vez de dos e termina ...
fonte
SmileBASIC,
6951 bytesO preenchimento de uma área 2D em uma matriz geralmente exigiria o preenchimento de um loop. Mas é muito mais fácil trabalhar com dados 2D na página de gráficos; primeiro, o array é copiado para lá.Aww, eu pensei que era tão inteligente usando comandos gráficos ... mas acontece que chamar FILL várias vezes é realmente mais curto.
De qualquer forma, as entradas de função são a matriz e a largura / altura (isso é padrão no Smilebasic porque não há como verificar as dimensões de uma matriz).
fonte
APL (Dyalog Classic) , 12 bytes
Experimente online!
⍉⌽⍵
é normalmente rotação (inverter horizontalmente e transpor)aqui nós o combinamos com o
0⍪1↓⍵
que substitui a primeira linha por zeros (solte uma linha e concatene 0 no topo) em um único trem:⍉0⍪1↓⌽
⍣4
repete 4 vezes⊢-
subtrai da matriz originalfonte