Geçerli Badminton Skoru?


27

Giriş:

Şu anda sadece bir tane badminton ile ilgili zorluk olduğunu gördüm . Kendimi badminton oynadığımdan (son 13 yıldır), bazı badminton ile ilgili zorlukları ekleyeceğimi düşündüm. İşte ilki:

Meydan okuma:

Girdi: İki tam sayı
Çıktı: Seçtiğiniz üç ayrı ve benzersiz çıktıdan biri. Girişin geçerli bir badminton skoru olduğunu belirten ve AND kümesinin galibi ile sona erdiğini; girişin geçerli bir badminton skoru olduğunu belirten ve AND set hala oyunda olduğunu; girişi gösteren geçerli bir badminton puanı değil.

Badminton ile, her iki (çift) oyuncu 0 puanla başlar ve iki (çift) oyuncudan birinin skoru 21, en az 2 puan farkla maksimum 30-29'a ulaştığında durursunuz.

Bu yüzden bunların hepsi geçerli bir girdi çiftidir (her iki sırada da) geçerli bir badminton puanı olduğunu gösterir ve set sona erdi:

[[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]]

Ve bunların hepsi olası giriş çiftleridir (her iki sırada da), geçerli bir badminton skoru olduğunu belirtirler, ancak set hala oyundadır:

[[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]]

Başka bir tamsayı çifti geçersiz bir badminton puanı olabilir.

Meydan okuma kuralları:

  • G / Ç esnektir, bu nedenle:
    • Girişi iki sayının listesi olarak alabilirsiniz; STDIN veya fonksiyon parametreleri ile iki ayrılmış sayı; iki dizi; vb.
    • Çıktı, kendi seçtiğiniz üç ayrı ve benzersiz değer olacaktır. Tamsayılar (yani olabilir [0,1,2], [1,2,3], [-1,0,1]vs.); Booleanlar olabilir (yani [true,false,undefined/null/empty]); karakter / karakter olabilir (yani ["valid & ended","valid","invalid"]); vb.
    • Lütfen cevabınızda kullandığınız G / Ç'yi belirtin!
  • Önceden sipariş verilen giriş tam sayılarını en düşükten en yükseğe alabilir veya tam tersini yapabilirsiniz.
  • Giriş tamsayıları negatif olabilir, bu durumda elbette geçersizdirler.

Genel kurallar:

  • Bu , bayt cinsinden en kısa cevap kazanır.
    Code-golf dillerinin, codegolfing olmayan dillerle cevap göndermekten vazgeçmesine izin vermeyin. Herhangi bir programlama dili için mümkün olduğunca kısa bir cevap bulmaya çalışın.
  • Standart G / Ç kurallarına cevabınız için standart kurallar geçerlidir , bu nedenle STDIN / STDOUT işlevlerini, uygun parametreleri içeren fonksiyonlar / yöntemleri ve dönüş tipini, tam programları kullanmanıza izin verilir. Senin çağrı.
  • Varsayılan Loopholes yasaktır.
  • Mümkünse, lütfen kodunuzu test eden bir bağlantı ekleyin (ör. TIO ).
  • Ayrıca, cevabınız için bir açıklama eklemek şiddetle tavsiye edilir.

Test durumları:

Bu test durumları geçerlidir ve set sona ermiştir:

0 21
12 21
21 23
28 30
29 30

Bu test durumları geçerlidir, ancak set hala oyundadır:

0 0
0 20
12 12
21 21
21 22

Bu test durumları geçersiz:

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

Yanıtlar:


1

Stax , 20 bayt

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

Koş ve hata ayıkla

Örneklerle aynı biçimde girdi alır. 0geçerli bir kazanan olduğu anlamına gelir. 1oyunun devam ettiği anlamına gelir. -1geçersiz puan anlamına gelir.

Sahte kodda, sıralı girişler xve yalgoritma

sign(clamp(x + 2, 21, 30) - y) | (x < 0 || x >= 30 ? 0 : -1)
  • signanlamına gelir sayısal bir işaret ( -1, 0ya da 1)
  • clamp ilk argümanını belirtilen yarı-açık aralığa zorlar

6

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

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

Çevrimiçi deneyin!

Önceden sipariş edilen girişi alır a,b.

İade -2, -1, 0için ended, in play, invalid.

