圣诞老人需要送多少只精灵?


23

圣诞老人需要一些帮助来确定他需要多少精灵来帮助他向每所房子运送礼物。

煤炭比礼物重得多,因此圣诞老人每个屋子里每个顽皮的人都需要三个精灵。只需要两个精灵来帮助圣诞老人携带礼物。

在圣诞老人的地图上,一栋房子用表示*,每栋房子用拆分+

房子的两边都会有一个数字-左边的数字代表房子里顽皮的人数,右边的数字代表房子里好人的人数。如果一侧没有数字,则将其解释为0。

圣诞老人不会拜访那些不懂圣诞节的人(他们甚至不配煤),因此有时候,房屋的两边可能没有号码。在这种情况下,圣诞老人不需要任何精灵的帮助

例如,圣诞老人的一张地图可能看起来像这样

1*3+2*2+1*+*2

在第一所房子里有1个顽皮的和3个漂亮的,圣诞老人将需要9个精灵。在第二个中,有2个顽皮和2个好人,圣诞老人将需要十个精灵。在第三间屋子里有1个顽皮和0个好人,圣诞老人将需要三个精灵,在最后一个屋子里,有0个顽皮和2个好人,圣诞老人将需要四个精灵。

不过,这是圣诞老人地图之一的过于简化的版本。通常,圣诞老人的地图有多条线,并且呈正方形,以便更好地适合他的列表。法线贴图可能看起来像这样(\n每行的结尾处是a )

1*2+*+*4+1*
2*4+3*+1*6+*
*+*+4*2+1*1
*4+*3+1*+2*3
3*10+2*+*5+*

在此地图中,圣诞老人需要((1 + 0 + 0 + 1 + 2 + 3 + 1 + 0 + 0 + 0 + 4 + 1 + 0 + 0 + 1 + 2 + 3 + 2 + 0 + 0) * 3) + ((2 + 0 + 4 + 0 + 4 + 0 + 6 + 0 + 0 + 0 + 2 + 1 + 4 + 3 + 0 + 3 + 10 + 0 + 5 + 0) * 2)= 151个精灵

挑战

帮助圣诞老人确定他需要为每个房屋运送货物的精灵数量!

房屋

  • 房子用 *
  • 房屋被分割 +
  • 房子左侧的数字表示顽皮的人数(没有数字表示0)
  • 右边的数字表示好人的数量(没有数字表示0)
  • \n输入中可能包含换行符(),也应将其拆分

精灵

  • 圣诞老人需要三位精灵的顽皮帮助(煤炭比礼物重得多)
  • 圣诞老人需要两位精灵的帮助,才能帮助好人
  • 如果双方都没有数字,圣诞老人将不会参观那所房子,因此不需要任何精灵

该怎么办

打印圣诞老人需要帮助他送礼物到房子的精灵数量。因为圣诞老人只需要知道要带多少只精灵,您只需要在房屋清单中打印出他需要增加的精灵数即可

测试用例

1*1 => 5
1*2 => 7
2*1 => 8
1* => 3
*1 => 2
* => 0

1*1+1*1 => 10
1*2+2*1 => 15
1*+*1 => 5
1*1+*+1*1 => 10
*+*+*+* => 0

规则

  • 输入既可以用作函数中的参数,也可以来自STDIN或等效输入
  • 输出可以是函数的返回值,也可以输出STDOUT或等效输出
  • 输入只包含数字,+*,和换行符\n
  • 输出应该仅是圣诞老人在圣诞节期间需要帮助的精灵总数
  • 适用标准漏洞

计分

圣诞老人的雪橇上满是礼物,给了他更少的空间来运行代码,因此他需要能获得的最短代码(不要担心,如果这样做没有道理。 )。由于圣诞老人的正确推理,最短提交以字节为准!

排行榜

这是一个堆栈片段,可按语言生成排行榜和获胜者概述。

为确保您的答案显示出来,请使用以下Markdown模板以标题开头

## Language Name, N bytes

N是提交内容的大小(以字节为单位)

如果要在标头中包含多个数字(例如,敲击旧分数或在字节数中包含标志),只需确保实际分数是标头中的最后一个数字

## Language Name, <s>K</s> X + 2 = N bytes


1
我想知道,由于圣诞老人会在任何家中停下来,他会不会max(naughty) + max(nice)在整个路线上只需要最多的精灵?我以为他有一群精灵与他同行,但也许您对此有内幕消息,所以我今年需要更加仔细地研究。:)
insertusername此处为2015年

8
@insertusername此处我目前在Santa Inc.工作,我可以告诉您我们的基础结构以高度异步的方式运行。他不希望自己的资源枯竭,因此我们根据需要分配了许多工人。万一我们需要额外的ELF,可以在几秒钟内完成编译hello-world.c。如Jojodmo所说,工人们急切地分配了目标(我确定我知道Jojodmo,他必须是我们的sysadm),然后使用回调函数通知何时该将其重新插入雪橇池或何时孩子看到它们。
Stefano Sanfilippo

