Дійсна оцінка бадмінтону?


27

Вступ:

Я побачив, що зараз існує лише одна проблема, пов’язана з бадмінтоном . Оскільки я сам граю в бадмінтон (останні 13 років), я подумав, що додам деякі проблеми, пов'язані з бадмінтоном. Ось перший:

Виклик:

Введення: Два цілих числа
Вихід: Один з трьох різних та унікальних результатів на ваш власний вибір. Один вказує на те, що вхід - це дійсна оцінка бадмінтону І набір закінчився переможцем; один вказує на те, що вхід є дійсним бадмінтонним балом І набір все ще відтворюється; один із зазначень введення не є дійсним бадмінтоном.

У бадмінтоні обидва (пари) гравців починаються з 0 балів, і ви зупиняєтесь, коли один з двох (пар) гравців досяг бала 21, принаймні в 2 очки різниці, до максимуму 30-29.

Отже, це всі можливі пари введення (в будь-якому порядку), що вказує на те, що це дійсний бадмінтон і набір закінчився:

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

І це всі можливі пари введення (у будь-якому порядку), що вказує на те, що це дійсний бадмінтон, АЛЕ набір все ще в грі:

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

Будь-яка інша ціла пара буде недійсним бадмінтоном.

Правила виклику:

  • Введення / виведення є гнучким, тому:
    • Ви можете взяти вхід як список двох чисел; два відокремлених числа через STDIN або параметри функції; дві струни; тощо.
    • Вихідними даними будуть три чіткі та унікальні значення на ваш власний вибір. Може бути цілими числами (наприклад [0,1,2], [1,2,3], [-1,0,1]і т.д.); можуть бути булевими (тобто [true,false,undefined/null/empty]); можуть бути символи / рядки (тобто ["valid & ended","valid","invalid"]); тощо.
    • Вкажіть, будь ласка, введення-вивід, який ви використали у своїй відповіді!
  • Вам дозволяється приймати цілі введення, попередньо замовлені від найнижчих до найвищих, або навпаки.
  • Цілі числа введення можуть бути негативними, і в цьому випадку вони, звичайно, є недійсними.

Загальні правила:

  • Це , тому найкоротша відповідь у байтах виграє.
    Не дозволяйте мовам коду-гольфу відштовхувати вас від публікації відповідей з не кодовими гольф-мовами. Спробуйте придумати якомога коротшу відповідь на "будь-яку" мову програмування.
  • Для вашої відповіді застосовуються стандартні правила з правилами вводу / виводу за замовчуванням , тому вам дозволяється використовувати STDIN / STDOUT, функції / метод із відповідними параметрами та повним програмами типу повернення. Твій дзвінок.
  • Лазівки за замовчуванням заборонені.
  • Якщо можливо, додайте посилання з тестом для вашого коду (тобто TIO ).
  • Також настійно рекомендується додавати пояснення до своєї відповіді.

Тестові приклади:

Ці тестові випадки дійсні, і набір закінчився:

0 21
12 21
21 23
28 30
29 30

Ці тестові випадки дійсні, але набір все ще грає:

0 0
0 20
12 12
21 21
21 22

Ці тестові випадки є недійсними:

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

Відповіді:


1

Стакс , 20 байт

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

Запустіть і налагоджуйте його

Він приймає дані в тому ж форматі, що і приклади. 0означає, що є дійсний переможець. 1означає, що гра триває. -1означає недійсний бал.

У псевдокоді, із упорядкованими входами xта y, алгоритм є

sign(clamp(x + 2, 21, 30) - y) | (x < 0 || x >= 30 ? 0 : -1)
  • signозначає , числовий знак ( -1, 0або 1)
  • clamp змушує свій перший аргумент у вказаний напіввідкритий інтервал

6

Python 2 , 97 95 75 72 71 70 69 64 55 54 52 51 50 48 байт

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

Спробуйте в Інтернеті!

Вводиться як попереднє замовлення a,b.

Повертає -2, -1, 0для ended, in play, invalid.

-1 байт, завдяки Kevin Cruijssen


Ліва частина ( b-61<~a<a>b/22*b-3) - перевірка дійсності, а права частина ( 19<b-(b<30)>a) - перевірка закінченої гри.


6

Python 2 , 47 байт

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

Спробуйте в Інтернеті!

Виводить список двох булевих. Дякую TFeld, що написав тестовий набір у своїй відповіді, що полегшило перевірку мого рішення.

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

Ключове розуміння полягає в тому, що дійсний результат закінчується грою точно, якщо збільшення вищого значення bробить рахунок недійсним. Отже, ми просто кодуємо умову дійсності та перевіряємо її на (a,b+1)додаток, (a,b)щоб побачити, чи закінчилась гра.

Дійсність перевіряється за допомогою трьох умов, які пов'язані між собою:

  • b<3+max(19,a): Перевіряє, що вищий бал bне виграв минулого, з одним b<=21або b<=a+2(виграти двома)
  • 60-a>b: Еквівалентно тому a+b<=59, щоб оцінка не була вище(29,30)
  • 61>60-a: Еквівалентно a>=0, гарантує, що нижчий бал є негативним

Python 2 , 44 байти

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

Спробуйте в Інтернеті!

Покращена перевірка дійсності TFeld економить 3 байти. Основна ідея полягає в відділенні на «овертайм» b>21з b/22*bяким ефективно встановлює нижче 21 балів до нуля, в той час як я розгалуженого на a>19з тим довше max(19,a).


Python 2 , 43 байти

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

Спробуйте в Інтернеті!

Виходи:

