Ai sẽ thắng trò chơi bóng đá?


17

Giải vô địch bóng đá Mỹ, Super Bowl 50 , sẽ diễn ra vào lúc 11:30 tối UTC (và bạn có thể xem trực tuyến ). Thử thách này đã được thực hiện để ăn mừng nó.


Trong một trận bóng đá của Mỹ, hai đội thi đấu để giành được nhiều điểm nhất và có sáu cách để ghi những điểm này. Chúng tôi sẽ cung cấp cho mỗi từ viết tắt:

Viết chương trình hoặc hàm lấy trong một chuỗi dòng duy nhất chỉ chứa sáu chữ viết tắt này, bằng cả chữ hoa và chữ thường.

Chuỗi này đại diện cho tất cả các sự kiện ghi bàn trong một trò chơi (hoặc một phần của trò chơi) của bóng đá, với các thuật ngữ viết hoa thuộc về một đội và chữ thường thuộc về đội kia.

Công việc của bạn là báo cáo điểm số cuối cùng của trò chơi và cho biết ai đã thắng với kết quả đầu ra của biểu mẫu

[score 1] [to] [score 2]

Ở đâu:

  • [score 1] luôn luôn lớn hơn trong hai điểm số (nếu không bằng nhau), bất kể chữ hoa hay chữ thường thắng.
  • [score 2] là nhỏ hơn trong hai điểm số (nếu không bằng nhau).
  • [to]TOnếu đội chữ hoa thắng, tonếu đội chữ thường thắng, và Tonếu đó là hòa.

Ví dụ: Tất cả các sự kiện ghi điểm trong Super Bowl XLIX có thể được tóm tắt bằng chuỗi

TDXPtdxpTDXPtdxpfgtdxpTDXPTDXP

trong đó chữ hoa là New England Patriots và chữ thường là Seattle Seahawks . The Patriots đạt 28 và Hawks 24, do đó, kết quả sẽ là:

28 TO 24

Ghi chú

  • Chương trình / chức năng của bạn phải hỗ trợ bất kỳ đầu vào tùy ý, bao gồm cả chuỗi trống.
  • XPXDsẽ chỉ xảy ra ngay sau đó TD. xpxdsẽ chỉ xảy ra ngay sau đótd .
  • Bạn không thể cho rằng chuỗi đầu vào bắt đầu hoặc kết thúc trong một trường hợp nhất định.
  • Một dòng mới duy nhất được tùy chọn cho phép trong cả đầu vào và đầu ra

Chấm điểm

Mã ngắn nhất tính bằng byte thắng. Câu trả lời được đăng trước khi bắt đầu ( quá muộn! ) Của Super Bowl 50 có thể dự đoán đội chiến thắng (cả Panthers hoặc Broncos ), và nếu chúng đúng, hãy nhận phần thưởng -10% byte!

(Tôi sẽ kiểm tra lịch sử sửa đổi để đảm bảo dự đoán không thay đổi và thực sự đã được thực hiện trước khi khởi động.)

Các trường hợp thử nghiệm

