サンタは贈り物を配達するために何人のエルフを必要としますか?


23

サンタは、各家に贈り物を届けるのに必要なエルフの数を決めるのに助けが必要です。

石炭はプレゼントよりかなり重いので、サンタは家のいたずら好きな人ごとに3匹のエルフを必要とします。サンタがプレゼントを運ぶのを助けるのに必要なエルフは2人だけです。

サンタの地図では、家はで表され、*各家はで分割されてい+ます。

家の両側に数字が表示されます。左側の数字は家の中のいたずら好きな人の数を表し、右側の数字は家の中の素敵な人の数を表します。片側に番号がない場合、0として解釈されます。

サンタはクリスマス気分にない人を訪問しません(彼らは石炭に値することすらありません)。したがって、時々、家の両側に数字がないかもしれません。この場合、サンタはエルフの助けを必要としません

たとえば、サンタの地図の1つは次のようになります

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

最初の家にはいたずらが1 つ、素敵な3 があり、サンタは9つのエルフを必要とします。2番目には、2つのいたずらと2つの素敵なサンタがあり、サンタは10個のエルフを必要とします。3番目の家にはいたずらが1 、すてきな0があり、サンタには3つのエルフが必要です。最後の家にはいたずらが0 、すてきな2 があります。

ただし、これはサンタの地図の1つを単純化したバージョンです。通常、サンタの地図には複数の線があり、リストにうまく収まるように正方形になっています。法線マップは次のようになります(\n各行の最後)

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入力に改行()がある場合がありますが、これも分割として処理する必要があります

エルフ

  • サンタはいたずらな人々のために3つのエルフの助けを必要としています(石炭はプレゼントよりもずっと重いです)
  • サンタは素敵な人々のために2人のエルフの助けを必要としています
  • どちらの側にも番号がない場合、サンタはその家を訪問しないため、エルフは必要ありません

何をすべきか

サンタが家にプレゼントを届けるのに必要なサンタのエルフの数を印刷します。サンタが知る必要があるのは、持ち込むエルフの数だけなので、家のリストに必要なエルフの追加数を印刷するだけです。

テストケース

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
  • 出力は、サンタがクリスマスに届けるために助けを必要とするエルフの総数のみであるべきです
  • 標準的な抜け穴が適用されます

得点

サンタさんのそりは贈り物でいっぱいで、コードを実行するスペースが少ないので、できるだけ短いコードが必要です(これが意味をなさない場合でも心配しないでください。 )。サンタの正しい推論により、バイト単位の最短の提出が勝ちです!

リーダーボード

これは、リーダーボードと言語ごとの勝者の概要の両方を生成するスタックスニペットです。

回答が表示されるようにするには、次のマークダウンテンプレートを使用して、見出しから回答を開始してください

## Language Name, N bytes

Nは、送信のサイズ(バイト単位)です。

ヘッダーに複数の数字を含める場合(たとえば、古いスコアを打つ、またはバイトカウントにフラグを含める)、実際のスコアがヘッダーの最後の数字であることを確認してください

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


1
サンタはどの家にも立ち寄るので、max(naughty) + max(nice)ルート全体で最大エルフが必要なのではないでしょうか。彼はたくさんのエルフと一緒に飛んでいると思っていましたが、おそらくそれについてのインサイダー情報があり、今年はもっと詳しく調べる必要があります。:)
ここにusernameを挿入します

8
@insertusernamehere私は現在サンタ社で働いていますが、インフラストラクチャは非常に非同期的に動作していると言えます。彼は自分のリソースが枯渇することを望んでいないので、必要な数のワーカーを割り当てます。追加のELFが必要な場合は、から数秒でコンパイルできますhello-world.c。Jojodmoが言ったようにワーカーエルフはターゲットに熱心に割り当てられ(Jojodmoを知っているので、彼はsysadmである必要があります)、コールバックを使用して、そりプールに再挿入するときまたは子供が見たときに通知します。
ステファノサンフィリッポ

2
@StefanoSanfilippoあ、なるほど。この機密情報の詳細な洞察に感謝します。そしてメリークリスマス。:)
ここにusernameを挿入します

これはまったく理にかなっています。サンタはプリンタでコードのすべての文字を印刷し、実行する前にそりに乗せるので、最短のコードが必要です。
A̲̲

回答:


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.

真剣に... 30バイト未満でPyth ができないことはありますか?
ジョジョド

2
@Jojodmoない私はそれを助けることができるかどうか...
isaacg

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
.0アイデアの+1 。
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、283 211バイト

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

オンラインでお試しください!


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.