-1 bayt, Kevin Cruijssen sayesinde


Sol kısım ( b-61<~a<a>b/22*b-3) bir geçerlilik kontrolüdür ve sağ kısım ( 19<b-(b<30)>a) oyun sona eren bir kontroldür.


6

Python 2 , 47 bayt

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

Çevrimiçi deneyin!

İki Booleanın bir listesini çıkarır. Sayesinde TFeld bir test paketi yazmak için verdikleri yanıta kolay benim çözüm kontrol etmek yaptı.

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

Temel fikir, geçerli bir puanın, oyunun bittiği durumda, eğer yüksek değeri arttırmak eğer bpuanı geçersiz kılarsa, oyunu sonlandırır . Dolayısıyla, geçerlilik koşulunu kodlarız ve oyunun bitip bitmediğini görmek için (a,b+1)ek olarak kontrol ederiz (a,b).

Geçerlilik, birlikte zincirlenmiş üç koşulla kontrol edilir:

  • b<3+max(19,a): Yüksek puanın bgeçmiş b<=21veya kazanan ile olmadığını veya b<=a+2iki ile kazandığını kontrol eder.
  • 60-a>b: Eşdeğer a+b<=59, puanın yukarıda olmadığından emin olmak(29,30)
  • 61>60-a: Eşdeğer a>=0, düşük puanın negatif olmamasını sağlar

Python 2,44 bayt

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

Çevrimiçi deneyin!

TFeld tarafından geliştirilmiş bir geçerlilik kontrolü 3 bayttan tasarruf sağlar. Ana fikir "mesai" konulu dalına olan b>21ile b/22*bben kollara etmişti oysa etkili sıfıra aşağıda-21 puanlarını belirleyen a>19artık sahip max(19,a).


Python 2 , 43 bayt

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

Çevrimiçi deneyin!

Çıktılar:

ended: 0
going: -1
invalid: 1

Girişlerin altında olmadığını varsayar .299


1
En yeni geçerlilik kontrolümü ( b-61<~a<a>b/22*b-3) kullanarak 3 bayt kaydedebilirsiniz.
TFeld

1
İkinci çözümünüzü tüm girdiler için çalışması için +1 bayt:lambda a,b:-(a<0)|cmp(2+max(19,a)%30-a/29,b)
TFeld

4

JavaScript (ES6),  55 53  48 bayt

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

Çevrimiçi deneyin!



4

Jöle , 25 bayt

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

Çevrimiçi deneyin!

Sol argüman: minimum. Doğru argüman: maksimum.
Geçersiz: 0. Devam eden: 1. Sona erdi: 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]

Açıklama:

»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 bayt

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

Bu işlev, artan sırada sıralanan puanları alır ve puan geçersizse boş kümeyi veya kümenin tamamlanıp tamamlanmadığını içeren kümeyi döndürür (küme eksiksiz ve geçerliyse {true} ve küme eksikse {false} ve geçerli)

Çalıştırmak için tam bir program şöyle görünebilir:

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

Açıklama:

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 bayt

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

Çevrimiçi deneyin!

Sırasıyla , geçersiz oyunlar ve s ve geçerli devam eden oyunlar ve geçerli bitmiş oyunlar için Objectolanı döndürür . İlk önce daha yüksek puanla sipariş edilen (ve körilenmiş) puanı alır.Integer 0Booleantruefalse

-2 bytesmaç sonu kontrolünü ters çevirerek.
-11 byteskörleştirerek, bitsel operatörleri kullanarak ve bazı geri dönüş tipi otomatik boks hilelerini kullanarak - @KevinCruijssen sayesinde

Ungolfed

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 bayt SBCS

Sona erme 2, devam eden 1, geçersiz 0 olan infix tacit işlevi, daha küçük ve daha büyük skorlar bırakılır.

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

Çevrimiçi deneyin!

Uygular Erik Outgolfer en matematiksel formüller halinde bir araya

X:=min(max(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,max(20,1+x)))])

ve doğrudan APL'ye çevrilmiş (bu kesinlikle doğru bir ilişkiseldir, bu nedenle bazı parantezlerden kaçınırız):

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

Bu sadece ikame edilmesiyle bir zımni fonksiyonu haline dönüştürülebilir için ve için iki değişken yerine sol ve sağ argümanlar simgeleyen:xy

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

