ซานต้าต้องส่งของขวัญไปกี่เอลฟ์


23

ซานต้าต้องการความช่วยเหลือในการกำหนดจำนวนเอลฟ์ที่เขาจะต้องช่วยเขาส่งของขวัญให้แต่ละบ้าน

ถ่านหินนั้นหนักกว่าของกำนัลอย่างมากดังนั้นซานต้าจะต้องการเอลฟ์สามคนสำหรับทุกคนที่อยู่ในบ้าน มีเพียงสองเอลฟ์เท่านั้นที่จะช่วยมอบของขวัญให้ซานต้า

บนแผนที่ของซานต้าบ้านเป็นตัวแทนจากและบ้านแต่ละหลังถูกแบ่งออกโดย*+

จะมีตัวเลขอยู่ทั้งสองข้างของบ้าน - ด้านซ้ายแสดงถึงจำนวนคนแก่นในบ้านและอีกคนทางด้านขวาแสดงจำนวนคนดีในบ้าน หากไม่มีหมายเลขในด้านใดด้านหนึ่งมันจะตีความว่าเป็น 0

ซานต้าไม่ได้ไปเยี่ยมผู้ที่ไม่ได้อยู่ในจิตวิญญาณแห่งคริสต์มาส (พวกเขาไม่สมควรได้รับถ่านหิน) ดังนั้นบางครั้งบ้านอาจไม่มีตัวเลขด้านใดด้านหนึ่ง ในกรณีนี้ซานต้าไม่ต้องการความช่วยเหลือจากเหล่าเอลฟ์

ตัวอย่างเช่นหนึ่งในแผนที่ของซานต้าอาจมีลักษณะเช่นนี้

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

ในบ้านหลังแรกมีซุกซน1และ3ดีซานต้าจะต้องเก้าเอลฟ์ ในครั้งที่สองมี2ซนและ2ดี santa จะต้องสิบเอลฟ์ ในบ้านหลังที่สามมี1ซนและ0ดีซานต้าจะต้องสามเอลฟ์และในบ้านหลังสุดท้ายมี0ซนและ2ดีซานต้าจะต้องสี่เอลฟ์

นี่เป็นแผนที่ที่ง่ายกว่าฉบับหนึ่งในแผนที่ของซานต้า โดยปกติแผนที่ของซานต้าจะมีหลายบรรทัดและอยู่ในรูปทรงสี่เหลี่ยมเพื่อให้พอดีกับรายการของเขา แผนที่ปกติอาจมีลักษณะเช่นนี้ ( \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) ในอินพุตซึ่งควรจัดการเป็นแยก

แถน

  • ซานต้าต้องการความช่วยเหลือจากพวกเอลฟ์สามคนสำหรับคนซุกซน (ถ่านหินหนักกว่าของกำนัลมาก)
  • ซานต้าต้องการความช่วยเหลือจากสองเอลฟ์เพื่อคนดี
  • หากไม่มีตัวเลขด้านใดด้านหนึ่งซานต้าจะไม่ไปเยี่ยมบ้านหลังนั้นและไม่ต้องการเอลฟ์ใด ๆ

สิ่งที่ต้องทำ

พิมพ์จำนวนเอลฟ์ซานต้าต้องช่วยเขาจัดส่งของขวัญไปที่บ้านเพื่อ เนื่องจากซานต้าทุกคนจำเป็นต้องรู้ว่ามีเอลฟ์กี่ตัวที่นำมาคุณจะต้องพิมพ์เอลฟ์ที่เพิ่มจำนวนที่เขาต้องการสำหรับรายการของบ้าน

กรณีทดสอบ

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)เอลฟ์สูงสุดตลอดเส้นทางหรือไม่? ฉันคิดว่าเขามีฝูงเอลฟ์บินอยู่กับเขา แต่บางทีคุณอาจมีข้อมูลวงในเกี่ยวกับเรื่องนั้นและฉันต้องมองให้ใกล้ขึ้นในปีนี้ :)
แทรกชื่อผู้ใช้ ณ

8
@insertusername ที่นี่ฉันทำงานที่ Santa Inc. และฉันสามารถบอกคุณได้ว่าโครงสร้างพื้นฐานของเราดำเนินงานแบบ async อย่างหนัก เขาไม่ต้องการให้ทรัพยากรอดอยากดังนั้นเราจึงจัดสรรคนงานให้มากที่สุดเท่าที่ต้องการ hello-world.cในกรณีที่เราจำเป็นต้องมีเอลฟ์พิเศษเราสามารถรวบรวมเป็นหนึ่งในไม่กี่วินาที เอลฟ์คนงานได้รับการจัดสรรอย่างกระตือรือร้นไปยังเป้าหมายตามที่ Jojodmo กล่าว (ฉันแน่ใจว่าฉันรู้จัก Jojodmo เขาจะต้องเป็นผู้ดูแลระบบของเรา) จากนั้นใช้การโทรกลับเพื่อแจ้งเตือนเมื่อถึงเวลาที่จะต้องแทรกลงในสระเลื่อนหรือเมื่อเด็กเห็น
Stefano Sanfilippo

2
@StefanoSanfilippo อ่าเข้าใจแล้ว ขอบคุณสำหรับข้อมูลเชิงลึกโดยละเอียดทั้งหมดของข้อมูลลับนี้ และสุขสันต์วันคริสต์มาส :)
insertusername ที่นี่

ทั้งหมดนี้ทำให้รู้สึก ซานต้าต้องการรหัสที่สั้นที่สุดเพราะเขาพิมพ์อักขระทุกตัวของรหัสด้วยเครื่องพิมพ์จากนั้นวางลงบนตัวเลื่อนก่อนที่จะดำเนินการ
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.

อย่างจริงจัง ... มีสิ่งใดที่ Pyth ไม่สามารถทำได้ภายใน 30 ไบต์หรือไม่
Jojodmo

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และ=.00

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 's .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 Bytes

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 ที่นี่

Ungolfed

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("*")))

Ungolfed:

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

ฉันสายเกินไป แต่ฉันต้องการที่จะให้มันยิงต่อไป

Ruby , 84 55 ไบต์

ฉันพบคำถามนี้อีกครั้งหลังจากหลายปีที่ผ่านมาและกำลังคิดหาคำตอบใหม่ก่อนที่ฉันจะรู้ตัวว่าฉันตอบไปแล้วก่อนหน้านี้ อ๊ะ! อย่างไรก็ตามนี่คือคำตอบที่ดีขึ้นอย่างมาก

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

ลองออนไลน์!

คำตอบ 84 ไบต์เก่าจากเมื่อฉันตอบครั้งแรกเมื่อ 2 ปีก่อน:

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