introduction
Dans ce défi, vous recevez en entrée la représentation ASCII du réseau (surface dépliée) d'un cuboïde rectangulaire (zone 3D). Le format est le suivant:
....+--+.......
....|##|.......
....|##|.......
....|##|.......
+---+--+---+--+
|###|##|###|##|
+---+--+---+--+
....|##|.......
....|##|.......
....|##|.......
....+--+.......
Chaque face du cuboïde est un rectangle de #
s entouré de +-|
caractères. L'extérieur du filet est rempli de .
s. Le filet aura toujours la même orientation: il y a une face médiane entourée de ses quatre faces voisines et la contrepartie de la face médiane est située à la droite de l'entrée. L'entrée est complétée avec .
s en une forme rectangulaire et ne contiendra pas de lignes ou de colonnes supplémentaires de .
s.
La tâche
Votre tâche consiste à prendre en entrée un diagramme comme ci-dessus et à calculer le volume du cuboïde qu'il représente, qui est simplement le produit de sa hauteur, de sa largeur et de sa profondeur. Vous pouvez prendre l’entrée sous la forme d’une chaîne délimitée par une ligne ou d’un tableau de chaînes.
La longueur de chaque bord est la distance entre les +
caractères à ses deux extrémités. Par exemple, le bord horizontal +--+
a une longueur de 3 et le bord vertical
+
|
|
|
+
a une longueur de 4. La longueur minimale d’une arête est de 1. Le cuboïde exemple ci-dessus a un volume de 2 * 3 * 4 = 24.
Règles et notation
Vous pouvez écrire un programme complet ou une fonction, et le nombre d'octets le plus faible gagne.
Cas de test
.++..
+++++
+++++
.++..
1
...++....
...||....
...||....
+--++--++
+--++--++
...||....
...||....
...++....
3
..+-+....
..|#|....
+-+-+-+-+
|#|#|#|#|
|#|#|#|#|
+-+-+-+-+
..|#|....
..+-+....
12
.+---+.....
++---++---+
||###||###|
||###||###|
||###||###|
++---++---+
.+---+.....
16
....++.....
....||.....
....||.....
....||.....
+---++---++
|###||###||
|###||###||
|###||###||
+---++---++
....||.....
....||.....
....||.....
....++.....
16
...+--+......
...|##|......
...|##|......
+--+--+--+--+
|##|##|##|##|
+--+--+--+--+
...|##|......
...|##|......
...+--+......
18
....+--+.......
....|##|.......
....|##|.......
....|##|.......
+---+--+---+--+
|###|##|###|##|
+---+--+---+--+
....|##|.......
....|##|.......
....|##|.......
....+--+.......
24
....+-----+..........
....|#####|..........
....|#####|..........
....|#####|..........
+---+-----+---+-----+
|###|#####|###|#####|
|###|#####|###|#####|
|###|#####|###|#####|
|###|#####|###|#####|
+---+-----+---+-----+
....|#####|..........
....|#####|..........
....|#####|..........
....+-----+..........
120
Réponses:
Rétine ,
29 à28 octetsEssayez-le en ligne!
Il y a beaucoup de façons d'aborder cela dans Retina, en fonction de la zone que vous voulez multiplier avec quel côté, alors je ne suis pas sûr que ce soit optimal, mais en réalité, il est déjà beaucoup plus court que je ne le pensais.
J'ai actuellement deux autres solutions au même nombre d'octets qui semblent un peu plus faciles à jouer que l'approche ci-dessus:
Bien que dans ceux-ci, je pourrais sauvegarder un octet chacun si je suppose que l'entrée se termine par un retour à la ligne final, mais je préfère ne pas avoir à me fier à cela.
Et un autre, toujours à 28 octets (celui-ci multiplie en réalité trois côtés au lieu de multiplier une zone par un côté):
Explication
L'idée principale est de multiplier la surface du visage par la longueur du côté vertical qui touche le bord de la longueur de l'entrée.
Je prendrai comme exemple l'entrée suivante (elle a les longueurs de côtés 2, 3 et 4, donc une surface de 24):
Étape 1: Translittérer
La regex
\G\..+¶
correspond à une ligne qui commence par.
et est immédiatement adjacente à la ligne précédente. Donc, cela correspond à toutes les lignes qui contiennent la face supérieure. La scène elle-même se transforme.
enx
et tous les autres personnages (n'importe lequel|+-#
) eny
. Cela nous donne le résultat suivant:Cela a une colonne de plus
y
que ce dont nous avons besoin pour représenter la zone de la face supérieure. Nous corrigeons cela à la prochaine étape.Étape 2: remplacer
Nous faisons donc correspondre un
y
qui est précédé d'unx
(ce qui est exactement l'un d'entre eux par ligne) et les supprimons tous les deux de la chaîne. Nous obtenons ceci:Nous avons maintenant la partie supérieure représentée par le nombre de
y
s.Étape 3: remplacer
Notre objectif ici est de multiplier cette zone
A
par la longueur de côté manquante, qui correspond au nombre situé|
au début d'une ligne plus 1. Toutefois, il est en fait plus facile de multiplier par un nombren+1
car nous avons déjà une copie deA
la chaîne. . Si nous remplaçons lesn
choses parA
, nous nous retrouvons avec desn+1
copies deA
. Cela facilite beaucoup les choses pour nous.Nous remplaçons donc simplement tout
|
immédiatement après un saut de ligne par tout ce qui se trouve devant le match. Cela altère beaucoup la chaîne et la rend un peu plus large que nécessaire, mais le nombre dey
s finit par être le résultat recherché:Étape 4: match
Il ne reste plus qu'à compter le nombre de
y
s, qui est imprimé sous forme de nombre décimal à la fin.la source
Python 2, 57 octets
Une fonction qui prend une liste de chaînes.
Détermine les 3 dimensions séparément:
l[0].find('+')
L'index du premier
+
dans la première ligne.-~l[0].count('-')
Le nombre de
-
signes dans la première rangée.~`l`.count("'|")
Le nombre de lignes commençant par
|
symbole, via la représentation sous forme de chaîne de la liste précédée d'un symbole de citation.62 octets:
Une fonction qui prend une liste de chaînes et imprime le résultat.
Trouve une dimension en
a
tant qu'index de+
dans la première ligne. On en déduit les deux autres dimensions et la largeur et la hauteur du rectangle en entrée.Une alternative de 63 octets, trouvant les dimensions séparément:
la source
Bash + coreutils,
83, 77 octetsEDITS:
Golfé
A expliqué
Transformer avec sed :
Débarrassez-vous des newlines en utilisant des backticks, ajoutez)
Transmettre l'expression résultante à bc
Tester
Essayez-le en ligne! (utilise le développement arithmétique bash au lieu de bc , ce dernier n'étant pas disponible)
la source
Escargots , 19 octets
Essayez-le en ligne.
L'idée est que nous commençons quelque part sur le bord droit du filet, puis que nous allions quelque part dans le bas de la face. La longueur du bord et la surface de la face sont multipliées par le mécanisme de comptage de tous les chemins correspondants.
la source
JavaScript (ES6), 67
91Tester
la source
Ruby, 44 ans
Fonctionne sur le même principe que d'autres réponses: trouver le premier
+
pour trouver la profondeur, trouver le suivant.
après le+
pour trouver la largeur, compter le nombre de|
en bout de ligne et ajouter 1 pour trouver la hauteur.programme non testé
la source
05AB1E , 21 octets
Laisser
W
etH
être respectivement la largeur et la hauteur de l'entrée - pas la boîte. Ensuite, les dimensions de la boîteA
,B
etC
respecter les règles suivantes:Le montre la figure de ce qui suit
A
,B
etC
sont, en termes de noms de bord:D'où les formules ci-dessus. Ce programme calcule de
A
, les valeurs de déduitB
etC
et enfin calcule leur produit.Essayez-le en ligne!
Version précédente - Approche différente - 26 octets
la source
Befunge 93 , 56 octets
Essayez-le en ligne!
Explication:
Le volume de la boîte peut être calculé en multipliant le nombre de
.
s sur la première ligne avant tout autre caractère, le nombre de+
et-
s sur la première ligne - 1, et le nombre de lignes commençant par a|
+ 1.Je devais déplacer les lignes IP vers le haut plutôt que vers le bas pour utiliser la verticale si dans la 3ème ligne. Si l'adresse IP descendait, la verticale if forcerait le haut de la pile à 1 lorsque vous frappez l'horizontale suivante, en l'envoyant dans la mauvaise direction.
la source
Haskell,
6456 octetsEssayez-le en ligne!
Explication
L'entrée doit être une liste de chaînes pour chaque ligne. Par conséquent, la première ligne
f
du paramètrex
etr
une liste des lignes restantes figurent dans le paramètre .fst(span(>'+')x)
renvoie le.
préfixe de la première ligne sous forme de chaîne, de même quelength(fst(span(>'+')x))
la première dimensiond1
.['-' | '-' <- x]
renvoie une chaîne de tout-
dans la première ligne,1 + length['-' | '-' <- x]
générant ainsi la deuxième dimensiond2
.|
dans la première ligne peut être compté, de même que1 + length['|' | '|':_ <- r]
la troisième dimensiond3
.Les listes de compréhension de 2. et 3. peuvent être réduites à
1+sum[1|'-'<-x]
et1+sum[1|'|':_<-r]
en construisant une liste de celles pour chaque occurrence de '-' ou '|' et ensuite prendre la somme. Nous pouvons continuer à mettre l'extérieur1+
en annexant dans la compréhension de la liste-
àx
et"|"
àr
cédersum[1|'-'<-'-':x]
etsum[1|'|':_<-"|":r]
. Nous pouvons maintenant combiner les deux types de compréhension de liste en les mettant dans la même compréhension: De manièresum[1|'|':_<-"|":r,'-'<-'-':x]
pratique, le produit des deux dimensions est calculé car, pour les listesF
etG
la liste suivante, la compréhension est le produit cartésienF x G =[(a,b)|a<-F,b<-G]
.Enfin, au lieu de multiplier 1. avec la combinaison de 2. et 3., nous pouvons utiliser l'
>>
opérateur sur les listes:F>>G
répète lesG
length F
temps et concatène le résultat. Donc ,fst(span(>'+')x)>>[1|'|':_<-"|":r,'-'<-'-':x]
répète la liste desd2*d3
onesd1
fois, ce qui donne une liste ded1*d2*d3
ceux qui sont ensuite additionnés pour obtenir le volume.la source
lines
.Java 8,
185129 octetsmerci à Zgarb pour -56 octets
joué au golf:
ungolfed:
Explication
a*b*h = ((length_of_line-2*h-1)/2)*(number_of_lines-2*h-1)*h
où
a
etb
sont les dimensions de la base eth
est la hauteur. Vous pouvez trouverh
en comptant les premièresh
lignes où vous commencez par un.
.la source
Java, 112 octets
Étendu:
la source
Powershell,
68 à67 octetsNote:
"$args"|% i*f +
est un raccourci pour"$args".indexOf('+')
Explication
Bonne explication tirée de la réponse d'Osable :
Laisser
W
etH
être respectivement la largeur et la hauteur de l'entrée - pas la boîte. Ensuite, les dimensions de la boîteA
,B
etC
respecter les règles suivantes:Le montre la figure de ce qui suit
A
,B
etC
sont, en termes de noms de bord:Et
C
est la position du premier+
dans la première ligne de l'entrée.Script de test:
Sortie:
la source
Wolfram Language (Mathematica) , 64 octets
Essayez-le en ligne!
Utilise le nombre de
.
,|
et\n
caractères dans l’entrée à résoudre pour le volume. Cela semble stupide car il y a une nouvelle ligne à la place de\n
.Si
A
,B
etC
sont les côtés, alors. = 2C(A+2C)
,| = 5B+4C-9
et\n = B+2C
, afin que nous puissions résoudre le volumeABC
en termes de ces trois nombres de caractères.la source