La tâche
Ce défi est très simple. Votre entrée est un tableau 2D entier d’entiers, d’une taille minimale de 1 × 1. Il peut être pris dans n’importe quel format raisonnable. Votre sortie doit être le tableau en entrée, mais avec toutes les entrées non définies sur la première ou la dernière ligne ou colonne 0
. Il doit être au même format que l’entrée.
Par exemple, si le tableau d'entrée est
67 4 -8 5 13
9 13 42 4 -7
1 1 3 -9 29
16 99 8 77 0
alors la sortie correcte est
67 4 -8 5 13
9 0 0 0 -7
1 0 0 0 29
16 99 8 77 0
Règles et notation
Vous pouvez écrire un programme complet ou une fonction, et les fonctions sont autorisées à modifier l'entrée en place au lieu de la renvoyer. Le nombre d'octets le plus faible gagne et les failles standard sont interdites.
Cas de test
Celles-ci sont formatées en tant que listes imbriquées pour faciliter le copier-coller.
[[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]]
Classement
Voici un extrait de pile permettant de générer un classement régulier et un aperçu des gagnants par langue. Pour vous assurer que votre réponse apparaît, commencez votre réponse par un titre, en utilisant le modèle Markdown suivant:
## Language Name, N bytes
Si vous souhaitez inclure plusieurs numéros (par exemple, parce que vous avez amélioré votre score ou si vous souhaitez répertorier les indicateurs d'interprète séparément), assurez-vous que le score réel est le dernier numéro de l'en-tête:
## Perl, <s>50</s> 43 + 2 (-p flag) = 45 bytes
Vous pouvez également faire du nom de la langue un lien qui apparaîtra ensuite dans l'extrait de classement:
## [><>](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, en tant que fonction entièrement nommée: 85
Vous pouvez lambda dans Java 8 pour supprimer quelques octets, mais je ne le fais pas vraiment.
la source
Arrays.fill(a[i],1,a[i].length-1,0);
? C'est seulement 36 octets au lieu de 37. =)for(int i=0,j;++i<a.length-1;)for(j=0;++j<a[i].length-1;)a[i][j]=0;
? Cela ne sauvegarde aucun octet, mais il est plus cohérent, les deux boucles étant identiques. :)Jelly,
1817159 octetsEssayez-le en ligne! ou vérifier tous les cas de test .
Contexte
Cette approche est basée sur la réponse Jelly de @ Sp3000 , plus précisément sur son idée de tirer parti des opérations vectorisées entre des listes de longueurs différentes.
Nous commençons par prendre l'ET au niveau du bit AND de 0 et chaque entier de la première ligne de l'entrée. En raison de la vectorisation automatique, ceci peut être réalisé en prenant l'ET au niveau du bit AND de [0] et l'entrée sans sa dernière ligne. 0 est associé à la première ligne, ce qui donne une ligne de zéros. Comme les lignes restantes n'ont pas d'équivalent dans [0] , elles ne sont pas modifiées.
Maintenant, nous transposons le résultat, appliquons à nouveau la transformation ci-dessus (en supprimant effectivement la dernière colonne et en mettant à zéro la première) et en transposant à nouveau.
Pour l'entrée
cela se traduit par
Maintenant, prenons le bit XOR de ce résultat et la matrice originale. XORing un entier avec lui-même donne 0 . XORing un entier avec 0 (ou pas du tout) donne le même entier. Cela creuse la matrice.
Comment ça marche
la source
Mathematica, 27 octets
la source
-2
s indique en deuxième l’avant dernière colonne ou ligne.R ,
3348 octetsJe sais que R n'est pas fait pour le golf. Mais il est fait pour l'indexation positionnelle ... Chargement d'un exemple;
Remplacez la valeur à n’importe quelle position, pas sur la ligne ou la colonne du bord, par 0:
Vérification également d'un test à 2 colonnes:
Postérité: tentative précédente
Test de tous les exemples:
la source
a
existe. Pour respecter nos règles, vous pouvez en faire une fonction prenant une matrice, commefunction(a){a[-c(1,nrow(a)),-c(1,ncol(a))]=0;a}
pour 47 octets.Mathematica
8176 octetsComment ça marche
Supposons que le tableau d’entrée soit stocké dans
m
. Les dimensions dem
sont {4,5} `Chaque cellule du tableau suivant
a
, est définie sur True si la cellule figure dans la première ou||
dans la dernière ligne ( ) ou dans la première ou la dernière colonne; sinon c'est Faux.L'application de la fonction
Boole
au tableau convertit True en 1 et False en 0.Multipliez la matrice
m
parb
. Ceci multiplie chaque cellule en m par la cellule correspondante en b.la source
||
votre OU pour sauvegarder quelques octets, et je peux voir quelques autres octets que vous pouvez également sauvegarder!GNU Sed, 31
Version 4.2.2 ou antérieure, antérieure à cette validation (discussion) .
Le score inclut +1 pour l'
-r
option.Les lignes d'entrée sont séparées par une nouvelle ligne. Les éléments de chaque ligne sont séparés par une seule ligne.
Explication
Essayez-le en ligne.
la source
1n;$n;:;s/ -?\w+ / : /;t;y/:/0/
.Octave, 34 octets
Notez que l'entrée nécessite des points-virgules pour séparer les lignes d'un tableau:
Explication:
Les indices de tableau Octave (et MATLAB) sont basés sur 1. Spécifier une plage de
Array(1:end)
vous donnera tous les éléments du tableau (unidimensionnel, dans cet exemple).Array(2:end-1)
vous donnera tous les éléments sauf le premier et le dernier.définit
0
tous les éléments qui ne figurent pas dans la première ou la dernière ligne ou colonne:Si l'une des dimensions est inférieure ou égale à 2, la plage
end-1
est inférieure à 2; la fin de la plage(2:end-1)
est donc inférieure au début. Dans ce cas, Octave ignore la plage et ne fait rien. Ceci est analogue à lafor
boucle:La condition d'arrêt est vraie à la première itération, nous tombons donc hors de la boucle.
la source
Gelée , 12 octets
Je pense que cela fonctionne, enveloppant toujours ma tête autour de Jelly. Essayez-le en ligne!
(Merci à @Dennis pour -2 octets)
Fonctionne en multipliant le tableau d'entrée par des tableaux de 1 et de 0 une dimension plus petite dans chaque sens. Par exemple,
[[67,4,-8,5,13],[9,13,42,4,-7],[1,1,3,-9,29],[16,99,8,77,0]]
nous multiplions élément par élémentExplication complète
la source
ES6,
524846 octetsEdit: 4 octets sauvegardés grâce à @ user81655. Sauvegardé 2 octets supplémentaires grâce à @ETHproductions.
la source
g
qui permet d'économiser quelques octets:f=a=>a.map((b,i)=>i&&a[i+1]!=a.x?b.map?f(b):0:b)
f=
), mais vous pouvez le réduire à 46:f=a=>a.map((b,i)=>i&&a[i+1]+.5?b.map?f(b):0:b)
f=
. Aussi, je suis un peu surpris des+.5
travaux mais je vois qu'il ajoute une chaîne dans l'autre appel.Javascript,
625956 octetsCette approche attend une chaîne comme argument. Vous pouvez voir ce que font les regex ici: https://regex101.com/r/kC6xA8/3
la source
Mathematica, 55 octets
Cas de test
Explication
L'idée principale de cette réponse est la même que celle de DavidC (commencez par construire une matrice de masque, puis multipliez-la par la matrice d'origine), mais la construction de la matrice de masque est différente.
ArrayFilter[f,list,r]
mappef
sur chaque élément delist
dans un rayon der
.Notez que les éléments de frontière sont dupliqués lorsque les voisins sont insuffisants. Quand
list
est de 2 dimensions, cette fonctionnalité fonctionne bienDet
pour donner le résultat souhaité, puisque les colonnes ou les lignes dupliquées sur quatre limites effacent les déterminants.où
Power~Array~{4,4}
garantit que les déterminants des positions internes sont non nuls. Etdonne la matrice de masque.
la source
Python, 50 octets
Accepte une liste de listes et la modifie sur place. La syntaxe de slice de Python n’est pas gênante pour cette tâche.
J'ai appris que multiplier une liste par un nombre négatif donne une liste vide, ce qui permet au code ci-dessus de fonctionner avec de petites entrées.
la source
Julia,
5035 octetsC'est une fonction anonyme qui accepte un tableau et le modifie sur place. Pour l'appeler, assignez-le à une variable.
L’approche ici est assez simple: pour le tableau d’entrée A n par m , nous assignons A ij = 0 pour tout i = 2, ..., n -1 et j = 2, ..., m -1 en construisant des plages des indices. Les plages peuvent être vides, comme si n ou m = 1, auquel cas aucun remplacement n’est effectué.
Essayez-le en ligne
Sauvegardé 15 octets grâce à Dennis!
la source
C, 62 octets
J'espère que ça va de prendre en longueur de tableau / largeur en tant que paramètres. Je me suis un peu amusé avec memset / bzero, mais sa multiplication a
sizeof(int)
considérablement augmenté la taille du code.EDIT: 55 octets si nous pouvons continuer à plier les règles et stocker notre tableau sous forme de caractères puisque l’entrée n’est composée que d’un seul chiffre.
EDIT: Merci Washington Guedes pour le tuyau!
la source
sizeof(int)
? Vous pourriez utiliser à la4
place ...sizeof(int) != 4
sur ma machine: P-->
opérateur distant ;)Perl 6 , 28 octets
Ceci modifie l'entrée en place
Usage
la source
{.[1..*-2]»[1..*-2]X=0}
enregistre 2 octetsJavaScript ES6,
696657 octetsComment ça marche
Cette solution est mappée sur chaque index y
y
et x-indexx
de l'entrée et décide de le supprimer ou non en fonction de ces deux index. Il y a quatre cas que nous devons garder:x
est 0y
est 0x
est égal à la longueur de la matrice interne, moins 1y
est égal à la longueur de la matrice externe, moins 1Nous pouvons nous occuper des deux premiers avec un peu de multiplication:
x*y
renvoie0
six
ouy
est égal à 0, et un entier positif sinon. Passons maintenant à la troisième: nous pourrions vérifier siX.length>x+1
, mais cela prend beaucoup d'octets. Une autre façon de procéder consiste à vérifier si l'élément à venir est faux, à savoirundefined
ce que vous obtenez lorsque vous essayez d'accéder à un élément inexistant. Cependant, cela correspond également si l'élément suivant est0
, nous ajoutons donc 0.5 pour nous assurer que cela ne se produise pas:Enfin, quatrième point: puisque le tableau extérieur ne contient que des tableaux et que tout tableau est véridique, nous pouvons simplement vérifier
Y[y+1]
. Maintenant, avec?0:N
, nous le convertissons en0
si tout ce qui précède se révélait être la vérité;N
autrement. Et c'est tout!la source
La rétine ,
31 24222 octets sauvés grâce à randomra
Essayez-le en ligne!
Il y a probablement une meilleure façon de le faire, car il s'agit simplement d'un remplacement de base multiligne. Nous trouvons essentiellement chaque numéro précédé d’une nouvelle ligne, d’un certain nombre de caractères et d’un espace, suivi immédiatement par une espace, puis d’une nouvelle ligne. Ces chiffres sont alors tous remplacés par
0
.Cela ne préservera pas le remplissage des colonnes, mais je ne pense pas que ce soit un problème.
la source
Java 8, en tant que fonction lambda:
828395 caractères / octetsSignature Lambda:
int[][] -> (void)
(ieConsumer<int[][]>
)EDIT Fait une erreur, je pensais qu'un [x, y] était le xième rang et le yt col. Clairement, cela devrait être un [x] [y] cependant!
EDIT J'ai oublié de tester le code et je dois remettre la colonne à zéro à chaque fois dans la boucle, +12 octets. : /
la source
Haskell,
5958 octetsÉtendu
la source
++[last y]
dans:(last y)
ou:last y
x : map f (…)
est déjà de type[a]
etlast y
a le typea
, alors que(:) :: a -> [a] -> [a]
. L'ajout d'un élément à la fin d'une liste dans Haskell est un peu dommage, car ces listes sont des listes de renvoi simples.k
en un opérateur infixe, nous allons dire#
et retourner les arguments pour sauver un octet:[x]#_=...
,(x:y)#f=...
,f=(#(# \_->0))
et vous pouvez laisser tomber le nom de votre fonction principale, à savoirf=
pour deux octets.Pyth, 18 octets
Explication
Les tableaux d'entrée sont séparés par des nouvelles lignes
Essayez-le ici
la source
Groovy, 70 octets
Ce n'est pas très créatif, mais c'est court!
Explication
Fermeture avec un argument
Itérer sur le tableau interne, en ignorant les premier et dernier éléments
Itérer sur les éléments du milieu de la matrice interne
Définir les éléments
0
et revenira
Des tests
la source
R,
716457 octetsedit -7 octets en traitant explicitement avec les matrices <2 lignes ou <2 colonnes explicitement edit2 -7 octets en affectant les dimensions de la matrice tout en vérifiant la taille
la source
C ++,
8079 octetsAttend le tableau comme
int**
avec les tailles donnéesn
etk
:Une alternative qui fonctionne pour tout type qui a
size()
etvalue_type & operator[](int)
(98 octets):Version élargie
la source
PHP,
82818071 octetsCourez comme ça:
count
, nom trop long pour codegolfla source
for
est sûr de toujours parcourir jusqu'àcount($z[0])-1
épargner 1 caractère.APL,
17 octets15 octetsComment ça marche
⍳⍴⍵
génère un tableau 2D où toutes les cellules contiennent les coordonnées de toutes les cellules de l'argument.1∊¨
cherche dans chacune de ces cellules s'il y a un 1 et retourne un 1 si c'est le cas ou 0 sinon. Cela crée une matrice où la première ligne et la première colonne sont des 1 et tout le reste est 0.(⌽∨⊖)
combine avec "ou" deux versions logiques de la matrice, une inversée le long de la première et une inversée le long du dernier axe.⍵×
est la multiplication standard.la source
Perl, 34 + 2 = 36 octets
Nécessite le
-p
drapeau:Comment ça marche:
la source
Lua, 69 octets
Si seulement j'avais des accolades au lieu de dos et se termine ...
la source
SmileBASIC,
6951 octetsRemplir une zone 2D dans un tableau nécessiterait généralement d'utiliser FILL dans une boucle. Mais il est beaucoup plus facile de travailler avec des données 2D sur la page graphique. Le tableau y est donc d'abord copié.Aww je pensais être si intelligent en utilisant des commandes graphiques ... mais il s'avère qu'appeler REMPLIR un tas de fois est en réalité plus court.
Quoi qu'il en soit, les entrées de fonction sont le tableau et la largeur / hauteur (ceci est standard dans Smilebasic car il n’ya aucun moyen de vérifier les dimensions d’un tableau.)
la source
APL (Dyalog Classic) , 12 octets
Essayez-le en ligne!
⍉⌽⍵
est normalement en rotation (inverser horizontalement et transposer)nous la combinons ici pour
0⍪1↓⍵
remplacer la première ligne par des zéros (déposer une ligne, puis concaténer 0 en haut) en un seul train:⍉0⍪1↓⌽
⍣4
répète 4 fois⊢-
soustrait de la matrice d'originela source