Siapa yang akan memenangkan pertandingan sepakbola?

17

Kejuaraan sepak bola Amerika, Super Bowl 50 , akan berlangsung hari ini pukul 11:30 malam UTC (dan Anda dapat menontonnya langsung online ). Tantangan ini dibuat untuk merayakannya.


Dalam pertandingan sepak bola Amerika, dua tim berlomba untuk mendapatkan poin terbanyak dan ada enam cara untuk mencetak poin ini. Kami akan memberikan masing-masing singkatan:

Tulis program atau fungsi yang menggunakan string garis tunggal yang hanya berisi enam singkatan ini, baik dalam huruf besar dan kecil.

String ini mewakili semua peristiwa mencetak gol dalam permainan (atau bagian dari permainan) sepakbola, dengan istilah huruf besar milik satu tim dan huruf kecil milik yang lain.

Tugas Anda adalah melaporkan skor akhir pertandingan dan menunjukkan siapa yang menang dengan output formulir

[score 1] [to] [score 2]

dimana:

  • [score 1] selalu lebih besar dari dua skor (jika tidak sama), terlepas dari apakah huruf besar atau kecil menang.
  • [score 2] adalah yang lebih kecil dari dua skor (jika tidak sama).
  • [to]adalah TOjika tim huruf besar menang, tojika tim huruf kecil menang, dan Tojika itu seri.

Contoh: Semua acara pemberian skor di Super Bowl XLIX dapat diringkas dengan string

TDXPtdxpTDXPtdxpfgtdxpTDXPTDXP

di mana huruf besar adalah New England Patriots dan huruf kecil adalah Seattle Seahawks . Patriots mencetak 28 dan Hawks 24, jadi hasilnya adalah:

28 TO 24

Catatan

  • Program / fungsi Anda harus mendukung input sembarang, termasuk string kosong.
  • XPdan XDhanya akan terjadi setelahnya TD. xpdan xdhanya akan terjadi setelahnya td.
  • Anda mungkin tidak menganggap string input dimulai atau diakhiri dalam kasus tertentu.
  • Sebuah baris baru yang membuntuti secara opsional diizinkan di input dan output

Mencetak gol

Kode terpendek dalam byte menang. Jawaban yang diposting sebelum kickoff ( terlambat sekarang! ) Dari Super Bowl 50 dapat memprediksi tim pemenang (baik Panthers atau Broncos ), dan jika mereka benar, dapatkan bonus byte -10%!

(Saya akan memeriksa riwayat revisi untuk memastikan prediksi tidak berubah dan benar-benar dibuat sebelum kickoff.)

Uji Kasus

