Skor Badminton Benar?


27

Pengantar:

Saya melihat hanya ada satu tantangan terkait bulu tangkis lainnya saat ini . Karena saya bermain bulutangkis sendiri (selama 13 tahun terakhir sekarang), saya pikir saya akan menambahkan beberapa tantangan terkait bulutangkis. Ini yang pertama:

Tantangan:

Input: Dua bilangan bulat
Output: Salah satu dari tiga output yang berbeda dan unik dari pilihan Anda sendiri. Satu menunjukkan bahwa input adalah skor bulu tangkis yang valid DAN set telah berakhir dengan pemenang; satu menunjukkan bahwa input adalah skor badminton yang valid DAN set masih dimainkan; satu menunjukkan input bukan skor bulu tangkis yang valid.

Dengan bulutangkis, kedua (pasangan) pemain mulai dengan 0 poin, dan Anda berhenti ketika salah satu dari dua (pasangan) pemain telah mencapai skor 21, dengan perbedaan minimal 2 poin, hingga maksimum 30-29.

Jadi ini semua pasangan-pasangan input yang memungkinkan (dalam urutan mana pun) yang mengindikasikan skor badminton yang valid DAN set telah berakhir:

[[0,21],[1,21],[2,21],[3,21],[4,21],[5,21],[6,21],[7,21],[8,21],[9,21],[10,21],[11,21],[12,21],[13,21],[14,21],[15,21],[16,21],[17,21],[18,21],[19,21],[20,22],[21,23],[22,24],[23,25],[24,26],[25,27],[26,28],[27,29],[28,30],[29,30]]

Dan ini semua adalah pasangan input yang memungkinkan (dalam urutan apa pun) yang menunjukkan itu adalah skor badminton yang valid TETAPI set masih dimainkan:

[[0,0],[0,1],[0,2],[0,3],[0,4],[0,5],[0,6],[0,7],[0,8],[0,9],[0,10],[0,11],[0,12],[0,13],[0,14],[0,15],[0,16],[0,17],[0,18],[0,19],[0,20],[1,1],[1,2],[1,3],[1,4],[1,5],[1,6],[1,7],[1,8],[1,9],[1,10],[1,11],[1,12],[1,13],[1,14],[1,15],[1,16],[1,17],[1,18],[1,19],[1,20],[2,2],[2,3],[2,4],[2,5],[2,6],[2,7],[2,8],[2,9],[2,10],[2,11],[2,12],[2,13],[2,14],[2,15],[2,16],[2,17],[2,18],[2,19],[2,20],[3,3],[3,4],[3,5],[3,6],[3,7],[3,8],[3,9],[3,10],[3,11],[3,12],[3,13],[3,14],[3,15],[3,16],[3,17],[3,18],[3,19],[3,20],[4,4],[4,5],[4,6],[4,7],[4,8],[4,9],[4,10],[4,11],[4,12],[4,13],[4,14],[4,15],[4,16],[4,17],[4,18],[4,19],[4,20],[5,5],[5,6],[5,7],[5,8],[5,9],[5,10],[5,11],[5,12],[5,13],[5,14],[5,15],[5,16],[5,17],[5,18],[5,19],[5,20],[6,6],[6,7],[6,8],[6,9],[6,10],[6,11],[6,12],[6,13],[6,14],[6,15],[6,16],[6,17],[6,18],[6,19],[6,20],[7,7],[7,8],[7,9],[7,10],[7,11],[7,12],[7,13],[7,14],[7,15],[7,16],[7,17],[7,18],[7,19],[7,20],[8,8],[8,9],[8,10],[8,11],[8,12],[8,13],[8,14],[8,15],[8,16],[8,17],[8,18],[8,19],[8,20],[9,9],[9,10],[9,11],[9,12],[9,13],[9,14],[9,15],[9,16],[9,17],[9,18],[9,19],[9,20],[10,10],[10,11],[10,12],[10,13],[10,14],[10,15],[10,16],[10,17],[10,18],[10,19],[10,20],[11,11],[11,12],[11,13],[11,14],[11,15],[11,16],[11,17],[11,18],[11,19],[11,20],[12,12],[12,13],[12,14],[12,15],[12,16],[12,17],[12,18],[12,19],[12,20],[13,13],[13,14],[13,15],[13,16],[13,17],[13,18],[13,19],[13,20],[14,14],[14,15],[14,16],[14,17],[14,18],[14,19],[14,20],[15,15],[15,16],[15,17],[15,18],[15,19],[15,20],[16,16],[16,17],[16,18],[16,19],[16,20],[17,17],[17,18],[17,19],[17,20],[18,18],[18,19],[18,20],[19,19],[19,20],[20,20],[20,21],[21,21],[21,22],[22,22],[22,23],[23,23],[23,24],[24,24],[24,25],[25,25],[25,26],[26,26],[26,27],[27,27],[27,28],[28,28],[28,29],[29,29]]

