Сколько эльфов нужно Санте, чтобы доставить подарки?


23

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

Уголь значительно тяжелее подарков, поэтому Санте понадобятся три эльфа на каждого непослушного человека в доме. Только два эльфа нужны, чтобы помочь Санте нести подарки.

На карте Санты дом представлен как *, а каждый дом разделен на +.

По обе стороны от дома будет цифра: слева - число непослушных людей в доме, а справа - количество милых людей в доме. Если на одной стороне нет числа, оно интерпретируется как 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
  • На выходе должно быть только общее количество эльфов, от которых Санта нуждается в помощи для доставки на Рождество
  • Применяются стандартные лазейки

счет

Сани Санты полны подарков, которые дают ему меньше места для выполнения кода, поэтому ему нужен самый короткий код, который он может получить (не волнуйтесь, если это не имеет смысла. Если вы сомневаетесь в логике Санты, вы окажетесь в списке непослушных ). Из-за ПРАВИЛЬНОГО рассуждения Санты выигрывает самое короткое представление в байтах!

Leaderboard

Это фрагмент стека, который генерирует как таблицу лидеров, так и обзор победителей по языкам.

Чтобы убедиться, что ваш ответ появляется, пожалуйста, начните свой ответ с заголовка, используя следующий шаблон уценки

## Language Name, N bytes

Где N - размер вашего сообщения в байтах

Если вы хотите включить в заголовок несколько чисел (например, пролистать старые оценки или включить флаги в счетчик байтов), просто убедитесь, что фактическая оценка является последней цифрой в заголовке.

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


1
Интересно, поскольку Санта заглянет в любой дом, разве ему не понадобится максимум max(naughty) + max(nice)эльфов для всего маршрута? Я думал, что с ним летит кучка эльфов, но, возможно, у вас есть инсайдерская информация об этом, и мне нужно присмотреться в этом году. :)
insertusername здесь

8
@insertusernamehere В настоящее время я работаю в 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 байтах?
Jojodmo

2
@Jojodmo Нет, если я смогу помочь ...
Исаак

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

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 байт

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

Я очень поздно, но я все равно хотел попробовать.

Рубин , 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.