Considérez la grille de mots croisés standard 15 × 15 suivante .
Nous pouvons représenter cela dans l'art ASCII en utilisant #
pour les blocs et (espace) pour les carrés blancs.
# #
# #
#
# #
### ## ##
## #
# #
# ##
## ## ###
# #
#
# #
# #
Étant donné une grille de mots croisés au format ASCII ci-dessus, déterminez le nombre de mots qu'il contient. (La grille ci-dessus contient 78 mots. Il s'agit du puzzle du New York Times de lundi dernier .)
Un mot est un groupe de deux espaces consécutifs ou plus s'étendant verticalement ou horizontalement. Un mot commence et se termine par un bloc ou le bord de la grille et court toujours de haut en bas ou de gauche à droite, jamais en diagonale ou en arrière. Notez que les mots peuvent s'étendre sur toute la largeur du puzzle, comme dans la sixième rangée du puzzle ci-dessus. Un mot n'a pas besoin d'être connecté à un autre mot.
Détails
- L'entrée sera toujours un rectangle contenant les caractères
#
ou(espace), avec des lignes séparées par une nouvelle ligne (
\n
). Vous pouvez supposer que la grille est composée de 2 caractères ASCII imprimables distincts au lieu de#
et.
- Vous pouvez supposer qu'il existe une nouvelle ligne facultative. Les caractères d'espace de fin comptent, car ils affectent le nombre de mots.
- La grille ne sera pas toujours symétrique et il peut s'agir de tous les espaces ou de tous les blocs.
- Votre programme devrait théoriquement pouvoir fonctionner sur une grille de n'importe quelle taille, mais pour ce défi, il ne sera jamais plus grand que 21 × 21.
- Vous pouvez prendre la grille elle-même comme entrée ou le nom d'un fichier contenant la grille.
- Prenez les entrées de stdin ou des arguments de ligne de commande et sortez vers stdout.
- Si vous préférez, vous pouvez utiliser une fonction nommée au lieu d'un programme, en prenant la grille comme argument de chaîne et en sortant un entier ou une chaîne via stdout ou retour de fonction.
Cas de test
Contribution:
# # #
Sortie:
7
(Il y a quatre espaces avant chacun#
. Le résultat serait le même si chaque signe numérique était supprimé, mais Markdown supprime les espaces des lignes autrement vides.)Contribution:
## # ##
Sortie:
0
(les mots d'une lettre ne comptent pas.)Contribution:
###### # # #### # ## # # ## # #### #
Production:
4
Entrée: ( puzzle du Sunday NY Times du 10 mai )
# ## # # # # # # # ### ## # # ## # # # ## # ## # ## # # ### ## # ## ## # ## ### # # ## # ## # ## # # # ## # # ## ### # # # # # # # ## #
Production:
140
Notation
Le code le plus court en octets gagne. Tiebreaker est le plus ancien poste.
py -3 slip.py regex.txt input.txt
etpy -3 slip.py regex.txt input.txt no
, qui est de trois octets (y compris l'espace avantn
)Haskell, 81 octets
Utilise les espaces
comme caractères de bloc et tout autre caractère (non blanc) comme cellule vide.
Comment ça marche: divisez la saisie en liste de mots dans les espaces. Prenez un
1
pour chaque mot avec au moins 2 caractères et additionnez ces1
s. Appliquez la même procédure à la transposition (divisée en\n
) de l'entrée. Ajoutez les deux résultats.la source
JavaScript ( ES6 ) 87
121 147Construisez la transposition de la chaîne d'entrée et ajoutez-la à l'entrée, puis comptez les chaînes de 2 espaces ou plus.
Exécutez l'extrait dans Firefox pour tester.
Crédits @IsmaelMiguel, une solution pour ES5 (122 octets):
la source
F=z=>{for(r=z.split(/\n/),i=0;i<r[j=0][L='length'];i++)for(z+='#';j<r[L];)z+=r[j++][i];return~-z.split(/ +/)[L]}
? Il fait 113 octets de long. Votre expression régulière a été remplacée par/ +/
(2 espaces), le aj=0
été ajouté dans lafor
boucle «parent» et au lieu d'utiliser la syntaxeobj.length
, j'ai changé pour utiliserL='length'; ... obj[L]
, qui est répété 3 fois.F=z=>
, je devais l'utiliservar F=(z,i,L,j,r)=>
). Je l'ai testé sur IE11 et ça marche!/\n/
par une chaîne de modèle avec une vraie nouvelle ligne entre. Cela économise 1 octet puisque vous n'avez pas à écrire la séquence d'échappement.Pyth,
151413 octetsJ'utilise
comme séparateur et
#
comme caractères de remplissage au lieu de leur signification opposée de l'OP. Essayez-le en ligne: DémonstrationAu lieu d'un
#
caractère de remplissage, cela accepte également les lettres. Ainsi, vous pourriez réellement prendre le puzzle de mots croisés résolu et imprimer le nombre de mots. Et si vous supprimez lal
commande, elle imprime même tous les mots. Testez-le ici: le puzzle du Sunday Times du 10 maiExplication
la source