Lorsque les élèves apprennent pour la première fois la technique de la preuve de l'induction mathématique , un exemple courant est le problème du carrelage d'une grille 2 N × 2 N avec des trominos en forme de L , laissant un espace de grille prédéterminé vide. (N est un entier non négatif.)
Je vous laisse le soin de passer en revue la preuve si vous ne la connaissez pas déjà. Il existe de nombreuses ressources qui en discutent.
Votre tâche ici est d'écrire un programme qui prend une valeur pour N, ainsi que les coordonnées de l'espace de grille à laisser vide, et imprime une représentation ASCII de la grille carrelée tromino résultante.
Le personnage O
remplira l'espace vide, et les 4 rotations de notre tromino ressembleront à ceci:
|
+-
|
-+
-+
|
+-
|
(Oui, il peut être ambigu qui +
va avec quoi -
et |
pour certains arrangements, mais ça va.)
Votre programme doit fonctionner pour N = 0 (pour une grille 1 × 1) jusqu'à au moins N = 8 (pour une grille 256 × 256). On lui donnera des valeurs x et y qui sont les coordonnées de O
:
- x est l'axe horizontal. x = 1 est le bord gauche de la grille, x = 2 N est le bord droit de la grille.
- y est l'axe vertical. y = 1 est le bord supérieur de la grille, y = 2 N est le bord inférieur de la grille.
X et y sont toujours dans la plage [1, 2 N ].
Donc, pour un N, x et y donné, votre programme doit imprimer une grille 2 N × 2 N , entièrement carrelée de trominos en L, à l'exception de la coordonnée de la grille x, y qui sera un O
.
Exemples
Si N = 0, alors x et y doivent tous deux être 1. La sortie est simplement
O
Si N = 1, x = 1 et y = 2, la sortie serait
-+
O|
N = 2, x = 3, y = 2:
+--+
||O|
|+-|
+--+
N = 2, x = 4, y = 1:
+-|O
||+-
|+-|
+--+
N = 3, x = 3, y = 6 (par exemple l'image sur cette page ):
+--++--+
|+-||-+|
||+--+||
+-|-+|-+
+--+||-+
||O|-+||
|+-||-+|
+--++--+
Détails
- Vous pouvez écrire une fonction qui prend les 3 entiers au lieu d'écrire un programme entier. Il doit imprimer ou renvoyer la chaîne de la grille.
- Prenez l'entrée de stdin, de la ligne de commande, (ou des arguments de fonction si vous écrivez une fonction).
- La sortie peut éventuellement contenir une seule nouvelle ligne de formation.
- Vous n'êtes pas obligé d'utiliser la méthode de pavage que la preuve suggère normalement. Il importe seulement que la grille soit remplie de trominos en forme de L en plus du
O
. (Les trominos ne peuvent pas être coupés ou sortir des limites de la grille.)
Le code le plus court en octets gagne. Tiebreaker est un post antérieur. ( Compteur d'octets pratique. )
if p!=i
; la liste à l'intérieur.join()
n'a pas besoin[]
;(1-i%2)
peut se faire comme~i%2
; vous pouvez utiliser le déballage itérable pour écrire ent,l,a=[],...
tant que*t,l,a=...
;if n==0
peut être vérifié carif n<1
carn
ne peut pas être négatif; la finale"\n".join
peut probablement se faire en imprimant chaque élément, car les règles générales autorisent l'impression au lieu du retour;if p!=i
peut êtreif p-i
dû au fait que les valeurs non nulles sont vraies.