[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

Hobi Calvin
sumber
26
Saya percaya ini bergaya "Burung Hantu Luar Biasa", bukan "Superbowl"
Downgoat
Apakah bonus masih berlaku jika Anda mengedit posting Anda setelah Super Bowl selesai?
Gagang pintu
1
@ Doorknob Bagaimana dengan ini: Jika Anda membuat prediksi sebelum kickoff dan tidak mengubahnya dengan pengeditan, Anda dapat mengedit kode sebanyak yang Anda inginkan. (Tapi prediksi Anda harus dalam jawaban Anda, bukan dalam beberapa komentar. Jadi Anda perlu kode kerja untuk memulai.)
Calvin's Hobbies
2
Bisakah saya membuat prediksi dan tidak menjawab? : P
R
2
Saya bukan penggemar bonus penilaian. Tidak adil bagi mereka yang pertama kali melihat tantangan ini setelah burung hantu yang hebat, itu bias terhadap mereka yang memperhatikan NFL, dan itu sama sekali tidak terkait dengan kemampuan pemrograman.
DJMcMayhem

Jawaban:

3

Pyth, 49 46 43 42 byte (37,8 byte dengan bonus)

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

Terima kasih kepada @Maltysen karena membantu saya menghemat 4 byte!

Cobalah di Pyth Compiler .

Saya suka menutupi semua pangkalan, jadi saya akan bertaruh pada Broncos.

Bagaimana itu bekerja

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 adalah keluarga fungsi yang beroperasi pada string.

  • Jika skor pertama dalam J(sesuai dengan kasus bertukar z, yaitu, huruf kecil asli) lebih rendah dari skor kedua, fungsi tanda akan kembali -1, (-1 + 1) ^ 2 == 2dan r" to "2ini swapcase, sehingga kembali " TO ".

  • Jika skor pertama lebih tinggi dari skor kedua, fungsi tanda akan kembali 1, (1 + 1) ^ 2 == 0dan r" to "0ini lowercase, sehingga kembali " to ".

  • Jika skor adalah sama, fungsi tanda akan kembali 0, (0 + 1) ^ 2 == 3dan r" to "3ini title, sehingga kembali " To ".

Dennis
sumber
Saya tidak mencobanya, tetapi Anda mungkin dapat menghemat dengan membuat berbagai tos melalui nilai yang berbeda untukr
Maltysen
@Maltysen Itu bekerja dengan baik. Terima kasih!
Dennis
4

MATL , 51 * 0,9 = 45,9 54 57 58 63 byte

Terima kasih kepada Dennis karena telah menghapus 3 byte!

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

String input kosong diwakili dalam kompiler online sebagai karakter baris baru.

EDIT (8 Juni 2016): Tautan di bawah ini mencakup modifikasi sesuai rilis 18.1.0 bahasa (pindah terlebih dahulu 3sebelum Xc)

Cobalah online!

Saya bertaruh pada Broncos.

Penjelasan

Skor terdeteksi menggunakan satu huruf, baik huruf besar atau kecil (huruf besar ditunjukkan sebagai berikut):

  • P untuk XP (1 poin)
  • D untuk XD (2 poin)
  • F untuk FG (3 poin) dan untuk FCK (3 poin)
  • T untuk TD (6 poin)
  • S untuk S (2 poin)

Masing-masing dari lima huruf ini berkorespondensi secara unik dengan event skor kecuali itu

  • Fdigunakan kembali untuk FGdanFCK , yang memiliki skor yang sama. Terima kasih kepada @Dennis untuk ini !
  • Dakan mendeteksi TD dan XD. Jadi Takan diberikan 4 poin, bukan 6 untuk kompensasi.

Pemesanan PDFTS , menyimpan beberapa byte ketika mendefinisikan array nomor yang menentukan poin: [1,2,3,4,2].

Setiap peristiwa dideteksi oleh kehadiran salah satu huruf di atas dalam huruf besar atau kecil. Perbandingan dilakukan dalam tiga dimensi: panjang string input ( N ) × jumlah tim (2) × jumlah peristiwa skor yang terdeteksi (5). Penggunaan luas dibuat dari penyiaran , yang merupakan perluasan otomatis dari array sepanjang dimensi tunggal untuk mencocokkan ukuran array yang lebih besar.

'%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
Luis Mendo
sumber
Tidak ada prediksi menang?
Hobi Calvin
2
@ Calvin'sHobbies Saya berkonsultasi dengan Wikipedia ... pengetahuan saya tentang sepak bola Amerika hampir tidak ada :-)
Luis Mendo
2
Menggunakan kembali Fin FGdan FCKharus menyimpan tiga byte.
Dennis
3

CJam, 57 55 54 53 50 49 byte

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

Cobalah online!

Saya tidak tahu apa itu Bronco, jadi saya akan bertaruh pada Panthers.

Bagaimana itu bekerja

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.
Dennis
sumber
3
Begitulah
Digital Trauma
1
:-gtidak pernah melihat emotikon itu sebelumnya
ETHproduk
@ETHproduk-siput-mulut?
Bukan berarti Charles
@ ETHproductions Ini seseorang yang kacamatanya jatuh di atas mulut mereka.
CJ Dennis
Ini adalah Bronco.
DJMcMayhem
3

JavaScript (ES6), 128 130 byte

Edit 2 byte yang disimpan dengan menerapkan tip @ 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

UJI

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>

edc65
sumber
1
Wow, trik dengan parseIntitu benar-benar pintar! Menggunakan tip @ Neil l>u?l+" to "+u:u+(u>l?" TO ":" To ")+luntuk output akan menghemat 2 byte juga.
user81655
@ user81655 baik saya menganggap parseInt setiap kali saya perlu beroperasi pada beberapa kelompok surat kecil dalam kasus cara sensitif ... 99% kali itu tidak berguna. Terima kasih telah menunjukkan tip 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 disimpan berkat @ dev-null , 5 berkat @Tidak itu Charles dan 2 berkat @Neil !

Penjelasan

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>

pengguna81655
sumber
Anda tidak bisa menggunakan /s|fck|../gidan map(..),a>bbukannyamap(..)&&a>b
andlrc
Saya pikir Anda akan menghemat beberapa jika Anda melakukannya...:u=="T"?6:u>"R"?2:3...
Bukan Charles
@NotthatCharles Benar. Terima kasih atas tipnya!
user81655
Saya pikir Anda dapat menyimpan 2 byte menggunakanb+(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

Membutuhkan -nbendera dan -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: Lupa dukungan to, Todan TO.

andlrc
sumber
Bagus. Tapi %a=qw(fg 3 td 6 xp 1 xd 2 s 2 fck 3)lebih singkat %a=(fg,3,td,6,xp,1,xd,2,s,2,fck,3). Dan " "(dalam definisi Anda tentang $,) lebih singkat $". Tapi saya belum menguji keduanya.
msh210
@ msh210, saya bisa menggunakan $"dan saya bisa menghapus qwpada to To TOarray, terima kasih!
andlrc
1

Lua, 231 200 Bytes

Itu sangat menyenangkan, bahkan jika saya tidak benar-benar tahu aturan sepak bola Amerika (Kami punya Rugby di sini :)). Saya harus menguji banyak hal untuk membuatnya sesingkat mungkin, saya tidak berpikir ada banyak hal untuk diperbaiki, mungkin tidak ada.

Sunting: Saya benar-benar terbelakang. Solusi pertama yang saya kerjakan berputar menggunakan ekspansi array, lalu saya mengubahnya dan array yang berisi skor untuk tim huruf kecil dan besar tidak lagi berguna. Menghapusnya dan menggunakan variabel biasa menghasilkan -31 byte yang indah.

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

Tidak terseret dan penjelasan

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
Katenkyo
sumber
0

Python, 167 byte

Burung hantu yang luar biasa sudah lama berlalu, tetapi karena belum ada solusi 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]

Bekerja di Python 2 atau 3.

Chuck Morris
sumber