Решение Санты


29

Решение Санты:

В этом задании вы поможете Санта-Клаусу решить, был ли кто-то в его списке непослушным или милым, и впоследствии получите coalили toys.

Но , к сожалению, Санта неорганизованная, в некоторых из его записей, то naughty, nice и nameполя находятся в неправильном порядке.

вход

Ввод поступит в следующем, взаимозаменяемом формате:

  • имя человека (не может содержать только двоеточие 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.
  • Но если naughtyи niceравны, то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
Это хорошая идея ... Я думаю, что всегда будет в следующий раз ...
Перо

1
«Бальфе нужно больше данных» .
Адам Дэвис

Ответы:



5

Юлия, 176 169 байт

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

Это анонимная функция, которая принимает строку и печатает результат в STDOUT. Чтобы назвать его, дайте ему имя, например f=s->....

Ungolfed:

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

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

Ungolfed

->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[?:]}можно сыграть в гольф.grep(/:/)
гистократ

@histocrat Вау, я полностью забыл этот метод. Спасибо :)
Васу Адари

3

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

включает +1 для -p

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

Менее гольф:

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)

  • обновление 113
    • сохранить 25 байтов, используя 1 букву от niceили naughtyкак имя переменной;
    • потерять 5 байт, исправив ошибку, когда имя является последним
  • обновить 105 сохранить 8 байтов, используя <=>для индексации списка выходных строк.
  • обновить 103 сохранить 2 байта с помощью регулярного выражения для добавления выходной строки
  • обновить 102 сохранить 1 байт, используя последнюю букву niceили naughtyвместо 2-го.
  • обновить 96 сохранить 6 байтов, перейдя $$_ ? ... : ($$_++, ...)в $$_++ ? ... : ...
    (почему я не видел это раньше).

2

JavaScript (ES6), 174 байта - бонус 25% = 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``

объяснение

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

Тест



2

Lua, 329 байт - бонус 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

Отредактирую в негольфированной версии и объяснениях позже, немного уставший на данный момент. Все данные вводятся через командную строку, разделенные пробелом.


2

Python 2, 206 байт - 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%)

Анонимная функция, использующая строки шаблона, есть 4 новых строки, которые являются значительными и включены в число байтов

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``
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.