Représentons une brique de maçonnerie standard comme [__]
(et ignorons le fait que le haut est ouvert). Lorsque ces briques sont empilées, toutes les autres couches sont compensées par une demi-brique, comme c'est généralement le cas dans la construction en briques:
[__][__][__][__]
[__][__][__][__]
[__][__][__][__]
[__][__][__][__]
Ainsi, chaque brique a au plus six voisins et il est impossible pour deux briques de s'aligner directement verticalement.
Le point clé est que les dispositions de ces briques ne sont pas mortier , mais simplement maintenues ensemble par gravité. Il est donc important que chaque brique de la structure soit stable, sinon la structure entière est instable.
Il existe trois façons dont une brique individuelle peut être stable:
- Toute brique au sol (la ligne de briques la plus basse) est stable.
Toute brique qui a deux briques directement en dessous est stable:
[__] <- this brick is stable [__][__] <- because these bricks hold it up
Toute brique qui a une brique au-dessus et en dessous du même côté est stable:
[__] [__] [__] [__] <- these middle bricks are stable [__] [__] because the upper and lower bricks clamp them in [__] [__] [__] [__] <- these middle bricks are NOT stable [__] [__]
De ces règles, nous pouvons voir, par exemple, l'arrangement
[__][__][__][__]
[__][__][__][__]
[__][__][__][__]
[__][__][__][__]
est instable parce que la brique en haut à droite est instable, c'est tout ce qu'il faut.
Une structure en brique n'est stable que si toutes ses briques sont stables.
Défi
Votre tâche consiste à écrire une fonction qui prend une chaîne de structure en brique et retourne une valeur véridique si la structure est stable et une valeur fausse si elle est instable. ( définition véridique / fausse )
La chaîne d'entrée peut être arbitrairement grande mais ce sera toujours une grille rectangulaire de caractères, avec des espaces remplissant des zones vides de briques. La largeur de la grille de caractères sera divisible par 4 mais la hauteur peut être paire ou impaire.
La grille de briques s'étend toujours au-dessus et à droite de la position de brique inférieure gauche:
.
.
.
BRK?BRK?BRK?BRK?
BRK?BRK?BRK?BRK?BRK?
BRK?BRK?BRK?BRK?
BRK?BRK?BRK?BRK?BRK? . . .
BRK?BRK?BRK?BRK?
BRK?BRK?BRK?BRK?BRK?
Selon la structure, chacun BRK?
représente soit une brique ( [__]
) soit un espace vide (4 espaces).
Notez que les cavités en demi-brique sont remplies d'espaces pour garantir que la grille de caractères est rectangulaire.
Notation
Le code le plus court en octets gagne.
Remarques
- Si vous le souhaitez, vous pouvez utiliser à la
.
place de l'espace comme caractère d'espace vide. - La chaîne vide est considérée comme stable.
- Si votre langue n'a pas de fonctions, vous pouvez utiliser une variable de chaîne nommée en entrée et affecter le résultat à une autre variable.
- Si votre langue n'a pas de chaînes, vous pouvez faire tout ce qui semble approprié pour la saisie.
Cas de test
Différents cas de test, séparés par des lignes vides. Pour plus de clarté .
est utilisé à la place de l'espace pour les espaces vides.
Stable:
[__]
..[__]..
[__][__]
........[__]........
......[__][__]......
........[__]........
..[__][__]..
[__][__][__]
..[__][__]..
[__]....[__]
............[__]..
..[__][__][__][__]
[__][__][__][__]..
..[__][__][__][__]
[__][__][__][__]..
..[__]........[__]..
[__][__][__][__][__]
..[__][__][__][__]..
....[__][__][__]....
......[__][__]......
........[__]........
Instable:
..[__]..
........
..[__]..
[__]....
..[__]..
....[__]
..[__][__]..
[__]....[__]
..[__][__]..
[__]....[__]
..[__][__][__][__]
[__][__][__][__]..
..[__][__][__][__]
[__][__][__][__]..
[__][__][__][__][__]
..[__][__][__][__]..
....[__][__][__]....
......[__][__]......
........[__]........
........[__]....
......[__][__]..
....[__][__]....
..[__][__]......
[__][__]........
..[__]..........
(vous devrez empiler mentalement ces lignes les unes sur les autres. Le fait étant que vos règles autorisent les structures dont le centre de gravité est loin de leur point de contact avec le sol. Il devrait être possible de les resserrer pour éviter cela , sans avoir besoin d'un moteur physique, si vous en aviez envie.)Réponses:
80386 code machine, 98
Le code:
Le code scanne l'art ASCII de la fin au début, en sautant 2 caractères à la fois. Cela fait deux fois les vérifications nécessaires (il suffirait de sauter 4 caractères), mais simplifie la logique.
La vérification commence à l'avant-dernière ligne de caractères (pas besoin de vérifier la dernière ligne). A chaque ligne, il commence 3 caractères à partir de la droite (pas besoin de vérifier trop loin à droite). Pour chaque personnage, il vérifie 4 personnages environnants:
Il y a un tas de conditions logiques à vérifier:
C'est une heureuse coïncidence que tous les personnages de briques
[_]
aient leur jeu LSB; tous les autres personnages l'.\n
ont clairement. En outre, le jeu d'instructions 80386 a ces « haut » à portée de main et les registres de « bas » (ah
,al
, etc.), qui aide paralléliser les chèques un peu. Ainsi, tous les contrôles reviennent à un peu de tripotage obscur.Je suis parti du code C suivant:
J'ai traduit le code en langage assembleur (c'est principalement un à un), y compris une implémentation golfée de
strchr
etstrlen
. Le code source suivant est traduit par MS Visual Studio dans le code machine en haut de mon message.la source
MATLAB - 119 octets
Minifié:
Étendu:
Exemple d'utilisation:
Détails
La routine ajoute une ligne de
.
en haut de la matrice d'entrée, puis convertit en une matrice numérique en ajoutant 3 aux codes de caractères ASCII. Compte tenu de cette conversion, une convolution 2D avec le noyaudonne une matrice
0
aux endroits où le motif de caractèresest présent,
*
représentant "n'importe quel caractère". En raison de la construction du noyau, c'est le seul modèle de caractère valide qui produira a0
.Une convolution identique est effectuée avec la version inversée gauche-droite du noyau pour détecter
Une entrée est stable si i ) elle est vide ou ii ) aucun zéro n'apparaît dans l'une ou l'autre convolution.
Deux frustrations sont
La convolution par défaut de MATLAB passe le long des bords de la matrice d'opérande, produisant des
0
s erronés dans les coins opposés pour les deux convolutions, nécessitant,'valid'
(8 octets) d'être ajouté pourconv2
appeler afin de limiter la sortie à la zone où la convolution est valide.La gestion du cas de chaîne vide ajoute 12 octets.
la source
JavaScript (E6)
131261Test dans la console FireFox / FireBug
Sortie
Non golfé
la source
[...a]
faire, si cela ne vous dérange pas que je demande? Je sais que ES6 permet...arg
comme dernier argument d'une fonction de capturer des variadics, mais je ne l'ai jamais vu utilisé de cette façon.{:}
dans MATLAB. Ça va être très utile. Merci. :)Python 279
Je pense que je suis assez mauvais dans les défis de golf de code et peut-être que j'utilise les mauvais langages pour cela: D Mais j'aime le code qui peut être facilement lu :) Btw Je voudrais voir un code python qui utilise moins d'octets!
Exemples possibles:
la source
_
et[
<>
, vous utiliseriez!=
.!=
c'est la voie préférée deJavaScript 2 (ES6) - 148
151octetsAttend une chaîne de lignes de briques séparées par des sauts de ligne (remarque: si nous pouvions utiliser un caractère de séparation différent comme "|" pour séparer les lignes, cela pourrait être raccourci d'un octet).
Testez dans la console Firefox avec:
la source
Python, 209
Tests:
Sortie:
la source