Berapa banyak elf yang dibutuhkan Santa untuk mengirim hadiah?

23

Santa membutuhkan bantuan menentukan berapa banyak elf yang akan dia perlukan untuk membantunya mengirimkan hadiah ke setiap rumah.

Batubara jauh lebih berat daripada hadiah, jadi santa akan membutuhkan tiga elf untuk setiap orang nakal di rumah. Hanya diperlukan dua elf untuk membantu santa membawa hadiah.

Pada peta santa, sebuah rumah diwakili oleh a *, dan setiap rumah dibagi oleh a +.

Akan ada angka di kedua sisi rumah - yang di sebelah kiri mewakili jumlah orang nakal di rumah, dan yang di sebelah kanan mewakili jumlah orang baik di rumah. Jika tidak ada angka di satu sisi itu ditafsirkan sebagai 0.

Santa tidak mengunjungi mereka yang tidak semangat natal (mereka bahkan tidak pantas mendapatkan batu bara), jadi kadang-kadang, sebuah rumah mungkin tidak memiliki nomor di kedua sisinya. Dalam hal ini, santa tidak membutuhkan bantuan elf mana pun

Misalnya, salah satu peta santa mungkin terlihat seperti ini

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

Di rumah pertama ada 1 nakal dan 3 bagus, santa akan membutuhkan sembilan elf. Dalam kedua, ada 2 nakal dan 2 bagus, santa akan membutuhkan sepuluh peri. Di rumah ketiga ada 1 nakal dan 0 bagus, santa akan membutuhkan tiga elf, dan di rumah terakhir ada 0 nakal dan 2 bagus, santa akan membutuhkan empat elf.

Ini adalah versi salah satu peta santa yang terlalu disederhanakan. Biasanya, peta santa memiliki banyak garis, dan berada dalam bentuk persegi agar lebih sesuai dengan daftar. Peta normal mungkin terlihat seperti ini (a \ndi akhir setiap baris)

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

Dalam peta ini, kebutuhan santa ((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 elf

Tantangan

Bantu santa menentukan berapa banyak elf yang ia butuhkan untuk mengirimkan barang ke setiap rumah!

Rumah

  • Sebuah rumah diwakili oleh a *
  • Rumah dibagi oleh +
  • Angka di sebelah kiri rumah melambangkan jumlah orang nakal (tidak ada angka berarti 0)
  • Angka di sebelah kanan melambangkan jumlah orang baik (tidak ada angka berarti 0)
  • Mungkin ada baris baru ( \n) di input, yang juga harus ditangani sebagai pemisahan

Peri

  • Santa membutuhkan bantuan dari tiga elf untuk orang nakal (batu bara jauh lebih berat daripada hadiah)
  • Santa membutuhkan bantuan dari dua peri untuk orang-orang baik
  • Jika tidak ada nomor di kedua sisi, santa tidak akan mengunjungi rumah itu, dan karenanya tidak memerlukan elf

Melakukan apa

Cetak jumlah elf yang santa butuhkan untuk membantunya mengantarkan hadiah ke rumah. Karena semua yang perlu diketahui Santa adalah berapa banyak elf yang harus dibawa, Anda hanya perlu mencetak jumlah elf tambahan yang ia butuhkan untuk daftar rumah

Uji Kasus

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

Aturan

  • Input dapat diambil sebagai argumen dalam suatu fungsi, atau dari STDIN atau yang setara
  • Outputnya bisa berupa nilai balik suatu fungsi, atau dicetak ke STDOUT atau setara
  • Input hanya akan berisi angka, +, *, dan baris\n
  • Hasilnya seharusnya hanya jumlah total elf yang dibutuhkan bantuan Santa untuk dikirimkan pada Natal
  • Celah standar berlaku

Mencetak gol

Giring Santa penuh dengan hadiah yang memberinya ruang lebih sedikit untuk menjalankan kode, jadi dia membutuhkan kode terpendek yang bisa dia dapatkan (jangan khawatir jika ini tidak masuk akal. Jika Anda mempertanyakan logika Santa, Anda akan berakhir di daftar nakal ). Karena alasan Santa yang BENAR , pengajuan terpendek dalam byte akan menang!

Papan peringkat

Ini adalah Stack Snippet yang menghasilkan leaderboard dan ikhtisar pemenang berdasarkan bahasa.

Untuk memastikan jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama menggunakan templat Penurunan harga berikut

## Language Name, N bytes

Di mana N adalah ukuran, dalam byte, dari kiriman Anda

Jika Anda ingin memasukkan beberapa angka dalam tajuk Anda (misalnya, mencoret skor lama, atau menyertakan bendera dalam jumlah byte), pastikan saja skor sebenarnya adalah angka terakhir di tajuk Anda

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

Jojodmo
sumber
1
Aku ingin tahu, ketika Santa akan mampir di rumah mana saja, bukankah dia hanya membutuhkan maksimum max(naughty) + max(nice)elf untuk seluruh rute? Saya pikir dia memiliki banyak peri terbang bersamanya, tetapi mungkin Anda memiliki informasi orang dalam tentang itu dan saya perlu melihat lebih dekat tahun ini. :)
insertusernamehere
8
@insertusernamedi sini saya saat ini bekerja di Santa Inc. dan saya dapat memberitahu Anda infrastruktur kami beroperasi dengan cara yang sangat async. Dia tidak ingin sumber dayanya kelaparan, jadi kami mengalokasikan pekerja sebanyak yang dibutuhkan. Jika kami membutuhkan ELF tambahan, kami dapat mengkompilasi satu dalam beberapa detik dari hello-world.c. Elf pekerja dengan bersemangat dialokasikan ke target ketika Jojodmo berkata (Saya yakin saya tahu Jojodmo, dia pasti sysadm kami) dan kemudian menggunakan panggilan balik untuk memberi tahu kapan saatnya dimasukkan kembali ke kolam giring atau ketika seorang anak melihat mereka.
Stefano Sanfilippo
2
@StefanoSanfilippo Ah, begitu. Terima kasih untuk semua wawasan terperinci dari informasi rahasia ini. Dan Selamat Natal. :)
insertusernamehere
Ini sangat masuk akal. Santa membutuhkan kode terpendek karena ia mencetak setiap karakter kode dengan printer dan kemudian menempatkannya di giringnya sebelum ia menjalankannya.
A

