一堆重物


13

挑战:

您将获得一堆重物的ASCII图像作为输入,并且必须输出一堆重物的组合重量。

在此处输入图片说明

格式:

共有5种不同的砝码,分别为1、2、5、10、20 Passerees(或其他任意单位)。

权重如下所示,按升序排列:

1:   __
    |__|

2:   ______
    |______|

5:   ______
    |      |
    |______|

10:  ______________
    |              |
    |______________|

20:  ____________________
    |                    |
    |____________________|

称重将对称放置(如示例图像中所示),而不必按排序顺序放置。称重将共享边界,如果适用:

测试用例:

您也可以将所有单个权重用作测试用例。

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

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

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

附加规则:

  • 您可能不会假设其他前导空格。最大的重量将一直向左。
  • 您可以假设尾随空格和换行符。
  • 您可能会假设最多有10个砝码
  • 您可以采用可选格式输入,但不能替换其他字符使用的字符

这是因此每种语言以字节为单位的最短代码胜出。一如既往地鼓励人们进行解释。


您的挑战启发了我写这本书。任何提示表示赞赏!
tgrass18年

Answers:


7

果冻 24  23 字节

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

在线尝试!

怎么样?

权重可以通过其宽度和高度来识别。可以通过查看行|字符之间的距离来测量宽度。如果我们首先删除所有空间,则那些高度为2的权重将构成这样一条线,其宽度为1。

不同的权重的宽度为3, 7, 7, 15, 211, 2, 5, 10, 20分别用于权重)。添加一个尾随1高度为2 的尾部,我们发现[3],[7],[7,1],[15,1],[21,1]从二进制转换为尾数3,7,15,31,43,整数除以3得到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

可选地取代的测量宽度2130使用前的转换“ßœ‘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, ' '],它们代表重量,长度和每个重量基础中的字符,这些三元组将用于制作每个重量的唯一单行表示形式。
由于第三个权重将与第二个权重重叠,因此我用它的主体(_-> )替换了它的基数,并将其值减小为3(它将基数记为2,将主体记为3,结果为5


4

视网膜0.8.2,60字节

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

在线尝试!说明:为方便匹配,将|s替换为!s,然后将权重转换为一元和求和。唯一有趣的部分是5权重被视为a 23权重的总和,而10and和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,其中键是竖线字符之间的空格或下划线的数目,而值是对应的Passerees数量。将密钥插入到正则表达式中,以确定行是否匹配有效模式。一个警告是在管道之间的子字符串的长度为6且由空格(与下划线相对)组成的情况下,三进制加1。如果没有任何模式匹配,则该行的值为0。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.