Một đống trọng lượng


13

Thử thách:

Bạn sẽ được cung cấp hình ảnh ASCII của một đống trọng lượng làm đầu vào và phải xuất trọng lượng kết hợp của cọc.

nhập mô tả hình ảnh ở đây

Định dạng:

Có 5 trọng lượng khác nhau, nặng 1, 2, 5, 10, 20 Passerees (hoặc một số đơn vị tùy ý khác).

Các trọng số trông như thế này, theo thứ tự tăng dần:

1:   __
    |__|

2:   ______
    |______|

5:   ______
    |      |
    |______|

10:  ______________
    |              |
    |______________|

20:  ____________________
    |                    |
    |____________________|

Các trọng lượng sẽ được đặt đối xứng (như trong hình ảnh ví dụ), không nhất thiết phải theo thứ tự được sắp xếp. Cân sẽ chia sẻ ranh giới, khi áp dụng:

Các trường hợp thử nghiệm:

Bạn cũng có thể sử dụng tất cả các trọng số như các trường hợp thử nghiệm.

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

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

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

Quy tắc bổ sung:

  • Bạn không thể giả định không gian hàng đầu bổ sung. Trọng lượng lớn nhất sẽ là tất cả các bên trái.
  • Bạn có thể giả định dấu cách và dòng mới.
  • Bạn có thể cho rằng sẽ có tối đa 10 trọng lượng
  • Bạn có thể lấy đầu vào ở định dạng tùy chọn, nhưng bạn không thể thay thế các ký tự được sử dụng bởi một thứ khác

Đây là vì vậy mã ngắn nhất tính theo byte mỗi ngôn ngữ sẽ thắng. Giải thích được khuyến khích như mọi khi.


Thử thách của bạn đã truyền cảm hứng cho tôi để viết bài này . Bất kỳ lời khuyên được đánh giá cao!
tgrass12

Câu trả lời:


7

Thạch ,  24  23 byte

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

Hãy thử trực tuyến!

Làm sao?

Các trọng số có thể được xác định bởi chiều rộng và chiều cao của chúng. Độ rộng có thể được đo bằng cách nhìn vào khoảng cách giữa các |ký tự của dòng . Nếu trước tiên chúng ta loại bỏ tất cả các khoảng trắng thì các trọng số có chiều cao hai sẽ đóng góp một đường như vậy với chiều rộng đo được là một.

Các trọng lượng khác nhau có chiều rộng 3, 7, 7, 15, 21(đối với trọng lượng 1, 2, 5, 10, 20tương ứng). Thêm một dấu vết 1cho những người có chiều cao hai, chúng tôi thấy việc [3],[7],[7,1],[15,1],[21,1]chuyển đổi từ nhị phân này là 3,7,15,31,43, số nguyên chia cho ba cho chúng tôi 1,2,5,10,14, đó là các trọng số ngoại trừ 14nhu cầu thay thế bởi 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

Thay thế chiều rộng đo được 21bằng 30trước khi chuyển đổi bằng cách sử dụng “ßœ‘y:

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

4

Python 2 , 77 byte

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

Hãy thử trực tuyến!

[i/21, i%21, ' _'[i<50] for i in [23,48,69,224,440]]sẽ tạo ra các bộ ba sau đây [1, 2, '_'], [2, 6, '_'], [3, 6, ' '], [10, 14, ' '], [20, 20, ' ']đại diện cho trọng lượng, chiều dài và ký tự trong cơ sở của từng trọng lượng, sẽ được sử dụng để tạo một biểu diễn một dòng duy nhất của mỗi trọng lượng.
Vì trọng lượng thứ 3 sẽ trùng với trọng lượng thứ 2, tôi thay thế cơ sở của nó bằng cơ thể của nó ( _-> ) và giảm giá trị xuống 3(nó sẽ tính cơ sở là 2và cơ thể như 3, kết quả là 5)


4

Võng mạc 0.8.2 , 60 byte

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

Hãy thử trực tuyến! Giải thích: Các |s được thay thế bằng !s để dễ khớp, sau đó các trọng số được chuyển đổi thành đơn nguyên và tổng. Phần thú vị duy nhất là 5trọng lượng được coi là tổng của a 23trọng lượng, trong khi trọng lượng 1020trọng lượng chỉ là hai dòng cân bằng một nửa.



2

Python 3 , 76 byte

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

Hãy thử trực tuyến!

Làm sao?

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

Tôi chắc chắn có một số cải tiến sẽ được thực hiện, nhưng đây là những gì tôi có tại thời điểm này:

Groovy, 131 byte

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

Chuyển đổi đầu Stringvào thành một Collection<String>và sau đó tính tổng các kết quả cho mỗi dòng để có được tổng số. Sử dụng một Maptrong đó khóa là số lượng khoảng trắng hoặc dấu gạch dưới ở giữa các ký tự ống và giá trị là số lượng Passerees tương ứng. Khóa được cắm vào biểu thức chính quy để xác định xem dòng có khớp với mẫu quan trọng không. Một cảnh báo là ternary để thêm 1 trong trường hợp độ dài của chuỗi con giữa các ống là 6 và bao gồm các khoảng trắng (trái ngược với dấu gạch dưới). Nếu không có mẫu nào khớp, dòng có giá trị 0.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.