Sepasang bilangan bulat lainnya akan menjadi skor bulutangkis yang tidak valid.

Aturan tantangan:

  • I / O fleksibel, jadi:
    • Anda dapat mengambil input sebagai daftar dua angka; dua angka yang terpisah melalui STDIN atau parameter fungsi; dua string; dll.
    • Output akan menjadi tiga nilai berbeda dan unik dari pilihan Anda sendiri. Dapat bilangan bulat (yaitu [0,1,2], [1,2,3], [-1,0,1], dll); bisa menjadi Booleans (yaitu [true,false,undefined/null/empty]); dapat berupa karakter / string (yaitu ["valid & ended","valid","invalid"]); dll.
    • Silakan tentukan I / O yang Anda gunakan dalam jawaban Anda!
  • Anda diizinkan mengambil bilangan bulat input yang dipesan lebih dulu dari terendah ke tertinggi atau sebaliknya.
  • Bilangan bulat input bisa negatif, dalam hal ini tentu saja tidak valid.

Aturan umum:

  • Ini adalah , jadi jawaban tersingkat dalam byte menang.
    Jangan biarkan bahasa kode-golf mencegah Anda memposting jawaban dengan bahasa non-codegolf. Cobalah untuk memberikan jawaban sesingkat mungkin untuk bahasa pemrograman 'apa saja'.
  • Aturan standar berlaku untuk jawaban Anda dengan aturan I / O standar , sehingga Anda diperbolehkan menggunakan STDIN / STDOUT, fungsi / metode dengan parameter yang tepat dan tipe pengembalian, program penuh. Panggilanmu.
  • Celah default tidak diperbolehkan.
  • Jika memungkinkan, silakan tambahkan tautan dengan tes untuk kode Anda (yaitu TIO ).
  • Juga, menambahkan penjelasan untuk jawaban Anda sangat dianjurkan.

Kasus uji:

Kasus uji ini valid, dan set telah berakhir:

0 21
12 21
21 23
28 30
29 30

Kasing uji ini valid, tetapi set masih dalam permainan:

0 0
0 20
12 12
21 21
21 22

Kasus uji ini tidak valid:

-21 19
-19 21
-1 1
12 22
29 31
30 30
42 43
1021 1021

Jawaban:


1

Stax , 20 byte

ÇåπßéD╩¬7▼ß▌ΣU¬í╡S┤╘

Jalankan dan debug itu

Dibutuhkan input dalam format yang sama dengan contoh. 0berarti ada pemenang yang valid. 1berarti permainan sedang berlangsung. -1berarti skor tidak valid.

Dalam pseudo-code, dengan input yang diurutkan xdan y, algoritmanya

sign(clamp(x + 2, 21, 30) - y) | (x < 0 || x >= 30 ? 0 : -1)
  • signberarti tanda numerik ( -1, 0, atau 1)
  • clamp memaksa argumen pertamanya ke dalam interval setengah terbuka yang ditentukan

6

Python 2 , 97 95 75 72 71 70 69 64 55 54 52 51 50 48 byte

lambda a,b:(b-61<~a<a>b/22*b-3)*~(19<b-(b<30)>a)

Cobalah online!

Mengambil input sebagai sudah dipesan sebelumnya a,b.

Pengembalian -2, -1, 0untuk ended, in play, invalid.

-1 byte, terima kasih kepada Kevin Cruijssen


Bagian kiri ( b-61<~a<a>b/22*b-3) adalah pemeriksaan validitas, dan bagian kanan ( 19<b-(b<30)>a) adalah cek untuk permainan berakhir.


6

Python 2 , 47 byte

lambda a,b:[61>60-a>b<3+max(19,a)for b in-~b,b]

Cobalah online!

