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.f
c'est une fonction récursive. En fait, je dois rétablir le formatage de sortiesplit()
après chaque auto-appel.A,B,C,D=t;return'\n'.join(map("".join,zip(A+C,B+D)))
,t+=[...]
sur l'avant-dernière ligne peut être écrite en tant quet+=...,
(en ajoutant un tuple au lieu d'une liste) et je ne sais pas si celle-ci fonctionne maisA if B else C
peut être écrite en tant queB and A or C
(également sur le avant-dernière ligne), mais seulement si A n'est jamais faux (ce que je ne pense pas?)JavaScript (ES6) 317
414Beaucoup de travail au golf, mais encore assez long.
Exécutez l'extrait de code pour tester (meilleure apparence en utilisant des caractères de bloc Unicode - mais même un peu plus longtemps)
Afficher l'extrait de code
la source
IDL 8.3+, 293 octets
C'est trop long, j'essaye de le réduire mais je n'y suis pas encore arrivé.
Les sorties:
Et, euh ... juste pour le plaisir ...
la source
Rubis Rév.1, 288
En tant que littéral lambda anonyme. Montré dans le programme de test (le littéral lambda est
->(n,a,b){...}
)Ruby Rev 0, 330 non golfé
Actuellement, le seul golf que je prétends est l'élimination des commentaires, des nouvelles lignes et des retraits inutiles.
Ceci est mon premier algorithme approprié encodé en Ruby et cela a été un travail difficile. Je suis sûr qu'il y a au moins 50 caractères qui peuvent être éliminés, mais j'en ai fait assez pour l'instant. Il y a de vraies horreurs, par exemple l'entrée. Cela peut probablement être corrigé par une fonction ou lambda au lieu d'un programme, mais la fonction interne
t
qui dessine les trominos a toujours besoin d'accéder aux variables globales. Je vais devoir trouver la syntaxe pour ça.Une caractéristique de ma réponse qui n'est pas présente dans les autres, c'est que j'initialise un tableau de chaînes avec des
|
caractères. Cela signifie que je n'ai qu'à dessiner le+-
ou-+
, qui sont côte à côte sur la même ligne.la source
Haskell, 170 octets
Courez en ligne sur Ideone
Exemple d'exécution:
la source