Кто победит в футбольном матче?


17

Чемпионат по американскому футболу Super Bowl 50 состоится сегодня в 23:30 UTC (и вы можете смотреть его в прямом эфире онлайн ). Этот вызов был сделан, чтобы отпраздновать это.


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

Напишите программу или функцию, которая принимает строку в одну строку, содержащую только эти шесть сокращений, как в верхнем, так и в нижнем регистре.

Эта строка представляет все события подсчета очков в игре (или части игры) в футбол, причем прописные слова принадлежат одной команде, а строчные - другой.

Ваша задача - сообщить итоговые результаты игры и указать, кто выиграл, с помощью формы

[score 1] [to] [score 2]

где:

  • [score 1] всегда больше, чем один из двух баллов (если не равен), независимо от того, выиграл ли он в верхнем или нижнем регистре.
  • [score 2] является меньшим из двух баллов (если не равен).
  • [to]это TOесли прописные команда выиграла, toесли строчной команда выигрывала, и Toесли это галстук.

Пример: все события подсчета очков в Super Bowl XLIX можно суммировать с помощью строки

TDXPtdxpTDXPtdxpfgtdxpTDXPTDXP

где заглавными буквами обозначены патриоты Новой Англии, строчными - Сиэтл Сихокс . Патриоты набрали 28, а Ястребы 24, так что результат будет:

28 TO 24

Примечания

  • Ваша программа / функция должна поддерживать любой произвольный ввод, включая пустую строку.
  • XPи XDпроизойдет только сразу после TD. xpи xdпроизойдет только сразу после td.
  • Вы не можете предполагать, что входная строка начинается или заканчивается в определенном случае.
  • Одиночный завершающий перевод строки необязательно разрешен как на входе, так и на выходе.

счет

Самый короткий код в байтах побеждает. Ответы, опубликованные до начала ( слишком поздно! ) Суперкубка 50, могут предсказать команду-победителя ( Пантеры или Бронкос ), и, если они верны, получите бонус -10%!

(Я проверю историю изменений, чтобы убедиться, что прогнозы не изменились и действительно были сделаны до начала.)

Тестовые случаи

[empty string] -> 0 To 0
TDXPtdxpTDXPtdxpfgtdxpTDXPTDXP -> 28 TO 24
FG -> 3 TO 0
fg -> 3 to 0
TD -> 6 TO 0
td -> 6 to 0
TDXP -> 7 TO 0
tdxp -> 7 to 0
TDXD -> 8 TO 0
tdxd -> 8 to 0
S -> 2 TO 0
s -> 2 to 0
FCK -> 3 TO 0
fck -> 3 to 0
TDTDXDSssFCKfgfckFGtd -> 22 TO 16
fcksFCKS -> 5 To 5
tdtdtdtdxp -> 25 to 0
SSSSSSSTD -> 20 TO 0
fgSfckFGfgtdxptdxdTDs -> 26 to 11
FGTDXPtdxdtdsStdxpfgTDfckTDXDFCK -> 29 To 29


26
Я считаю, что он стилизован под "Superb Owl", а не "Superbowl"
Downgoat

Действует ли бонус, если вы отредактируете свое сообщение после завершения Суперкубка?
Дверная ручка

1
@ Doorknob Как насчет этого: если вы делаете прогноз до начала работы и не меняете его при каких-либо изменениях, вы можете редактировать свой код столько раз, сколько захотите. (Но ваш прогноз должен быть в вашем ответе, а не в каком-то комментарии. Поэтому вам нужен рабочий код, чтобы начать.)
Увлечения Кэлвина

2
Могу ли я просто сделать прогноз, а не ответить? : P
Rɪᴋᴇʀ

2
Я не большой поклонник выигрыша. Это несправедливо по отношению к тем, кто впервые увидел эту проблему после превосходной совы, она склонна к тем, кто обращает внимание на НФЛ, и это абсолютно не связано со способностями программирования.
DJMcMayhem