Jawaban:

2

Pyth, 21 byte

ssMs*VCcR\*scR\+.z_S3

Contoh multi-line

Suite uji satu baris

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.
isaacg
sumber
Serius ... Apakah ada yang tidak bisa dilakukan oleh Pyth di bawah 30 byte?
Jojodmo
2
@Jojodmo Tidak jika saya bisa membantu ...
isaacg
13

JavaScript (ES6), 52 byte

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

Penjelasan

Mengubah input menjadi pernyataan JavaScript yang valid. Mengganti semua *dengan .0*3+dan semua simbol (non-digit) lainnya dengan .0*2+. Misalnya 8*9+*10menjadi 8.0*3+9.0*2+.0*3+10. Akhirnya menambahkan .0*2sampai akhir untuk hitungan bagus terakhir. Ini berfungsi karena n.0= ndan .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 "+"
  )

Uji

pengguna81655
sumber
9
+1 untuk .0gagasan itu.
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);}

Karakter pertama adalah spasi. Kompilasi dengan:

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

Membaca dari STDIN, menulis ke STDOUT. Input diakhiri oleh EOF (Ctrl + D di konsol).

Stefano Sanfilippo
sumber
2

Mathematica, 70 byte

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

Penggunaan StringExtractuntuk mengekstraksi nomor individual.

LegionMammal978
sumber
2

CJam, 23 byte

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

Uji di sini.

Penjelasan

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.
Martin Ender
sumber
2

Serius, 38 30 byte

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

Hex Dump:

272a57736027302b272a407327f79c4d3472522a604de42b272b2c575858

Versi baru ini mematahkan penerjemah online, tetapi berfungsi dengan baik secara lokal. Ini contoh menjalankan:

$ 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

Penjelasan:

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

Versi lama:

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

Hex Dump:

272bee272a602b272b2b2c60ce587360f760bb6027302b272a4073bd4d5b332c325d2a604de4

Cobalah secara Online

Penjelasan:

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

Ini mungkin bisa lebih pendek jika saya hanya mengonversi setiap baris secara terpisah dan menyimpulkan semuanya pada akhirnya. Saya akan memeriksanya nanti.

kuintopia
sumber
2

PowerShell, 52 byte

Menggunakan variasi user81655 's .0trik

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

Versi tidak disatukan

$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

Contoh penggunaan

$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
beatcracker
sumber
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}

Ini dapat diuji di SwiftStub, di sini

Tidak disatukan

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
    }
}
Jojodmo
sumber
1

Python 3, 141 114 112 byte

Mengambil input multi-line seperti ini 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("*")))

Tidak Disatukan:

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
Sherlock9
sumber
1

Saya sangat terlambat, tapi saya ingin mencobanya.

Ruby , 84 55 byte

Saya menemukan pertanyaan ini lagi setelah bertahun-tahun dan memikirkan jawaban baru sebelum saya menyadari saya sudah menjawab ini sebelumnya. Aduh! Bagaimanapun, inilah jawaban yang ditingkatkan secara drastis.

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

Cobalah online!

Jawaban 84 byte sejak saya pertama kali menjawab ini 2 tahun yang lalu:

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

Cobalah online!

Nilai Tinta
sumber
1

Python 3 , 96 byte

lambda s:sum(int('0'+n)*(3-i%2)for i,n in enumerate(re.sub('[*\s]','+',s).split('+')));import re

Cobalah online!

101 byte tanpa regex

lambda s:sum(int('0'+n)*(3-i%2)for i,n in enumerate(s.replace('*','+').replace('\n','+').split('+')))

Cobalah online!

Matthew Jensen
sumber