Điểm tennis đáp ứng Code Golf


25

Trong giải Úc mở rộng 2014 tại Melbourne, và chiến thắng của Stanislas Wawrinka trước Novak Djokovic, tôi đề xuất thử thách chơi gôn mã sau đây!

Wawrinka và Djokovic là một lần nữa cho nền tảng của CGC này. Thử thách của bạn là lấy một chuỗi gồm 1 và 2 và xác định điểm số quần vợt dựa trên hệ thống tính điểm quần vợt. "1" chỉ ra rằng Wawrinka đã ghi được một điểm, trong khi "2" chỉ ra rằng Djokovic đã ghi được một điểm.

Vì lợi ích của ví dụ: 1211222122111122111sẽ tạo đầu ra hai dòng:

Wawrinka 1 - 40
Djokovic 1 - 30

Chuỗi càng dài, điểm số càng xa.

Quy tắc:

  • Mã ngắn nhất thắng, tinh khiết và đơn giản.
  • Điểm số khi được hiển thị phải được căn phải và cũng được căn chỉnh theo cột; ví dụ
  • Căn chỉnh mẫu của đầu ra:

    Wawrinka 7 5 3 -  0
    Djokovic 6 7 4 - 15
    
  • Nếu một trò chơi đang diễn ra, điểm số phải được hiển thị sau khi điểm số được đặt. Điểm số trò chơi phải tuân theo điểm số đã đặt bằng dấu phân cách dấu cách-dấu cách. Nếu điều này xảy ra là trò chơi đầu tiên, điểm số 0-0 phải được hiển thị.

    Wawrinka 0 -  0
    Djokovic 0 - 15
    
  • Một trò chơi sẽ đi theo thứ tự 0, 15, 30, 40 và điểm trò chơi. Nếu một trò chơi đạt 40-40, một sự thất bại được tuyên bố và điểm số phải hiển thị sự thất bại trên hàng người chơi ghi điểm:

    Wawrinka 7 5 3 - 40
    Djokovic 6 7 4 - 40 Deuce
    
  • Nếu đạt được một quyết định, điểm tiếp theo sẽ là một lợi thế cho người chơi ghi điểm:

    Wawrinka 7 5 3 - Ad
    Djokovic 6 7 4 - 40
    

    Điểm sau đó, nếu được ghi bởi người chơi có lợi thế, sẽ thắng trò chơi, nếu không thì trò chơi sẽ quay trở lại.

  • Nếu có nhiều hơn một lần khử được ghi ở giữa các điểm lợi thế, số lần khử sẽ được chỉ định bằng một số trong ngoặc đơn:

    Wawrinka 7 5 3 - 40
    Djokovic 6 7 4 - 40 Deuce (2)
    
  • Một bộ được thắng nếu người chơi đạt 6 trận trở lên và có tỷ lệ cược hai trò chơi dẫn đầu, ví dụ 7-5, 6-4 ... 9-7 (Trong trường hợp của bộ thứ năm tối qua)

  • Các bộ liên tiếp phải được phân tách bằng một khoảng trắng.

  • Có những lần hòa vốn trong Giải Úc mở rộng, do đó, nếu đạt được tỷ số 6-6, một lần hòa vốn được thiết lập bởi người chơi đầu tiên đạt bảy điểm với cách biệt hai điểm. Hiển thị ngắt kết nối được hiển thị trong dấu ngoặc vuông như sau:

    Wawrinka 7 6 [6]
    Djokovic 6 6 [4]
    

    Người chiến thắng trong loạt tie-break được cho là đã thắng set 7-6 trước đó.

  • Nếu bộ thứ năm đạt 6-6, trò chơi được tiếp tục mà không cần hòa vốn cho đến khi đạt được mức chênh lệch hai trò chơi với một người chơi, người chơi đó là người chiến thắng của bộ đó. KHÔNG có tie-break trong tập thứ năm.

  • Nếu một người chơi đã giành được ba bộ, một dòng thứ ba sẽ được hiển thị cho biết Wawrinka winshoặc Djokovic winstùy thuộc vào người đã thắng và mã sau đó chấm dứt.

    Wawrinka 2 6 6 3 9
    Djokovic 6 4 2 6 7
    Wawrinka wins
    
  • Nếu chuỗi kết thúc sao cho điểm cuối cùng giành chiến thắng trong trò chơi, bộ hoặc trận đấu, điểm số trò chơi sẽ không được hiển thị ...

    Wawrinka 7 5 3
    Djokovic 6 7 4
    
  • Nếu chuỗi vượt quá trận đấu được thắng, phần còn lại của chuỗi bị bỏ qua, điểm số được hiển thị và người chiến thắng được tuyên bố.