Ответы:


3

Pyth, 49 46 43 42 байта (37,8 байта с бонусом)

jr" to "xh._-FJmsmhx"PSFT"kXd\D\S,rz2z2_SJ

Спасибо @Maltysen за помощь в экономии 4 байтов!

Попробуйте это в Pyth Compiler .

Мне нравится покрывать все базы, поэтому я сделаю ставку на Бронкос.

Как это устроено

jr" to "xh._-FJmsmhx"PSFT"kXd\D\S,rz2z2_SJ Input: z

                                  rz2      Swap the case of z.
                                 ,   z     Pair the result with z.
               m                           Map; for each d in the pair:
                           Xd\D\S            Replace each D with an S.
                 m                           Map; for each character k:
                   x"PSFT"k                    Compute k's first index on "PSFT".
                  h                            Increment the index.
                s                            Compute the sum of the incr. indices.
                                               "FG"  -> [3, 0]     -> 3
                                               "TD"  -> [4, 2]     -> 6
                                               "XP"  -> [0, 1]     -> 1
                                               "XD"  -> [0, 2]     -> 2
                                               "S"   -> [2]        -> 2
                                               "FCK" -> [3, 0, 0]  -> 3
                                               (lowercase letters) -> 0
              J                            Save the resulting list of scores in J.
            -F                             Reduce J by subtraction.
          ._                               Compute the sign of the difference.
         h                                 Add 1.
        x                             2    XOR the result with 2.
 r" to "                                   Pick‡ a function and apply it to " to ".
                                       _SJ Sort and reverse the list of scores.
j                                          Join, separating by the modified string.

r это семейство функций, которые работают со строками.

  • Если первая оценка в J(соответствующем выгружен случае z, то есть, оригинальные строчные буквы) ниже , чем второй счет, знаковая функция будет возвращать -1, (-1 + 1) ^ 2 == 2и r" to "2это swapcase, поэтому он возвращается " TO ".

  • Если первый балл выше , чем второй счет, знаковая функция будет возвращать 1, (1 + 1) ^ 2 == 0и r" to "0это lowercase, поэтому он возвращается " to ".

  • Если баллы равны, знаковая функция будет возвращать 0, (0 + 1) ^ 2 == 3и r" to "3это title, поэтому он возвращается " To ".


Я не пробовал, но вы, вероятно, можете сэкономить, сделав различные tos с разными значениямиr
Maltysen

@Maltysen Это сработало. Благодарность!
Деннис

4

MATL , 51 * 0,9 = 45,9 54 57 58 63 байта

Спасибо Деннису за удаление 3 байтов!

'%i To %i'j0h!3'PDFTS'tkXc=s4:Hh*sSPYD3MdXK?kK0<?Xk

Пустая строка ввода представляется в онлайн-компиляторе как один символ новой строки.

РЕДАКТИРОВАТЬ (8 июня 2016 г.): приведенная ниже ссылка включает в себя модификацию в соответствии с версией 18.1.0 языка (переместите его первым 3прямо перед Xc)

Попробуйте онлайн!

Бьюсь об заклад на Бронкос.

объяснение

Баллы определяются по одной букве в верхнем или нижнем регистре (заглавные буквы показаны ниже):

  • P за XP (1 балл)
  • D для XD (2 балла)
  • F для FG (3 балла) и для FCK (3 балла)
  • T для ТД (6 баллов)
  • S для S (2 балла)

Каждая из этих пяти букв соответствует уникальному событию, за исключением того, что

  • Fповторно используется для FGи FCK, которые имеют ту же оценку. Спасибо @Dennis за это !
  • Dобнаружит как TD, так и XD. Так Tбудет назначено 4 балла вместо 6 для компенсации.

Упорядочение PDFTS, экономит несколько байт при определении массива чисел , который определяет точку: [1,2,3,4,2].

