산타의 결정


29

산타의 결정 :

이 문제에서는 산타 클로스가 자신의 목록에있는 누군가가 장난 꾸러기 또는 좋은되었는지 여부를 결정하는 데 도움이, 그리고 이후에 얻을 것이다 coaltoys.

그러나 불행히도 산타는 그의 입장에서 조직화되지 않았습니다. naughty 에서 nicename필드의 순서가 잘못되었습니다.

입력

입력은 다음과 같은 교환 가능한 형식으로 제공됩니다.

  • 사람의 이름 (콜론 만 포함 할 수 없으며 a-zA-Z0-9 )
  • 단어 naughty 뒤에는 콜론과 산타가 너를 못쓰게했던 횟수를 나타내는 음이 아닌 정수가 뒤 따른다
  • 단어 nice뒤에 콜론과 산타가 너를 멋지게 붙잡는 횟수를 나타내는 음이 아닌 정수

모두 공백을 하나의 공백 (ASCII 32)으로 구분합니다.

또한 이름에는 이름 부분 사이에 공백이 없습니다 Santa Claus.->SantaClaus .

보너스:

  • (25 %) : 그는 산타 클로스이므로 목록을 두 번 확인하고 중복이 없는지 확인해야합니다. (이 경우 사용자가 가진 첫 번째 점수 만 얻습니다)

예:

Quill naughty:4 nice:0
naughty:0 Doorknob nice:3
naughty:2 Quill nice:6
nice:3 balpha naughty:3
pops nice:4 naughty:2

산출:

출력은 다음으로 구성되어야합니다.

그 사람의 이름 :

  • 에서 더 많은 포인트가 있다면 naughty다음을 coal:
  • 에서 더 많은 포인트가 있다면 nice다음 toys.
  • 그러나 경우 naughtynice다음, 동일needs more data

    출력 예 :

  • 조직 보너스 및 중복 제거 보너스 :

Quill coal
Doorknob toys
balpha needs more data
pops toys
  • 보너스없이 :

Quill coal
Doorknob toys
Quill toys
balpha needs more data
pops toys

가장 낮은 바이트 수가 이깁니다!


4
테스트 사례에도 오타가 있습니다. 당신은 우리의 영광스러운 모드 DorkNoob 의 이름을 잘못 입력했습니다 : ^)
FryAmTheEggman

9
@FryAmTheEggman ಠ_ಠ
손잡이

2
아니, 장난 꾸러기 또는 좋은 이름은 유효합니다
Quill

1
좋은 생각입니다 ... 다음에 항상있을 것 같아요
Quill

1
"balpha 더 많은 데이터를 필요로" 권리에 대한 그 소리.
Adam Davis

답변:


4

Pyth, 68 bytes - 25% = 51

V.zI-hA.g}\:kcNdY=+YGjd+G@c"needs more data
coal
toys"b._-Fmsecd\:SH

Try it online: Demonstration


5

Julia, 176 169 bytes

s->for l=split(s,"\n") M(r)=parse(matchall(r,l)[1]);g=M(r"e:\K\d+");b=M(r"y:\K\d+");println(replace(l,r" *\w+:\d+ *","")," ",g>b?"toys":b>g?"coal":"needs more data")end

This is an anonymous function that accepts a string and prints the result to STDOUT. To call it, give it a name, e.g. f=s->....

언 골프 드 :

function santa(s::AbstractString)
    # Split the input on newlines and process each line separately
    for l in split(s, "\n")
        # Define a function to get the number from the result of a
        # regular expression match
        M(r) = parse(matchall(r, l)[1])

        # Goodness
        g = M(r"e:\K\d+")

        # Badness
        b = M(r"y:\K\d+")

        # Get the name by replacing the naughty and nice specifications
        # with empty strings and print the line to STDOUT
        println(replace(l, r" *\w+:\d+ *", ""), " ",
                g > b ? "toys" : b > g ? "coal" : "needs more data")
    end
end


3

루비 144 123 155 * 0.75 = 116.25 바이트

->s{d={}
s.split("
").map{|l|
a=l.split
b=a.grep /:/
i,j,v=(b.sort*'').scan(/\d+/)+a-b
d[v]||(d[v]=0
puts v+' '+['needs more data','coal','toys'][i<=>j])}}

grep방법 을 제안 해 주신 히스 토크 라트에게 감사드립니다 .

164 * .75 = 123 바이트

->s{d={}
s.split("
").map{|l|
a=l.split
b=a.select{|t|t[?:]}
i,j,v=(b.sort*'').scan(/\d+/)+a-b
d[v]||(d[v]=0
puts v+' '+['needs more data','coal','toys'][i<=>j])}}

144 바이트