3
Tôi thực sự không nghĩ rằng chúng ta cần một thẻ mới gọi là thể thao ; Trò chơi nên hoạt động tốt.
Justin

1
Kết quả sẽ như thế nào? Chỉ là điểm số cuối cùng hoặc mỗi bước trên đường?
Teun Pronk

1
@TeunPronk tùy theo điểm số, trận đấu sẽ kết thúc hay không. Ý tưởng có vẻ là: Cho chuỗi điểm, điểm hiện tại là bao nhiêu.
Tim Seguine

1
@McKay - bạn không thể đạt 9-7 trong set thứ ba của Giải Úc mở rộng; tiebreak nên áp dụng trong mọi bộ trừ thứ năm.
Chowlett

1
@WallyWest bạn đã đúng với chỉnh sửa trước đó của bạn; chỉ có bộ thứ năm không có tie-breaker. Tôi đã sửa ví dụ của bạn để làm cho điều này rõ ràng hơn.
primo

Câu trả lời:


5

Perl - 424 byte

*1=a;*2=b;@1=(Wawrinka,0);@2=(Djokovic,0);
$$_++>${$o=S^$_}&&$$_>3and$1=$2=0,
$w=$w[$_]+=($$_[$.]++>$$o[$.]||(($t=$$_[$.]==$$o[$.])&&!$%&&$.<5))&&
$$_[$.]>5+$%&&!($1[$.]=$2[$.+=!$%]=$w<2&&0,$$_[$.-1]+=$%,$%=$t)for<>=~/./g;
@s=(' 0',15,30,(40)x($e=$$o<3||$$o-2),Ad);
$%and$_="[$_]"for@1[-1],@2[-1];$d[$&]=$1>2&&$1==$2&&' Deuce'.($1>3&&" ($e)");
print"@1",$w<3&&" - $s[$1]$d[1]","\n@2",$w<3&&" - $s[$2]$d[2]",$w>2&&"\n${$&}[0] wins"

Dòng mới đã được thêm vào để dễ đọc ngang.

Tôi tin rằng đây là một giải pháp hoàn chỉnh, theo cách tính điểm của Giải Úc mở rộng :

  • Tốt nhất trong năm bộ (còn gọi là cuộc đua đến ba).
  • Các bộ 1-4 được chơi dưới dạng 6-6 tie-breaker.
  • Bộ 5 được chơi như một bộ lợi thế.

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


1211222122111122111

Wawrinka 1 - 40
Djokovic 1 - 30

12112221221111221112

Wawrinka 1 - 40
Djokovic 1 - 40 Deuce

121122212211112211122

Wawrinka 1 - 40
Djokovic 1 - Ad

1211222122111122111221

Wawrinka 1 - 40 Deuce (2)
Djokovic 1 - 40

22111111212122221122111212212112121221212211221121222222112112221121121122221122221211111222121222122211212122111212112211222121211212211212211122121211112222222212211121122

Wawrinka 6 [5] - 30
Djokovic 6 [6] - 40

221111112121222211221112122121121212212122112211212222221121122211211211222211222212111112221212221222112121221112121122112221212112122112122111221212111122222222122111211222

Wawrinka 6 0 -  0
Djokovic 7 0 -  0

1122222211121211121211111121111211221222212212112221211222211222112212211121122122212122212222122212212211221111121222111221211111211112222212122122112111212121221221212211112122212211111111112111212222221112212121122212121111122111222222111212221121221111222122122222111212111111221121122111122122111222222121122221112221221122221121211212111122111121212112112121222122

