J'aime beaucoup Tetris, mais je ne suis pas très bon dans ce domaine. Juste une fois, j'aimerais voir ce vaisseau spatial décoller devant mes propres yeux! Et comme les ordinateurs sont tellement géniaux en tout, la seule solution possible est de créer un programme pour le jouer pour moi ... sauf que vous allez faire ça pour moi!
Étant donné un tetromino (forme composée de quatre carrés) et une carte du terrain de jeu, vous devez placer le tetromino de telle sorte qu'il marque le plus grand nombre de lignes (rend le plus grand nombre de lignes complètement remplies de blocs) et crée le moins de nombres de nouveaux trous (un espace vide qui ne peut pas "voir" le haut du terrain de jeu 1 ).
Contribution
L'entrée contiendra un caractère sur une seule ligne qui représente le tétromino en baisse, suivi d'une grille 10 * 18 2 d'espaces ( ) et de signes plus (
+
).
Le caractère représente l'un des sept tétrominoes de base trouvés dans Tetris. Toutes les pièces peuvent être tournées de 90 degrés, mais pas retournées. Tous les tétrominoes et leurs rotations sont les suivants:
#
S = ## ##
## #
#
Z = ## ##
## #
# ### ##
L = # # # #
## # ###
# ### ##
J = # # # #
## # ###
# # #
T = ### ## ### ##
# # #
O = ##
##
#
I = # ####
#
#
La grille représente le terrain de jeu de Tetris, avec +
des blocs précédemment placés. Ainsi, un exemple d'entrée peut être le suivant:
I
+ ++
+ +++++
++ +++++++
++ +++++++
++ +++++++
++ +++++++
++++++ +++
Production
Votre sortie sera identique à l'entrée, mais avec le tetromino dans la position idéale. Le tétromino doit être représenté par #
pour les différencier des blocs pré-placés. En plus de cela, vous devez également afficher le nombre de lignes / trous que votre placement crée dans le formulaire xL yH
sur une nouvelle ligne.
La sortie de l'exemple donné ci-dessus serait la suivante 3 :
I
+ ++
+ +++++
++#+++++++
++#+++++++
++#+++++++
++#+++++++
++++++ +++
4L 0H
Vous ne devez produire que le ou les meilleurs résultats; dans le cas de deux ou plusieurs cas donnant le même score, vous devez tous les afficher (séparés par une ligne vierge). Les meilleurs résultats doivent être déterminés en triant d'abord le nombre de lignes marquées (décroissantes), puis le nombre de nouveaux trous créés (ascendants). Donc, 1L 1H
c'est un meilleur score que 0L 0H
.
Je vais travailler sur la création d'une liste de diverses entrées et sorties attendues sur lesquelles vous pouvez tester votre programme. Surveillez cet endroit.
Règles et désambiguïsation
- Il s'agit de code-golf , donc la mise en œuvre correcte la plus courte l'emporte.
- L'entrée / sortie peut se faire sur tout support adapté à votre langue cible (par exemple fichier, stdin / stdout, zone de texte).
- Si votre langue cible ne prend pas en charge la saisie sur plusieurs lignes (ou si cela n'est pas pratique), vous pouvez à la place délimiter chaque ligne de la saisie avec des virgules (
,
). - Vous pouvez omettre la sortie de toutes les lignes vides de la grille.
- N'oubliez pas que le tétromino tombe d'en haut - vous ne pouvez pas placer la pièce "sous terre". Vous pouvez donc supposer que tous les emplacements possibles de la pièce seront au "niveau de la surface" (c'est-à-dire qu'il n'y a pas de bloc entre la pièce et le haut de la planche).
- Supposons qu'il n'y aura jamais de situation dans laquelle vous serez obligé de reprendre la partie (le tétromino placé touche le haut du centre du terrain).
- Les solutions identiques en sortie doivent être omises (par exemple, il existe 3 sorties de solutions si vous faites naïvement tourner la
O
pièce).
1 Je sais que cela va créer des faux positifs, mais c'est une simplification.
2 Il s'agit de la taille de grille utilisée dans la version Game Boy.
3 Oui, 0H
c'est correct. Vérifiez encore, j'ai dit de nouveaux trous; ^)
Réponses:
C 1009 octets
Voici la version non golfée
J'ai vu que la principale source de code long serait probablement la définition des tuiles. J'ai donc décidé de les représenter sous forme de motifs binaires dans un tableau 4x4 bits. Il en résulte 16 bits qui s'intègrent facilement dans un seul
int
. Letiles
tableau contient tous les modèles pour les 19 rotations possibles des 7 tuiles.Lors de la compilation, ignorez l'avertissement
gets
obsolète. Je le sais, mais c'est le moyen le plus court de lire une ligne depuis l'entrée.la source
int
comme il est supposé. Plusieurs de vosprintfs
seuls produisent un seul caractère. Vous pourrez peut-être les remplacer par des équivalentsputchar
pour enregistrer quelques caractères. Par exemple, changerprintf("\n")
pourputchar(10)
:)