Le jeu vidéo Minecraft consiste à placer et à supprimer différents types de blocs dans le réseau entier 3D qui compose le monde virtuel. Chaque point de réseau peut contenir exactement un bloc ou être vide (un bloc " aérien " officiellement). Dans ce défi, nous ne nous occuperons que d'un seul plan 2D horizontal du monde 3D, et d'un type de bloc: les coffres .
Les coffres permettent aux joueurs de stocker des objets. Lorsque deux coffres sont orthogonalement adjacents dans le même plan horizontal, leurs textures s'unissent et un coffre double avec deux fois la forme se forme. Rien de plus grand qu'un double coffre ne peut être fait; il n'y a pas de coffres triples ni de coffres quadruples.
Un bloc thoracique ne peut être placé dans un point de réseau vide que si ses quatre points adjacents orthogonalement sont tous vides, ou si exactement l'un contient un bloc thoracique qui ne fait pas déjà partie d'un double coffre. Ces règles de placement garantissent qu'il ne peut jamais y avoir d'ambiguïté sur les blocs de poitrine qui se lient pour former des doubles coffres.
Par exemple, supposons qu'il .
s'agit d'un espace vide et d' C
un coffre: (Les chiffres sont également des espaces vides et uniquement à des fins d'identification.)
.......C..
.1.C2.C3..
........5C
.CC4..CC..
..........
- Un coffre peut être placé à l'emplacement 1 car ses 4 voisins sont vides.
- Un coffre peut être placé au point 2 car le coffre voisin ne fait pas (encore) partie d'un coffre double.
- Un coffre ne peut pas être mis en place 3 car il y aurait ambiguïté sur la façon dont le double coffre se forme.
- Un coffre ne peut pas être placé au point 4 car le coffre voisin fait déjà partie d'un coffre double.
- Un coffre peut être placé à l'endroit 5. Le double coffre voisin en diagonale n'affecte rien.
En supposant que la zone au-delà de la grille est vide, changer chaque .
dans la grille en *
si un coffre pourrait y être placé entraîne ceci:
******.C**
***C**C.**
*..***..*C
.CC.*.CC.*
*..***..**
*
Bien sûr, tous les espaces ne peuvent pas être occupés par des coffres en même temps, mais si vous n'aviez qu'un seul coffre, il pourrait être placé dans l'un d'eux.
Défi
Ecrire un programme ou une fonction qui prend une .
et C
grille et change tous .
à un *
si un coffre pourrait être placé là, l' impression ou de retourner la grille résultante.
L'entrée peut provenir de stdin ou d'un fichier ou comme argument de chaîne pour une fonction.
Vous pouvez supposer que l'entrée est bien formée - c'est-à-dire une grille de texte parfaitement rectangulaire, d'au moins 1 caractère de large et de haut, contenant uniquement
.
etC
vous pouvez éventuellement supposer qu'il y a un retour à la ligne après la dernière ligne (et il peut y en avoir un dans la sortie ).Vous pouvez supposer que la disposition des coffres dans l'entrée est conforme aux règles ci-dessus. Il n'y aura jamais d'ambiguïtés sur les coffres qui forment des coffres doubles.
Si vous le souhaitez, vous pouvez utiliser tous les trois distincts ASCII imprimables caractères à la place
.
,C
et*
. Vous ne pouvez pas utiliser autre chose à la place des nouvelles lignes.Tous les coffres sont des coffres normaux. Coffres non piégés ou coffres ender .
Notation
La soumission avec le moins d'octets est gagnante.
Pour un défi lié à Minecraft qui est un peu plus difficile, essayez la détection de portail Nether .
Réponses:
CJam,
82 76 66 62 5854 octetsLe format d'entrée attend
0
une cellule d'air et8
une cellule thoracique. La sortie contient1
pour toutes les cellules qui peuvent être placées avec un coffre.MISE À JOUR :
correction d'un bug. Augmenté de 3 octets :(golfé plus loin :). 4 octets enregistrés grâce à @ Sp3000Exemple d'entrée:
Production:
Je pense que j'ai fini de jouer au golf pour l'instant ...
Explication
Essayez-le en ligne ici
la source
.NET Regex ( rétine ),
434416310 + 1 = 311 octetsAprès le dernier défi auquel j'ai répondu en regex (le défi du portail Nether lié à ce défi), j'ai finalement décidé d'écrire un outil de ligne de commande, qui agit comme un interprète pour les expressions régulières de style .NET, afin que je puisse répondre aux questions avec regex sans être mis au défi qu'ils ne sont pas une langue autonome. Je l'ai nommé Retina.
Maintenant, ce défi ne se prête pas très bien à une soumission regex, mais je devais utiliser Retina maintenant. ;) (De plus, Sp3000 m'a mis au défi de le faire dans le chat.) Voici donc:
Fichier regex
Fichier de remplacement
Le fichier regex est principalement juste le regex, sauf qu'il
`
vous permet de mettre quelques options dans le fichier, dans ce cas simplement le mode multiligne. Lorsqu'on lui donne deux fichiers, Retina assume automatiquement le mode de remplacement complet. Ces deux fichiers définissent un programme qui lit l'entrée de STDIN et imprime le résultat dans STDOUT.Vous pouvez également le tester sur RegexHero et RegexStorm . Le regex fonctionne à la fois avec et sans retour à la ligne et utilise
_
à la place de.
. (Apparemment, RegexStorm a parfois des problèmes s'il n'y a pas de nouvelle ligne de fin, mais RegexHero semble bien gérer les deux cas.)Il y a une horrible quantité de duplication dans l'expression régulière, et j'ai quelques idées pour le raccourcir considérablement ... Je vais essayer un peu plus tard, puis ajouter une explication. En attendant, faites-moi savoir si vous pouvez trouver des entrées qui donnent un mauvais résultat.
la source
J,
7573 octetsUtilise le format de la question, en utilisant
.
/*
/C
pour l'espace / espace utilisable / coffre, respectivement.Edit: corrige un petit bug (j'ai accidentellement utilisé un tore au lieu de traiter correctement l'environnement comme un espace vide).
Explication
la source
C, 193
2 nouvelles lignes inutiles pour plus de clarté. Les changements par rapport au code non golfé incluent: les caractères en tant que codes ascii au lieu des littéraux de caractères; réarrangement de v = 0, strlen et strchr pour enregistrer les caractères (strchr est le plus laid, car cela signifie qu'un calcul qui ne serait autrement effectué qu'une seule fois, est effectué 5 fois par cellule!)
Les fonctions C n'acceptent pas les chaînes comme arguments ou ne les renvoient pas comme valeurs, donc le mieux que je puisse faire est le suivant:
q
est un pointeur vers la chaîne d'entrée. La fonction modifie la chaîne et lorsque la fonction retourne la sortie se trouve dans la chaîne d'origine.Pour résumer les règles:
un carré vide (qui ne contient ni C ni nouvelle ligne) peut être converti s'il a max 1 voisin avec un C
... ET ce voisin n'a pas de voisins avec un C.
La fonction g contient une fonction f qui revient de la profondeur 1 à la profondeur 0. Avec seulement 2 niveaux de récursivité, un simple
f(r,0)
appel récursif fera l'affaire, il n'y a pas besoin def(r,d-1)
!Code non golfé dans le programme de test
La chaîne de test d'entrée est codée en dur.
gets
etscanf
n'acceptera pas une chaîne d'entrée contenant des retours à la ligne; ils le coupent en morceaux à chaque nouvelle ligne.Sortie basée sur l'exemple de question
la source
JavaScript (ES6) 124
129Utilisation des caractères 0 (*), 6 (C), 7 (.)
Non golfé et expliqué
Tester dans la console Firefox / FireBug
Production
la source
Perl, 66
Les conflits de poitrine correspondant à l'expression rationnelle se sont retrouvés sur le côté long, donc pas de concurrence avec CJam cette fois.
Utilise 0 et 2 pour les espaces vides et la poitrine sur l'entrée, 1 pour marquer les taches sur la sortie.
Essayez-le ici .
la source
Python 2 - 281 octets
(Les lignes 8 et 9 sont conçues avec un seul caractère de tabulation, que SE convertit en 4 espaces. Chaque ligne de ce programme a soit 0 soit 1 octet d'espaces en tête.)
Entrée:
0
pour pas de poitrine,2
pour poitrineSortie:
0
pour pas de poitrine,2
pour poitrine existante,1
pour une nouvelle poitrine possibleDieu, c'est horrible. Je dois être sérieusement hors de pratique. J'ai lancé tous les trucs que je connais et il est sorti ... eh bien, il est sorti en 281 octets, perdant à chaque réponse sauf celle en regex , haha. Honnêtement, j'ai l'impression d'avoir bien joué au golf, donc je suppose que mon algorithme était juste loin d'être idéal.
Non golfé:
la source