La tarea
Este desafío es muy simple. Su entrada es una matriz rectangular 2D de enteros, con un tamaño de al menos 1 × 1. Se puede tomar en cualquier formato razonable. Su salida será la matriz de entrada, pero con todas las entradas que no estén en la primera o última fila o columna configuradas en 0
. Debe estar en el mismo formato que la entrada.
Por ejemplo, si la matriz de entrada es
67 4 -8 5 13
9 13 42 4 -7
1 1 3 -9 29
16 99 8 77 0
entonces la salida correcta es
67 4 -8 5 13
9 0 0 0 -7
1 0 0 0 29
16 99 8 77 0
Reglas y puntaje
Puede escribir un programa completo o una función, y las funciones pueden modificar la entrada en su lugar en lugar de devolverla. El conteo de bytes más bajo gana, y las lagunas estándar no se permiten.
Casos de prueba
Estos están formateados como listas anidadas para facilitar el pegado de copias.
[[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]]
Tabla de clasificación
Aquí hay un fragmento de pila para generar una tabla de clasificación regular y una descripción general de los ganadores por idioma. Para asegurarse de que su respuesta se muestre, comience con un título, usando la siguiente plantilla de Markdown:
## Language Name, N bytes
Si desea incluir varios números (por ejemplo, porque ha mejorado su puntaje o desea enumerar las banderas de intérprete por separado), asegúrese de que el puntaje real sea el último número en el encabezado:
## Perl, <s>50</s> 43 + 2 (-p flag) = 45 bytes
También puede hacer que el nombre del idioma sea un enlace que luego aparecerá en el fragmento de la tabla de clasificación:
## [><>](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 una función con nombre completo: 85
Podrías incluir esto en Java 8 para eliminar algunos bytes, pero realmente no hago eso.
fuente
Arrays.fill(a[i],1,a[i].length-1,0);
? Son solo 36 bytes en lugar de 37. =)for(int i=0,j;++i<a.length-1;)for(j=0;++j<a[i].length-1;)a[i][j]=0;
? No guarda ningún byte, pero es más consistente con que ambos bucles sean iguales. :)Jalea,
1817159 bytesPruébalo en línea! o verificar todos los casos de prueba .
Fondo
Este enfoque se basa en la respuesta Jelly de @ Sp3000 , específicamente en su idea de aprovechar las operaciones vectorizadas entre listas de diferentes longitudes.
Comenzamos tomando el AND bit a bit de 0 y cada número entero en la primera fila de la entrada. Debido a la vectorización automática, esto se puede lograr tomando el AND bit a bit de [0] y la entrada sin su última fila. 0 se empareja con la primera fila, lo que resulta en una fila de ceros. Como las filas restantes no tienen contrapartida en [0] , se dejan intactas.
Ahora transponemos el resultado, aplicamos la transformación anterior una vez más (eliminando efectivamente la última columna y poniendo a cero la primera), y volvemos a transponer.
Para la entrada
esto resulta en
Ahora, tomamos el XOR bit a bit de este resultado y la matriz original. XORing un entero consigo mismo produce 0 . XORing un entero con 0 (o no XORing en absoluto) produce el mismo entero. Esto ahueca la matriz.
Cómo funciona
fuente
Mathematica, 27 bytes
fuente
-2
s indica en segundo lugar la penúltima columna o fila.R ,
3348 bytesLo sé, R no está hecho para jugar al golf. Pero está hecho para indexación posicional ... Cargando un ejemplo;
Reemplace el valor en cualquier posición que no esté en la fila o columna del borde, con 0:
También verificando una prueba de 2 columnas:
Posteridad: intento previo
Prueba de todos los ejemplos:
fuente
a
existe. Para cumplir con nuestras reglas, puede convertirlo en una función que tome una matriz, comofunction(a){a[-c(1,nrow(a)),-c(1,ncol(a))]=0;a}
47 bytes.Mathematica
8176 bytesCómo funciona
Suponga que la matriz de entrada está almacenada en
m
. Las dimensiones dem
son {4,5} `Cada celda en la siguiente matriz,
a
es True si la celda está en la primera o (||
) en la última fila o en la primera o última columna; de lo contrario es falso.La aplicación de la función
Boole
a la matriz convierte True a 1 y False a 0.Multiplica la matriz
m
porb
. Esto multiplica cada celda en m por la celda correspondiente en b.fuente
||
como OR para guardar un par de bytes, y puedo ver algunos otros bytes que también puede guardar!GNU Sed, 31
Versión 4.2.2 o anterior, antes de esta confirmación (discusión) .
La puntuación incluye +1 para la
-r
opción.Las filas de entrada están separadas por una nueva línea. Los elementos en cada fila están separados por una sola línea.
Explicación
Pruébalo en línea.
fuente
1n;$n;:;s/ -?\w+ / : /;t;y/:/0/
.Octava, 34 bytes
Tenga en cuenta que la entrada requiere punto y coma para separar las filas de la matriz:
Explicación:
Los índices de matriz de octava (y MATLAB) están basados en 1. Especificar un rango de
Array(1:end)
le dará todos los elementos de la matriz (unidimensional, en este ejemplo).Array(2:end-1)
le dará todos los elementos, excepto el primero y el último.se establece en
0
todos los elementos que no están en la primera o última fila o columna:Si una de las dimensiones es menor o igual que 2, el rango
end-1
es menor que 2, por lo tanto, el final del rango(2:end-1)
es menor que el principio. En este caso, Octave ignora el rango y no hace nada. Esto es análogo alfor
bucle:La condición de detención es verdadera en la primera iteración, por lo que nos salimos del ciclo.
fuente
Jalea , 12 bytes
Creo que esto funciona, todavía envolviendo mi cabeza alrededor de Jelly. Pruébalo en línea!
(Gracias a @Dennis por -2 bytes)
Funciona multiplicando la matriz de entrada por una matriz de 1s y 0s una dimensión más pequeña en cada sentido. Por ejemplo, porque
[[67,4,-8,5,13],[9,13,42,4,-7],[1,1,3,-9,29],[16,99,8,77,0]]
multiplicamos elementos sabios porExplicación completa
fuente
ES6,
524846 bytesEditar: Guardado 4 bytes gracias a @ user81655. Ahorré otros 2 bytes gracias a @ETHproductions.
fuente
g
cual ahorra unos pocos bytes:f=a=>a.map((b,i)=>i&&a[i+1]!=a.x?b.map?f(b):0:b)
f=
), pero puedesf=a=>a.map((b,i)=>i&&a[i+1]+.5?b.map?f(b):0:b)
f=
. También estoy un poco sorprendido de que+.5
funcione, pero veo que agrega una cadena en la otra llamada.Javascript,
625956 bytesEste enfoque espera una cadena como argumento. Puedes ver lo que hace la expresión regular aquí: https://regex101.com/r/kC6xA8/3
fuente
Mathematica, 55 bytes
Caso de prueba
Explicación
La idea principal de esta respuesta es la misma que la respuesta de DavidC (primero construya una matriz de máscara, y luego multiplíquela por la matriz original), pero la construcción de la matriz de máscara es diferente.
ArrayFilter[f,list,r]
asignaf
a cada elementolist
dentro de un radio der
.Tenga en cuenta que los elementos de límite se duplican cuando no hay suficientes vecinos. Cuando
list
es de 2 dimensiones, esta característica funciona bienDet
para dar el resultado deseado, ya que las columnas o filas duplicadas en cuatro límites desvanecen los determinantes.donde
Power~Array~{4,4}
garantiza que los determinantes en las posiciones internas sean distintos de cero. Yda la matriz de la máscara.
fuente
Python, 50 bytes
Acepta una lista de listas y la modifica en su lugar. La sintaxis de corte de Python no es inconveniente para esta tarea.
Aprendí que multiplicar una lista por un número negativo da como resultado una lista vacía, lo que permite que el código anterior funcione en entradas pequeñas.
fuente
Julia,
5035 bytesEsta es una función anónima que acepta una matriz y la modifica en su lugar. Para llamarlo, asígnelo a una variable.
El enfoque aquí es bastante simple: para la matriz de entrada n por m A , asignamos A ij = 0 para todo i = 2, ..., n -1 y j = 2, ..., m -1 construyendo rangos de índices. Los rangos pueden estar vacíos, como si n o m = 1, en cuyo caso no se realiza ningún reemplazo.
Pruébalo en línea
¡Ahorró 15 bytes gracias a Dennis!
fuente
C, 62 bytes
Espero que esté bien tomar la longitud / ancho de la matriz como parámetros. Jugué un poco con memset / bzero un poco, pero multiplicarlo
sizeof(int)
aumentó drásticamente el tamaño del código.EDITAR: 55 bytes si podemos seguir doblando las reglas y almacenar nuestra matriz como caracteres, ya que la entrada es de un solo dígito cada uno.
EDITAR: ¡Gracias Washington Guedes por el dato!
fuente
sizeof(int)
? En su4
lugar, podría usar ...sizeof(int) != 4
en mi máquina: P-->
operador distante ;)Perl 6 , 28 bytes
Esto modifica la entrada en el lugar
Uso
fuente
{.[1..*-2]»[1..*-2]X=0}
ahorra 2 bytesJavaScript ES6,
696657 bytesCómo funciona
Esta solución se asigna a través de cada índice yy índice
y
xx
en la entrada y decide si se descarta o no en función de estos dos índices. Hay cuatro casos que debemos mantener:x
es 0y
es 0x
es igual a la longitud de la matriz interna, menos 1y
es igual a la longitud de la matriz externa, menos 1Podemos ocuparnos de los dos primeros con una pequeña multiplicación:
x*y
devuelve0
iffx
oy
son 0, y un entero positivo de lo contrario. Ahora para el tercero: podríamos verificar siX.length>x+1
, pero eso requiere muchos bytes. Otra forma de hacer esto es verificar si el elemento que está por delante es falso, es decirundefined
, qué es lo que obtienes cuando intentas acceder a un elemento inexistente. Sin embargo, esto también coincide si el siguiente elemento es0
, por lo que agregamos 0.5 para asegurarnos de que eso no suceda:Finalmente, el cuarto punto: dado que la matriz externa solo tiene matrices en el interior, y cualquier matriz es verdadera, podemos verificar
Y[y+1]
. Ahora con?0:N
, lo convertimos a0
si todo lo anterior resultó verdadero;N
de otra manera. ¡Y eso es!fuente
Retina ,
31 2422Guardado 2 bytes gracias a randomra
Pruébalo en línea!
Probablemente haya una mejor manera de hacerlo, ya que este es solo un reemplazo de varias líneas bastante básico. Esencialmente, encontramos cada número precedido por una nueva línea, una cierta cantidad de caracteres y un espacio, y es seguido inmediatamente por un espacio y luego, y finalmente es seguido por una nueva línea. Estos números se reemplazan todos con
0
.Esto no preservará el relleno de la columna, pero no creo que sea un problema.
fuente
Java 8, como una función lambda:
828395 caracteres / bytesFirma Lambda:
int[][] -> (void)
(es decirConsumer<int[][]>
)EDITAR Cometí un error, pensé que a [x, y] era la fila x y la columna y. ¡Claramente debería ser un [x] [y] sin embargo!
EDITAR Olvidé probar el código, y necesito volver a poner la columna a cero cada vez dentro del bucle, +12 bytes. : /
fuente
Haskell
5958 bytesExpandido
fuente
++[last y]
en:(last y)
o:last y
x : map f (…)
ya es de tipo[a]
ylast y
tiene tipoa
, mientras que(:) :: a -> [a] -> [a]
. Agregar un elemento al final de una lista en Haskell es una mierda, ya que esas listas son listas de reenvío de enlace único.k
en un operador infijo, digamos#
y voltear los argumentos para salvar un byte:[x]#_=...
,(x:y)#f=...
,f=(#(# \_->0))
y que puede caer el nombre de su función principal, es decir,f=
hasta dentro de dos bytes.Pyth, 18 bytes
Explicación
Las matrices de entrada están separadas por líneas nuevas
Pruébalo aquí
fuente
Groovy, 70 bytes
¡Esto no es muy creativo, pero es corto!
Explicación
Cierre con un argumento
Iterar sobre la matriz interna, omitiendo el primer y el último elemento
Iterar sobre elementos intermedios en la matriz interna
Establezca los elementos ay
0
regresea
Pruebas
fuente
R,
716457 bytesedite -7 bytes tratando explícitamente las matrices de <2 filas o <2 columnas edite explícitamente de 2 a 7 bytes asignando dimensiones de matriz mientras verifica el tamaño
fuente
C ++,
8079 bytesEspera la matriz como
int**
con los tamaños dadosn
yk
:Una alternativa que funciona para cualquier tipo que tenga
size()
yvalue_type & operator[](int)
(98 bytes):Versión ampliada
fuente
PHP,
82818071 bytesCorre así:
count
, que es un nombre demasiado largo para codegolffuente
for
es seguro iterar siemprecount($z[0])-1
para ahorrar 1 carácter.APL,
17 bytes15 bytesCómo funciona
⍳⍴⍵
genera una matriz 2D donde todas las celdas contienen las coordenadas de todas las celdas del argumento.1∊¨
busca en cada celda si hay un 1 y devuelve un 1 si es así, o 0 en caso contrario. Esto construye una matriz donde la primera fila y la primera columna son 1s y el resto son 0.(⌽∨⊖)
se combina con la versión lógica "o" dos de la matriz, una invertida a lo largo de la primera y otra invertida a lo largo del último eje.⍵×
es la multiplicación estándarfuente
Perl, 34 + 2 = 36 bytes
Requiere el
-p
bandera:Cómo funciona:
fuente
Lua, 69 bytes
Si solo tuviera llaves en lugar de dos y termina ...
fuente
SmileBASIC,
6951 bytesLlenar un área 2D en una matriz generalmente requeriría usar FILL en un bucle. Pero es mucho más fácil trabajar con datos 2D en la página de gráficos, por lo que primero se copia la matriz allí.Aww, pensé que era muy inteligente usando comandos gráficos ... pero resulta que llamar a FILL varias veces es más corto.
De todos modos, las entradas de función son la matriz y el ancho / alto (esto es estándar en Smilebasic porque no hay forma de verificar las dimensiones de una matriz).
fuente
APL (Dyalog Classic) , 12 bytes
Pruébalo en línea!
⍉⌽⍵
es normalmente rotación (invertir horizontalmente y transponer)aquí lo combinamos con el
0⍪1↓⍵
que reemplaza la primera fila con ceros (suelte una fila, luego concatene 0 en la parte superior) en un solo tren:⍉0⍪1↓⌽
⍣4
se repite 4 veces⊢-
resta de la matriz originalfuente