Inspiré tangentiellement par l'ouverture du livre What-If.
L'entrée est un rectangle d'espaces sous forme de chaîne, liste de chaînes, etc., avec des objets constitués de #
's à l'intérieur:
########
# #
########
### ####
### ####
###
Les objets seront toujours des rectangles sans intersection et sans contact. Un objet mou est défini comme un objet qui n'est pas rempli de #
's au milieu et n'est qu'une bordure, un objet dur est celui qui est rempli. Un objet de largeur ou de hauteur <=2
est considéré comme dur. Tous les objets sont durs ou mous.
S'il y a plus d'objets durs dans l'entrée, sortez "Hard"
, si plus doux, sortez "Soft"
, s'ils sont égaux, sortez "Equal"
.
C'est le code-golf , donc le code le plus court en octets gagne!
Cas de test
Ces cas ne sont pas des entrées complètes, mais plutôt ce que chaque objet doit être caractérisé. L'entrée réelle sera comme l'art ascii en haut de la question.
Difficile
#
####
##
##
##########
##########
##########
Doux
###
# #
###
###################
# #
# #
# #
###################
####
# #
# #
# #
# #
# #
# #
# #
####
Cas de test réels
########
# #
########
### ####
### ####
###
Hard
###
###
###
###################
# #
# #
# #
###################
Equal
######
# #
######
###
## # # #
###
########
# #
########
Soft
la source
Réponses:
MATL ,
105104585049 octetsMerci à @Neil pour une suggestion qui m'a permis de supprimer 46 octets!
L'entrée est un tableau de caractères 2D, avec des lignes séparées par
;
. L'exemple du défi estVoici un autre exemple:
Cela correspond à
et devrait donc donner
'Equal'
.Comme troisième exemple, correspondant à
'Soft'
,C'est,
Essayez-le en ligne!
Explication
Cela utilise la convolution 2D pour détecter les formes. L'entrée est convertie en un tableau 2D avec
1
indication#
et-1
pour l'espace; et est rembourré avec un cadre de-1
valeurs. Cela garantit que les formes au bord du champ d'origine sont également détectées.Un objet mou est détecté par le masque
qui correspond au coin supérieur gauche de l'objet avec un point intérieur vide. Notez que la convolution inverse le masque, il est donc défini comme
[-1 1; 1 1]
dans le code. Le nombre S de positions dans lesquelles la convolution4
est égale est le nombre total d'objets mous.Un objet (mou ou dur) est détecté par le masque
qui correspond au coin supérieur gauche de l'objet avec quelques points extérieurs vides. Ce masque est la version annulée du précédent, donc le résultat de convolution précédent peut être réutilisé. Plus précisément, le nombre T de positions dans lesquelles ce résultat
-4
est égal est le nombre total d'objets.Le nombre H d'objets durs est T - S . La chaîne de sortie est déterminé par le signe de S - H = 2 * S - T .
la source
JavaScript (ES6),
123121118 octetsEnregistré 2 octets grâce à @ edc65!
Prend l'entrée sous la forme d'une chaîne multiligne remplie d'espaces pour former une grille.
Explication / test
Très proche de la longueur MATL!Fondamentalement, il recherche la ligne supérieure de#
s de chaque objet, et si la longueur de la ligne supérieure est inférieure à 2 ou si les 2 premiers caractères sous la ligne supérieure sont identiques, c'est difficile, sinon doux.la source
###
retourneEqual
.~g.search(/$/m)
est légèrement plus lisible que~g.search`\n`||-1
.||-1
le corriger, mais votre suggestion m'a fait réaliser que l'ajout|$
à l'expression régulière économiserait de toute façon 2 octets. Merci!n=l=...
n>l?...:n<l?...:...
Gelée,
5049464338343332 octetsEssayez-le en ligne! ou vérifiez tous les cas de test .
Contexte
Il y a 16 différents 2 × 2 modèles de blocs et espaces:
Parmi ceux-ci, puisque deux objets ne se toucheront jamais,
ne se produira jamais dans l'entrée, nous laissant avec 14 modèles possibles.
En attribuant
une valeur de 0 et
#
une valeur de 1 , nous pouvons encoder un motif 2 × 2comme 2 (2a + c) + (2b + d) = 4a + 2b + 2c + d , laissant les valeurs suivantes pour les 14 motifs.
Pour les motifs partiels 2 × 1 , 1 × 2 ou 1 × 1 sur la bordure inférieure et / ou droite, nous les traiterons comme s'ils étaient remplis d'espaces, en les codant respectivement en 4a + 2b , 4a + 2c et 4a . .
De cette façon, chaque objet (doux ou dur) aura exactement un motif 4 (son coin inférieur droit); chaque objet souple aura exactement deux 7 motifs (son coin inférieur gauche et son coin supérieur droit).
Ainsi, en soustrayant la quantité de 4 motifs du nombre de 7 motifs rencontrés dans l'entrée, vous obtiendrez (s + h) - 2s = h - s: = d , où h et s sont la quantité d'objets durs et mous qu'ils forment.
Nous imprimons dur si d> 0 , doux si d <0 et égal si d = 0 .
Comment ça fonctionne
la source
Julia,
999593 octets!
attend un tableau Char bidimensionnel comme argument. Essayez-le en ligne!Comment ça fonctionne
Cela utilise presque exactement la même idée que ma réponse Jelly , avec une amélioration:
Au lieu de compter le nombre de 4 et de 7 , nous supprimons tous les autres nombres, puis soustrayons 5,5 pour mapper (4, 7) à (-1,5, 1,5) . De cette façon, le signe de la somme des différences résultantes détermine la sortie correcte.
la source
TSQL,
328249 octetsDéclaration des variables et des données de test:
Code:
Code dégonflé:
Explication:
Le script analyse le texte du motif:
Chacun d'eux est le début d'une boîte
Pour ces positions, le script vérifie ensuite le motif, pas besoin de vérifier le premier x:
Quand cela existe, c'est un objet mou, sinon c'est un objet dur.
la source