ใครจะชนะเกมฟุตบอล?


17

การแข่งขันชิงแชมป์อเมริกันฟุตบอลSuper Bowl 50กำลังเกิดขึ้นวันนี้เวลา 23:30 น. UTC (และคุณสามารถรับชมการถ่ายทอดสดออนไลน์ได้ ) ความท้าทายนี้ถูกสร้างขึ้นเพื่อเฉลิมฉลอง


ในเกมอเมริกันฟุตบอลสองทีมแข่งขันกันเพื่อให้ได้คะแนนมากที่สุดและมีหกวิธีในการทำคะแนนเหล่านี้ เราจะให้คำย่อแต่ละคำ:

เขียนโปรแกรมหรือฟังก์ชั่นที่ใช้ในสตริงบรรทัดเดียวที่มีตัวย่อหกตัวนี้เท่านั้นทั้งตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก

สตริงนี้แสดงถึงเหตุการณ์การให้คะแนนทั้งหมดในเกม (หรือบางส่วนของเกม) ของฟุตบอลโดยมีเงื่อนไขตัวพิมพ์ใหญ่เป็นของทีมหนึ่งและตัวเล็กเป็นของอีกทีม

งานของคุณคือการรายงานคะแนนสุดท้ายของเกมและระบุผู้ชนะด้วยผลลัพธ์ของแบบฟอร์ม

[score 1] [to] [score 2]

ที่อยู่:

  • [score 1] มีขนาดใหญ่กว่าของคะแนนทั้งสองเสมอ (หากไม่เท่ากัน) ไม่ว่าจะเป็นตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็กก็ตามจะชนะ
  • [score 2] เล็กกว่าของสองคะแนน (ถ้าไม่เท่ากัน)
  • [to]คือTOถ้าทีมตัวพิมพ์ใหญ่ชนะtoถ้าทีมตัวพิมพ์เล็กชนะและToถ้าเสมอกัน

ตัวอย่าง:ทุกเหตุการณ์เกณฑ์การให้คะแนนในซูเปอร์โบว์ล XLIX สามารถสรุปโดยสตริง

TDXPtdxpTDXPtdxpfgtdxpTDXPTDXP

ที่เป็นตัวพิมพ์ใหญ่นิวอิงแลนด์รักชาติและตัวพิมพ์เล็กเป็น ซีแอตเติ ผู้รักชาติได้คะแนน 28 และเหยี่ยว 24 ดังนั้นผลลัพธ์จะเป็น:

28 TO 24

หมายเหตุ

  • โปรแกรม / ฟังก์ชั่นของคุณต้องรองรับอินพุตที่กำหนดเองรวมถึงสตริงว่าง
  • XPและจะเกิดขึ้นทันทีหลังจากที่XD และจะเกิดขึ้นทันทีหลังจากTDxpxdtdจะเกิดขึ้นทันทีหลังจากที่
  • คุณอาจไม่สมมติว่าสตริงอินพุตเริ่มต้นหรือสิ้นสุดในบางกรณี
  • บรรทัดใหม่ต่อท้ายเดี่ยวอนุญาตให้เลือกได้ทั้งในอินพุตและเอาต์พุต

เกณฑ์การให้คะแนน

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ คำตอบที่ถูกโพสต์ก่อนกำหนดการแข่งขัน ( สายเกินไปแล้ว! ) ของ Super Bowl 50 อาจทำนายทีมที่ชนะ (ทั้งPanthersหรือBroncos ) และหากถูกต้องให้รับโบนัส -10% byte!

(ฉันจะตรวจสอบประวัติการแก้ไขเพื่อให้แน่ใจว่าการคาดการณ์จะไม่เปลี่ยนแปลงและทำขึ้นจริงก่อนที่จะแจ้งกำหนดการ)

กรณีทดสอบ

