Хто виграє футбольну гру?


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.
  • Ви не можете припустити, що рядок введення починається або закінчується в певному випадку.
  • Один додатковий новий рядок необов'язково дозволений і в вхідному, і у вихідному

Оцінка балів

Виграє найкоротший код у байтах. Відповіді, які розміщені перед початком ( вже зараз пізно! ) Super Bowl 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
Я вважаю, що це стилізовано як "Чудова сова", а не "Superbowl"
Пуховик

Чи все ще бонус застосовується, якщо ви редагуєте свою публікацію після закінчення Super Bowl?
Дверна ручка

1
@Doorknob Як щодо цього: Якщо ви зробите прогноз перед початком і не змінюєте його жодними правками, ви можете редагувати свій код скільки завгодно. (Але ваше передбачення повинно бути у вашій відповіді, а не в якомусь коментарі. Тому для початку вам потрібен робочий код.)
Захоплення Calvin's Hobbies

2
Чи можу я просто зробити передбачення, а не відповісти? : P
Rɪᴋᴇʀ

2
Я не є великим шанувальником бонусного заліку. Це несправедливо до тих, хто вперше побачив цей виклик після чудової сови, він упереджений до тих, хто звертає увагу на NFL, і це абсолютно не пов'язане з можливостями програмування.
DJMcMayhem

Відповіді:


3

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

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

Дякуємо @Maltysen за допомогу мені зберегти 4 байти!

Спробуйте його в компіляторі Pyth .

Мені подобається покривати всі бази, тому буду робити ставку на Бронкос.

Як це працює

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

Порожній вхідний рядок представлений в онлайн-компіляторі як єдиний символ нового рядка.

EDIT (8 червня 2016 р.): Посилання нижче включає в себе зміну відповідно до випуску 18.1.0 мови (перемістіть його спочатку 3праворуч раніше Xc)

Спробуйте в Інтернеті!

Я ставлю на Бронкос.

Пояснення

Оцінки виявляються за допомогою однієї літери, верхньої або малої літери (великі регістри показані нижче):

  • P для XP (1 бал)
  • D для XD (2 бали)
  • F для ФГ (3 бали) та ФКК (3 бали)
  • T для TD (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 Dennis

Це Бронко.
DJMcMayhem

3

JavaScript (ES6), 128 130 байт

Відредагуйте 2 байти, збережені із застосуванням підказки Ніла

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справді розумний! Використання @ Ніла підказки l>u?l+" to "+u:u+(u>l?" TO ":" To ")+lдля виводу також збереже 2 байти.
користувач81655

@ user81655 добре, я вважаю, що аналізуємо кожен раз, коли мені потрібно оперувати деякою невеликою групою листів у випадку нечутливого способу ... у 99% випадків це марно. Дякуємо, що
вказали

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 Правда. Дякую за пораду!
користувач81655

Я думаю, ви можете зберегти 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

Edit: Забула підтримку 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

Пітон, 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.