->s{puts s.split("
").map{|l|b=(a=l.split).select{|t|t[?:]};i,j=(b.sort*'').scan(/\d+/);(a-b)[0]+' '+['needs more data','coal','toys'][i<=>j]}}

언 골프

->s{
  d={}
  s.split("
  ").map{ |l|
    a = l.split
    b = a.grep /:/
    i, j, v = (b.sort * '').scan(/\d+/) + a-b
    d[v] ||
      (d[v]=0
       puts v + ' ' + ['needs more data','coal','toys'][i<=>j]
      )
  }
}

용법:

# Assign the anonymous function to a variable
f = ->s{d={}
s.split("
").map{|l|
a=l.split
b=a.grep /:/
i,j,v=(b.sort*'').scan(/\d+/)+a-b
d[v]||(d[v]=0
puts v+' '+['needs more data','coal','toys'][i<=>j])}}

f["Quill naughty:4 nice:0
naughty:0 Doorknob nice:3
naughty:2 Quill nice:6
nice:3 balpha naughty:3
pops nice:4 naughty:2"]

Quill coal
Doorknob toys
balpha needs more data
pops toys

.select{|t|t[?:]} can be golfed to .grep(/:/)
histocrat

@histocrat Wow i totally forgot that method. Thank you :)
Vasu Adari

3

Perl, 138 113 105 103 102 96 - 25% = 72

includes +1 for -p

s/ *\w*(.):(\d+) */$$1=$2,()/eg;$$_++?$_='':s/\n/$".('needs more data',toys,coal)[$e<=>$y].$&/e

Less golfed:

s/ *\w*(.):(\d+) */$$1=$2,()/eg;    # strip naughty/nice, set $a to naughty, $i to nice
                                    # $_ is now the input name followed by \n
$$_++ ? $_='' :                     # only output once per name
s/\n/                               # replace newlines with:
  $".                               # a space,
  ('needs more data',toys,coal)     # one of these strings,
  [$e<=>$y]                         # indexed by -1, 0 or 1
  .$&                               # and the matched newline.
/ex                                 # (/x only for legibility)

  • update 113
    • save 25 bytes by using 1 letter from nice or naughty as variable name;
    • loose 5 bytes by fixing bug when name is last
  • update 105 save 8 bytes by using <=> to index a list of output strings.
  • update 103 save 2 bytes by using regex to append output string
  • update 102 save 1 byte by using last letter of nice or naughty instead of 2nd.
  • update 96 save 6 bytes by changing $$_ ? ... : ($$_++, ...) into $$_++ ? ... : ...
    (why didn't I see that before).

2

JavaScript (ES6), 174 bytes - 25% bonus = 130.5 score

s=>s.split`
`.map(l=>l.split` `.map(p=>(m=p.match(/\w:\d+/))?(n=+m[0].slice(2),m>"f")?b=n:c=n:a=p)&&d[a]?"":d[a]=a+" "+(b>c?`coal
`:b<c?`toys
`:`needs more data
`),d={}).join``

Explanation

s=>
  s.split`
`.map(l=>                   // for each line l of Santa's list
    l.split` `.map(p=>      // for each word p in l
      (m=p.match(/\w:\d+/)) // m = "y:x" for naughty, "e:x" for nice or null for name
        ?(n=+m[0].slice(2), // n = number at end of match
          m>"f")?b=n:c=n    // if naughty matched b = n, if nice matched c = n
        :a=p                // if no match, a = name
    )
    &&d[a]?"":              // if the name has been used before, add nothing to output
    d[a]=                   // else set d[name] to true

      // Add the appropriate text to the output
      a+" "+(b>c?`coal
`:b<c?`toys
`:`needs more data
`),

    // NOTE: This line is executed BEFORE the code above it in the map function...
    d={}                    // d = list of names that have been output
  )
  .join``                   // return the list of outputs as a string

Test



2

Lua, 329 Bytes - 25% bonus = 246.75

a={...}p={}u=" "k=ipairs for i=1,#a/3 do p[i]={}end for i,v in k(a)do p[math.floor((i+2)/3)][(v:find("y:")and 3)or(v:find("e:")and 2)or 1]=v:gsub("%a+%:","")end for i,v in k(p)do d=tonumber b,g,n=d(v[3]),d(v[2]),v[1]if(not u:find(" "..n.." "))then u=u..n.." "print(n..(g<b and" coal"or g>b and" toys"or" needs more data"))end end

Will edit in ungolfed version and explanations later, a bit tired at the moment. All input is taken in through command line, space separated.


2

Python 2, 206 bytes - 25% = 154.5

s=[]
x=[0,0]
for p in zip(*(iter(input().split()),)*3):
 for w in p:
  j=w.find(':')+1
  if j:x[j<6]=int(w[j:])
  else:N=w
 b,g=x
 if N not in s:print N,['needs more data','coal','toys'][(b>g)-(g>b)];s+=[N]

2

JavaScript (ES6) 120 (160-25%)

Anonymous function using template strings, there are 4 newlines that are significant and included in the byte count

l=>l.split`
`.map(r=>k[r=r.replace(/\S+:(\d+)/g,(a,c)=>(t-=a[1]<'i'?c:-c,''),t=0).trim()]?'':k[r]=r+(t>0?` toys
`:t<0?` coal
`:` needs more data
`),k={}).join``
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.