Wawrinka 5 4 6 6 5 - 15
Djokovic 7 6 4 4 6 - 40

11222222111212111212111111211112112212222122121122212112222112221122122111211221222121222122221222122122112211111212221112212111112111122222121221221121112121212212212122111121222122111111111121112122222211122121211222121211111221112222221112122211212211112221221222221112121111112211211221111221221112222221211222211122212211222211212112121111221111212121121121212221222

Wawrinka 5 4 6 6 5
Djokovic 7 6 4 4 7
Djokovic wins

222221112112212212222111222211111111121111121112211221221211212121122211222112111112122122212222211112122212221111121111121211212112112112221221121122121121112221221222122122211222212121212112112111221221121112222212122222221111112222222221221122211221121111221121222222111111122221122111211121222112112122212122221121222221222121212111121221221112111212212222122212212212112111112112112121112221111221221221121222122211221212211111111222222121221112221212

Wawrinka 6 7 6 4 7 - 40
Djokovic 3 5 7 6 8 - Ad

2222211121122122122221112222111111111211111211122112212212112121211222112221121111121221222122222111121222122211111211111212112121121121122212211211221211211122212212221221222112222121212121121121112212211211122222121222222211111122222222212211222112211211112211212222221111111222211221112111212221121121222121222211212222212221212121111212212211121112122122221222122122121121111121121121211122211112212212211212221222112212122111111112222221212211122212122

Wawrinka 6 7 6 4 7 
Djokovic 3 5 7 6 9 
Djokovic wins

Tất cả các điểm trung gian cho trường hợp kiểm tra cuối cùng có thể được xem tại đây: http://codepad.org/FzDIcf0W


Không phải 11-9 chỉ có nghĩa là hợp lệ như một bộ thứ năm?
Biến động

@Volatility thực sự, bạn đã đúng. Tôi sẽ cần cập nhật.
primo

2

ECMAScript 6 - 635 Ký tự

f=(p,q,C)=>{B='';T=' ';L=(x)=>(B+x).length;M=(x,y)=>x>y?x:y;E=(a)=>{var x=L(a[0]),y=L(a[1]),q=M(x,y);for(;x++<q;)a[0]=T+a[0];for(;y++<q;)a[1]=T+a[1]};E(a=[p,q]);g=[m=n=o=i=t=z=0,0];s=[0,0];S=[0,0];w=2;O=(i)=>a[i]+(n+o>0?T+s[i]:B)+(o>0?(t?' ['+g[i]+']':' - '+[' 0',15,30,40,'Ad'][g[i]]+(z>0&&g[0]+g[1]==6&&i==w?' Deuce'+(z>1?' ('+z+')':B):B)):B)+'\n';while(W=C[i++]){w=--W;++o;if((d=++g[w])>M(t?6:3,(e=g[l=1-w])+1)){g=[o=z=0,0];j=++s[w];k=s[l];t=++n>11;if(j>M(5,m>4||k<6?k+1:6)){E(s);a[0]+=T+s[0];a[1]+=T+s[1];s=[n=0,0];++m;if(++S[w]>2)break}}else if(!t&&d+e>7){--g[w];--g[l];++z}}E(s);E(g);return O(0)+O(1)+(S[w]>2?(w?q:p)+' wins':B)}

Với nhận xét:

// Function f takes arguments:
//   p - Player 1 name
//   q - Player 2 name
//   C - String of 1s and 2s representing points won by players.
f=(p,q,C)=>{
    /* Empty String          */ B='';
    /* Space                 */ T=' ';
    /* String Length Func.   */ L=(x)=>(B+x).length;
    /* Max Function          */ M=(x,y)=>x>y?x:y;
    /* Equalize Length Func. */ E=(a)=>{var x=L(a[0]),y=L(a[1]),q=M(x,y);for(;x++<q;)a[0]=T+a[0];for(;y++<q;)a[1]=T+a[1]};
    /* No. of sets           */ m=0;
    /* No. games in set      */ n=0;
    /* No. points in game    */ o=0;
    /* Input Index           */ i=0;
    /* Output String         */ E(a=[p,q]);
    /* Current Game's Points */ g=[0,0];
    /* Current Set's Games   */ s=[0,0];
    /* No. sets won          */ S=[0,0];
    /* Is a tiebreaker       */ t=0;
    /* No. of deuces         */ z=0;
    /* Current match result  */ w=2;
    /* Output Fnctn  */ O=(i)=>a[i]+(n+o>0?T+s[i]:B)+(o>0?(t?' ['+g[i]+']':' - '+[' 0',15,30,40,'Ad'][g[i]]+(z>0&&g[0]+g[1]==6&&i==w?' Deuce'+(z>1?' ('+z+')':B):B)):B)+'\n';
    while(W=C[i++]){
        w=--W;
        // w - index of winner of current game
        // l - index of loser of current game
        // d - winner of current point's game score
        // e - loser of current point's game score
        ++o;
        if((d=++g[w])>M(t?6:3,(e=g[l=1-w])+1)){ 
            g=[0,0];  // Reset the game score.
            o=z=0;
            j=++s[w]; // j = Increment the winner's set score
            k=s[l];   // k = Loser's set score
            t=++n>11; // Is a tiebreak?
            if(j>M(5,m>4||k<6?k+1:6)){
                E(s);
                a[0]+=T+s[0]; // Add to output
                a[1]+=T+s[1]; // Add to output
                s=[n=0,0];  // Reset current set's no. of games & no. of deuces.
                ++m;        // Increment no. of sets.
                if(++S[w]>2)break;     // Increment winners no. sets won and check if match won.
            }
        }
        else if(!t&&d+e>7){--g[w];--g[l];++z}// Check if deuces increased.
    }
    E(s); // Format sets strings.
    E(g); // Format games strings.
    return O(0)+O(1)+(S[w]>2?(w?q:p)+' wins':B);
}

Kiểm tra

var tests=[
            '',
            '1',
            '2',
            '11',
            '222',
            '1111',
            '2222',
            '1112221',
            '11122212',
            '121212121',
            '1212121212',
            '1211222122111122111',
            '12112221221111221112',
            '121122212211112211122',
            '1211222122111122111221',
            '1111222211112222111122221111222211112222111122221212121212121212121',
            '11111111111111111111111111111111111111111111111111111111111111111111111',
            '111111111111111111111111111111111111111111111111111111111111111111111111',
            '1111111111111111111111111111111111111111111111111111111111111111111111111'
        ];
for(var ex in tests) console.log('Test '+ex+'\n'+tests[ex]+'\n'+f('Wawrinka','Djokovic',tests[ex]));

Đầu ra thử nghiệm

Test 0

Wawrinka
Djokovic


Test 1
1
Wawrinka 0 - 15
Djokovic 0 -  0


Test 2
2
Wawrinka 0 -  0
Djokovic 0 - 15


Test 3
11
Wawrinka 0 - 30
Djokovic 0 -  0


Test 4
222
Wawrinka 0 -  0
Djokovic 0 - 40


Test 5
1111
Wawrinka 1
Djokovic 0


Test 6
2222
Wawrinka 0
Djokovic 1


Test 7
1112221
Wawrinka 0 - Ad
Djokovic 0 - 40


Test 8
11122212
Wawrinka 0 - 40
Djokovic 0 - 40 Deuce


Test 9
121212121
Wawrinka 0 - Ad
Djokovic 0 - 40


Test 10
1212121212
Wawrinka 0 - 40
Djokovic 0 - 40 Deuce (2)


Test 11
1211222122111122111
Wawrinka 1 - 40
Djokovic 1 - 30


Test 12
12112221221111221112
Wawrinka 1 - 40
Djokovic 1 - 40


Test 13
121122212211112211122
Wawrinka 1 - 40
Djokovic 1 - Ad

Test 14
1211222122111122111221
Wawrinka 1 - 40 Deuce
Djokovic 1 - 40


Test 15
1111222211112222111122221111222211112222111122221212121212121212121
Wawrinka 6 [10]
Djokovic 6 [ 9]


Test 16
11111111111111111111111111111111111111111111111111111111111111111111111
Wawrinka 6 6 5 - 40
Djokovic 0 0 0 -  0


