Скільки ельфів потрібно Санта, щоб доставити подарунки?


23

Санта потребує допомоги, щоб визначити, скільки ельфів йому знадобиться, щоб допомогти йому доставити подарунки до кожного будинку.

Вугілля значно важче, ніж подарунки, тож Санта потребує трьох ельфів для кожної неслухняної людини в будинку. Тільки два ельфи потрібні, щоб допомогти Санта переносити подарунки.

На карті Санта будинок представлений символом a *, а кожен будинок розділений символом a +.

Буде номер з обох боків будинку - той, що ліворуч представляє кількість неслухняних людей у ​​будинку, і той, що праворуч представляє кількість приємних людей у ​​будинку. Якщо на одній стороні немає числа, це інтерпретується як 0.

Санта не відвідує тих, хто не в дусі Різдва (вони навіть не заслуговують вугілля), тому іноді будинок може не мати номера по обидва боки. У цьому випадку Санта не потребує допомоги жодних ельфів

Наприклад, одна з карт Санти може виглядати так

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

У першому будинку є 1 пустотливий і 3 приємні, Санта знадобиться дев’ять ельфів. У другій - 2 пустотливих і 2 приємних, Санта знадобиться десять ельфів. У третьому будинку 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., і можу сказати вам, що наша інфраструктура працює в дуже асинхронному режимі. Він не хоче, щоб його ресурси голодували, тому ми виділяємо стільки працівників, скільки потрібно. Якщо нам потрібен додатковий ELF, ми можемо скласти його за кілька секунд hello-world.c. Робочі ельфи охоче розподіляються за цілями, як сказав Джоддмо (я впевнений, що я знаю, що Джоджо, він повинен бути нашою системою), а потім використовують зворотний дзвінок, щоб повідомити, коли прийшов час перевстановитись у санний басейн або коли дитина їх побачила.
Стефано Санфіліппо

2
@StefanoSanfilippo Ах, бачу. Дякуємо за всю детальну інформацію про цю секретну інформацію. І з Різдвом Христовим. :)
insertusernameту

Це абсолютно має сенс. Санта потребує найкоротшого коду, оскільки він друкує кожен символ коду за допомогою принтера, а потім кладе їх на сани, перш ніж виконувати їх.

Відповіді:


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 байт?
Джодмомо

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
+1 для .0ідеї.
німі

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

Математика, 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

Швидкий 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}}

Спробуйте в Інтернеті!

Стара відповідь на 84 байти, коли я вперше відповів на це 2 роки тому:

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

Спробуйте в Інтернеті!


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.