Menghasilkan daftar dua Boolean. Terima kasih kepada TFeld karena telah menulis test suite dalam jawaban mereka yang membuatnya mudah untuk memeriksa solusi saya.

ended: [False, True]
going: [True, True]
invalid: [False, False]

Wawasan utama adalah bahwa skor yang valid mengakhiri permainan dengan tepat jika meningkatkan nilai yang lebih tinggi bmembuat skor tidak valid. Jadi, kami hanya membuat kode kondisi validitas, dan memeriksanya (a,b+1)selain (a,b)untuk melihat apakah permainan telah berakhir.

Validitas diperiksa melalui tiga kondisi yang dirantai bersama:

  • b<3+max(19,a): Memeriksa bahwa skor yang lebih tinggi bbukan kemenangan sebelumnya, dengan salah satu b<=21atau b<=a+2(menang dua)
  • 60-a>b: Setara dengan a+b<=59, memastikan skor tidak di atas(29,30)
  • 61>60-a: Setara dengan a>=0, memastikan skor yang lebih rendah adalah non-negatif

Python 2 , 44 byte

lambda a,b:[b-61<~a<a>b/22*b-3for b in-~b,b]

Cobalah online!

Pemeriksaan validitas yang ditingkatkan oleh TFeld menghemat 3 byte. Ide utama adalah untuk cabang pada "lembur" b>21dengan b/22*byang secara efektif menetapkan bawah-21 skor nol, sedangkan aku bercabang di a>19dengan lagi max(19,a).


Python 2 , 43 byte

lambda a,b:a>>99|cmp(2+max(19,a)%30-a/29,b)

Cobalah online!

Output:

ended: 0
going: -1
invalid: 1

299


1
Menggunakan validitas-cek terbaru saya ( b-61<~a<a>b/22*b-3), Anda dapat menyimpan 3 byte.
TFeld

1
+1 byte untuk membuat solusi kedua Anda berfungsi untuk semua input:lambda a,b:-(a<0)|cmp(2+max(19,a)%30-a/29,b)
TFeld

4

JavaScript (ES6),  55 53  48 byte

ab

(a)(b)ab012

a=>b=>a<0|a>29|b>30|b>21&b-a>2?2:b>20&b-a>1|b>29

Cobalah online!



4

Jelly , 25 byte

»19«28‘<‘×+2>ɗʋ⁹×,%Ƒ“œþ‘ɗ

Cobalah online!

Argumen kiri: minimum. Argumen yang tepat: maksimum.
Valid: 0. Yang sedang berlangsung: 1. Berakhir: 2.

xy

