Купа ваг


13

Виклик:

Вам буде надано зображення ASCII купи ваг як вхідних даних і виведете комбіновану вагу ворсу.

введіть тут опис зображення

Формат:

Існує 5 різних ваг, вагою 1, 2, 5, 10, 20 Пассерій (або якась інша довільна одиниця).

Ваги виглядають так у порядку зростання:

1:   __
    |__|

2:   ______
    |______|

5:   ______
    |      |
    |______|

10:  ______________
    |              |
    |______________|

20:  ____________________
    |                    |
    |____________________|

Ваги будуть розміщені симетрично (як на прикладі зображення), не обов'язково в упорядкованому порядку. Ваги будуть розділяти межі, де це можливо:

Тестові приклади:

Ви також можете використовувати всі одиничні ваги в якості тестових випадків.

   __
 _|__|_
|______|
|      |
|______|
1 + 2 + 5 = 8

 ____________________
|                    |
|____________________|
   |              |
   |______________|
        _|__|_
       |______|
       |      |
       |______|          
20 + 10 + 1 + 2 + 5 = 38 

 ______
|______|
|______|
|______|
|______|
2 + 2 + 2 + 2 = 8

Додаткові правила:

  • Ви не можете припускати додаткові провідні місця. Найбільша вага буде весь шлях ліворуч.
  • Ви можете припустити пробіли та нові рядки.
  • Ви можете припустити, що буде максимум 10 ваг
  • Ви можете взяти вхід у необов'язковому форматі, але ви не можете замінити символи, які використовуються чимось іншим

Це тому виграє найкоротший код у байтах кожної мови. Пояснення заохочуються, як завжди.


Ваше завдання надихнуло мене на написання цього . Будь-які поради цінуються!
tgrass12

Відповіді:


7

Желе ,  24  23 байти

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

Спробуйте в Інтернеті!

Як?

Ваги можуть бути визначені по їх ширині та висоті. Ширину можна виміряти, переглянувши відстань між |символами рядка . Якщо ми спочатку видалимо всі пробіли, то ті ваги висоти два сприятимуть такій лінії з виміряною шириною одиниці.

Різні ваги мають ширину 3, 7, 7, 15, 21(для ваг 1, 2, 5, 10, 20відповідно). Додаючи трейлінг 1для висоти двох, ми знаходимо [3],[7],[7,1],[15,1],[21,1]перетворення з двійкових, це 3,7,15,31,43ціле ділення на три дає нам 1,2,5,10,14, які є вагами, крім 14потреб, замінених на 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

Як альтернативи замінити виміряні ширини 21з 30до перетворення з допомогою “ßœ‘y:

ḟ⁶Ỵẹ€”|IF“ßœ‘yṚ’œṗ$Ḅ:3S

4

Python 2 , 77 байт

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

Спробуйте в Інтернеті!

[i/21, i%21, ' _'[i<50] for i in [23,48,69,224,440]]буде генерувати такі триплети, [1, 2, '_'], [2, 6, '_'], [3, 6, ' '], [10, 14, ' '], [20, 20, ' ']які представляють вагу, довжину та характер у базі кожної ваги, які будуть використані для створення унікального однорядкового подання кожної ваги.
Оскільки третя вага буде перетинатися з другою, я замінюю її основою на її body ( _-> ) і зменшив значення до 3(воно буде рахувати базу як 2і тіло як 3, в результаті чого 5)


4

Сітківка 0,8,2 , 60 байт

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

Спробуйте в Інтернеті! Пояснення: |s замінюються на !s для зручності узгодження, потім ваги перетворюються в одинарні та сумарні. Єдиною цікавою частиною є те, що 5вага вважається сумою a 2і 3вагою, тоді як вага 10і 20ваги - це лише два рядки від половини ваги.



2

Python 3 , 76 байт

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

Спробуйте в Інтернеті!

Як?

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

1

Я впевнений, що слід вдосконалити деякі поліпшення, але ось що я маю на даний момент:

Groovy, 131 байт

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}}

Перетворює вхід Stringу a, Collection<String>а потім підсумовує результати для кожного рядка, щоб отримати загальну суму. Використовує a, Mapде ключовим є кількість пробілів або підкреслень між символами труби, а значення - відповідна кількість пассерій. Ключ підключається до регулярного вираження, щоб визначити, чи відповідає рядок значній схемі. Одне застереження - це потрійне додавання 1 у випадку, коли довжина підрядок між трубами становить 6 і складається з пробілів (на відміну від підкреслення). Якщо жоден шаблон не відповідає, рядок має значення 0.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.