Futbol maçını kim kazanacak?


17

Amerikan futbol şampiyonası Super Bowl 50 , bugün 23:30 UTC'de (ve çevrimiçi canlı olarak izleyebilirsiniz ). Bu meydan okuma kutlamak için yapıldı.


Bir Amerikan futbol maçında, iki takım en yüksek puanı almak için yarışır ve bu puanları almanın altı yolu vardır . Her birine bir kısaltma vereceğiz:

Yalnızca bu altı kısaltmayı içeren tek bir satır dizesini alan, büyük ve küçük harf içeren bir program veya işlev yazın.

Bu dize, bir futbol maçındaki (veya oyunun bir bölümündeki) tüm skorlama olaylarını temsil eder; büyük terimler bir takıma ve küçük harf diğerine aittir.

İşiniz oyunun son skorlarını raporlamak ve formun çıktısını kimin kazandığını belirtmektir

[score 1] [to] [score 2]

nerede:

  • [score 1] büyük veya küçük harf kazanılmış olsun, her zaman iki puandan daha büyüktür (eşit değilse).
  • [score 2] iki puandan küçükse (eşit değilse).
  • [to]olduğu TOtakdirde büyük takım kazandı, toküçük takım Won ve eğer Tobu bir kravat buysa.

Örnek: Bütün puanlama olaylar içinde Super Bowl XLIX dize tarafından özetlenebilir

TDXPtdxpTDXPtdxpfgtdxpTDXPTDXP

büyük harf New England Patriots ve küçük harf Seattle Seahawks . Vatanseverler 28 ve Hawks 24 puanları aldılar, böylece çıktı:

28 TO 24

notlar

  • Programınız / işleviniz, boş dize dahil olmak üzere tüm rastgele girişleri desteklemelidir.
  • XPve XDancak hemen sonrasında gerçekleşir TD. xpve xdancak hemen sonrasında gerçekleşir td.
  • Giriş dizesinin belirli bir durumda başladığını veya bittiğini varsayamazsınız.
  • Giriş ve çıkışta isteğe bağlı olarak tek bir satırsonuna izin verilir

puanlama

Bayt cinsinden en kısa kod kazanır. Super Bowl 50 başlamadan önce ( şimdi çok geç! ) Gönderilen cevaplar kazanan takımı ( Panthers veya Broncos ) tahmin edebilir ve eğer doğruysa,% -10 bayt bonusu kazanın !

(Tahminlerin değişmediğinden ve gerçekten başlamadan önce yapıldığından emin olmak için düzeltme geçmişini kontrol edeceğim.)

Test Durumları