[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
Tôi tin rằng nó được cách điệu thành "Cú tuyệt vời", không phải "Superbowl"
Downgoat 7/2/2016

Phần thưởng vẫn áp dụng nếu bạn chỉnh sửa bài đăng của mình sau khi Super Bowl kết thúc?
Doorknob

1
@Doorknob Làm thế nào về điều này: Nếu bạn đưa ra dự đoán trước khi bắt đầu và không thay đổi nó với bất kỳ chỉnh sửa nào, bạn có thể chỉnh sửa mã của mình bao nhiêu tùy ý. (Nhưng dự đoán của bạn phải nằm trong câu trả lời của bạn chứ không phải trong một số nhận xét. Vì vậy, bạn cần mã làm việc để bắt đầu.)
Sở thích của Calvin

2
Tôi chỉ có thể đưa ra một dự đoán và không trả lời? : P
Rɪᴋᴇʀ

2
Tôi không phải là một fan hâm mộ lớn của phần thưởng ghi bàn. Thật không công bằng cho những người lần đầu tiên nhìn thấy thử thách này sau con cú tuyệt vời, nó thiên về những người chú ý đến NFL và nó hoàn toàn không liên quan đến khả năng lập trình.
DJMcMayhem

Câu trả lời:


3

Pyth, 49 46 43 42 byte (37,8 byte có thưởng)

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

Cảm ơn @Maltysen đã giúp tôi tiết kiệm 4 byte!

Hãy thử nó trong Trình biên dịch Pyth .

Tôi thích bao gồm tất cả các căn cứ, vì vậy tôi sẽ đặt cược vào Broncos.

Làm thế nào nó hoạt động

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 là một gia đình của các chức năng hoạt động trên dây.

  • Nếu điểm đầu tiên trong J(tương ứng với trường hợp hoán đổi z, ví dụ, chữ thường ban đầu) là thấp hơn so với số điểm thứ hai, hàm dấu hiệu sẽ trở lại -1, (-1 + 1) ^ 2 == 2r" to "2swapcase, vì vậy nó sẽ trả về " TO ".

  • Nếu điểm đầu tiên là cao hơn so với số điểm thứ hai, hàm dấu hiệu sẽ trở lại 1, (1 + 1) ^ 2 == 0r" to "0lowercase, vì vậy nó sẽ trả về " to ".

  • Nếu điểm số đều bình đẳng, hàm dấu hiệu sẽ trở lại 0, (0 + 1) ^ 2 == 3r" to "3title, vì vậy nó sẽ trả về " To ".


Tôi đã không thử nó, nhưng bạn có thể tiết kiệm bằng cách thực hiện các togiá trị khác nhau thông qua các giá trị khác nhau đểr
Maltysen

@Maltysen Điều đó đã làm việc độc đáo. Cảm ơn!
Dennis

4

MATL , 51 * 0.9 = 45.9 54 57 58 63 byte

Cảm ơn Dennis vì đã xóa 3 byte!

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

Một chuỗi đầu vào trống được biểu diễn trong trình biên dịch trực tuyến dưới dạng một ký tự dòng mới.

EDIT (ngày 8 tháng 6 năm 2016): Liên kết bên dưới bao gồm một sửa đổi theo bản phát hành 18.1.0 của ngôn ngữ (di chuyển anh ta trước tiên 3ngay trước khi Xc)

Hãy thử trực tuyến!

Tôi đặt cược vào Broncos.

Giải trình

Điểm số được phát hiện bằng một chữ cái duy nhất, chữ hoa hoặc chữ thường (chữ hoa được hiển thị dưới đây):

  • P cho XP (1 điểm)
  • D cho XD (2 điểm)
  • F cho FG (3 điểm) và cho FCK (3 điểm)
  • T cho TD (6 điểm)
  • S cho S (2 điểm)

Mỗi trong số năm chữ cái này tương ứng duy nhất với một sự kiện điểm trừ

  • Fđược sử dụng lại cho FGFCK, có cùng số điểm. Cảm ơn @Dennis vì điều này !
  • Dsẽ phát hiện cả TD và XD. Vậy Tsẽ được chỉ định 4 điểm thay vì 6 để bù.

Thứ tự PDFTS, lưu một vài byte khi xác định mảng số chỉ định các điểm:[1,2,3,4,2] .

Mỗi sự kiện được phát hiện bởi sự hiện diện của một trong các chữ cái trên bằng chữ in hoa hoặc chữ thường. Việc so sánh được thực hiện theo ba chiều: chiều dài chuỗi đầu vào ( N ) × số đội (2) × số lượng sự kiện điểm được phát hiện (5). Sử dụng rộng rãi được tạo ra để phát sóng , đó là sự mở rộng tự động của một mảng dọc theo kích thước đơn để phù hợp với kích thước của một mảng lớn hơn.

'%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

Không có dự đoán chiến thắng?
Sở thích của Calvin

2
@ Calvin'sHob sở thích Tôi đã tham khảo Wikipedia ... kiến ​​thức của tôi về bóng đá Mỹ gần bằng không :-)
Luis Mendo

2
Sử dụng lại Ftrong FGFCKnên lưu ba byte.
Dennis

3

CJam, 57 55 54 53 50 49 byte

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

Hãy thử trực tuyến!

Tôi không biết Bronco là gì, vì vậy tôi sẽ đặt cược vào Panthers.

Làm thế nào nó hoạt động

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
:-gchưa bao giờ thấy biểu tượng cảm xúc đó trước đây
ETHproductions 7/2/2016

@ETHproductions ốc-miệng?
Không phải Charles

@ETHproductions Đó là ai đó có kính rơi xuống miệng.
CJ Dennis

Đây là một đồng tiền.
DJMcMayhem

3

JavaScript (ES6), 128 130 byte

Chỉnh sửa 2 byte được lưu bằng cách sử dụng mẹo của 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

KIỂM TRA

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
Wow, mẹo đó với parseIntthực sự thông minh! Sử dụng mẹo đầu ra của @ Neil l>u?l+" to "+u:u+(u>l?" TO ":" To ")+lcũng sẽ tiết kiệm được 2 byte.
dùng81655

@ user81655 Tôi cũng xem xét phân tích cú pháp mỗi lần tôi cần thao tác trên một số nhóm chữ nhỏ trong trường hợp không nhạy cảm ... 99% số lần nó vô dụng. Cảm ơn bạn đã chỉ ra mẹo của Neil
edc65

2

JavaScript (ES6), 165 156 151 149 byte

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 byte được lưu nhờ @ dev-null , 5 nhờ @Not mà Charles và 2 nhờ vào @Neil !

Giải trình

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>


Bạn không thể sử dụng /s|fck|../gimap(..),a>bthay vìmap(..)&&a>b
andlrc

Tôi nghĩ rằng bạn sẽ tiết kiệm một số nếu bạn đã làm...:u=="T"?6:u>"R"?2:3...
Không phải Charles

@NotthatCharles Đúng. Cảm ơn vì tiền hỗ trợ!
dùng81655

Tôi nghĩ rằng bạn có thể tiết kiệm 2 byte bằng cách sử dụngb+(b>a?" TO ":" To ")+a
Neil

2

Perl, 144 140 + 2 = 142 byte

%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

Yêu cầu -n cờ và -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

Chỉnh sửa: Quên hỗ trợ to, ToTO.


Đẹp. Nhưng %a=qw(fg 3 td 6 xp 1 xd 2 s 2 fck 3)là briefer như %a=(fg,3,td,6,xp,1,xd,2,s,2,fck,3). Và " "(theo định nghĩa của bạn về $,) là briefer như $". Nhưng tôi đã không kiểm tra một trong hai.
msh210

@ msh210, tôi có thể sử dụng $"và tôi có thể xóa qwtrên to To TOmảng, cảm ơn!
andlrc

1

Lua, 231 200 byte

Đó là rất nhiều niềm vui, ngay cả khi tôi không thực sự biết các quy tắc của bóng đá Mỹ (Chúng tôi có Rugby ở đây :)). Tôi đã phải thử nghiệm rất nhiều thứ để làm cho nó ngắn nhất có thể, tôi không nghĩ có nhiều thứ phải cải thiện, có lẽ là không.

Chỉnh sửa: Tôi là một tổng số chậm phát triển. Giải pháp đầu tiên tôi đã thực hiện xoay quanh việc sử dụng mở rộng mảng, sau đó tôi đã thay đổi nó và mảng chứa điểm số cho cả chữ thường và nhóm chữ hoa không còn hữu ích nữa. Loại bỏ nó và sử dụng biến đơn giản tạo ra một -31 byte đẹp.

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

Ungolfed và giải thích

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 byte

Con cú tuyệt vời đã qua từ lâu, nhưng vì vẫn chưa có giải pháp 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]

Hoạt động trong Python 2 hoặc 3.

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.