2
@StefanoSanfilippo啊,我知道了。感谢您提供此分类信息的所有详细见解。和圣诞快乐。:)
insertusername此处,2015年

这完全有道理。圣诞老人需要最短的代码,因为他用打印机将代码的每个字符打印出来,然后在执行之前将它们放到雪橇上。
A̲̲

Answers:


2

Pyth,21个字节

ssMs*VCcR\*scR\+.z_S3

多行示例

单线测试套件

ssMs*VCcR\*scR\+.z_S3
                .z        Take a input, as a list of lines.
            cR\+          Chop each line on '+'.
           s              Flatten into list of strings.
       cR\*               Chop each line on '*'.
      C                   Transpose, into a list of naughty and nice.
    *V            _S3     Vectorized multiplication with [3, 2, 1]. This replicates
                          the naughty list 3 times and the nice list 2 times.
   s                      Flatten.
 sM                       Convert each string to an int.
s                         Sum.

严重... Pyth 在30字节以下不能做任何事情吗?
Jojodmo 2015年

2
@Jojodmo不,如果我能帮忙...
isaacg 2015年

13

JavaScript(ES6),52个字节

s=>eval(s.replace(/\D|$/g,m=>`.0*${m=="*"?3:2}+`)+0)

说明

将输入转换为有效的JavaScript语句。将所有替换*.0*3+,将所有其他(非数字)符号替换为.0*2+。例如8*9+*10变为8.0*3+9.0*2+.0*3+10。最后,它会附加.0*2到末尾以获取最后的计数。这是有效的,因为n.0= n.0= 0

s=>
  eval(                      // execute the formed equation
    s.replace(/\D|$/g,       // replace each symbol (and also add to the end) with:
      m=>`.0*${m=="*"?3:2}+` // case * = ".0*3+", else replace with ".0*2+"
    )
    +0                       // add "0" to the end for the trailing "+"
  )

测试


9
+1这个.0想法。
nimi

3

Flex + C,112个 90字节

 m=3,t;
%%
[0-9]+ t+=m*atoi(yytext);
\* m=2;
[+\n] m=3;
%%
main(){yylex();printf("%d",t);}

第一个字符是空格。编译:

flex -o santa.c santa.l
cc santa.c -o santa -ll

从STDIN读取,写入STDOUT。输入由EOF终止(控制台中为Ctrl + D)。


2

Mathematica,70个字节

