Noel Baba'nın hediye vermesi için kaç elf gerekiyor?


23

Noel Baba'nın, her eve hediye vermesi için kaç elf kullanması gerektiğine karar vermek için yardıma ihtiyacı var.

Kömür hediyelerden oldukça ağırdır, bu yüzden santa evdeki her yaramaz insan için üç elf gerekir. Noel Baba'nın hediye taşımasına yardım etmek için sadece iki elf gerekir.

Noel Baba'nın haritasında bir ev a ile temsil edilir *ve her ev bir ile bölünür +.

Evin her iki tarafında bir miktar olacaktır - soldaki evdeki yaramaz insan sayısını, soldaki evdeki güzel insan sayısını temsil eden. Bir tarafta sayı yoksa, 0 olarak yorumlanır.

Noel Baba, yılbaşı ruhunda olmayanları (kömür bile hak etmiyorlar) ziyaret etmiyor, bu nedenle bazen bir evin iki tarafında bir numarası olmayabilir. Bu durumda, santa herhangi bir elflerden yardıma ihtiyaç duymaz

Örneğin, Noel Baba'nın haritalarından biri şöyle görünebilir.

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

İlk evde 1 yaramaz ve 3 güzel var, Noel Baba dokuz elf gerekecek . İkincisi, 2 yaramaz ve 2 güzel, santa on elf gerekir . Üçüncü evde 1 yaramaz ve 0 güzel var, Noel Baba'nın üç elf, son evinde 0 yaramaz ve 2 güzel Noel Baba'nın dört elf gerekecek .

Bu, yine de, santa haritasından birinin aşırı basitleştirilmiş bir versiyonudur. Normalde, Noel Baba'nın haritaları birden fazla satıra sahiptir ve listeye daha iyi uyması için kare şeklindedir. Normal bir harita böyle bir şeye benzeyebilir \n(her satırın sonunda bir)

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

Bu haritada, santa ihtiyaç ((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

Meydan okuma

Noel Baba'ya, her eve kaç tane mal teslim etmesi gerektiğini belirlemesine yardım edin!

Evler

  • Bir ev tarafından temsil edilen *
  • Evler bölünmüş +
  • Evin solundaki sayı yaramaz insan sayısını belirtir (sayı 0 anlamına gelir)
  • Sağdaki sayı, iyi insan sayısını gösterir (sayı 0 anlamına gelir)
  • \nGirişte ayrıca bölünmüş olarak ele alınması gereken newlines ( ) olabilir.

Elfler

  • Noel Baba'nın yaramaz insanlar için üç elften yardıma ihtiyacı var (kömür hediyelerden çok daha ağırdır)
  • Santa iyi insanlar için iki elflerin yardıma ihtiyacı var
  • Her iki tarafta da sayı yoksa, Noel Baba o evi ziyaret etmez ve bunun için elflere ihtiyaç duymaz

Ne yapalım

Evlere hediye vermesi için Noel Baba'nın ihtiyacı olan elflerin sayısını yazdır. Tüm Noel Baba'nın bilmesi gereken, kaç tane elf getirmesi gerektiği olduğu için, sadece evlerin listesi için ihtiyacı olan elf sayısını yazdırmanız yeterlidir.

Test Kılıfları

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

kurallar

  • Girdi, bir işlevde argüman olarak veya STDIN veya eşdeğerinden alınabilir.
  • Çıktı, bir işlevin dönüş değeri olabilir veya STDOUT veya eşdeğerine basılabilir.
  • Giriş sadece sayılar, içerecektir +, *ve yeni satır\n
  • Çıktı yalnızca Noel Baba’nın Noel’de teslim edilmesi için ihtiyaç duyduğu toplam elf sayısı olmalıdır.
  • Standart boşluklar uygulanır

puanlama

Noel Baba'nın kızağı, kodunu çalıştırması için daha az alan veren hediyelerle doludur, bu yüzden alabileceği en kısa koda ihtiyacı vardır (bu mantıklı olmazsa endişelenmeyin. ). Noel Baba'nın DOĞRU muhakeme nedeniyle , bayt cinsinden en kısa gönderme kazanır!

Liderler Sıralaması

Bu, hem lider tablosunu hem de kazananların dile göre genel bir bakış oluşturmasını sağlayan bir Stack Snippet'tir.

Cevabınızın göründüğünden emin olmak için, lütfen aşağıdaki Markdown şablonunu kullanarak cevabınızı bir başlık ile başlatın

## Language Name, N bytes

N, gönderinizin bayt olarak büyüklüğüdür.

Başlığınıza birden çok numara eklemek istiyorsanız (örneğin, eski puanlara dikkat çekmek veya bayt sayımındaki bayraklar dahil), gerçek puanın başlığınızdaki son sayı olduğundan emin olun.

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


1
Merak ediyorum, Noel Baba herhangi bir evde uğrayacağından max(naughty) + max(nice), tüm yol boyunca maksimum elflere ihtiyacı olmaz mı? Yanında uçan bir sürü elf var sanıyordum, ama belki bunun hakkında içeriden bilgi edinmişsindir ve bu yıl daha yakından bakmam gerekiyor. :)
adınız

8
@insertusernamehere Şu anda Santa Inc.'de çalışıyorum ve altyapımızın çok asenkron bir şekilde çalıştığını söyleyebilirim. Kaynaklarının açlıktan ölmesini istemiyor, bu yüzden gerektiği kadar işçi tahsis ediyoruz. Fazladan bir ELF'ye ihtiyacımız olursa, birkaç saniyede birini derleyebiliriz hello-world.c. İşçi elfleri Jojodmo'nun dediği gibi hedeflere istekli bir şekilde tahsis edildi (Eminim Jojodmo'yu tanıdık, bizim sistemimiz olmalı) ve sonra kızak havuzuna ne zaman yerleştirileceğini veya bir çocuğun onları gördüğünü bildirmek için bir geri arama kullanın.
Stefano Sanfilippo,

