Ông già Noel cần bao nhiêu yêu tinh để giao quà?


23

Ông già Noel cần một số trợ giúp để xác định có bao nhiêu yêu tinh ông sẽ cần để giúp ông giao quà cho mỗi ngôi nhà.

Than nặng hơn đáng kể so với quà tặng, vì vậy ông già Noel sẽ cần ba yêu tinh cho mỗi người nghịch ngợm trong nhà. Chỉ có hai yêu tinh là cần thiết để giúp santa mang quà.

Trên bản đồ của santa, một ngôi nhà được đại diện bởi a *và mỗi ngôi nhà được chia cho a +.

Sẽ có một số ở hai bên của ngôi nhà - một bên trái đại diện cho số người nghịch ngợm trong nhà, và một bên phải đại diện cho số người tốt trong nhà. Nếu không có số ở một bên thì nó được hiểu là 0.

Ông già Noel không đến thăm những người không có tinh thần Giáng sinh (họ thậm chí không xứng đáng với than đá), vì vậy đôi khi, một ngôi nhà có thể không có số ở hai bên của nó. Trong trường hợp này, santa không cần sự giúp đỡ từ bất kỳ yêu tinh nào

Ví dụ: một trong những bản đồ của ông già Noel có thể trông như thế này

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

Trong ngôi nhà đầu tiên có 1 nghịch ngợm và 3 tốt bụng, ông già Noel sẽ cần chín yêu tinh. Trong phần hai, có 2 nghịch ngợm và 2 tốt bụng, santa sẽ cần mười yêu tinh. Trong ngôi nhà thứ ba có 1 nghịch ngợm và 0 tốt đẹp, santa sẽ cần ba yêu tinh, và trong ngôi nhà cuối cùng có 0 nghịch ngợm và 2 tốt đẹp, santa sẽ cần bốn yêu tinh.

Tuy nhiên, đây là phiên bản đơn giản hóa của một trong những bản đồ của ông già Noel. Thông thường, bản đồ của santa có nhiều đường và có dạng hình vuông để phù hợp hơn với danh sách của anh ấy. Một bản đồ bình thường có thể trông giống như thế này (một \nở cuối mỗi dòng)

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

Trong bản đồ này, santa cần ((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 yêu tinh

Thử thách

Giúp santa xác định có bao nhiêu yêu tinh anh ta cần để giao hàng đến từng nhà!

Nhà

  • Một ngôi nhà được đại diện bởi một *
  • Nhà bị chia cắt +
  • Số ở bên trái của ngôi nhà tượng trưng cho số người nghịch ngợm (không có số có nghĩa là 0)
  • Số bên phải tượng trưng cho số người tốt (không có số có nghĩa là 0)
  • Có thể có dòng mới ( \n) trong đầu vào, cũng nên được xử lý dưới dạng phân tách

Yêu tinh

  • Ông già Noel cần sự giúp đỡ của ba yêu tinh cho những người nghịch ngợm (than nặng hơn nhiều so với quà)
  • Santa cần sự giúp đỡ từ hai yêu tinh cho những người tốt
  • Nếu không có số ở hai bên, santa sẽ không đến thăm ngôi nhà đó và vì thế không cần bất kỳ yêu tinh nào

Phải làm gì

In số lượng yêu tinh santa cần để giúp anh ta gửi quà đến nhà. Bởi vì tất cả những gì ông già Noel cần biết là có bao nhiêu yêu tinh mang theo, bạn chỉ cần in số lượng yêu tinh cần thiết cho danh sách các ngôi nhà

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

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

Quy tắc

  • Đầu vào có thể được lấy làm đối số trong hàm hoặc từ STDIN hoặc tương đương
  • Đầu ra có thể là giá trị trả về của hàm hoặc được in thành STDOUT hoặc tương đương
  • Các đầu vào sẽ chỉ chứa số, +, *, và dòng mới\n
  • Đầu ra chỉ nên là tổng số yêu tinh mà ông già Noel cần sự giúp đỡ để giao hàng vào Giáng sinh
  • Áp dụng sơ hở tiêu chuẩn

Chấm điểm

Xe trượt tuyết của Santa có rất nhiều quà tặng cho anh ta ít không gian hơn để chạy mã, vì vậy anh ta cần mã ngắn nhất anh ta có thể nhận được (đừng lo lắng nếu điều này không có ý nghĩa. Nếu bạn nghi ngờ logic của Santa, bạn sẽ kết thúc trong danh sách nghịch ngợm ). Do lý do ĐÚNG của ông già Noel , bài nộp ngắn nhất tính bằng byte sẽ thắng!

Bảng xếp hạng

Đây là một Snippet Stack tạo ra cả bảng xếp hạng và tổng quan về người chiến thắng theo ngôn ngữ.

Để đảm bảo câu trả lời của bạn hiển thị, vui lòng bắt đầu câu trả lời của bạn bằng một tiêu đề bằng cách sử dụng mẫu Markdown sau

## Language Name, N bytes

Trong đó N là kích thước, tính bằng byte, của trình của bạn

Nếu bạn muốn bao gồm nhiều số trong tiêu đề của mình (ví dụ: vượt qua các điểm số cũ hoặc bao gồm các cờ trong số byte), chỉ cần đảm bảo rằng điểm thực tế là số cuối cùng trong tiêu đề của bạn

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


1
Tôi tự hỏi, vì ông già Noel sẽ dừng chân ở bất kỳ ngôi nhà nào, liệu ông có cần tối đa max(naughty) + max(nice)yêu tinh cho toàn bộ tuyến đường không? Tôi nghĩ rằng anh ta có một nhóm yêu tinh bay cùng anh ta, nhưng có lẽ bạn có thông tin nội bộ về điều đó và tôi cần xem xét kỹ hơn trong năm nay. :)
insertusernamehere

8
@insertusernamehere Tôi hiện đang làm việc tại Santa Inc. và tôi có thể nói với bạn rằng cơ sở hạ tầng của chúng tôi hoạt động theo kiểu không đồng bộ. Anh ta không muốn tài nguyên của mình bị chết đói, vì vậy chúng tôi phân bổ số lượng công nhân cần thiết. Trong trường hợp chúng tôi cần thêm ELF, chúng tôi có thể biên dịch một trong vài giây từ đó hello-world.c. Yêu tinh công nhân được phân bổ hăng hái cho các mục tiêu như Jojodmo nói (tôi chắc chắn tôi biết Jojodmo, anh ta phải là hệ thống của chúng tôi) và sau đó sử dụng một cuộc gọi lại để thông báo khi đến lúc được đưa vào bể bơi hoặc khi một đứa trẻ nhìn thấy chúng.
Stefano Sanfilippo

2
@StefanoSanfilippo À, tôi hiểu rồi. Cảm ơn tất cả những hiểu biết chi tiết của thông tin được phân loại này. Và giáng sinh vui vẻ. :)
insertusernamehere

