Étant donné une matrice rectangulaire d'élévations, dessinez ses contours.
Tâche
Deux éléments x
et y
sont au même niveau de contour si floor(x/10) == floor(y/10)
. Par exemple, 52
et 58
sont sur le même niveau de contour, mais 58
et 64
ne sont pas.
L'acte de dessiner des contours est défini comme suit: Pour chaque élément e
, remplacez-le par une chaîne de deux caractères choisie comme suit:
- le premier caractère est
" "
si l'élément cie
- dessous est au même niveau de contour quee
s'il n'y a pas d'élément en dessouse
et"_"
sinon - le deuxième caractère est
" "
si l'élément à droite dee
est au même niveau de contour quee
s'il n'y a pas d'élément à droite dee
et"|"
autrement
Les éléments des lignes sont joints ensemble, puis les lignes sont jointes avec des retours à la ligne.
Exemple
Disons que l'entrée est [[5,20],[3,6]]
, visualisée comme
5 20
3 6
Nous regardons d'abord 5
. Puisque se 3
trouve au même niveau de contour que 5
, le premier caractère est " "
. Puisque 20
n'est pas au même niveau de contour que 5
, le deuxième caractère l'est "|"
.
Maintenant, nous regardons 20
. Puisque 6
n'est pas au même niveau de contour que 20
, le premier caractère l'est "_"
. Puisqu'il n'y a aucun élément à droite de 20
, le deuxième caractère est " "
.
Maintenant, nous regardons 3
. Puisqu'il n'y a aucun élément ci 3
- dessous , le premier caractère est " "
. Puisque 6
est au même niveau de contour que 3
, le deuxième caractère est " "
.
Maintenant, nous regardons 6
. Puisqu'il n'y a aucun élément ci 6
- dessous , le premier caractère est " "
. Puisqu'il n'y a aucun élément à droite de 6
, le deuxième caractère est " "
.
Sur la base de ces chaînes de deux caractères, nous effectuons des remplacements pour obtenir [[" |","_ "],[" "," "]]
. En les joignant ensemble, nous obtenons une sortie de
|_
Règles
- La matrice d'entrée sera toujours rectangulaire et composée d'entiers positifs.
- Les espaces de fin ou les sauts de ligne peuvent être de n'importe quelle quantité (y compris 0) et ne doivent en aucun cas être cohérents.
- Vous n'avez pas à suivre le même algorithme tant que vous produisez les mêmes résultats.
- Votre programme ou fonction peut générer une chaîne, une liste de chaînes séparées par des sauts de ligne ou l'équivalent.
- C'est le code-golf , donc le code le plus court en octets gagne.
Cas de test
input
output
[[1,5,8,9],[3,11,13,8],[7,14,10,9],[4,8,7,6]]
_ _
| |
|_ _|
[[0,10,20,30,40,50,60,70,80,90],[0,0,10,10,20,20,30,30,40,40],[0,0,0,10,10,10,20,20,20,30],[0,0,0,0,10,10,10,10,20,20],[0,0,0,0,0,10,10,10,10,10],[0,0,0,0,0,0,10,10,10,10],[0,0,0,0,0,0,0,10,10,10],[0,0,0,0,0,0,0,0,10,10],[0,0,0,0,0,0,0,0,0,10],[0,0,0,0,0,0,0,0,0,0]]
|_|_|_|_|_|_|_|_|_
|_ |_ _|_ _|_ _
|_ |_ _ |_
|_ |_ _
|_
|_
|_
|_
|_
[[5,5,5,5,5,5,5,5,5,5,5],[5,10,10,10,10,10,10,10,10,10,5],[5,10,15,15,15,15,15,15,15,10,5],[5,10,15,20,20,20,20,20,15,10,5],[5,10,15,20,25,25,25,20,15,10,5],[5,10,15,20,25,30,25,20,15,10,5],[5,10,15,20,25,25,25,20,15,10,5],[5,10,15,20,20,20,20,20,15,10,5],[5,10,15,15,15,15,15,15,15,10,5],[5,10,10,10,10,10,10,10,10,10,5],[5,5,5,5,5,5,5,5,5,5,5]]
_ _ _ _ _ _ _ _ _
| |
| _ _ _ _ _ |
| | | |
| | _ | |
| | |_| | |
| | | |
| |_ _ _ _ _| |
| |
|_ _ _ _ _ _ _ _ _|
[[35,32,29,26,25,25,25,26,29,32,35],[32,28,25,22,20,20,20,22,25,28,32],[29,25,21,18,15,15,15,18,21,25,29],[26,22,18,14,11,10,11,14,18,22,26],[25,20,15,11,7,5,7,11,15,20,25],[25,20,15,10,5,0,5,10,15,20,25],[25,20,15,11,7,5,7,11,15,20,25],[26,22,18,14,11,10,11,14,18,22,26],[29,25,21,18,15,15,15,18,21,25,29],[32,28,25,22,20,20,20,22,25,28,32],[35,32,29,26,25,25,25,26,29,32,35]]
_| |_
_| _ _ _ _ _ |_
_| |_
| _ _ _ |
| | | |
| | | |
| |_ _ _| |
|_ _|
_ |_ _ _ _ _| _
|_ _|
| |
Réponses:
Perl 6 , 135 octets (131 caractères)
Essayez-le en ligne!
Légèrement non golfé:
Explication : Tout d'abord, nous définissons une variable
$n
(ligne 2) et une fonctionw
(ligne 3). Cette fonction renvoie un espace si ses deux arguments sont à la même "élévation", et le contenu de la variable$n
sinon. Au lieu de diviser par 10 et parquets, nous abusons du fait que les nombres entiers sontCool
(peuvent être traités comme des chaînes) et utiliséschop
pour supprimer le dernier caractère (= chiffre). Ensuite, nous les soustrayons calmement, les forçant à nouveau en nombres :—).Après cela (ligne 4), nous créons une fonction
q
qui prend une liste et retourne cette liste avec le premier élément supprimé et le dernier élément dupliqué.Sur les 3 lignes suivantes, nous allons créer 2 matrices supplémentaires à partir de la matrice d'entrée: la première a la première ligne manquante et la dernière ligne dupliquée (c'est juste
.&q
- en utilisant.&
, vous pouvez appeler une fonction sur n'importe quoi comme si elle était une méthode - la chose devant le point est alors le premier argument), l'autre a la première colonne manquante et la dernière colonne dupliquée (c'est.map(*.&q)
).Tout d'abord (ligne 4), nous prenons la matrice d'origine
$_
, la "superposons" avec la matrice "lignes décalées" et utilisons la fonctionw
comme un opérateur binaire (c'est ça[&w]
) sur les éléments correspondants. Celui-là met un_
partout où les éléments correspondants sont sur les différentes élévations, et unautre. On obtient donc la moitié du résultat (uniquement les "premiers caractères").
À la ligne 6, nous faisons la même chose, mais nous passons d'abord
$n
à|
, et nous «superposons» maintenant la matrice d'origine avec la matrice à colonnes décalées. Le résultat a une altitude|
différente etla même. Ce sont les "seconds caractères".
Maintenant, nous les combinons simplement. On zippe les tableaux avec un zip avec un enchaînement (ouais ...), ce qui se traduit par une matrice de la forme originale dont chaque élément est les 2 éléments correspondants des "demi-solutions" concaténées. Enfin, nous cartographions simplement cette matrice (qui est en réalité une liste de listes). Chacune de ces listes est aplatie puis mise à jour
say
(imprimée avec une nouvelle ligne). Puisqu'ilsay
peut prendre n'importe quel nombre d'arguments et qu'il les imprime tous sans séparateurs, faisant la nouvelle ligne uniquement à la fin, nous obtenons l'image souhaitée sur stdout. (Et le bloc renvoie une liste deTrue
s (chacun ensay
retourne unTrue
), mais peu importe.)la source
but who cares
Gelée ,
25 2322 octets-1 octet grâce aux miles (
I
vectorise)Un programme complet imprimant le résultat. En tant que lien monadique, il prend une liste de listes de nombres, les élévations et renvoie une liste de listes, mais ces "lignes" sont constituées de listes de "paires" de deux caractères - si cela est correct, 1 octet peut être enregistré en supprimant
Y
.Essayez-le en ligne!
Comment?
la source
⁵
vous sauve un de suite ...:⁵I;€0ao⁶
au lieu du lien principalZç”_Zż"ç”|$Y
I
ne vectoriserais pas comme ça.I
vectorise en profondeur 1, et les deuxa
eto
vectorise en profondeur 0Python 2 ,
199186157155 octetsEssayez-le en ligne!
la source
Gelée , 24 octets
Essayez-le en ligne!
Explication
-2 octets grâce à Jonathan Allan
la source
Y
- elle renverra une liste de listes de caractères, ce qui, je pense, est OK (alors que le mien a des paires à l'intérieur des "lignes").Python 2 , 226 octets
Essayez-le en ligne!
Ouf, c'était un peu compliqué de trouver la logique. Je vois maintenant Hyper Neutrino ninja'd avec une réponse plus courte mais j'ai consacré trop de temps à cela pour ne pas le publier. : P
De plus, je peux simplement dire que c'est une excellente façon de créer de l'art ASCII. Excusez-moi pendant que j'en fais encore plus.
la source
enumerate
au lieu d'utiliser deux fois le nom complet.enumerate
(obs, j'ai dû supprimer certaines entrées pour pouvoir le lier ici)J, 58 octets
Essayez-le en ligne!
Une fonction anonyme qui prend une matrice et sort les contours.
Beaucoup de choses à améliorer ici. Je n'ai pas eu le temps d'essayer tous les cas de test, alors faites-moi savoir s'il y a des problèmes. J'essaierai de jouer au golf plus et expliquerai plus tard.
(Rapide) Explication
Fonction d'assistance: indexe dans une chaîne de longueur 2 selon que le premier élément d'un tableau de 2 longueurs est égal au second. S'il est égal, il indexe dans l'élément zéro, s'il est inégal, il indexe dans le premier. Un tableau de 1 longueur indexe toujours l'élément zéro de la chaîne.
Fonction principale
1:+<.@%&10
planchers chaque élément divisé par 10 et ajoute 1 (donc nous n'obtiendrons jamais 0 - c'est important pour la fonction d'assistance).2 2((' _'f{."1),' |'f{.);.3
coupe la matrice en 2 x 2 segments si elle le peut (sinon cela donnera un segment 2 x 1, 1 x 2 ou 1 x 1 près des bords) et applique la fonction qui utilisef
pour comparer l'élément supérieur gauche au sommet à droite et l'élément en haut à gauche en bas à gauche.(,/"2)
aplatit le résultat dans la forme souhaitée. Je pense vraiment que je devrais pouvoir éviter d'avoir à utiliser cela (et beaucoup d'autres choses, mais je m'égare).la source
J ,
4645 octetsEssayez-le en ligne!
la source
JavaScript (ES6),
120118 bytesOù
\n
représente le caractère de nouvelle ligne littéral. Edit: sauvé 2 octets grâce à @ Bálint.la source
(a[i] || [])[j]
constructions en(a[i] || 0)[j]
join`\n`
vous pouvez supprimer la\n
pièce et la remplacer par une nouvelle ligne réellea=>a.map(b=>b.map(c=>c/10|0)).map((b,i,a)=>b.map((c,j)=>" _"[(a[i+1]||0)[j]-c&1]+" |"[b[j+1]-c&1]).join``).join`<new line here>`
\n
partie; Je teste dans un REPL pour que les nouvelles lignes littérales gênent.Proton , 202 octets
Essayez-le en ligne!
-2 octets grâce à Jonathan Frech
-15 octets en passant à Proton au lieu de Python 2
la source
len
avecL
et la définitionL=len;
.Java 8,
200170169 octetsExplication:
Essayez-le ici.
Notez que la division entière en Java est automatiquement mise en plan.
la source
R, 159 octets
Avec des nouvelles lignes et des indentations:
Est-ce que la division entière de la matrice, mesure les différences entre les lignes et les colonnes, et lorsqu'elle n'est pas nulle, remplace par
|
et_
respectivement, puis colle à la fois (indolore, grâce à la vectorisation de R) et les sorties.Cas de test:
la source
Perl 5 ,
130126 octets124 octets de code + 2 pour les
-ap
drapeauxEssayez-le en ligne!
Le format d'entrée est une grille 2D de nombres séparés par des espaces.
Explication
Ceci provient d'une précédente itération du code.
la source