Défi tiré de mon concours de défi de code universitaire
C'est en fait le jour 0, mais le défi d'hier était trop facile et peut être une dupe d'une autre question ici.
Tetris est un jeu vidéo devenu populaire dans les années 80. Il consiste à placer une série de pièces de formes différentes qui tombent sur une planche, afin qu'elles s'adaptent de la manière la plus compacte possible.
Dans ce problème, nous supposerons une séquence de pièces qui tombent, chacune dans une certaine position et avec une certaine orientation qui ne peut pas être modifiée. Les pièces sont empilées à mesure qu'elles tombent et les rangées complètes ne sont pas éliminées (comme dans le jeu original). L'objectif est de déterminer la hauteur finale de chaque colonne de la planche après la chute de toutes les pièces.
Il y a un total de 7 pièces différentes, illustrées dans la figure:
Défi
Étant donné une liste de pièces, affichez la hauteur de toutes les colonnes du tableau après la chute de toutes les pièces
Une pièce se compose de trois nombres: I, R et P. Le premier numéro, I, est l'identifiant de la pièce (un nombre entre 1 et 7, dans le même ordre que sur la figure). Le deuxième nombre, R, est la rotation de la pièce. Il peut prendre les valeurs 0, 90, 180 ou 270 et représente l'angle de rotation de la pièce dans le sens anti-horaire. Le troisième chiffre, P, indique la position de la pièce. Représente la colonne de gauche occupée par la pièce (cela peut être 1 ou 0 Index. Veuillez spécifier).
Exemple et cas de test (1 index)
- Donné
[[1, 0, 1], [4, 0, 1], [5, 90, 4]]
- Production
[3, 3, 1, 3, 2]
- Donné
[[6, 270, 4], [1, 180, 5], [1, 90, 6], [7, 0, 4]]
- Production
[0, 0, 0, 9, 9, 8, 3, 3]
[[3,0,1],[3,180,3]]
Sortie donnée[1,1,4,4,4]
[[2,180,1],[2,0,3]]
Sortie donnée[2,2,4,3,3]
Remarques
- C'est du code-golf
- La ligne / colonne peut être un index de 1 ou 0. Veuillez préciser.
- Vous pouvez redéfinir les valeurs d'entrée (peut-être que vous voulez appeler la pièce 1 comme A, etc.). Dans ce cas, veuillez préciser
Des questions
Peut-on utiliser 4 valeurs distinctes au lieu d'un angle en degrés?: Oui
Sommes-nous censés gérer les "trous" si une pièce ne correspond pas exactement aux précédentes?: Oui
La hauteur ou la largeur de la planche est-elle délimitée? Non, ni la largeur ni la hauteur ne sont délimitées
Merci @Arnauld pour les images et les cas de test *. *
I
-R
ilP
être saisi dans un ordre différent?Réponses:
JavaScript (Node.js) ,
286 284 270266 octetsEssayez-le en ligne! ou essayez une version améliorée qui affiche également la carte finale.
Encodage de forme
Toutes les pièces sont stockées sous la forme d'exactement 4 quartets (bits 4x4) avec les lignes triées dans l'ordre inverse et le pixel le plus à gauche mappé sur le bit le moins significatif. En d'autres termes, la représentation binaire de la forme est inversée verticalement et horizontalement.
Exemple:
Fonction de hachage et table de recherche
Ces entrées sont regroupées comme suit:
qui s'étend aux 82 grignotages suivants:
"ff"
Les paramètres de la fonction de hachage ont été forcés par une méthode brute qui optimise les zéros de début et de fin. Le fait que la chaîne puisse être compressée un peu plus en utilisant
1e12
les zéros du milieu et une conversion de base-16 en base-4 pour la partie droite est juste un effet secondaire bienvenu mais inattendu. :-)Voici une démonstration du processus de déballage de toutes les pièces et de toutes les rotations.
Commenté
la source
C (clang) ,
253239221212 octetsEssayez-le en ligne!
ps En fait, la taille du code est de 221 octets (mais 212 caractères) en raison des caractères UNICODE codés en UTF-8. Mais tio.run le traite comme un code de 212 octets ...
La taille du code sur mon ordinateur est de 209 caractères (218 octets). Mais je ne pouvais pas le remplacer
\225
par un caractère visible dans tio.run 😞Code non golfé
La description
Trouvons la ligne de base supérieure ( TBL ) de chaque figure et décrivons-la comme un nombre de cellules sous TBL pour chaque position horizontale. Décrivons également le nombre de cellules (hauteur) au-dessus de TBL ( HAT ).
Par exemple:
Décrivons les TBL et les HAT pour chaque figure et chaque angle de rotation:
Maintenant, nous devons coder ces nombres sous forme de séquences de 2 bits et les placer dans un tableau (en remplaçant
4 0
par3 1
un angle de 90 ° de "ligne" pour tenir sur 2 bits - le résultat sera le même et diminuera les largeurs de 1).Nous allons encoder dans l'ordre: largeur (en 2 LSB), TBL , HAT (en arrière pour la boucle en arrière). Par exemple ,
2 2 1 1 0
pour 270 ° Angle de T-chiffre est codé sous la forme1 0 1 2 1
(dernier 1 est la largeur-1 ):0b0100011001 = 281
.mise à jour 12.02:
a) J'ai converti un tableau en chaîne et enregistré 18 caractères (vous pouvez voir le code précédent de 239 octets ) :))
b) Plus d'optimisation, le code est réduit de 9 caractères.
Ceci est ma dernière tentative (je pense que oui, lol!) 😀
la source
<s> ... </s>
.Lisp commun, 634 octets
Verbeux
Essaye-le
Les pièces sont des listes circulaires de listes de nombres. Ces sous-listes représentent chacune un côté de la forme, les nombres indiquant à quelle distance ils se trouvent du côté opposé. Ils sont de gauche à droite lorsque ce côté est en bas, de droite à gauche en haut, de haut en bas à gauche et de bas en haut à droite. Ces choix de conception éliminent la nécessité d'écrire du code pour la rotation. Malheureusement, l'absence de code de rotation ne semble pas avoir compensé les longues représentations de forme ou la logique quelque peu compliquée que j'ai utilisée pour calculer les nouvelles hauteurs de colonne.
La rotation est un entier non négatif. 0 = 0 degrés, 1 = 90 degrés, 2 = 180 degrés, 4 = 270 degrés
la source
C # (compilateur interactif Visual C #) , 308 octets
Essayez-le en ligne!
OK - C'était de la folie ... J'ai soumis une réponse qui utilisait des techniques de golf de code banales. Mais quand j'ai vu ce que les autres soumettaient, j'ai réalisé qu'il y avait une meilleure façon.
Chaque
(shape, rotation)
tuple est codé dans un littéral de chaîne C # avec les doublons supprimés. Le processus de codage capture chacune de ces configurations sur 2 octets.La hauteur de mémoire la plus basse sur 3 bits et la largeur de la mémoire suivante sur 3 bits. Étant donné que chacune de ces valeurs n'est jamais supérieure à 4, elles peuvent être lues directement à partir des 3 bits sans aucune conversion. Voici quelques exemples:
Ensuite, chaque colonne est stockée sur 3 bits. La chose la plus utile pour moi de stocker était le nombre de carrés manquants en haut et en bas de la colonne.
Il n'y a jamais plus de 2 carrés manquants en haut ou en bas, et il n'y a jamais plus d'un carré manquant des deux en même temps. Compte tenu de cet ensemble de contraintes, j'ai trouvé le codage suivant:
Étant donné que nous devons tenir compte d'au plus 3 colonnes avec des carrés manquants au-dessus ou au-dessous, nous pouvons coder chaque
(shape, rotation)
tuple en 15 bits.Enfin, les formes en double ont été supprimées. L'exemple suivant montre comment plusieurs
(shape,rotation)
tuples peuvent produire des sorties en double pour la même forme à différentes rotations:Toutes les sorties uniques sont déterminées et enregistrées dans un
byte[]
et converties en un littéral de chaîne C #. Afin de rechercher rapidement où une forme est basée surI
etR
, les 7 premiers octets du tableau consistent en une clé de recherche codée.Ci-dessous, un lien vers le programme que j'ai utilisé pour compresser les morceaux.
Essayez-le en ligne!
Code moins joué et commenté:
la source
Fusain , 98 octets
Essayez-le en ligne! Le lien est vers la version détaillée du code. Prend l'entrée comme un tableau de valeurs [P, R, I], où I est de 0 à 6, R est de 0 o 3 et P est également indexé 0. Explication:
Faites une boucle sur les pièces d'entrée.
Extrayez la description de la pièce et de la rotation en cours. (Voir ci-dessous.)
Extraire la position.
Assurez-vous qu'il y a suffisamment d'espace horizontal pour placer la pièce.
Assurez-vous qu'il y a suffisamment d'espace vertical pour placer la pièce.
Calculez les nouvelles hauteurs des colonnes affectées.
Lorsque toutes les pièces ont été traitées, affichez la liste finale des hauteurs de colonne sur des lignes distinctes.
La chaîne compressée représente la chaîne d'origine
00001923001061443168200318613441602332034173203014614341642430137
. Ici, les2
s sont desI
séparateurs et les1
s sont desR
séparateurs. Les morceaux se décodent donc comme suit:Les
R
valeurs manquantes sont automatiquement remplies de manière cyclique par Charcoal. Chaque chiffre correspond ensuite à deux valeurs, le porte-à-faux et la hauteur totale, selon le tableau suivant:Le porte-à-faux et la hauteur totale se rapportent aux hauteurs de colonne comme suit: Étant donné une pièce que nous voulons placer à une position donnée
e
, il peut être possible de placer la pièce même si l'une des colonnes est plus haute quee
. La quantité d'espace disponible est donnée par le surplomb. La nouvelle hauteur de la colonne après avoir placé la pièce est simplement la position placée plus la hauteur totale.Exemple: Supposons que nous commençons par placer un
5
morceau dans la colonne 1. Puisqu'il n'y a rien d'autre encore, le morceau est donc placé à la position 0 et les colonnes 1 et 3 ont maintenant la hauteur 1 tandis que la colonne 2 a la hauteur 2. Nous voulons ensuite placer un6
morceau avec1
rotation dans la colonne 0. Ici, nous pouvons réellement placer cette pièce à la position 0; bien que la colonne 1 ait une hauteur de 1, la pièce a un surplomb de 1, et donc il y a assez d'espace pour la placer. La colonne 0 se termine par une hauteur de 2 et la colonne 1 se termine par une hauteur de 3.la source