[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
Bence "Superbowl" olarak değil "
Superbl

Super Bowl bittikten sonra yayınınızı düzenlerseniz bonus hala geçerli mi?
Kapı tokmağı

1
@Doorknob Buna ne dersiniz: Başlamadan önce tahmin yaparsanız ve herhangi bir düzenleme ile değiştirmezseniz, kodunuzu istediğiniz kadar düzenleyebilirsiniz. (Ama tahmininiz bazı yorumlarda değil cevabınızda olmalı. Bu yüzden başlamak için çalışma koduna ihtiyacınız var.)
Calvin'in Hobileri

2
Sadece bir tahmin yapabilir miyim, cevap veremez miyim? : P
Rɪᴋᴇʀ

2
Ben puanlama bonusunun büyük bir hayranı değilim. Süper baykuştan sonra bu zorluğu ilk görenlere haksızlık , NFL'ye dikkat edenlere karşı önyargılı ve programlama yeteneğiyle tamamen ilgisiz.
DJMcMayhem

Yanıtlar:


3

Pyth, 49 46 43 42 bayt (bonus ile 37,8 bayt)

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

@Maltysen'e 4 bayt kurtarmama yardım ettiği için teşekkürler!

Pyth Derleyicisinde deneyin .

Tüm üsleri örtmeyi seviyorum, bu yüzden Broncos'a bahse girerim.

Nasıl çalışır

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 tellerde çalışan bir işlevler ailesidir.

  • İlk skor ise J(takas durumda tekabül zyani orijinal küçük harf), ikinci puanı daha düşüktür, işaret fonksiyonu dönecektir -1, (-1 + 1) ^ 2 == 2ve r" to "2olduğunu swapcasedöndürür, böylece " TO ".

  • Birinci skor ikinci puanından yüksek olması durumunda, işaret fonksiyonu dönecektir 1, (1 + 1) ^ 2 == 0ve r" to "0bir lowercaseo kadar döndürür, " to ".

  • Puanlar eşitse, işaret fonksiyonu dönecektir 0, (0 + 1) ^ 2 == 3ve r" to "3bir titleo kadar döndürür, " To ".


Ben denemedim, ama muhtemelen çeşitli todeğerleri farklı değerler yaparak kaydedebilirsinizr
Maltysen

@Maltysen Güzel çalıştı. Teşekkürler!
Dennis

4

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

Dennis'e 3 bayt ayırdığı için teşekkürler!

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

Çevrimiçi derleyicide boş bir giriş dizesi, tek satırsonu karakteri olarak gösterilir.

DÜZENLEME (8 Haziran 2016): Aşağıdaki bağlantı, dilin 18.1.0 sürümüne göre bir değişiklik içerir (ilk 3sağdan önce hareket ettir Xc)

Çevrimiçi deneyin!

Broncos'a bahse girerim.

açıklama

Skorlar, büyük veya küçük harf olmak üzere tek bir harf kullanılarak algılanır (büyük harf, aşağıda gösterilmiştir):

  • P XP için (1 puan)
  • D XD için (2 puan)
  • F FG (3 puan) ve FCK (3 puan) için
  • T TD için (6 puan)
  • S S için (2 puan)

Bu beş harften her biri benzersiz bir skor etkinliğine karşılık gelir.

  • Fiçin kullanılan FGve FCKaynı puana sahip. Bunun için @Dennis'e teşekkürler !
  • Dhem TD hem de XD'yi tespit edecektir. Yani Ttelafi etmek için 6 yerine 4 puan verilecektir.

Sipariş PDFTSnoktaları belirten sayı dizisini tanımlarken, birkaç byte kaydeder: [1,2,3,4,2].

Her olay, yukarıdaki harflerden birinin büyük veya küçük harf olmasıyla algılanır. Karşılaştırma üç boyutta yapılır: giriş dizesi uzunluğu ( N ) × takım sayısı (2) × tespit edilen skor olaylarının sayısı (5). Yaygın kullanım, daha büyük bir dizinin boyutuna uyacak şekilde bir dizinin tekli bir boyut boyunca otomatik olarak genişletilmesi olan yayından yararlanır.

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

Kazanç tahmini yok mu?
Calvin'in Hobileri

2
@ Calvin'sHobbies Wikipedia'ya danışıyordum ... Amerikan futbolu hakkındaki bilgim nil'e yakın :-)
Luis Mendo

2
Yeniden kullanma Fin FGve FCKüç bayt kaydetmek gerekir.
Dennis

3

CJam, 57 55 54 53 50 49 bayt

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

Çevrimiçi deneyin!

Bronco'nun ne olduğu hakkında hiçbir fikrim yok, bu yüzden Panterlere bahse girerim.

Nasıl çalışır

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
:-gDaha önce bu ifadeyi hiç görmedim
ETHproductions 7:16

@ETHproductions salyangoz ağzı?
Charles

@ETHproductions Gözlükleri ağzına düşmüş biri.
CJ Dennis

Bu bir Bronco.
DJMcMayhem

3

JavaScript (ES6), 128 130 bayt

DüzenleNeil'ın ipucunu uygulayarak kaydedilen 2 baytı

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

ÖLÇEK

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
Vay be, bu hile parseIntgerçekten zekice! l>u?l+" to "+u:u+(u>l?" TO ":" To ")+lÇıktı için @ Neil'in ipucunu kullanmak da 2 bayt tasarruf sağlayacaktır.
user81655

@ user81655 iyi parseInt her seferinde duyarsız bir şekilde bazı küçük harf gruplarında çalışmam gerekiyor ...% 99 kez işe yaramaz. Neil'in ipucunu işaret
ettiğiniz

2

JavaScript (ES6), 165 156 151 149 bayt

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 bayt sayesinde kaydedilen @ dev-boş üzere, 5 sayesinde @Not Charles ve 2 teşekkür @Neil !

açıklama

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>


Kullanmak Cant /s|fck|../give map(..),a>byerinemap(..)&&a>b
andlrc

Sanırım sen de biraz kurtaracaksın...:u=="T"?6:u>"R"?2:3...
Charles

@NotthatCharles True. Bahşiş için teşekkürler!
user81655

Sanırım 2 bayt kullanarak tasarruf edebilirsinizb+(b>a?" TO ":" To ")+a
Neil

2

Perl, 144140 + 2 = 142 bayt

%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

-nBayrağı gerektirir ve -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

Düzenleme: desteğine unuttum to, Tove TO.


Güzel. Ama %a=qw(fg 3 td 6 xp 1 xd 2 s 2 fck 3)daha kısadır %a=(fg,3,td,6,xp,1,xd,2,s,2,fck,3). Ve " "(tanımınızda $,) olarak daha kısadır $". Ama ikisini de test etmedim.
msh210

@ msh210, ben kullanabilir $"ve ben kaldırabilir qwüzerinde to To TO, dizinin sayesinde!
andlrc

1

Lua, 231200 Bayt

Amerikan futbolu kurallarını gerçekten bilmesem bile çok eğlenceliydi (Rugby burada var :)). Mümkün olduğunca kısa yapmak için birçok şeyi test etmek zorunda kaldım, geliştirecek çok şey olduğunu düşünmüyorum, belki de yoktur.

Düzenleme: Ben tamamen geciktiriyorum. Üzerinde çalıştığım ilk çözüm dizi genişletmeyi kullanarak döndüm, sonra değiştirdim ve hem küçük hem de büyük harf ekibinin puanlarını içeren dizi artık kullanışlı değildi. Kaldırmak ve düz değişken kullanmak güzel bir -31 bayt yapar.

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 ve açıklamalar

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 bayt

Süper baykuş uzun bir geçmiş, ancak henüz bir Python çözümü olmadığından:

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 veya 3'te çalışır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.