Каждое событие обнаруживается по наличию одной из вышеуказанных букв в верхнем или нижнем регистре. Сравнение проводится в трех измерениях: длина входной строки ( N ) × количество команд (2) × количество обнаруженных событий оценки (5). Широко используется широковещательная передача , которая представляет собой автоматическое расширение массива по одноэлементному измерению для соответствия размеру большего массива.

'%i To %i'  % string with format specifiers for two integers
j0h         % input string. Attach 0 so it's never empty. Gives string of length N>0
!           % transpose into char array of size N×1
3           % number literal
'PDFTS'     % characters to detect the five combined types of score
tk          % duplicate and convert to lowercase
Xc          % concatenate along the third dimension to produce a 1×5×2 array
=           % test for equality with broadcast. Gives N×5×2 array
s           % sum along 1st dim. Gives 1×5×2 array
4:Hh        % array [1,2,3,4,2] to compute the total score. Size 1×5(×1) 
*           % multiply with broadcast. Gives 1×5×2 array
s           % sum along 2nd dim. Gives 1×1×2 array with the two scores
SP          % sort in reverse order along 3rd dim
YD          % sprintf. Gives output string with "To"
3M          % push array with the two scores again
dXK         % difference along 3rd dim. Gives a number. Copy to clipboard K
?           % is it non-zero? If so we need to make either lowercase or uppercase
  k         %   make (tentatively) lowercase
  K0<       %   did the uppercase team win?
  ?         %   if so...
    Xk      %     make uppercase
            % implicitly end the two if's and display string

Нет прогноза победы?
Увлечения Кэлвина

2
@ Calvin'sHobbies Я советовался с Википедией ... мои знания американского футбола близки к нулю :-)
Луис Мендо

2
Повторное использование Fв FGи FCKдолжно сохранить три байта.
Деннис

3

CJam, 57 55 54 53 50 49 байтов

q_32f^]{"PSFTD"f#:)5Yer1b}%_$(@:-g"ToTOto"2/=\]S*

Попробуйте онлайн!

Я понятия не имею, что такое Бронко, поэтому я сделаю ставку на Пантер.

Как это устроено

q                              Read all input from STDIN.
 _                             Push a copy.
  32f^                         XOR all characters with 32. This swaps case.
      ]                        Wrap both strings in an array.
       {                 }%    Map; push the string S, then:
        "PSFTD"                    Push that string (T).
               f#                  Compute the index of each character of S in T.
                 :)                Increment each index.
                   5Yer            Replace 5's with 2's.
                       1b          Add the resulting integers.
                                       "FG"  -> [3 0]      -> 3
                                       "TD"  -> [4 2]      -> 6
                                       "XP"  -> [0 1]      -> 1
                                       "XD"  -> [0 2]      -> 2
                                       "S"   -> [2]        -> 2
                                       "FCK" -> [3 0 0]    -> 3
                                       (lowercase letters) -> 0

                               We've now computed the scores of the first (input)
                               and second (swapped case) team.

_$                             Push a copy of the array of scores and sort it.
  (                            Shift out the first (lower) score.
   @                           Rotate the array of scores on top.
    :-                         Reduce it by subtraction.
      g                        Compute the sign (1, 0 or -1) of the difference.
       "ToTOto"2/              Push ["To" "TO" "to"].
                 =             Select the string that corresponds to the sign.
                  \            Swap it with the lower score.
                   ]           Wrap the entire stack in an array.
                    S*         Join the resulting array, separating by spaces.


1
:-gникогда раньше не видел этот смайлик
ETHproductions

@ETHproductions улитка?
Не то, что Чарльз

@ETHproductions Это кто-то, чьи очки упали на рот.
CJ Деннис

Это Бронко.
DJMcMayhem

3

JavaScript (ES6), 128 130 байт

Отредактируйте 2 байта, сохраненных с помощью подсказки @ Neil

