Keputusan Santa

29

Keputusan Santa:

Dalam tantangan ini, Anda akan membantu Santa Claus memutuskan apakah seseorang di daftar mereka nakal atau baik, dan kemudian mendapatkan coalatau toys.

Namun sayangnya, Santa tidak terorganisir, dalam beberapa entri, bidang naughty, nice dan namedalam urutan yang salah.

Memasukkan

Input akan datang dalam format berikut yang dapat dipertukarkan:

  • nama orang (tidak boleh mengandung titik dua, hanya a-zA-Z0-9)
  • kata yang naughtydiikuti secara langsung oleh titik dua dan bilangan bulat non-negatif mewakili jumlah kali Santa menangkap Anda nakal
  • kata yang nicediikuti secara langsung oleh titik dua dan bilangan bulat non-negatif yang menunjukkan berapa kali Santa membuat Anda bersikap baik

Semua dipisahkan dengan spasi putih tunggal (ASCII 32) di antara masing-masing.

Selain itu, nama tidak akan memiliki spasi putih di antara bagian nama Santa Claus-> SantaClaus.

Bonus:

  • (25%) : Dia adalah Santa Claus, jadi dia perlu memeriksa daftar dua kali , dan pastikan tidak ada duplikat. (Dalam hal ini, itu hanya mendapat skor pertama yang dimiliki pengguna)

Contoh:

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

Keluaran:

Output harus terdiri dari:

Nama orang tersebut diikuti oleh:

  • Jika ada lebih banyak poin naughty, maka coal:
  • Jika ada lebih banyak poin nice, maka toys.
  • Tetapi jika naughtydan nicesama, makaneeds more data

    Contoh output:

  • Dengan bonus organisasi dan bonus penghapusan rangkap:

Quill coal
Doorknob toys
balpha needs more data
pops toys
  • Tanpa bonus:

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

Hitungan byte terendah menang!

Bulu ayam
sumber
4
Ada juga kesalahan ketik pada test case. Anda salah mengeja nama DorkNoob mod kita yang mulia : ^)
FryAmTheEggman
9
@FryAmTheEggman ಠ_ಠ
Doorknob
2
Tidak, nakal atau menyenangkan adalah nama yang valid
Quill
1
Itu ide yang bagus ... Saya kira selalu ada waktu berikutnya ...
Quill
1
"balpha membutuhkan lebih banyak data" Kedengarannya benar.
Adam Davis

Jawaban:

4

Pyth, 68 byte - 25% = 51

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

Cobalah online: Demonstrasi

Jakube
sumber
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

Ini adalah fungsi anonim yang menerima string dan mencetak hasilnya ke STDOUT. Untuk menyebutnya, berikan nama, mis f=s->....

Tidak Terkumpul:

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
Alex A.
sumber
4

Pyth - 64 byte

Akan mencoba menggunakan string yang dikemas.

jmj\ +hK.g@k\:cd\ @c"needs more data
coal
toys"b._-Fmseck\:SeK.z

Cobalah online di sini .

Maltysen
sumber
Bahasa ini adalah teknologi yang cukup canggih.
Robert Grant
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])}}

Terima kasih kepada histokrat untuk menyarankan grep metode.

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

Tidak disatukan

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

Pemakaian:

# 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
Vasu Adari
sumber
.select{|t|t[?:]}dapat .grep(/:/)
bermain golf
@ histokrat Wow saya benar-benar lupa metode itu. Terima kasih :)
Vasu Adari
3

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

termasuk +1 untuk -p

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

Kurang bermain golf:

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)

  • pembaruan 113
    • hemat 25 byte dengan menggunakan 1 huruf dari niceataunaughty sebagai nama variabel;
    • kehilangan 5 byte dengan memperbaiki bug saat nama terakhir
  • perbarui 105 simpan 8 byte dengan menggunakan<=> untuk mengindeks daftar string keluaran.
  • pembaruan 103 simpan 2 byte dengan menggunakan regex untuk menambahkan string keluaran
  • perbarui 102 simpan 1 byte dengan menggunakan huruf terakhir niceataunaughty bukan 2.
  • perbarui 96 simpan 6 byte dengan mengubahnya $$_ ? ... : ($$_++, ...)menjadi $$_++ ? ... : ...
    (mengapa saya tidak melihat itu sebelumnya).
Kenney
sumber
2

JavaScript (ES6), 174 byte - Bonus 25% = skor 130,5

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

Penjelasan

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

Uji

pengguna81655
sumber
2

CJam, 64 byte

qN/{S/':f/_{,1=},_@^$1f=:~:-g"needs more data
coal
toys"N/=S\N}/

Cobalah online!

Dennis
sumber
2

Lua, 329 Bytes - Bonus 25% = 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

Akan mengedit dalam versi dan penjelasan ungolfed nanti, sedikit lelah saat ini. Semua input diambil melalui baris perintah, dipisahkan oleh ruang.

Cyv
sumber
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]
TFeld
sumber
2

JavaScript (ES6) 120 (160-25%)

Fungsi anonim menggunakan string template, ada 4 baris baru yang signifikan dan termasuk dalam jumlah 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``
edc65
sumber