[a]={a:1¬a:0(a,b)=(amod30,bmod31)x,yZX:=min(max(x+1,20),29)p:=(x,y)([X<y]+1)[X+2>y][p=p]

Penjelasan:

»19«28‘<‘×+2>ɗʋ⁹×,%Ƒ“œþ‘ɗ Left argument: x, Right argument: y
»19«28‘                   X := Bound x + 1 in [20, 29]:
»19                         X := max(x, 19).
   «28                      X := min(X, 28).
      ‘                     X := X + 1.
       <‘×+2>ɗʋ⁹          X := If X + 2 <= y, then 0, else if X < y, then 2, else 1:
       <                    t := If X < y, then 1, else 0.
        ‘                   t := t + 1.
          +2>ɗ              u := Check if X + 2 > y:
          +2                  u := X + 2.
            >                 u := If u > y, then 1, else 0.
         ×                  X := t * u.
                 ,%Ƒ“œþ‘ɗ z := If x mod 30 = x and y mod 31 = y, then 1, else 0:
                 ,          z := (x, y).
                  % “œþ‘    m := z mod (30, 31) = (x mod 30, y mod 31).
                   Ƒ        z := If z = m, then 1, else 0.
                ×         X * z.

3

VDM-SL , 80 byte

f(i,j)==if(j-i>2and j>21)or(i<0or i=30or j>30)then{}else{(j>20and j-i>1or j=30)} 

Fungsi ini mengambil skor yang dipesan dalam urutan menaik dan mengembalikan set kosong jika skor tidak valid atau set yang berisi apakah set selesai (jadi {true} jika set lengkap dan valid dan {false} jika set tidak lengkap dan sah)

Program lengkap untuk dijalankan mungkin terlihat seperti ini:

functions
f:int*int+>set of bool
f(i,j)==if(j-i>2and j>21)or(i<0or i=30or j>30)then{}else{(j>20and j-i>1or j=30)}

Penjelasan:

if(j-i>2 and j>21)             /*if scores are too far apart*/
or(i<0 or i=30 or j>30)        /*or scores not in a valid range*/
then {}                        /*return the empty set*/
else{                       }  /*else return the set containing...*/
     (j>20 and j-i>1 or j=30)  /*if the set is complete*/

3

Java (JDK) , 59 48 byte

a->b->b<0|b>29|a>b+2&a>21|a>30?0:a<21|a<30&a<b+2

Cobalah online!

Mengembalikan Object, yang merupakan Integer 0untuk game yang tidak valid danBoolean s truedan falseuntuk game yang sedang berlangsung yang valid dan untuk game yang sudah selesai secara valid. Mengambil skor yang dipesan (dan kari), dengan skor yang lebih tinggi terlebih dahulu.

-2 bytes dengan membalikkan cek akhir pertandingan.
-11 bytesdengan menjelajah, menggunakan operator bitwise, dan beberapa tipu daya autoboxing tipe kembali - terima kasih kepada @KevinCruijssen

Tidak disatukan

a->                      // Curried: Target type IntFunction<IntFunction<Object>>
    b->                  // Target type IntFunction<Object>
                         // Invalid if:
            b<0          //    Any score is negative
          | b > 29       //    Both scores above 29
          |   a > b + 2  //    Lead too big
            & a > 21     //        and leader has at least 21 points
          | a > 30       //    Anyone has 31 points
        ? 0              // If invalid, return 0 (autoboxed to Integer)
                         // If valid, return whether the game is ongoing (autoboxed to Boolean)
                         // Ongoing if:
        :   a < 21       //    Nobody has 21 points
          |   a < 30     //    Leader has fewer than 30 points
            & a < b + 2  //        and lead is small

3

APL (Dyalog Unicode) , 35 byte SBCS

Fungsi infix tacit di mana berakhir adalah 2, berkelanjutan adalah 1, tidak valid adalah 0, skor lebih kecil dan lebih besar dibiarkan.

(,≡30 31|,)×(⊢<2+X1+⊢>X29201+⊣

Cobalah online!

Menerapkan formula matematika Erik the Outgolfer yang digabungkan menjadi

X: =min(maks(x+1,20),29) ([X<y]+1)[X+2>y][(x,y)=(xmod30,ymod31)]

[(x,y)=(x,y)mod(30,31)]×[y<2+X]×(1+[y<(X: =min(29,maks(20,1+x)))])

dan diterjemahkan langsung ke APL (yang benar-benar asosiatif, jadi kami menghindari beberapa tanda kurung):

((x,y)30 31|x,y)×(y<2+X)×1+y>X29201+x

xy

((,)30 31|,)×(<2+X)×1+>X29201+

(,30 31|,)×(<2+X)×1+>X29201+

yang merupakan solusi kami; (,≡30 31|,)×(⊢<2+X)×1+⊢>X←29⌊20⌈1+⊣:

 argumen kiri; x
1+ satu ditambah itu; 1+x
20⌈ maksimal 20 dan itu; maks(20,...)
29⌊ minimal 29 dan itu; min(29,...)
X← tetapkan itu untuk X;X: =...
⊢> Apakah argumen yang benar lebih besar (0/1)?; [y>...]
1+ tambahkan satu; 1+...
(...  gandakan yang berikut dengan itu;(...)×...
2+X dua plus X;2+X
⊢< adalah argumen yang benar kurang dari itu (0/1); [y<...]
(...  gandakan yang berikut dengan itu;(...)×...
, menggabungkan argumen; (x,y)
30 31| sisa ketika dibagi dengan angka-angka ini; ...mod(30,31)
,≡ apakah argumen gabungan identik dengan itu (0/1)?; [(x,y)=...]


3

x86 Assembly, 42 Bytes

Mengambil input ECXdan EDXregister. Catatan yang ECXharus lebih besar dari EDX.
Keluaran menjadi EAX, di mana 0berarti game masih menyala, 1mewakili game yang berakhir dan -1(alias FFFFFFFF) mewakili skor yang tidak valid.

31 C0 83 F9 1E 77 1F 83 FA 1D 77 1A 83 F9 15 7C 
18 83 F9 1E 74 12 89 CB 29 D3 83 FB 02 74 09 7C 
08 83 F9 15 74 02 48 C3 40 C3

Atau, lebih mudah dibaca di Intel Syntax:

check:
    XOR EAX, EAX
    CMP ECX, 30     ; check i_1 against 30
    JA .invalid     ; if >, invalid.
    CMP EDX, 29     ; check i_2 against 29
    JA .invalid     ; if >, invalid.
    CMP ECX, 21     ; check i_1 against 21
    JL .runi        ; if <, running.
    CMP ECX, 30     ; check i_1 against 30
    JE .over        ; if ==, over.
    MOV EBX, ECX
    SUB EBX, EDX    ; EBX = i_1 - i_2
    CMP EBX, 2      ; check EBX against 2
    JE .over        ; if ==, over.
    JL .runi        ; if <, running.
                    ; if >, keep executing!
    CMP ECX, 21     ; check i_1 against 21
    JE .over        ; if ==, over.
                    ; otherwise, it's invalid.
    ; fallthrough!
    .invalid:
        DEC EAX     ; EAX = -1
        RETN
    .over:
        INC EAX     ; EAX = 1
    ; fallthrough!
    .runi:
        RETN        ; EAX = 0 or 1

Fakta menyenangkan: fungsi ini hampir mengikuti aturan Konvensi Pemanggilan C tentang register mana yang harus dilestarikan, kecuali saya harus mengalahkan EBXuntuk menghemat beberapa byte pada penggunaan stack.


Optional (not included in byte-count)

Dengan menambahkan 6 byte berikut secara langsung sebelum memulai kode di atas, Anda dapat lulus ECXdan EDXtidak berurutan:

39 D1 7D 02 87 CA

Berikut ini adalah sintaks Intel yang dapat dibaca:

CMP ECX, EDX
JGE check
XCHG ECX, EDX

2

Retina 0.8.2 , 92 byte

\d+
$*
^(1{0,19},1{21}|(1{20,28}),11\2|1{29},1{30})$|^(1*,1{0,20}|(1{0,28}),1?\4)$|.+
$#1$#3

Cobalah online! Tautan termasuk kasus uji. Mengambil input dalam urutan menaik. Penjelasan: Tahap pertama hanya mengkonversi dari desimal ke unary sehingga skor dapat dibandingkan dengan benar. Tahap kedua berisi enam pola alternatif, dikelompokkan menjadi tiga kelompok sehingga tiga nilai berbeda dapat menjadi output, yang 10untuk menang, 01untuk yang sedang berlangsung dan 00untuk yang ilegal. Polanya adalah:

  • Terhadap 0-19, skor 21 adalah kemenangan
  • Terhadap 20-28, skor +2 adalah kemenangan
  • Terhadap 29, skor 30 adalah kemenangan
  • Terhadap setiap skor (lebih rendah), skor 0-20 sedang berlangsung
  • Terhadap skor hingga 28, skor +1 sedang berlangsung
  • Hal lain (termasuk skor negatif) adalah ilegal


1

Bash 4+, 97 89 91 88 byte

Asumsikan bahwa input sedang naik. Konsep yang digunakan dari jawaban VDM-SL . Cobalah Online
z==0 - game dalam proses
z==1- permainan selesai
z==2- tidak valid

-8 dengan pembersihan braket dari (( & | ))kondisi
+2 memperbaiki bug, terima kasih kepada Kevin Cruijssen
-3 peningkatan logika oleh Kevin Cruijssen

i=$1 j=$2 z=0
((j-i>2&j>21|i<0|i>29|j>30?z=2:0))
((z<1&(j>20&j-i>1|j>29)?z=1:0))
echo $z

1
Versi 89 byte Anda tampaknya untuk keluaran, 1bukan 2untuk 0 30. Versi 97 byte Anda berfungsi dengan benar, jadi jika Anda tidak dapat memperbaikinya, Anda selalu dapat mengembalikannya. Terpilih untuk versi 97 itu. :)
Kevin Cruijssen


1
Saya memperbaikinya, tetapi milik Anda lebih baik! Sulit untuk mengikuti: P
roblogic

Bug di 29 30:( harus "selesai"
roblogic

1
Ah oops .. i>29harus berada j>29di terner kedua untuk memperbaikinya.
Kevin Cruijssen
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.