Cartes thermiques
Prenons une pièce rectangulaire, au plafond de laquelle se trouve une caméra thermique pointant vers le bas. Dans la pièce, il existe un certain nombre de sources de chaleur d'intensité 1-9
, la température de fond étant 0
. La chaleur se dissipe de chaque source, chutant d'une unité par pas (non diagonal). Par exemple, la 20x10
pièce
...........1........
....................
...8................
..5...............2.
....................
.1..................
................1...
.................65.
....................
............2.......
contient 9 sources de chaleur, et le gradient de température indiqué par la caméra thermique est
34565432100100000000
45676543210000000000
56787654321000000110
45676543210000001221
34565432100000012321
23454321000000123432
12343210000001234543
01232100000012345654
00121000000011234543
00010000000121123432
Sous forme graphique, cela pourrait ressembler à ceci:
Du gradient, nous pouvons déduire les positions et les intensités de certaines sources de chaleur, mais pas toutes. Par exemple, tous les 9
s peuvent toujours être déduits, car ils ont la température maximale, et il en va de même 8
dans ce cas, car il produit un maximum local dans le gradient. La 2
proximité de la frontière droite peut également être déduite, même si elle n'est pas au maximum local, car elle n'en a pas d'autre 2
comme voisin. Les 5
s, en revanche, ne sont pas déduits, car leur chaleur pourrait aussi bien être produite par les sources les plus intenses à proximité. Les 0
s sont connus pour ne contenir aucune source de chaleur, mais toutes les autres tuiles peuvent potentiellement en contenir une. Notons les tuiles incertaines par des tirets-
, certaines sources de chaleur par les chiffres correspondants, et certains espaces vides par périodes .
:
---------..1........
----------..........
---8-------......--.
----------......--2-
---------......-----
--------......------
-------......-------
.-----......-----6--
..---.......--------
...-.......-2-------
Votre tâche sera de produire ce modèle inféré à partir du gradient de température.
Règles
L'entrée vous est donnée sous la forme d'une chaîne délimitée par des sauts de ligne ou des tuyaux verticaux |
, selon ce qui est le plus pratique, et la sortie doit être de la même forme. Il peut y avoir un délimiteur de fin dans l'entrée et / ou la sortie, mais aucun précédent. La taille de l'entrée peut varier, mais sa largeur et sa hauteur sont toujours au moins 4
. Les fonctions et les programmes complets sont acceptables. Le nombre d'octets le plus bas l'emporte et les failles standard sont interdites.
Cas de test supplémentaires
Contribution:
898778765432100
787667654321100
677656543211210
678765432112321
567654321123210
qui ressemble à ceci sous forme graphique:
Sortie:
-9---8-------..
-------------..
--------------.
--8---------3--
-----------3--.
Contribution:
7898
8787
7676
6565
Sortie:
--9-
8---
----
----
Contribution:
00001
00000
00000
10000
Sortie:
....1
.....
.....
1....
Réponses:
CJam,
73 69 6255 octetsMISE À JOUR : Nouvel algorithme. Des améliorations plus courtes et plus nombreuses
Comment ça marche
La logique est similaire à l'algorithme ci-dessous, mais ici je ne vérifie pas les 4 voisins en une seule itération. Au lieu de cela, j'utilise une approche plus petite pour parcourir toutes les lignes et colonnes dans les deux directions. Voici les étapes à suivre:
.
ou-
.Voici un exemple exécuté sur une petite entrée:
Après la première étape:
Après la deuxième étape:
Après le dernier mappage sur un seul caractère, sortie finale:
Explication du code :
Essayez-le ici
Une approche plus ancienne
Comment ça marche
La logique est simple, parcourez la grille et voyez si la valeur actuelle est supérieure ou égale aux quatre voisins restants - haut, bas, gauche et droite. Transformez ensuite la valeur actuelle sur la base de la règle ci-dessus et si la valeur est égale à 0, faites-la "." .
Explication du code
Essayez-le en ligne ici
la source
JavaScript (ES6) 99
Tester dans la console Firefox / FireBug
Sortie
la source
Python 2: 154 octets
L'entrée doit être de la forme
"00001\n00000\n00000\n10000"
.La conversion d'une chaîne en matrice 2D est assez longue en Python. Je garde donc le format de chaîne d'origine. J'énumère sur l'entrée,
i
est l'index,v
est le char (Enfin, énumère les octets enregistrés dans une solution de golf !!). Pour chaque paire,(i,v)
je calcule le bon caractère de sortie et je les rejoins. Comment choisir le bon caractère de sortie? Siv == '\n'
, le caractère de sortie est\n
, ilv == '0'
, que le caractère de sortie est'.'
. Sinon, je teste les 4 voisins dev
, qui sontb[i-b.index('\n')-1]
(ci-dessus),b[i-1]
(gauche,b[i+1]
(droite) etb[i+b.index('\n')+1]
(dessous), s'ils le sont<= v
et choisissez le caractère'-'
ouv
. Ici, je compare les caractères et non les nombres, mais cela fonctionne très bien, car les valeurs ascii sont dans le bon ordre. Il n'y a pas non plus de problèmes, sib[i-1]
oub[i+1]
égaux'\n'
, carord('\n') = 10
.Pyth:
6158Plus ou moins une traduction du script Python. Assez moche ;-)
Essayez-le en ligne: Pyth Compiler / Executor Même format d'entrée que la solution Python.
la source
Perl,
77, 75, 7270Astuces d'appariement regex 2d standard.
Exemple:
Essayez-le ici
la source
Java,
307,304,303,299298C'est à coup sûr un défi "parfait" pour certains Java Codegolf :)
Entrée (méthode du tube '|'):
Sortie:
la source
char[]r=a[0].replace("|", <--here"").toCharArray()
.APL, 92
Exemple:
la source
Rubis 140
Rien de spécial; il suffit de parcourir la carte et de comparer la valeur actuelle avec la valeur des quatre voisins.
Exécutez-le en ligne avec des tests: http://ideone.com/AQkOSY
la source
R, 223
À propos du meilleur que je puisse trouver pour le moment. Le traitement de la chaîne coûte assez cher. Je pense qu'il y a place à amélioration, mais je ne le vois pas pour le moment
Résultat du test
la source
J - 69 octets
Exemples:
PS:
(0 : 0)
c'est la manière J standard de spécifier les chaînes. Vous pourriez aussi bien utiliser des|
chaînes délimitées (avec une fin|
).la source
Excel VBA - 426
Ce sera une occasion rare que VBA gagne des jeux de golf à code, mais comme c'est ce que j'utilise le plus, c'est amusant de jouer avec. La première ligne est un boîtier de bord qui a rendu cela plus long qu'il n'y paraît.
Le nombre n'inclut pas l'espace blanc de la ligne initiale.
J'ai joué avec l'idée d'envoyer l'entrée sur une feuille et de travailler à partir de là, mais je pense que boucler la chaîne passée caractère par caractère enregistre le code.
Appel depuis la fenêtre immédiate:
Sortie (dans une fenêtre):
la source
Perl - 226
Vous pouvez l'essayer sur ideone . Si quelqu'un est intéressé par une explication, faites-le moi savoir.
la source
Haskell - 193
f
est une fonction qui prend une chaîne sous la forme0001\n0000\n0000\n1000
et renvoie la chaîne requise.g
est une fonction qui prend une liste de listes de caractères et retourne une liste de listes de ((gauche, haut), ceci, (droite, bas)).la source