Quyết định của ông già Noel


29

Quyết định của ông già Noel:

Trong thử thách này, bạn sẽ giúp ông già Noel quyết định xem ai đó trong danh sách của họ là nghịch ngợm hay tốt bụng, và sau đó có được coalhay không toys.

Nhưng thật không may, ông già Noel là chưa được tổ chức, trong một số bút ký của mình, các naughty, nicenamecác trường là theo thứ tự sai.

Đầu vào

Đầu vào sẽ có các định dạng sau, có thể hoán đổi cho nhau:

  • tên người (không thể chứa dấu hai chấm a-zA-Z0-9)
  • từ được naughtytheo sau trực tiếp bởi dấu hai chấm và số nguyên không âm biểu thị số lần ông già Noel bắt bạn trở nên nghịch ngợm
  • từ được nicetheo sau trực tiếp bởi dấu hai chấm và số nguyên không âm biểu thị số lần ông già Noel bắt bạn trở nên tốt đẹp

Tất cả được phân tách bằng một khoảng trắng duy nhất (ASCII 32) giữa mỗi khoảng trắng.

Ngoài ra, tên sẽ không có khoảng trắng giữa các phần của tên Santa Claus-> SantaClaus.

Tiền thưởng:

  • (25%) : Ông là ông già Noel, vì vậy ông cần kiểm tra danh sách hai lần và đảm bảo không có bản sao. (Trong trường hợp đó, nó chỉ đạt được điểm số đầu tiên mà người dùng có)

Thí dụ:

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

Đầu ra:

Đầu ra phải bao gồm:

Tên của người theo sau:

  • Nếu có nhiều điểm hơn naughty, thì coal:
  • Nếu có nhiều điểm hơn nice, thì toys.
  • Nhưng nếu naughtynicebằng nhau, thìneeds more data

    Ví dụ đầu ra:

  • Với tiền thưởng tổ chức và tiền thưởng loại bỏ trùng lặp:

Quill coal
Doorknob toys
balpha needs more data
pops toys
  • Không có tiền thưởng:

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

Số byte thấp nhất sẽ thắng!


4
Cũng có một lỗi đánh máy trong các trường hợp thử nghiệm. Bạn đã viết sai tên mod vinh quang của chúng tôi DorkNoob : ^)
FryAmTheEggman

9
@FryAmTheEggman _ಠ
Doorknob

2
Không, nghịch ngợm hay tốt đẹp là những cái tên hợp lệ
Quill

1
Đó là một ý tưởng hay ... Tôi đoán sẽ luôn có lần sau ...
Quill

1
"Balpha cần nhiều dữ liệu hơn" Nghe có vẻ đúng.
Adam Davis

Câu trả lời:


4

Pyth, 68 byte - 25% = 51

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

Dùng thử trực tuyến: Trình diễn


5

Julia, 176 169 byte

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

Đây là một hàm ẩn danh chấp nhận một chuỗi và in kết quả ra STDOUT. Để gọi nó, đặt tên cho nó, vd f=s->....

Ung dung:

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

Ruby, 144 123 155 * .75 = 116,25 byte

->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])}}

Cảm ơn histocrat cho đề xuất grepphương pháp.

164 * .75 = 123 byte

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

->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]}}

Bị đánh cắp

->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]
      )
  }
}

Sử dụng:

# 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[?:]}có thể được chơi gôn.grep(/:/)
lịch sử

@histocrat Wow tôi hoàn toàn quên mất phương pháp đó. Cảm ơn bạn :)
Vasu Adari

3

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

bao gồm +1 cho -p

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

Ít chơi gôn hơn:

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)

  • cập nhật 113
    • lưu 25 byte bằng cách sử dụng 1 chữ cái từ nicehoặc naughtylàm tên biến;
    • mất 5 byte bằng cách sửa lỗi khi tên cuối cùng
  • cập nhật 105 lưu 8 byte bằng cách sử dụng <=>để lập chỉ mục một danh sách các chuỗi đầu ra.
  • cập nhật 103 lưu 2 byte bằng cách sử dụng regex để nối chuỗi đầu ra
  • cập nhật 102 lưu 1 byte bằng cách sử dụng chữ cái cuối cùng nicehoặc naughtythay vì thứ 2.
  • cập nhật 96 lưu 6 byte bằng cách thay đổi $$_ ? ... : ($$_++, ...)thành $$_++ ? ... : ...
    (tại sao tôi không thấy điều đó trước đây).

2

JavaScript (ES6), 174 byte - 25% tiền thưởng = 130,5 điểm

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

Giải trình

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

Kiểm tra



2

Lua, 329 Byte - 25% tiền thưởng = 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

Sẽ chỉnh sửa trong phiên bản chưa được chỉnh sửa và giải thích sau, hơi mệt vào lúc này. Tất cả các đầu vào được thực hiện thông qua dòng lệnh, không gian tách biệt.


2

Python 2, 206 byte - 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%)

Hàm ẩn danh sử dụng chuỗi mẫu, có 4 dòng mới có ý nghĩa và được bao gồm trong số byte

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``
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.