[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

โบนัสยังคงมีผลอยู่หรือไม่หากคุณแก้ไขโพสต์หลังจากที่ 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 คอมไพเลอร์

ฉันชอบครอบคลุมทุกฐานดังนั้นฉันจะเดิมพันกับ Broncos

มันทำงานอย่างไร

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 "


ฉันไม่ได้ลอง แต่คุณสามารถบันทึกได้โดยการทำให้ค่าต่าง ๆtoผ่านค่าที่แตกต่างกันไป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)

ลองออนไลน์!

ฉันเดิมพันกับ Broncos

คำอธิบาย

คะแนนถูกตรวจพบโดยใช้ตัวอักษรตัวเดียวไม่ว่าจะเป็นตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็ก (ตัวพิมพ์ใหญ่จะแสดงในรายการต่อไปนี้):

  • P สำหรับ XP (1 คะแนน)
  • D สำหรับ XD (2 คะแนน)
  • F สำหรับ FG (3 คะแนน) และสำหรับ FCK (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

ไม่ชนะการทำนาย?
งานอดิเรกของ Calvin

2
@ Calvin'sHobbies ฉันให้คำปรึกษากับ Wikipedia ... ความรู้เกี่ยวกับอเมริกันฟุตบอลของฉันอยู่ใกล้กับศูนย์ :-)
Luis Mendo

2
การนำFในFGและFCKควรบันทึกสามไบต์
เดนนิส

3

CJam, 57 55 54 53 50 49 ไบต์

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

ลองออนไลน์!

ฉันไม่รู้ว่า Bronco คืออะไรดังนั้นฉันจะเดิมพันกับ Panthers

มันทำงานอย่างไร

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

นี่คือ Bronco
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 ดีฉันพิจารณาแยกวิเคราะห์ในแต่ละครั้งที่ฉันต้องทำงานกับตัวอักษรกลุ่มเล็ก ๆ ในกรณีที่ไม่รู้สึกตัว ... 99% ของเวลาไม่มีประโยชน์ ขอบคุณสำหรับการชี้ให้เห็นเคล็ดลับของ Neil
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 ขอบคุณ@Not นั่นที่ Charlesและ 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 True ขอบคุณสำหรับทิป!
user81655

ฉันคิดว่าคุณอาจประหยัด 2 ไบต์โดยใช้b+(b>a?" TO ":" To ")+a
Neil

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, และToTO


ดี แต่%a=qw(fg 3 td 6 xp 1 xd 2 s 2 fck 3)เป็น briefer %a=(fg,3,td,6,xp,1,xd,2,s,2,fck,3)เป็น และ" "(ตามคำจำกัดความของคุณ$,) ก็มีน้อยกว่าเช่น$"กัน แต่ฉันไม่ได้ทดสอบอย่างใดอย่างหนึ่ง
msh210

@ msh210 ฉันสามารถใช้$"และฉันสามารถลบqwในto To TOอาร์เรย์ขอบคุณ!
andlrc

1

Lua, 231 200 ไบต์

มันสนุกมากแม้ว่าฉันจะไม่รู้กฎของอเมริกันฟุตบอลจริงๆ (เรามี Rugby ที่นี่ :)) ฉันต้องทดสอบหลายสิ่งหลายอย่างเพื่อทำให้สั้นที่สุดเท่าที่จะเป็นไปได้ฉันไม่คิดว่าจะมีอะไรที่ต้องปรับปรุงอีกมากบางทีอาจไม่มี

แก้ไข: ฉันปัญญาอ่อนทั้งหมด วิธีแก้ปัญหาแรกที่ฉันทำเกี่ยวกับ revolved โดยใช้การขยายอาร์เรย์แล้วฉันเปลี่ยนมันและอาร์เรย์ที่มีคะแนนสำหรับทั้งตัวพิมพ์เล็กและทีมตัวพิมพ์ใหญ่นั้นไม่มีประโยชน์อีกต่อไป การลบออกและการใช้ตัวแปรธรรมดาทำให้ -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))

Ungolfed และคำอธิบาย

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.