Test 17
111111111111111111111111111111111111111111111111111111111111111111111111
Wawrinka 6 6 6
Djokovic 0 0 0
Wawrinka wins

Test 18
1111111111111111111111111111111111111111111111111111111111111111111111111
Wawrinka 6 6 6
Djokovic 0 0 0
Wawrinka wins

1

Javascript - 743 byte

var b=process.argv[2],c=[0,0],e=[],g=[0,0],h=[0,0],k=["0","15","30","40"],l=["Wawrinka","Djokovic"];function m(a){var d="",f;for(f in e)d+=e[f][a]+" ";3<=c[0]||3<=c[1]||(d+=g[a]+" - ",f=h[a],a=h[(a+1)%2],d=n()?d+("["+f+"]"):3>f||3>a?d+k[f]:f>a?d+"Ad":d+k[3]);return d}function n(){return 6<=g[0]&&6<=g[1]}function p(){var a=q;g[a]++;h=[0,0];7<=g[a]?(e.push(g),g=[0,0],c[a]++):6<=g[a]&&g[a]>g[(a+1)%2]+1&&(e.push(g),g=[0,0],c[a]++)} for(var r in b){var q=parseInt(b[r])-1,s=++h[q];n()?7<=s&&(4>e.length?p():s>h[(q+1)%2]+1&&p()):4<=s&&s>h[(q+1)%2]+1&&p()}console.log(l[0]," ",m(0));console.log(l[1]," ",m(1),n()?"":2<h[0]&&2<h[1]&&h[0]==h[1]?"Deuce"+(3<h[0]?" ("+(h[0]-2)+")":""):"");console.log(3<=c[0]||3<=c[1]?(3<=c[0]?l[0]:l[1])+" wins":"");

Không có trình biên dịch đóng:

var input = process.argv[2];

var score = [0,0];
var match = [];
var set = [0,0];
var game = [0,0];
var gameScore = [ '0', '15', '30', '40' ];
var names = ['Wawrinka', 'Djokovic'];

function printScores(who)
{
    var out = '';
    for (var i in match) {
        out += match[i][who] + ' ';
    }

    if (!isDone()) {
        out += set[who] + ' - ';

        var point = game[who], otherPoint = game[(who+1)%2];

        if (isTieBreaker()) { // Tie breaker
            out += '['+point+']';
        } else {
            if (point < 3 || otherPoint < 3) {
                out += gameScore[point];
            } else if (point > otherPoint) {
                out += 'Ad';
            } else {
                out+= gameScore[3];
            }
        }
    }

    return out;
}

function printDeuce()
{
    if (isTieBreaker()) {
        return '';
    } else {
        return (game[0] > 2 && game[1] > 2 && game[0] == game[1]) ? ('Deuce' + (game[0] > 3 ? ' (' + (game[0] - 2) + ')' : '')) : '';
    }

}

function isDone()
{
    return score[0] >= 3 || score[1] >= 3;
}

function isTieBreaker()
{
    return set[0] >= 6 && set[1] >= 6;
}

function getOther(who)
{
    return (who + 1) % 2;
}

function addPoint(who)
{
    var points = ++game[who];

    if (isTieBreaker()) {
        if (points >= 7) {
            if (match.length < 4) {
                addGame(who);
            } else if (points > (game[getOther(who)]+ 1)) {
                addGame(who);
            }
        }
    } else {
        if (points >= 4 && points > (game[getOther(who)] + 1)) {
            addGame(who);
        }
    }
}

function addGame(who)
{
    set[who]++;
    game = [0,0];

    if (set[who] >= 7) { // Won Tiebreaker
        addSet(who);
    } else if (set[who] >= 6 && set[who] > (set[getOther(who)] + 1)) {
        addSet(who);
    }
}

function addSet(who)
{
    match.push(set);
    set = [0,0];
    score[who]++;
}

// Play game
for(var i in input) {
    addPoint(parseInt(input[i]) - 1);
}

console.log(names[0], ' ', printScores(0));
console.log(names[1], ' ', printScores(1), printDeuce());
console.log(isDone() ? ((score[0] >= 3 ? names[0] : names[1]) + ' wins') : '');
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.