a=Tr[FromDigits/@StringExtract[#,"
"|"+"->;;,"*"->#2]]&;3#~a~1+2#~a~2&

用于StringExtract提取单个数字。


2

CJam,23个字节

q'+NerN/{'*/3*5<:~~}%1b

在这里测试。

说明

q      e# Read all input.
'+Ner  e# Replaces all "+" with linefeeds.
N/     e# Split the string around linefeeds (i.e. into houses).
{      e# Map this block over the list of house...
  '*/  e#   Split the string around the "*".
  3*   e#   Repeat the times.
  5<   e#   Truncate to 5 elements, keeping 3 copies of the naughty number and 2 copies of
       e#   the nice number.
  :~   e#   Evaluate each number (which may be an empty string which pushes nothing).
  ~    e#   Dump the list of numbers on the stack.
}%
1b     e# Sum all the numbers.

2

严重的是38 30字节

'*Ws`'0+'*@s'≈£M4rR*`MΣ+'+,WXX

十六进制转储:

272a57736027302b272a407327f79c4d3472522a604de42b272b2c575858

这个新版本破坏了在线解释器,但在本地运行良好。这是一个示例运行:

$ python2 seriously.py -f elves.srs
1*2+*+*4+1*
2*4+3*+1*6+*
*+*+4*2+1*1
*4+*3+1*+2*3
3*10+2*+*5+*

151

说明:

'*                              Push a "*" to make the stack truthy
  W                        W    Repeat while the top of stack is truthy
                                  (A whole bunch of instructions just turn the "*" into a
                                  zero on the first pass, so I'll list them here in the
                                  order they actually accomplish useful things:)
                          ,     Read in a line of input
   s                    '+      Split it on occurrence of "+"
    `               `M          Map this function over the list of strings.
     '0+                        Prepend a "0" to ensure a naughty number exists
        '*@s                    Split the string on "*"
            '≈£M                Map over the string with int() to convert it to int
                4rR             Push [3,2,1,0]
                   *            Dot product
                      Σ+        Sum all the houses, and add it to the results
                                  from the previous line of input
                            XX  Pop the "" and '+ from the stack, leaving only the
                                result to be implicitly output.

旧版:

'+ε'*`+'++,`╬Xs`≈`╗`'0+'*@s╜M[3,2]*`MΣ

十六进制转储:

272bee272a602b272b2b2c60ce587360f760bb6027302b272a4073bd4d5b332c325d2a604de4

在线试用

说明:

  ε'*                                   Initialize with two strings so the first + works
     `+'++,`╬                           Read in strings and compile them until "" is read
             X                          Throw away the ""
'+            s                         Split on +
               `≈`╗                     Chuck int function into reg0 to use within function
                   `               `M   Map this function over the list of houses
                    '0+                 Prepend a "0" to ensure a naughty number exists
                       '*@s             Split on *
                           ╜M           Convert the resulting list to ints with stored func
                             [3,2]*     Dot product with [3,2]
                                     Σ  Sum all houses

如果我只是单独转换每行并在末尾将它们全部加起来,则可能会更短。我稍后再研究。


2

PowerShell,52个字节

使用的变化user81655.0伎俩

$OFS='+';"$("$args"-replace'\*','.0*3+2*0'|iex)"|iex

非高尔夫版本

$OFS='+' # Set Output Field Separator to '+'
         # So if $arr = 1,2,3 then "$arr" will output 1+2+3

" # Cast result of subexpression to string using $OFS

    $( # Subexpression

        "$args" # Input is an array of arguments. Casting it to string using "$args"
                # is shorter then acessing the first element using $args[0]
                # $OFS wouldn't affect this, because input has only 1 element.

        -replace '\*' , '.0*3+2*0' # Replace every * with .0*3+2*0
                                   # Example: 1*+*1 becomes 1.0*3+2*0+.0*3+2*01

    ) | Invoke-Expression # Execute a result of subexpression as PS code.
                          # This will execute resulting multiline string line-by line
                          # and return an array of values, e.g.: 18,38,21,29,45

" Cast the aray above to string using '+' as Output Field Separator, e.g: 18+38+21+29+45

| Invoke-Expression # Execute the string above as PS code to get final result.
                    # E.g.: 18+38+21+29+45 = 151

使用范例

$Map = @'
1*2+*+*4+1*
2*4+3*+1*6+*
*+*+4*2+1*1
*4+*3+1*+2*3
3*10+2*+*5+*
'@

PS > .\SantaMap.ps1 $Map
151

1

Swift 2,283211字节

func f(s:String)->Int{var r=0;for p in(s.characters.split{$0=="\n"}.map(String.init)){for v in p.utf8.split(43){let k="0\(v)".utf8.split(42);r+=(Int("\(k[0])")!)*3;r+=(k.count<2 ?0:Int("\(k[1])")!)*2}};return r}

可以在SwiftStub上测试,在这里

不打高尔夫球

func f(s: String) -> Int{
    var r = 0

    //for every value in the input, split every "\n" and mapped
    //to a String array
    for p in (s.characters.split{$0=="\n"}.map(String.init)){

        //for every value in the split input, split again at every + (Decimal 43)
        for v in p.utf8.split(43){
            //change the value to "0" + v, which doesn't change the
            //input, but in the event that there is no input on the
            //left side, a "0" will be used
            //
            //then split on every * (Decimal 42)
            let k = "0\(v)".utf8.split(42)

           //add to the total count of elves the number on the left * 3
            r+=(Int("\(k[0])")!) * 3

            //add to the total count of elves the number on the left * 2
            r+=(k.count < 2 ? 0 : Int("\(k[1])")!) * 2
        }

        //return the number of elves
        return r
    }
}

1

Python 3中,141个 114 112字节

接受这样的多行输入 c("1*2+*+*4+1*\n2*4+3*+1*6+*\n*+*+4*2+1*1\n*4+*3+1*+2*3\n3*10+2*+*5+*")

lambda s:sum(a and(3-z)*int(a)or 0for j in s.split("\n")for i in j.split("+")for z,a in enumerate(i.split("*")))

取消高尔夫:

def c(s):
    t = 0
    for j in s.split("\n"):
        for i in j.split("+"):
            for z,a in enumerate(i.split("*"))
                if a == "":
                    a = 0
                else:
                    a = int(a)
                t += (3-z) * a  # alternate a*3 and a*2
    return t

1

我来晚了,但是我还是想试一试。

红宝石84 55字节

这么多年后,我再次找到了这个问题,并且在想出一个新的答案之前,我才意识到自己已经回答了这个问题。哎呀!无论如何,这是一个大大改善的答案。

->m{m.scan(/(\d*)\*(\d*)/).sum{|a,b|3*a.to_i+2*b.to_i}}

在线尝试!

我2年前首次回答时的84字节旧答案:

->m{m.split(/[+\n]/).map{|h|b,g=h.split(?*).map &:to_i
3*(b||0)+2*(g||0)}.inject :+}

在线尝试!


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.