Wyzwanie:
Otrzymasz obraz ASCII stosu ciężarów jako dane wejściowe i musisz podać łączną wagę stosu.
Format:
Istnieje 5 różnych wag, o wadze 1, 2, 5, 10, 20 passerees (lub inna dowolna jednostka).
Odważniki wyglądają następująco, w porządku rosnącym:
1: __
|__|
2: ______
|______|
5: ______
| |
|______|
10: ______________
| |
|______________|
20: ____________________
| |
|____________________|
Wagi zostaną umieszczone symetrycznie (jak na przykładowym obrazie), niekoniecznie w posortowanej kolejności. Wagi mają wspólne granice, w stosownych przypadkach:
Przypadki testowe:
Możesz użyć wszystkich pojedynczych wag również jako przypadków testowych.
__
_|__|_
|______|
| |
|______|
1 + 2 + 5 = 8
____________________
| |
|____________________|
| |
|______________|
_|__|_
|______|
| |
|______|
20 + 10 + 1 + 2 + 5 = 38
______
|______|
|______|
|______|
|______|
2 + 2 + 2 + 2 = 8
Dodatkowe zasady:
- Być może nie zakładamy dodatkowe spacje. Największa waga będzie aż do lewej.
- Możesz założyć końcowe spacje i znaki nowej linii.
- Możesz założyć, że będzie maksymalnie 10 ciężarków
- Możesz wziąć dane wejściowe w opcjonalnym formacie, ale nie możesz zastąpić znaków używanych przez coś innego
Jest to kod-golf, więc wygrywa najkrótszy kod w bajtach dla każdego języka. Wyjaśnienia są zachęcane jak zawsze.
Odpowiedzi:
Galaretka ,
2423 bajtyWypróbuj online!
W jaki sposób?
Wagi mogą być identyfikowane na podstawie ich szerokości i wysokości. Szerokość można zmierzyć, patrząc na odległość między
|
znakami linii . Jeśli najpierw usuniemy wszystkie spacje, wówczas odważniki o wysokości dwa wniosą taką linię o zmierzonej szerokości jeden.Różne ciężary mają szerokości
3, 7, 7, 15, 21
(1, 2, 5, 10, 20
odpowiednio dla ciężarków ). Dodając znak końcowy1
dla tych o wysokości dwóch,[3],[7],[7,1],[15,1],[21,1]
przekonwertujemy, że są to wartości binarne3,7,15,31,43
, liczba całkowita podzielona przez trzy daje nam1,2,5,10,14
, które są wagami, z wyjątkiem14
potrzeb zastąpienia20
.Można wymienić zmierzonych szerokości
21
z30
przed konwersją pomocą“ßœ‘y
:źródło
Python 2 , 77 bajtów
Wypróbuj online!
[i/21, i%21, ' _'[i<50] for i in [23,48,69,224,440]]
wygeneruje następujące trojaczki,[1, 2, '_'], [2, 6, '_'], [3, 6, ' '], [10, 14, ' '], [20, 20, ' ']
które reprezentują wagę, długość i znak w podstawie każdej wagi, które zostaną wykorzystane do utworzenia unikatowej reprezentacji pojedynczej linii dla każdej masy.Ponieważ trzeci ciężar nakłada się na drugi, zastępuję jego podstawę ciałem (
_
->) i zmniejszam wartość do
3
(policzy bazę jako2
i ciało jako3
, w wyniku czego5
)źródło
Retina 0.8.2 , 60 bajtów
Wypróbuj online! Objaśnienie: Litery
|
s są zastępowane literami!
s w celu ułatwienia dopasowania, a następnie wagi są przeliczane na jednostkowe i sumowane. Jedyną interesującą częścią jest to, że5
waga jest uważana za sumę2
ai3
wagi, podczas gdy wagi10
i20
to tylko dwie linie połowy masy.źródło
JavaScript (Node.js) , 73 bajty
Wypróbuj online!
źródło
Python 3 , 76 bajtów
Wypróbuj online!
W jaki sposób?
źródło
Jestem pewien, że należy wprowadzić pewne ulepszenia, ale w tej chwili mam to:
Groovy, 131 bajtów
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}}
Konwertuje dane wejściowe
String
na a,Collection<String>
a następnie sumuje wyniki dla każdego wiersza, aby uzyskać sumę. UżywaMap
gdzie klucz to liczba spacji lub znaków podkreślenia między znakami potoku, a wartość jest odpowiednią liczbą passerees. Klucz jest podłączony do wyrażenia regularnego, aby ustalić, czy linia pasuje do znaczącego wzorca. Jedynym zastrzeżeniem jest trójskładnikowe dodanie 1 w przypadku, gdy długość podciągu między rurami wynosi 6 i składa się ze spacji (w przeciwieństwie do podkreślników). Jeśli żaden wzorzec nie pasuje, linia ma wartość 0.źródło
Perl 6 , 57 bajtów
Wypróbuj online!
źródło