2
@StefanoSanfilippo Ah, anlıyorum. Bu gizli bilgilerin tüm detayları için teşekkürler. Ve Mutlu Noeller. :)
insertusernamehere

Bu tamamen mantıklı. Noel Baba'nın en kısa koda ihtiyacı var, çünkü kodun her karakterini bir yazıcıyla yazdırıyor ve sonra çalıştırmadan önce onları kızağının üzerine koyuyor.
Bir

Yanıtlar:


2

Pyth, 21 bayt

ssMs*VCcR\*scR\+.z_S3

Çok hatlı örnek

Tek hat test odası

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.

Ciddi ... orada birşey Pyth mi olamaz 30 bayt altında mı?
Jojodmo

2
@Jojodmo Yardım
edemezsem

13

JavaScript (ES6), 52 bayt

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

açıklama

Girişi geçerli bir JavaScript ifadesine dönüştürür. Tüm değiştirir *ile .0*3+ve diğer tüm (non basamaklı) sembolleri ile .0*2+. Mesela 8*9+*10olur 8.0*3+9.0*2+.0*3+10. Sonunda .0*2son güzel sayımın sonuna eklenir . Bu çalışır çünkü n.0= nve .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 "+"
  )

Ölçek


9
.0Fikir için +1 .
nimi

3

Flex + C, 112 90 bayt

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

İlk karakter bir boşluktur. İle derleyin:

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

STDIN'den okur, STDOUT'a yazar. Giriş, EOF ile sonlandırılır (konsolda Ctrl + D).


2

Mathematica, 70 bayt

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

Kullanımları StringExtractbireysel numaraları ayıklamak için.


2

CJam, 23 bayt

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

Burada test et.

açıklama

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

Cidden, 38 30 bayt

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

Hex Dump:

272a57736027302b272a407327f79c4d3472522a604de42b272b2c575858

Bu yeni sürüm çevrimiçi tercümanı kırar ancak yerel olarak iyi çalışır. İşte bir örnek çalışma:

$ 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

Açıklama:

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

Eski versiyon:

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

Hex Dump:

272bee272a602b272b2b2c60ce587360f760bb6027302b272a4073bd4d5b332c325d2a604de4

Çevrimiçi Deneyin

Açıklama:

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

Her satırı ayrı ayrı dönüştürüp sonunda hepsini toplarsam, bu daha kısa olabilir. Daha sonra inceleyeceğim.


2

PowerShell, 52 bayt

Varyasyonunu kullanarak user81655 s' .0hüner

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

Ungolfed versiyonu

$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

Kullanım örneği

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

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}

Bu , burada SwiftStub'ta test edilebilir

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 bayt

Bunun gibi çok satırlı girişleri alır 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

Çok geç kaldım, ama yine de bir şans vermek istedim.

Ruby , 84 55 bayt

Bu soruyu yıllar sonra tekrar buldum ve daha önce cevapladığımı fark etmeden önce yeni bir cevap düşünüyordum. Tüh! Her neyse, işte son derece gelişmiş bir cevap.

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

Çevrimiçi deneyin!

Bu 2 yıl önce ilk cevapladığımda gelen eski 84 baytlık cevap:

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

Çevrimiçi deneyin!


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.