Şimdi eşdeğerdir herhangi infix fonksiyonu için biz basitleştirmek böylece,

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

bu bizim çözümümüz; (,≡30 31|,)×(⊢<2+X)×1+⊢>X←29⌊20⌈1+⊣:

 sol argüman;  bir artı bu;  maksimum 20 ve bu;  en az 29;  ata ;  doğru argüman daha büyük (0/1) ?;  ekle; ...  çarpın o aşağıdaki;  iki artı ;  , bundan daha az olan doğru argümandır (0/1); …  aşağıdakileri bununla çarpın;  argümanları birleştirir;  bu sayılara bölündüğünde kalanlar; x1 + x maks ( 20 , ) dak ( 29 , ) X : = [ y > ] 1 + ( ) × 2 + X [ y < ] ( ) ×
1+1+x
20⌈max(20,)
29⌊min(29,)
X←XX:=
⊢>[y>]
1+1+
(()×
2+XX2+X
⊢<[y<]
(()×
,(x,y)
30 31|mod(30,31)[ ( x , y ) = ]
,≡ bitiştirilmiş argümanlar bununla aynı mı (0/1)?; [(x,y)=]


3

x86 Meclisi, 42 Bayt

Girdi ECXve EDXkayıtları alır. Şundan ECXbüyük olması gerektiğini unutmayın EDX.
Çıkışlar içine EAXnerede, 0araç oyunu, hala var 1oyunu üzerinde olma ve temsil -1(aka FFFFFFFFgeçersiz puanı temsil eden).

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

Veya, Intel sözdiziminde daha okunaklı:

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

Eğlenceli bir gerçek: Bu fonksiyon neredeyse ben clobber zorunda haricinde kayıtlar korumak için hangi Sözleşme kurallarını çağrılması C izler EBXyığın kullanımı hakkında bazı bayt kaydedin.


İsteğe bağlı (bayt sayıma dahil değildir)

Yukarıdaki kodun başlamasından hemen önce aşağıdaki 6 baytı ekleyerek, iletebilir ECXve EDXsırasız bırakabilirsiniz :

39 D1 7D 02 87 CA

Okunabilir Intel sözdizimi aşağıdaki gibidir:

CMP ECX, EDX
JGE check
XCHG ECX, EDX

2

Retina 0.8.2 , 92 bayt

\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

Çevrimiçi deneyin! Link, test durumlarını içerir. Artan sırada girdi alır. Açıklama: İlk aşama, skorların düzgün bir şekilde karşılaştırılabilmesi için ondalıktan birime dönüşür. İkinci aşama, üç gruba ayrılan altı alternatif örüntü içerir, böylece 10kazanma, 01devam etme ve 00yasadışı için üç ayrı değer elde edilebilir . Desenler şunlardır:

  • 0-19'a karşı 21 puan kazanıyor
  • 20-28'e karşı, +2 puanı kazanır
  • 29'a karşı 30 puan kazanıyor
  • Herhangi bir (düşük) puan karşısında, 0-20 puan devam ediyor
  • 28 puana karşı, +1 puanı devam ediyor
  • Başka bir şey (negatif puanlar dahil) yasaktır


1

Bash 4+, 97 89 91 88 bayt

Girdilerin yükseldiğini varsayın. VDM-SL cevabından kullanılan kavramlar . Çevrimiçi Deneyin
z==0 - oyun devam ediyor
z==1- oyun tamamlandı
z==2- geçersiz

-8 braket temizleme ile (( & | ))koşulları
+ 2 , bir hata düzeltme Kevin Cruijssen sayesinde
-3 Kevin Cruijssen lojik gelişmeler

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
Sizin 89 bayt sürümü çıktı görünüyor 1yerine 2için 0 30. 97 baytlık sürümünüz düzgün çalışıyordu, bu yüzden düzeltemiyorsanız, geri alabilirsiniz. Bu 97 sürümü için oy verildi. :)
Kevin Cruijssen


1
Düzeltdim ama seninki daha iyiydi!
Tutulması

Hata 29 30:( "tamamlandı" olmalı
roblogic

1
Ayy Ah .. i>29olmalı j>29bunu düzeltmek için ikinci üçlü içinde.
Kevin Cruijssen
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.