Une fenêtre est un carré de style ASCII avec une longueur de côté impair d'au moins 3, avec une bordure de caractère unique autour du bord ainsi que des traits verticaux et horizontaux au milieu:
#######
# # #
# # #
#######
# # #
# # #
#######
Une fenêtre MS est une fenêtre où la bordure est constituée uniquement des caractères M
et S
. Votre tâche consiste à écrire un programme (ou une fonction) qui prend une chaîne et génère une valeur véridique si l'entrée est une fenêtre MS valide et une valeur Falsey si ce n'est pas le cas.
Caractéristiques
- Vous pouvez prendre l'entrée comme une chaîne séparée par des sauts de ligne ou un tableau de chaînes représentant chaque ligne.
- La bordure d'une fenêtre MS peut contenir un mélange de caractères M et S, mais l'intérieur sera toujours composé d'espaces.
- Vous pouvez choisir de détecter uniquement les fenêtres avec des retours à la ligne de fin, ou uniquement les fenêtres sans retours à la ligne de fin, mais pas les deux.
Cas de test
Vérité:
MMM
MMM
MMM
SMSMS
M M S
SMSMM
S S M
SMSMS
MMMMMMM
M S M
M S M
MSSSSSM
M S M
M S M
MMMMMMM
Falsey:
Hello, World!
MMMM
MSSM
MS M
MMMM
MMSMM
M S.M
sSSSS
M S M
MMSMM
MMMMMMM
M M M
MMMMMMM
M M M
MMMMMMM
MMMMMMM
M M M M
MMMMMMM
M M M M
MMMMMMM
M M M M
MMMMMMM
MMSSMSSMM
M M M
S S S
S S S
MMSSMSSMM
S S S
S S S
M M M
MMSSMSSMM
code-golf
string
ascii-art
decision-problem
Esolanging Fruit
la source
la source
Réponses:
Pyke,
3431 octetsEssayez-le ici!
la source
Rétine ,
6867 octetsLe nombre d'octets suppose un codage ISO 8859-1.
Essayez-le en ligne!
la source
Grime ,
3938 octetsMerci à Zgarb d'avoir économisé 1 octet.
Essayez-le en ligne!
Je ne sais pas s'il existe un moyen plus simple d'appliquer le rapport d'aspect carré des composants de fenêtre individuels que d'utiliser un non-terminal récursif, mais cela semble fonctionner assez bien.
Explication
Il est préférable de lire le programme de bas en haut.
Cela définit simplement un non-terminal (que vous pouvez considérer comme un sous-programme qui correspond à un rectangle)
W
qui correspond à unM
ou à unS
(il y a un implicite]
à la fin de la ligne).Cela définit un non-terminal
B
qui correspond à environ un quart de la sortie, c'est-à-dire un panneau de fenêtre avec la bordure gauche et supérieure. Quelque chose comme ça:Pour garantir que ce panneau de fenêtre est carré, nous le définissons
B
récursivement. C'est soit un caractère de fenêtreW
, soit c'est celuiB/W\ * W/\ /*
qui ajoute un calque à droite et en bas. Pour voir comment cela fonctionne, supprimons du sucre syntaxique:C'est la même chose, car la concaténation horizontale peut être écrite soit
AB
ouA B
, mais celle-ci a une priorité plus faible que la concaténation verticale/
tandis que pour la première, elle est plus élevée. Il enB/W[ ]*
va de mêmeB
avec un caractère de fenêtre et une rangée d'espaces ci-dessous. Et puis nous ajoutons horizontalementW/[ ]/*
ce qui est un caractère de fenêtre avec une colonne d'espaces.Enfin, nous assemblons ces non terminaux dans la forme finale de la fenêtre:
C'est quatre panneaux de fenêtre
B
suivis d'une ligne de caractères de fenêtre et d'une colonne de caractères de fenêtre. Notez que nous n'affirmons pas explicitement que les quatre panneaux de fenêtre sont de la même taille, mais s'ils ne le sont pas, il est impossible de les concaténer en rectangle.Enfin,
e`
au début est simplement une configuration qui dit à Grime de vérifier que l'entrée entière peut être mise en correspondance par ce modèle (et elle imprime0
ou en1
conséquence).la source
JavaScript (ES6),
115113 bytesPrend l'entrée comme un tableau de tableaux de caractères (ajoutez 5 octets pour un tableau de chaînes) et retourne
1
ou0
. Après avoir vérifié que la hauteur est impaire, chaque ligne est vérifiée pour s'assurer que le tableau est carré, et chaque caractère est vérifié pour être l'un des caractères que nous attendons à cette position particulière. Edit: sauvé 2 octets grâce à @PatrickRoberts.la source
(...).includes(c)
pour~(...).search(c)
enregistrer 1 octet(...?/ /:/[MS]/).test(c)
pour enregistrer 2 octets au lieu de seulement 1.Perl,
124123119959384Le script Perl suivant lit une fenêtre MS candidate à partir de l'entrée standard. Il sort ensuite avec un état de sortie nul si le candidat est une MS Window et avec un état de sortie non nul s'il ne l'est pas.
Il fonctionne en générant deux expressions régulières, une pour la ligne du haut, du milieu et du bas et une pour chaque autre ligne, et en vérifiant l'entrée par rapport à elles.
Merci, @Dada. Et encore.
la source
@a=<>;$s=$"x(($.-3)/2);$m="[MS]";map{$a[$_]!~($_%($./2)?"$m$s$m$s$m":"$m${m}{$.}")&&die}0..--$.
$.
à la fin pour éviter d'utiliser deux fois$.-1
(surtout depuis la première fois($.-1)/2
, il fallait donc des parenthèses supplémentaires), donc l'$m
in$m${m}{$.}
n'est pas une erreur. De plus, je viens de me rendre compte maintenant, mais les expressions régulières doivent être entourées de^...$
(donc un caractère supplémentaire à la fin ou au début les fait échouer), ou plus court: utilisezne
plutôt!~
.ne
place de!~
(je ne devrais pas écrire de messages quand je suis réveillé depuis seulement 15 minutes!). Vous devrez donc utiliser les^...$
deux expressions rationnelles, je le crains.Mathematica, 166 octets
Fonction sans nom prenant une liste de listes de caractères en entrée et retournant
True
ouFalse
. Voici une version moins golfique:La première ligne définit la fonction
t
, qui sépare une liste de longueurd
en deux parties, dont la première est la première, la moyenne et la dernière entrée de la liste, et la seconde est tout le reste. La deuxième ligne vérifie si l'entrée est un tableau carré en premier lieu. La quatrième ligne utiliset
deux fois, une fois sur l'entrée elle-même et une fois sur toutes * les chaînes de l'entrée, pour séparer les caractères qui sont censés être"M"
ou"S"
des caractères qui sont censés être des espaces; puis les cinquième et septième lignes vérifient si elles sont vraiment ce qu'elles sont censées être.la source
JavaScript (ES6),
108106 octetsEntrée: tableau de chaînes / Sortie:
0
ou1
Cas de test
Afficher l'extrait de code
la source
JavaScript (ES6),
140138141 141140 octetsJe sais que ce n'est pas un nombre d'octets gagnant (bien que merci à Patrick Roberts pour -3, et je me suis rendu compte que cela donnait des faux positifs pour 1 au lieu de M / S: +3), mais je l'ai fait d'une manière légèrement différente, je ' m nouveau à ce sujet, et c'était amusant ...
Accepte un tableau de chaînes, une pour chaque ligne et renvoie vrai ou faux. Ajout d'une nouvelle ligne pour plus de clarté (non inclus dans le nombre d'octets).
Au lieu de vérifier l'entrée par rapport à un modèle généralisé, je construis une fenêtre «M» de la même taille, remplace S par M en entrée et compare les deux.
Non golfé
Cas de test
la source
f=
n'a pas besoin d'être incluse dans le nombre d'octets, il s'agit donc en fait d'une soumission de 138 octets.z=-1+s/2|0
parz=(s-3)/2
pour économiser 1 octete.replace(/S/g,'M')==...
pare.split`S`.join`M`==...
pour enregistrer un autre octetz=-1+s/2|0
est là pour retourner un entier positif pour s == 1 et même s, c'est-à-dire que la fonction retourne false sans que Array () le plante. Sinon, la logique nécessaire l'a allongé. Excellent conseil sur le split / join, mercis=1
cas, car mon expression rationnelle invalide échoue silencieusement.JavaScript (ES6),
10910710610599 octetsEdit : Whoa, Arnauld m'a sauvé 6 octets en passant
s.split`\n`.length
às.search`\n`
! Merci!Cela prend une seule chaîne multiligne et construit une
RegExp
validation basée sur la longueur de la chaîne d'entrée. Renvoietrue
oufalse
. Suppose une fenêtre valideane pas une nouvelle ligne de fuite.Démo
la source
r=s.search('\n')
place desplit / length
?s=>!s.split`S`.join`M`.search([...])
peuvent être supprimées sans provoquer d'erreurs de syntaxe.RegExp