Défi:
Vous recevrez une image ASCII d'un tas de poids en entrée, et vous devrez sortir le poids combiné du tas.
Format:
Il existe 5 poids différents, pesant 1, 2, 5, 10, 20 passagers (ou une autre unité arbitraire).
Les poids ressemblent à ceci, dans l'ordre croissant:
1: __
|__|
2: ______
|______|
5: ______
| |
|______|
10: ______________
| |
|______________|
20: ____________________
| |
|____________________|
Les pesées seront placées symétriquement (comme dans l'image d'exemple), pas nécessairement dans un ordre trié. Les pesées partageront les limites, le cas échéant:
Cas de test:
Vous pouvez également utiliser tous les poids uniques comme cas de test.
__
_|__|_
|______|
| |
|______|
1 + 2 + 5 = 8
____________________
| |
|____________________|
| |
|______________|
_|__|_
|______|
| |
|______|
20 + 10 + 1 + 2 + 5 = 38
______
|______|
|______|
|______|
|______|
2 + 2 + 2 + 2 = 8
Règles supplémentaires:
- Vous ne pouvez pas supposer d’espaces de début supplémentaires. Le poids le plus important sera tout le chemin vers la gauche.
- Vous pouvez supposer des espaces de fin et des retours à la ligne.
- Vous pouvez supposer qu'il y aura au maximum 10 poids
- Vous pouvez prendre l'entrée sur un format facultatif, mais vous ne pouvez pas remplacer les caractères utilisés par autre chose
Il s'agit de code-golf, donc le code le plus court en octets de chaque langue gagne. Les explications sont encouragées comme toujours.
Réponses:
Gelée ,
2423 octetsEssayez-le en ligne!
Comment?
Les poids peuvent être identifiés par leurs largeurs et hauteurs. Les largeurs peuvent être mesurées en regardant la distance entre les
|
caractères de la ligne . Si nous supprimons d'abord tous les espaces, ces poids de hauteur deux contribueront à une telle ligne avec une largeur mesurée de un.Les différents poids ont des largeurs de
3, 7, 7, 15, 21
(pour les poids1, 2, 5, 10, 20
respectivement). En ajoutant un suivi1
pour ceux de la hauteur deux, nous trouvons la[3],[7],[7,1],[15,1],[21,1]
conversion de binaire ce sont3,7,15,31,43
, l'entier divisé par trois nous donne1,2,5,10,14
, qui sont les poids sauf les14
besoins remplacés par20
.Vous pouvez également remplacer les largeurs mesurées de
21
avec30
avant la conversion en utilisant“ßœ‘y
:la source
Python 2 , 77 octets
Essayez-le en ligne!
[i/21, i%21, ' _'[i<50] for i in [23,48,69,224,440]]
générera les triplets suivants[1, 2, '_'], [2, 6, '_'], [3, 6, ' '], [10, 14, ' '], [20, 20, ' ']
qui représentent le poids, la longueur et le caractère dans la base de chaque poids, qui seront utilisés pour faire une représentation unique sur une seule ligne de chaque poids.Étant donné que le 3e poids chevaucherait le 2e, je remplace sa base par son corps (
_
->) et réduit la valeur à
3
(il comptera la base comme2
et le corps comme3
, résultant en5
)la source
Retina 0.8.2 , 60 octets
Essayez-le en ligne! Explication: Les
|
s sont remplacés par des!
s pour faciliter l'appariement, puis les poids sont convertis en unaires et totalisés. La seule partie intéressante est que le5
poids est considéré comme la somme de a2
et d'un3
poids, tandis que les poids10
et ne20
sont que deux lignes de la moitié du poids.la source
JavaScript (Node.js) , 73 octets
Essayez-le en ligne!
la source
Python 3 , 76 octets
Essayez-le en ligne!
Comment?
la source
Je suis sûr qu'il y a des améliorations à apporter, mais c'est ce que j'ai en ce moment:
Groovy, 131 octets
def f(s){s.split('\n').sum{n=0;[2:1,6:2,14:5,20:10].each{k,v->if(it==~".*\\|[ _]{$k}\\|.*"){n=v+(!it.contains('_')&&k==6?1:0)}};n}}
Convertit l'entrée
String
en aCollection<String>
puis additionne les résultats de chaque ligne pour obtenir le total. Utilise unMap
où la clé est le nombre d'espaces ou de traits de soulignement entre les caractères de canal et la valeur est le montant correspondant des passagers. La clé est branchée sur l'expression régulière pour déterminer si la ligne correspond à un motif significatif. La seule mise en garde est le ternaire pour ajouter 1 dans le cas où la longueur de la sous-chaîne entre les tuyaux est de 6 et est composée d'espaces (par opposition aux traits de soulignement). Si aucun motif ne correspond, la ligne a une valeur de 0.la source
Perl 6 , 57 octets
Essayez-le en ligne!
la source