산타는 몇 명의 엘프에게 선물을 전달해야합니까?


23

산타는 각 집에 선물을 전달하는 데 얼마나 많은 엘프가 필요한지 결정하는 데 도움이 필요합니다.

석탄은 선물보다 상당히 무겁기 때문에 산타는 집안에있는 나쁜 사람마다 3 명의 엘프가 필요합니다. 산타가 선물을 나르는데 도움을주기 위해 두 명의 엘프만이 필요합니다.

산타의지도에서 집은로 표시되고 *각 집은로 나뉩니다 +.

집안의 양쪽에는 숫자가 있습니다. 왼쪽은 집안의 장난 꾸러기 사람들의 수를 나타내고, 오른쪽은 집안의 좋은 사람들의 수를 나타냅니다. 한쪽에 숫자가 없으면 0으로 해석됩니다.

산타는 크리스마스 정신이없는 사람들을 방문하지 않기 때문에 (석탄조차도 필요하지 않음) 때로는 집 양쪽에 숫자가 없을 수도 있습니다. 이 경우 산타는 엘프의 도움이 필요하지 않습니다.

예를 들어, 산타의지도 중 하나는 다음과 같습니다

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

첫 번째 집에는 1 명의 장난 꾸러기와 3 명의 멋쟁이 가 있으며, 산타에게는 9 명의 엘프 가 필요합니다 . 두 번째에있다 2 장난 꾸러기와 2 산타 필요한, 좋은 엘프. 세 번째 집에는 1 개의 장난 꾸러기와 0 개의 멋쟁이가 있고 , 산타에게는 3 명의 엘프 가 필요 하고, 마지막 집에는 0 개의 장난 꾸러기와 2 개의 멋쟁이 가 있으며, 산타는 4 명의 엘프 가 필요합니다 .

그러나 이것은 산타의지도 중 하나의 단순화 된 버전입니다. 일반적으로 산타의지도에는 여러 줄이 있으며 그의 목록에 더 잘 맞도록 사각형 모양입니다. 노멀 맵은 다음과 같이 보일 수 있습니다 ( \n각 줄의 끝에 있는 a )

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
  • 산타가 크리스마스를 배달하는 데 도움이 필요한 총 엘프 수만 출력해야합니다.
  • 표준 허점 적용

채점

산타의 썰매는 선물로 가득 차서 코드를 실행할 공간이 줄어들 기 때문에 가장 짧은 코드가 필요합니다. ). 산타의 정확한 추론 으로 인해 가장 짧은 바이트 제출이 이깁니다!

리더 보드

리더 보드와 언어 별 수상자 개요를 모두 생성하는 스택 스 니펫입니다.

답변이 표시되도록하려면 다음 마크 다운 템플릿을 사용하여 헤드 라인으로 답변을 시작하십시오.

## Language Name, N bytes

여기서 N은 제출 크기 (바이트)입니다.

헤더에 여러 숫자를 포함하려면 (예를 들어, 오래된 점수를 받거나 바이트 수에 플래그 포함) 실제 점수가 헤더 의 마지막 숫자 인지 확인하십시오.

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


1
산타가 집에 max(naughty) + max(nice)들러서 전체 경로에 최대 엘프 가 필요하지 않을까요? 나는 그와 함께 날아 다니는 많은 엘프가 있다고 생각했지만, 당신은 그것에 대한 내부자 정보를 가지고 있고 올해 더 자세히 볼 필요가 있습니다. :)
insertusernamehere

8
@insertusername 여기서 현재 Santa Inc.에서 근무하고 있으며 인프라가 심하게 비동기 방식으로 작동한다고 말할 수 있습니다. 그는 자신의 자원이 고갈되는 것을 원하지 않기 때문에 필요한만큼 많은 근로자를 할당합니다. 추가 ELF가 필요한 경우에서 몇 초 안에 컴파일 할 수 있습니다 hello-world.c. Jojodmo가 말한 것처럼 작업자 엘프는 대상에 열심히 할당됩니다 (Jojodmo는 우리의 sysadm이어야 함을 알고 있습니다). 그러면 썰매 풀에 다시 삽입 할 때 또는 어린이가 볼 때 알림을 위해 콜백을 사용하십시오.
Stefano Sanfilippo

2
@StefanoSanfilippo 아, 알겠습니다. 이 분류 된 정보에 대한 자세한 통찰력에 감사드립니다. 그리고 메리 크리스마스. :)
insertusernamehere

이것은 완전히 의미가 있습니다. 산타는 코드의 모든 문자를 프린터로 인쇄 한 다음 실행하기 전에 썰매에 넣기 때문에 가장 짧은 코드가 필요합니다.
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

자바 스크립트 (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
.0아이디어에 +1
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.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

파이썬 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}}

온라인으로 사용해보십시오!

2 년 전 처음 응답했을 때의 84 바이트 이전 답변 :

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