Điều này hoàn toàn có ý nghĩa. Santa cần mã ngắn nhất vì anh ta in ra từng ký tự của mã bằng máy in và sau đó đặt chúng lên xe trượt tuyết trước khi anh ta thực thi chúng.
A̲̲

Câu trả lời:


2

Bình thường, 21 byte

ssMs*VCcR\*scR\+.z_S3

Ví dụ đa dòng

Bộ kiểm tra đơn dòng

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.

Nghiêm túc ... Có điều gì Pyth không thể làm dưới 30 byte không?
Jojodmo

2
@Jojodmo Không phải nếu tôi có thể giúp nó ...
isaacg

13

JavaScript (ES6), 52 byte

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

Giải trình

Chuyển đổi đầu vào thành một câu lệnh JavaScript hợp lệ. Thay thế tất cả *bằng .0*3+và tất cả các ký hiệu khác (không phải chữ số) bằng .0*2+. Ví dụ 8*9+*10trở thành 8.0*3+9.0*2+.0*3+10. Cuối cùng, nó .0*2kết thúc vào cuối cho số tốt đẹp cuối cùng. Điều này hoạt động vì 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 "+"
  )

Kiểm tra


9
+1 cho .0ý tưởng.
nimi

3

Flex + C, 112 90 byte

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

Nhân vật đầu tiên là một không gian. Biên dịch với:

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

Đọc từ STDIN, ghi vào STDOUT. Đầu vào được kết thúc bằng EOF (Ctrl + D trong bảng điều khiển).


2

Toán học, 70 byte

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

Sử dụng StringExtractđể trích xuất các số riêng lẻ.


2

CJam, 23 byte

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

Kiểm tra nó ở đây.

Giải trình

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

Nghiêm túc, 38 30 byte

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

Bãi rác Hex:

272a57736027302b272a407327f79c4d3472522a604de42b272b2c575858

Phiên bản mới này phá vỡ trình thông dịch trực tuyến, nhưng hoạt động tốt tại địa phương. Đây là một ví dụ chạy:

$ 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

Giải trình:

'*                              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.

Phiên bản cũ:

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

Bãi rác Hex:

272bee272a602b272b2b2c60ce587360f760bb6027302b272a4073bd4d5b332c325d2a604de4

Dùng thử trực tuyến

Giải trình:

  ε'*                                   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

Điều này có thể có thể ngắn hơn nếu tôi chỉ chuyển đổi từng dòng riêng biệt và tổng hợp tất cả chúng ở cuối. Tôi sẽ xem xét nó sau.


2

PowerShell, 52 byte

Sử dụng biến thể của user81655 's .0lừa

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

Phiên bản ung dung

$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

Ví dụ sử dụng

$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 byte

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}

Điều này có thể được thử nghiệm trên SwiftStub, tại đây

Bị đánh cắp

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 byte

Có đầu vào nhiều dòng như thế này 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("*")))

Ung dung:

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

Tôi siêu muộn, nhưng dù sao tôi cũng muốn cho nó một phát súng.

Ruby , 84 55 byte

Tôi đã tìm thấy câu hỏi này một lần nữa sau nhiều năm và đang suy nghĩ một câu trả lời mới trước khi tôi nhận ra rằng tôi đã trả lời câu hỏi này trước đây. Rất tiếc! Dù sao, đây là một câu trả lời được cải thiện mạnh mẽ.

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

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

Câu trả lời cũ 84 byte từ khi tôi trả lời lần đầu tiên cách đây 2 năm:

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

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


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.