s=>(l=u=0,s.replace(/fck|s|../gi,x=>(z=+' 231  362'[parseInt(x,36)%10],x>'a'?l+=z:u+=z)),l>u?l+' to '+u:u+(u>l?' TO ':' To ')+l

ТЕСТОВОЕ ЗАДАНИЕ

f=s=>(
  l=u=0,
  s.replace(/fck|s|../gi,x=>(
    z=+' 231  362'[parseInt(x,36)%10],
    x>'a'?l+=z:u+=z
  )),
  l>u?l+' to '+u:u+(u>l?' TO ':' To ')+l
)

//TEST
console.log=x=>O.textContent+=x+'\n'

;[
["","0 To 0"],
["TDXPtdxpTDXPtdxpfgtdxpTDXPTDXP", "28 TO 24"],
["FG", "3 TO 0"],
["fg", "3 to 0"],
["TD", "6 TO 0"],
["td", "6 to 0"],
["TDXP", "7 TO 0"],
["tdxp", "7 to 0"],
["TDXD", "8 TO 0"],
["tdxd", "8 to 0"],
["S", "2 TO 0"],
["s", "2 to 0"],
["FCK", "3 TO 0"],
["fck", "3 to 0"],
["TDTDXDSssFCKfgfckFGtd", "22 TO 16"],
["fcksFCKS", "5 To 5"],
["tdtdtdtdxp", "25 to 0"],
["SSSSSSSTD", "20 TO 0"],
["fgSfckFGfgtdxptdxdTDs", "26 to 11"],
["FGTDXPtdxdtdsStdxpfgTDfckTDXDFCK", "29 To 29"]
].forEach(t=>{
  var i=t[0],x=t[1],r=f(i)
  console.log(i+' -> '+r+(r==x?' OK':' FAIL expected '+x))
})
<pre id=O></pre>


1
Вау, этот трюк с parseIntдействительно умным! Использование подсказки @ Neil l>u?l+" to "+u:u+(u>l?" TO ":" To ")+lдля вывода также сэкономит 2 байта.
user81655

@ user81655 ну я считаю parseInt каждый раз, когда мне нужно оперировать какой-то небольшой группой букв в случае нечувствительности к регистру ... 99% раз это бесполезно. Спасибо за указание на совет Нила
edc65

2

JavaScript (ES6), 165 156 151 149 байт

s=>(a=b=0,s.match(/S|FCK|../gi)||[]).map(m=>(u=m.toUpperCase(),p=u>"XO"?1:u=="TD"?6:u>"R"?2:3,u<m?a+=p:b+=p))&&a>b?a+" to "+b:b+(b>a?" TO ":" To ")+a

9 байтов сохранено благодаря @ dev-null , 5 благодаря @ Не это Чарльз и 2 благодаря @Neil !

объяснение

var solution =

s=>(
    a=b=0,                // scores for teams A and B
    s.match(/S|FCK|../gi) // get an array of each abbreviation
      ||[]                // if it returns null, default to an empty array
  ).map(m=>(              // for each abbreviation m
    u=m.toUpperCase(),    // u = abbreviation in upper-case
    p=                    // p = number of points for the abbreviation
      u>"XO"?1            // case "XP"
      :u=="TD"?6          // case "TD"
      :u>"R"?2            // case "XD" or "S"
      :3,                 // case "FG" or "FCK"
    u<m?a+=p:b+=p         // add the points to the appropriate team
  ))
  
  // Output the scores
  &&a>b?a+" to "+b
  :b+(b>a?" TO ":" To ")+a
<input type="text" id="input" value="FGTDXPtdxdtdsStdxpfgTDfckTDXDFCK" />
<button onclick="result.textContent=solution(input.value)">Go</button>
<pre id="result"></pre>


Не можете ли вы использовать /s|fck|../giи map(..),a>bвместоmap(..)&&a>b
andlrc

Я думаю, что вы бы сэкономили, если бы это сделали...:u=="T"?6:u>"R"?2:3...
не тот Чарльз

@NotthatCharles Правда. Спасибо за чаевые!
user81655

Я думаю, что вы могли бы сэкономить 2 байта, используяb+(b>a?" TO ":" To ")+a
Нил

2

Perl 144 140 + 2 = 142 байта

%a=qw(fg 3 td 6 xp 1 xd 2 s 2 fck 3);@a=(0,0);$^=lc,$a[$^eq$_]+=$a{$^}for/fck|s|../gi;$,=$".(To,TO,to)[$a[1]-$a[0]<=>0].$";say sort{$b-$a}@a

Требуется -nфлаг и -E:

$ echo "
TDXPtdxpTDXPtdxpfgtdxpTDXPTDXP
FG
fg
SSSSSSSTD
FGTDXPtdxdtdsStdxpfgTDfckTDXDFCK" | \
perl -nE'%a=qw(fg 3 td 6 xp 1 xd 2 s 2 fck 3);@a=(0,0);$^=lc,$a[$^eq$_]+=$a{$^}for/fck|s|../gi;$,=$".(To,TO,to)[$a[1]-$a[0]<=>0].$";say sort{$b-$a}@a'
0 To 0
28 TO 24 
3 TO 0
3 to 0
20 TO 0
29 To 29

Изменить: Забыл, чтобы поддержать to, Toи TO.


Ницца. Но %a=qw(fg 3 td 6 xp 1 xd 2 s 2 fck 3)короче %a=(fg,3,td,6,xp,1,xd,2,s,2,fck,3). И " "(в вашем определении $,) короче $". Но я не проверял ни один из них.
msh210

@ msh210, я могу использовать, $"и я могу удалить qwна to To TOмассив, спасибо!
andlrc

1

Луа, 231 200 байт

Было очень весело, даже если я действительно не знаю правил американского футбола (у нас есть регби здесь :)). Мне пришлось протестировать много вещей, чтобы сделать его как можно более коротким, я не думаю, что есть что-то, что можно улучшить, а может и нет.