ended: 0
going: -1
invalid: 1

Припускаємо, що вхідні дані не нижче299 .


1
Використовуючи мою останню перевірку дійсності ( b-61<~a<a>b/22*b-3), ви можете зберегти 3 байти.
TFeld

1
+1 байт, щоб ваше друге рішення працювало на всі входи:lambda a,b:-(a<0)|cmp(2+max(19,a)%30-a/29,b)
TFeld



4

Желе , 25 байт

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

Спробуйте в Інтернеті!

Лівий аргумент: мінімум. Правильний аргумент: максимум.
Invalid: 0. Поточна: 1. Завершено 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]

Пояснення:

»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 байт

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

Ця функція приймає впорядковані бали у порядку зростання і повертає порожній набір, якщо оцінка недійсна або набір, що містить, чи є комплект повним (так {true}, якщо набір повний і дійсний, і {false}, якщо набір неповний і дійсний)

Повна програма для запуску може виглядати приблизно так:

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

Пояснення:

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 байт

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

Спробуйте в Інтернеті!

Повертає an Object, що є Integer 0для недійсних ігор та Booleans trueта falseдля дійсних поточних ігор відповідно і для дійсно готових ігор відповідно. Приймає впорядкований (і зріс) бал, першим - більший бал.

-2 bytesшляхом інвертування чека на кінець матчу.
-11 bytesза допомогою currying, використання операцій з побітними операціями та деякою хитрістю автоматичного боксу повернення типу - завдяки @KevinCruijssen

Безумовно

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 байт SBCS

Функція мовчання Infix, у якій закінчено 2, триває 1, недійсна - 0, менші та великі бали залишаються.

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

Спробуйте в Інтернеті!

Реалізує математичні формули Ерік Outgolfer в поєднанні в

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

і перекладається безпосередньо в APL (що суто правильно асоціативно, тому ми уникаємо деяких дужок):

((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+

яке наше рішення; (,≡30 31|,)×(⊢<2+X)×1+⊢>X←29⌊20⌈1+⊣:

 лівий аргумент;  один плюс це;  максимум 20 і це;  мінімум 29 і це;  призначити це ;  чи правильний аргумент більший (0/1) ?;  додати один; ...  помножити наступне цим;  два плюс ;  - правильний аргумент, менший за цей (0/1); …  помножте наступне на це;  об'єднайте аргументи;  залишки, поділені на ці числа; x
1+1+x
20⌈max(20,)хв ( 29 , ) X : = [ y > ] 1 + ( ) × 2 + X [ y < ] ( ) × ( x , y )
29⌊min(29,)
X←XX:=
⊢>[y>]
1+1+
(()×
2+XX2+X
⊢<[y<]
(()×
,(x,y)
30 31|mod(30,31)
,≡ чи є ідентичні аргументовані аргументи (0/1) ?; [(x,y)=]


3

x86 Асамблея, 42 байти

Здійснює вхід ECXі EDXреєструє. Зауважте, що ECXповинно бути більше, ніж EDX.
Виводить EAXтуди, де 0означає, що гра все ще триває, що 1відображає гру, яка закінчилася, і -1(ака FFFFFFFF) представляє недійсний рахунок.

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

Або, більш читабельний у синтаксисі Intel:

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

Забавний факт: ця функція майже відповідає правилам Конвенції C Calling, згідно з якими зберігати регістри, за винятком того, що мені довелося клобувати, EBXщоб зберегти кілька байтів для використання стека.


Необов’язково (не включено до підрахунку байтів)

Додавши наступні 6 байтів безпосередньо перед запуском коду вище, ви можете пройти ECXі не EDXупорядковано:

39 D1 7D 02 87 CA

Що в читаному синтаксисі Intel є наступним:

CMP ECX, EDX
JGE check
XCHG ECX, EDX

2

Сітківка 0,8,2 , 92 байти

\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

Спробуйте в Інтернеті! Посилання включає тестові випадки. Приймає вхід у порядку зростання. Пояснення: Перший етап просто перетворюється з десяткових в одинарні, щоб бали можна було правильно порівняти. Другий етап містить шість альтернативних шаблонів, згрупованих у три групи, щоб можна було вивести три різних значення, які є 10виграшними, 01тривалими та 00незаконними. Шаблони:

  • Проти 0-19, рахунок 21 - це виграш
  • Проти 20-28 рахунок +2 - це виграш
  • Проти 29 оцінка 30 - це виграш
  • Проти будь-якого (нижчого) балу триває оцінка 0-20
  • Проти балів до 28 триває оцінка +1
  • Все інше (включаючи негативні бали) є незаконним


1

Bash 4+, 97 89 91 88 байт

Припустимо, що входи зростають. Використовувані поняття з відповіді VDM-SL . Спробуйте онлайн
z==0 - гра триває
z==1- гра завершена
z==2- недійсна

-8 шляхом очищення дужок від (( & | ))умов
+2 виправлення помилки, завдяки Kevin Cruijssen
-3 вдосконалення логіки Кевіна 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
Здається, ваша версія байтів на 89 балів 1 замість 2для 0 30. Ваша версія 97 байт працювала коректно, тому якщо ви не можете її виправити, ви завжди можете відкатати. Запропоновано для цієї версії 97. :)
Kevin Cruijssen


1
Я це виправив, але ваш був кращий! Важко йти в ногу: P
roblogic

Помилка за адресою 29 30:( вона має бути "завершена"
roblogic

1
Ах, ой, i>29має бутиj>29 у другому трійці, щоб це виправити.
Кевін Кройсейсен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.