Un concours simple, inspiré de cette question stackoverflow :
Vous obtenez une image d'une surface photographiée par un satellite. L'image est une image bitmap où l'eau est marquée par '
.
' et la terre est marquée par '*
'. Des groupes de voisins*
forment une île. (Deux pouces*
sont adjacents s'ils sont voisins horizontaux, verticaux ou diagonaux). Votre tâche consiste à imprimer le nombre d'îles dans le bitmap.
Un seul *
compte également comme une île.
Exemple d'entrée:
.........**
**......***
...........
...*.......
*........*.
*.........*
Exemple de sortie:
5
Le gagnant est l'entrée avec le plus petit nombre d'octets dans le code.
*
île isolée*
sont également des îles.Réponses:
Mathematica
188 185 170 115 115 130 4648 caractèresExplication
Dans les versions précédentes, j'ai fait un graphique des positions ayant une distance d'échiquier de 1 les unes des autres.
GraphComponents
a ensuite révélé le nombre d'îles, une par composante.La présente version utilise
MorphologicalComponents
pour rechercher et numéroter des grappes dans les régions du tableau où1
sont physiquement contiguës. Parce que la représentation graphique n'est pas nécessaire, cela se traduit par une énorme économie de code.Code
Exemple
5
Comment ça marche
Les données sont entrées sous forme de tableau; dans Mathematica, il s'agit d'une liste de listes.
Dans le tableau d'entrée, les données sont converties en
1
's et0
' par le remplacementoù
/.
est une forme d'infixeReplaceAll
suivie de règles de remplacement. Cela convertit essentiellement la matrice en une image en noir et blanc. Tout ce que nous devons faire est d'appliquer la fonctionImage
,.Les carrés blancs correspondent aux cellules ayant la valeur 1.
L'image ci-dessous montre quelques étapes que l'approche utilise. La matrice d'entrée ne contient que des
1
«et0
». La matrice de sortie étiquette chaque groupe morphologique avec un nombre. (J'ai enveloppé les matrices d'entrée et de sortieMatrixForm
pour mettre en évidence leur structure bidimensionnelle.)MorphologicalComponents
remplace1
s par un entier correspondant au numéro de cluster de chaque cellule.Max
renvoie le plus grand numéro de cluster.Affichage des îles
Colorize
colorera chaque île de façon unique.la source
MorphologicalComponents
veut unImage
, mais même sur v9 ne devrait-il pas en être ainsiMax@MorphologicalComponents[d/.{"."->0,"*"->1}]
? Autrement dit, le remplacement fait en premier?Max
disparaîtrait avant le remplacement, n'est-ce pas?Max@MorphologicalComponents@d/.{"."->0,"*"->1}
ne fonctionne pas, ce qui est logiqueMax@MorphologicalComponents[d /. {"." -> 0, "*" -> 1}]
, vous avez donc un caractère de plus.Rubis 1.9 (
134121113110)Prend la carte sur stdin ou le nom de fichier de la carte comme premier argument de ligne de commande et imprime le nombre d'îlots à stdout. Utilisation d'un remplissage récursif de base. Des améliorations bienvenues comme toujours!
Semblable à la colorisation de David, vous pouvez également l'obtenir pour afficher les différentes îles en changeant
$_[i]=?.
vers$_[i]=c.to_s
etp c
versputs$_
, ce qui vous donnerait quelque chose comme ceci:(au moins jusqu'à ce que vous manquiez de chiffres!)
Quelques cas de test:
5
9
1
2
3
la source
C, 169 caractères
Lit la carte depuis stdin. N'a pas eu de chance d'améliorer la fonction de remplissage inondable récursif
r(j)
bien qu'il semble que cela puisse être.la source
Python 2,
223203 octetsMerci à Step Hen et Arnold Palmer d' avoir rasé 20 caractères d'espaces et de parenthèses inutiles!
Je pensais que l'utilisation des compréhensions de liste pouvait réduire le nombre d'octets, mais cela n'apportait aucune amélioration significative.
Essayez ici.
Je continue d'essayer de le découper autour de la liste des n (voisins), mais je n'ai pas réussi. Peut-être que quelqu'un d'autre aura des idées pour cette section.
la source
(s.index(l),i)
etfor
,enumerate(l)
etif
,-v[0])<2
etand
,p=0:
etp
, etbool(x&n[p])
etelse
. Vous avez également plus de parenthèses que nécessaire dans votre déclaration d'impression, car vous avez 2 groupes autourset
. Edit: Beat by StepHen parce que faire des choses sur mobile n'est pas idéal.Perl 5 , 100 octets
98 octets de code + 2 octets pour les
-p0
drapeaux.Essayez-le en ligne!
Une adaptation (ou plutôt une simplification) de ma réponse au défi Combien de trous? . Vous pouvez trouver des explications sur le fonctionnement de ce code sur cette autre réponse (c'est un peu long à expliquer, donc je préfère ne pas retaper l'intégralité des explications).
la source
Python 2, 233 octets
Trop long par rapport aux autres réponses. Port de ma réponse à cette question .
Essayez-le en ligne
la source
JavaScript, 158 octets
Réponse ES6 non concurrente (défi de postdates de langue) pour 132 octets:
Port de ma réponse à Combien de trous? (oui je saute dans le train, maintenant que j'ai vu deux autres personnes porter leurs réponses).
la source
Python 2 , 225 octets
Essayez-le en ligne!
la source