Изменить: я полная задержка. Первое решение, над которым я работал, основывалось на использовании расширения массива, затем я изменил его, и массив, содержащий оценки как для строчных, так и для прописных команд, больше не был полезен. Удаление его и использование простой переменной дает красивые -31 байт.

a={F=3,D=2,T=4,P=1,S=2}l,u=0,0 io.read():gsub(".",function(c)x=a[c:upper()]if a[c]then u=u+a[c]elseif x then l=l+x end end)w=l>u and" to "or l<u and" TO "or" To "print(math.max(l,u)..w..math.min(l,u))

Неуправляемый и объяснения

a={F=3,D=2,T=4,P=1,S=2}        -- define the table a with our scoring values
l,u=0,0                        -- scores for the upper and lowercase teams
io.read():gsub(".",function(c) -- iterate over each character in the input
  x=a[c:upper()]               -- x contains the score for a lowercase character
  if a[c]                      -- if a contains c (would evaluate to nil otherwise)
  then
    u=u+a[c]                   -- increment the score of the uppercase team
  elseif x                     -- if x isn't nil
  then                         -- same as "a contains c:upper()"
    l=l+x                      -- increment the score of the lowercase team
  end
end)                           -- exit the anonyme function
w=l>u and" to "               -- nested ternary, lower > upper, we will use "to"
    or l<u and" TO "       -- lower < uppercase, use "TO"
    or" To "                   -- else (draw), use "To"
print(math.max(l,u)        -- output the concatenated string using 
      ..b.w..math.min(l,u))-- min/max to put the winner in the first position

0

Python, 167 байт

Превосходная сова давно прошла, но пока нет решения Python:

def f(s):g=lambda s:0if s==""else{68:1,70:3,83:2,84:5,88:1}.get(ord(s[0]),0)+g(s[1:]);a=g(s);b=g(s.upper())-a;return"%i %s %i"%((a,("To","TO")[a>b],b),(b,"to",a))[a<b]

Работает в Python 2 или 3.

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