Kupa ciężarów

13

Wyzwanie:

Otrzymasz obraz ASCII stosu ciężarów jako dane wejściowe i musisz podać łączną wagę stosu.

wprowadź opis zdjęcia tutaj

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 więc wygrywa najkrótszy kod w bajtach dla każdego języka. Wyjaśnienia są zachęcane jak zawsze.

Stewie Griffin
źródło
Twoje wyzwanie zainspirowało mnie do napisania tego . Wszelkie wskazówki są mile widziane!
tgrass12

Odpowiedzi:

7

Galaretka ,  24  23 bajty

ḟ⁶Ỵẹ€”|IFṚ’œṗ$Ḅ:3“ÇÞ‘yS

Wypró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, 20odpowiednio dla ciężarków ). Dodając znak końcowy 1dla tych o wysokości dwóch, [3],[7],[7,1],[15,1],[21,1]przekonwertujemy, że są to wartości binarne 3,7,15,31,43, liczba całkowita podzielona przez trzy daje nam 1,2,5,10,14, które są wagami, z wyjątkiem 14potrzeb zastąpienia 20.

ḟ⁶Ỵẹ€”|IFṚ’œṗ$Ḅ:3“ÇÞ‘yS - Link: list of characters    e.g. <example 2>
 ⁶                      - literal space character
ḟ                       - filter discard
  Ỵ                     - split at new lines
     ”|                 - literal pipe character
   ẹ€                   - get indices for €ach             [[],[1,2],[1,22],[1,2],[1,16],[2,5],[1,8],[1,2],[1,8]]
       I                - incremental differences          [[],[1],[21],[1],[15],[3],[7],[1],[7]]
        F               - flatten                          [1,21,1,15,3,7,1,7]
         Ṛ              - reverse                          [7,1,7,3,15,1,21,1]
             $          - last two links as a monad:
          ’             -   decrement                     [6,0,6,2,14,0,20,0]
           œṗ           -   partition at truthy indices   [[],[7,1],[7],[3],[15,1],[21,1]]
              Ḅ         - convert from binary             [0,15,7,3,31,43]
               :3       - integer divide by three         [0,5,2,1,10,14]
                 “ÇÞ‘   - code-page-indices               [14,20]
                     y  - translate                       [0,5,2,1,10,20]
                      S - sum                             38

Można wymienić zmierzonych szerokości 21z 30przed konwersją pomocą “ßœ‘y:

ḟ⁶Ỵẹ€”|IF“ßœ‘yṚ’œṗ$Ḅ:3S
Jonathan Allan
źródło
4

Python 2 , 77 bajtów

lambda x:sum(i/21*x.count('|'+i%21*' _'[i<50]+'|')for i in[23,48,69,224,440])

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ę jako 2i ciało jako 3, w wyniku czego 5)

Pręt
źródło
4

Retina 0.8.2 , 60 bajtów

T`|`!
!__!
1
!_{6}!
11
! {6}!
3$*
!.{14}!
5$*
!.{20}!
10$*
1

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, że 5waga jest uważana za sumę 2ai 3wagi, podczas gdy wagi 10i 20to tylko dwie linie połowy masy.

Neil
źródło
2

Python 3 , 76 bajtów

lambda t:sum([1,2,3,5,5,9,11][len(x)//4+(x<'_')]for x in t.split('|')[1::2])

Wypróbuj online!

W jaki sposób?

sum([1,2,3,5,5,9,11][len(x)//4+(x<'_')]for x in t.split('|')[1::2])
                                                t.split('|')         - split ascii art into pieces
                                                            [1::2])  - weights are at odd indexes
                                       for x in                      - iterates over the weights
                     len(x)//4                                       - map widths to 0,1,3,5,7
                              +(x<'_')                               - add 1 if the first row of 2-row weight
    [1,2,3,5,5,9,11][                 ]                              - value of each part of a weight
sum(                                                              )  - add 'em all up
RootTwo
źródło
1

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 Stringna a, Collection<String>a następnie sumuje wyniki dla każdego wiersza, aby uzyskać sumę. Używa Mapgdzie 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.

TheJizel
źródło