Оцінка ножиць-папір


70

З урахуванням двох рядкових входів "Rock", "Paper" або "Scissors", визначте результат раунду RPS . Вихід 1, якщо виграє перший гравець, -1 якщо виграє другий гравець, або 0 за нічию.

Rock Rock -> 0
Rock Paper -> -1
Rock Scissors -> 1
Paper Rock -> 1
Paper Paper -> 0
Paper Scissors -> -1
Scissors Rock -> -1
Scissors Paper -> 1
Scissors Scissors -> 0

Ви повинні використовувати точні рядки "Рок", "Папір" та "Ножиці" в якості входів. Ви можете вибрати, чи (послідовно) вибір першого гравця дається першому чи другому. Ви також можете прийняти їх як єдиний вхід з одно символьним або порожнім роздільником. Введення гарантується одним із 9 можливих пар з трьох варіантів у вашому форматі введення.

Вихід повинен бути числом 1, 0 або -1, або його рядкове подання. Поплавці прекрасні. Так є +1, +0,і -0.

Пов'язане: Кодування гри RPS


Табло:


Чи означає один вхід з порожнім роздільником, наприклад, "rockpaper"?
Емінья

1
@Emigna Так, але з великої літери RockPaper.
xnor

15
Це було НАЙКРАЩО веселіше, ніж я передбачав, мій пане, є кілька цікавих способів зробити це.
Чарівний восьминіг Урна

Чи може вхід бути масивом двох рядків?
Луїс Мендо

@LuisMendo Так.
xnor

Відповіді:


73

Гроовий, 67 56 50 байт

{a,b->Math.sin(1.3*((int)b[0]-(int)a[0])).round()}

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

Виявляється, гра в скелі, папір, ножиці має досить класну властивість.
Враховуючи рядки a і b, візьміть першу літеру кожного, це призводить до двох з наступних:R,P,S

Вичерпний список можливих значень (Коли поєднано 2 варіанти):

XX=ASCII=Y=Wanted output
RR=82-82=0=0
PP=80-80=0=0
SS=83-83=0=0
RS=82-83=-1=1
RP=82-80=2=-1
PS=80-83=-3=-1
PR=80-82=-2=1
SR=83-82=1=-1
SP=83-80=3=1

Реорганізація списку для:

-3->-1
-2->1
-1->1
0->0
1->-1
2->-1
3->1

Дає нам послідовність, яка виглядає навпаки синусоїдально, і ви можете насправді представити цю формулу приблизно (і, приблизно, я маю на увазі лише ледве достатньо для роботи, ви можете отримати рівняння, яке мертве, але коштує більше байтів):

-sin((4*a[0]-b[0])/PI).roundNearest() = sin(1.3*(b[0]-a[0])).roundNearest()

Спрощення 4 / pi до 1.3 було запропоновано спочатку @flawr, а потім перевірено @titus на загальну економію 6 байт.

Пояснення рівняння

Використовуючи властивості подвійного заокруглення groovy, це призводить до правильного виходу ножиць-папір.


05AB1E , 10 байт (не змагається)

Ç¥13T/*.½ò

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

Таку ж відповідь, поданий до 05AB1E, використовуючи нові команди, додано 26.10.2017.


3
Чи не могли б ви зробити його коротше, використовуючи , що -sin(x) = sin(-x)це означає, що тільки зміна порядку aі bта опускаючи провідний -? Крім цього, жорстке кодування наближення 4/Piподібного 1.273може бути достатнім, 1.3або 9/7або 5/4.
flawr

2
PS: Я також пропоную зробити посилання, щоб спробувати його в Інтернеті, щоб такі люди, як я, могли пограти з вашим поданням =)
недолік

3
sin(b-a)Замість цього можна зберегти 1 байт -sin(a-b). Чудова знахідка!
Тит

2
Збережіть ще 7 байт шляхом множення на, 1.3а не на 4/Math.PI; це досить точно.
Тит

1
@carusocomputingXX=ASCII=Y=Wanted output RR=82-82=0=0 PP=83-83=0=0 SS=80-80=0=0
CraigR8806

44

C, 50 35 байт

#define f(i)*(short*)(i+7)%51%4%3-1

Телефонуйте fза допомогою рядка, що містить обох гравців, без роздільника, і він повернеться, чи виграє перший.

Пояснення:

Переглянувши дев'ять можливих рядків, виявляється, що букви пар на стовпцях 7 і 8 є унікальними:

       vv
RockPaper
PaperScissors
ScissorsRock
RockRock         // Sneakily taking advantage of the terminating zero
PaperPaper
ScissorsScissors
RockScissors
PaperRock
ScissorsPaper
       ^^

Зсув і дикун призначається для short*отримання цих літерних пар та інтерпретації їх як цифри:

29285
29545
21107
107
25968
21363
29555
27491
20595

Тоді було вирішено знайти грубі сили 51та 4залишки, які застосовані послідовно зменшують ці числа до:

3 0 0 1 1 1 2 2 2

Що просто ідеально підходить до чергового залишку в кінці та компенсації результату.

Побачити його в прямому ефірі на Коліру


Просто не робіть нічого подібного -f(i)до обчислення, щоб обчислити рахунок іншого гравця - результат буде несподіваним результатом!
nneonneo

4
@nneonneo -(f(i))повинен добре працювати. Макроси - це весело!
nwp

18

MATLAB / Octave , 63 54 52 байти

Дуже зручно, що ASCII-коди перших літер Rock,Paper,Scissorsє R=82,P=80,S=83. Якщо відняти, 79ми отримаємо зручно 3,1,4, яке ми будемо використовувати зараз як матричні індекси: Тут 4x4-матриця є жорстким кодом, де i,j-та запис відповідає результату, якщо ви підключите значення безпосередньо раніше:

     1   2   3   4
  +---------------
1 |  0   0   1  -1
2 |  0   0   0   0
3 | -1   0   0   1
4 |  1   0  -1   0
A(5,5)=0;A(4:7:18)=1;A=A-A';@(x,y)A(x(1)-79,y(1)-79)

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


16

Чистий Баш, 31 рік

Формула позики @ Денніса :

a=$1$1$2
echo $[(${#a}^67)%3-1]

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


Попередня відповідь:

Чистий Баш, 43 35

echo $[(7+(${#2}^3)-(${#1}^3))%3-1]
  • Отримати довжину рядка кожного Arg ( 4, 5, 8відповідно , для Rock, Paper, Scissors)
  • Виключає кожен з 3 , щоб дати 7, 6, 11(який при прийомі мод 3 дають 1, 0, 2)

  • Потім відніміть і згадайте мод 3, щоб отримати бажаний результат.

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


15

Пітон , 40 30 байт

lambda x,y:(len(2*x+y)^67)%3-1

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

Фон

Я почав з шаблону функцій

lambda x,y:(len(a*x+b*y)^c)%d-e

і здійснив грубу силу пошуку відповідних параметрів за допомогою наступної програми, а потім вибрав один з мінімальною довжиною реалізації.

RPS = 'Rock Paper Scissors'.split()
g = lambda x,y:2-(94>>len(6*x+y)%7)%4
r = range(1,10)
R = range(100)

def f(a, b, c, d, e):
    h = lambda x,y:(len(a*x+b*y)^c)%d-e
    return all(g(x, y) == h(x, y) for x in RPS for y in RPS)

[
    print('%2d ' * 5 % (a, b, c, d, e))
    for e in r
    for d in r
    for c in R
    for b in r
    for a in r
    if f(a, b, c, d, e)
]

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


14

Математика, 32 байти

Mod[{1,-1}.(Length/@#-3)!,3,-1]&

Безіменна функція, яка приймає впорядковану пару списків символів, наприклад {{"R","o","c","k"},{"P","a","p","e","r"}}, та повертається -1|0|1.

Я хотів, щоб код уникав не тільки трьох вхідних слів, але і занадто довгу назву функції ToCharacterCode; тому я працював із довжиною 4,5,8введених слів замість цього і шукав коротку функцію тих довжин, які давали чіткі відповіді по модулю 3. (Ціле ділення на 2 є математично перспективним, але ці функції мають занадто довгі імена в Mathematica.)

Виявляється, беручи факториал (довжина - 3) дає відповіді 1,2,120, які є 1,-1,0модулем 3. Тоді ми просто обчислюємо, модуль 3, різницю двох значень (через крапковий добуток {1,-1}.{x,y} = x-y, що є хорошим способом, коли два значення є у списку).


1
"Виходить ..." Ви маєте око на ці речі
ngenisis

12

Рубі, 36 35 30 байт

a=->a,b{(a+b)[12]?a<=>b:b<=>a}

Спробуйте це на ideone.com

Тестовий вихід:

a=->a,b{(a+b)[12]?a<=>b:b<=>a}

puts a.call("Rock", "Rock")
puts a.call("Rock", "Paper")
puts a.call("Rock", "Scissors")
puts a.call("Paper", "Rock")
puts a.call("Paper", "Paper")
puts a.call("Paper", "Scissors")
puts a.call("Scissors", "Rock")
puts a.call("Scissors", "Paper")
puts a.call("Scissors", "Scissors")

0
-1
1
1
0
-1
-1
1
0

Користується тим, що 7 з 9 правильних результатів генеруються лише шляхом лексикографічного порівняння з використанням оператора космічного корабля <=>. (a+b)[12]Просто перевертає вхідні дані для порівняння , якщо входи Paperі Scissors(а також Scissors Scissors- але це 0або навпаки).

Завдяки Хорвату Давідові за те, що врятував мене персонажа, та завдяки ГБ, що врятував мене ще 5.


Ви можете використовувати анонімну лямбда та зберегти 2 символи.
ГБ

@GB Якщо я не даю ім'я функції, як я повинен її називати? Це присмаки до мене обману. Але спасибі за іншу пораду - я переглянув це, але відхилив його, тому що ScissorsScissors - 16, але я бачу, що насправді це не має значення. :-)
Гарет


@Dennis Ви не можете його зателефонувати, не призначивши його. Мені здається, що мені підман і несправедливо ставитися до мов без анонімних функцій, які мають визначати ім’я.
Гарет

Звичайно, ти можеш. tio.run/nexus/…
Денніс

10

Python , 39 36 34 33 байт

lambda x,y:2-(94>>len(6*x+y)%7)%4

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

Як це працює

Давайте розглянемо кілька значень довжини шести копій x та однієї копії y modulo 7 .

                                l(x,y) =:
x        y        len(x) len(y) len(6*x+y)%7
--------------------------------------------
Rock     Rock          4      4            0
Rock     Paper         4      5            1
Rock     Scissors      4      8            4
Paper    Rock          5      4            6
Paper    Paper         5      5            0
Paper    Scissors      5      8            3
Scissors Rock          8      4            3
Scissors Paper         8      5            4
Scissors Scissors      8      8            0

Ми можемо кодувати результати ( {-1, 0, 1} ), відобразивши їх у множину {0, 1, 2, 3} . Наприклад, відображення t ↦ 2 - t досягає цього і є власною оберненою.

Позначимо результат x і y через o (x, y) . Тоді:

x        y        l(x,y) o(x,y) 2-o(x,y) (2-o(x,y))<<l(x,y)
-----------------------------------------------------------
Rock     Rock          0      0        2                10₂
Rock     Paper         1     -1        3               110₂
Rock     Scissors      4      1        1            010000₂
Paper    Rock          6      1        1          01000000₂
Paper    Paper         0      0        2                10₂
Paper    Scissors      3     -1        3             11000₂
Scissors Rock          3     -1        3             11000₂
Scissors Paper         4      1        1            010000₂
Scissors Scissors      0      0        2                10₂

На щастя, біти в останніх стовпцях узгоджуються між собою, тому ми можемо АБО їх утворювати єдине ціле число n та отримувати o (x, y) як 2 - ((n ≫ o (x, y))% 4) . Значення n дорівнює 94 .


9

Сітківка , 35 31 байт

G`k P|r S|s R
*\)`.+
-
D`\w+
 .

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

Пояснення

Це працює в два етапи. Спочатку друкуємо знаки мінус для відповідних входів. Потім друкуємо а 0для краваток і 1інше.

G`k P|r S|s R
*\)`.+
-

Це два етапи. На )другому етапі вони об'єднують їх, *робить їх сухими (що означає, що вхідний рядок буде відновлено після їх обробки, але результат буде надрукований) і \пригнічує друк кінцевого рядкового каналу. Два етапи разом друкують, -якщо це можливо.

Перший етап є Gетапом Rep , який тільки тримає лінію , якщо вона містить або k P, r Sабо s R. Вони відповідають тим випадкам, коли нам потрібно вивести -1. Якщо це не один із таких випадків, вхід буде замінено порожнім рядком.

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

D`\w+
 .

Це ще два етапи. Перший етап - це Dвиховання. Він відповідає словам та видаляє дублікати. Тож якщо і лише якщо вхід є краваткою, це скидає друге слово.

Другий етап підраховує кількість збігів ., тобто пробіл, за яким слідує будь-який символ. Якщо введення було кращим, а друге слово було видалено, це призводить до 0. Інакше друге слово все ще стоїть на місці, і там одна відповідність, тому воно друкує 1замість цього.


Ось інший підхід, заснований на довжині вхідних рядків. Це довше, ніж у вас, але мені цікаво, чи не можна було би його в гольф?
Цифрова травма

@DigitalTrauma - це дійсно охайна ідея, але я не бачу нічого, щоб її скоротити. Я думаю, ви все одно повинні розмістити його (і якщо ви перемістите перший рядок у заголовок, тоді TIO не включить його до числа байтів).
Мартін Ендер

8

05AB1E , 18 17 15 10 9 байт

6 байтів, збережених за допомогою введення тривалості цифрової травми

€g3^Æ>3%<

Вводиться як " [SecondPlayersChoice,FirstPlayersChoice]

Спробуйте в Інтернеті! або підтвердити всі тестові випадки

Альтернативне 9-байтне рішення: íø¬ÇÆ>3%<

Пояснення

€g          # length of each in input
  3^        # xor 3
    Æ       # reduce by subtraction
     >      # increment
      3%    # modulus 3
        <   # decrement

Попереднє рішення 15 байт

A-D{„PSÊiR}Ç`.S

Спробуйте в Інтернеті! або підтвердити всі тестові випадки

Пояснення

 A-               # remove the lowercase alphabet from the input (leaves a 2 char string)
   D{             # sort a copy of the leftover
     „PSÊ         # check if the copy isn't "PS" (our special case)
         iR}      # if true, reverse the string to get the correct sign
            Ç`    # convert the two letters to their character codes
              .S  # compare their values

Ви побили мою веселу :( Ç¥13T/*.½òЧОМУ РОБОТИ? НІКОЛИ ЗНАЄ.
Чарівний восьминіг Урна

@MagicOctopusUrn: Ууу, це точно дивно. Яким був би формат введення, щоб він повернув int як вихід?
Емінья


@MagicOctopusUrn: О так, я забув про це. Моя улюблена відповідь на цей виклик :)
Emigna

6

Желе , 8 байт

L€Iµ-*×Ṡ

Спробуйте в Інтернеті! (тестовий набір, кидає ціле число для ясності)

Як це працює

L€Iµ-*×Ṡ  Main link. Argument: A (string array)

L€        Take the length of each string.
  I       Increments; compute the forward difference of the length.
   µ      Begin a new chain with the difference d as argument.
    -*    Compute (-1)**d.
      ×Ṡ  Multiply the result with the sign of d.

6

Python 2 , 46 40 байт

lambda x,y:+(x!=y,-1)[x[0]+y[0]in'RPSR']

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

Дякую @Dennis за те, що він дозволив мені запозичити його Спробуйте його онлайн-тестовий код та заощадив мені 6 байт.

Редагувати

@ hashcode55 - Приблизно так само, як ви описуєте. (x! = y, -1) - це послідовність двох елементів, і [x [0] + y [0] в 'RPSR'] обчислює, який елемент взяти. Якщо перша буква x + перша буква y знаходиться в списку символів, то вона буде оцінена до True або 1, тому (x! = Y, -1) [1] буде повернуто. Якщо це не тоді (x! = Y, -1) [0]. Ось де це стає трохи хитро. Перший елемент сам по собі фактично інший, якщо. Якщо x! = Y, то перший елемент буде True, інакше він буде False, якщо x [0] + y [0] in'RPSR 'false, то і True, і False повертаються залежно від того, x == y. + Трохи підлий і ще раз дякує @Dennis за цей. X! = Y поверне буквальне значення True чи False. Нам потрібно 1 або 0. Я досі не знаю як, але + робить це перетворення. Я можу лише припустити, що, використовуючи математичний оператор на True / False, він змушує його розглядатися як цілочисельний еквівалент. Очевидно, що + перед -1 все одно повернеться -1.

Сподіваюся, це допомагає!


Привіт! Скажіть, будь ласка, як працює цей синтаксис? За логічним відгадуванням, (x!=y,-1)це працює так, як якщо, якщо список генерує справжній, то -1 інший x!=y. Для чого використовується цей +знак? Джерело, що документує такий синтаксис, було б дуже корисно!
хеш-код55

@ hashcode55 - я додав пояснення до своєї відповіді.
ElPedro

Щоб відповісти на вашу невизначеність щодо +- у цьому випадку це одинарний плюс, як +10, і по суті це короткий спосіб перетворення в ціле число.
FlipTack

Дякуємо @FlipTack Kinda здогадалась, що це робить, але дякує за належне пояснення.
ElPedro

@ElPedro Дякую велике! Це дійсно мені допомогло.
хеш-код55

5

JavaScript (ES6), 46 38 байт

(a,b)=>(4+!b[4]+!b[5]-!a[4]-!a[5])%3-1

Використовує той факт, що ножиці Rock-Paper ножиці мають циклічний характер. JavaScript не має ні космічного корабля, ні збалансованих потрійних операторів, інакше відповідь буде (a,b)=>((b<=>'Rock')-(a<=>'Rock'))%%3.

Редагувати: Збережено 8 байт завдяки @WashingtonGuedes.


1
@WashingtonGuedes Я можу зробити навіть краще, ніж це!
Ніл

Ви можете каррі, щоб зберегти 1 байт
MayorMonty

Я намагався запустити його і завжди повертати 0
Vitim.us

5

MATL , 14 13 байт

TTt_0vic1Z)d)

Спробуйте в Інтернеті! Або перевірити всі тестові випадки .

Пояснення

Якщо ASCII-код початкової літери першого рядка відняти від значення другого рядка, то отримаємо значення у стовпці D нижче. Беручи за модулю 5 дає значення М . Кінцеве значення в дужках бажаний результат, R .

                        D        M     R
                       ---      ---   ---
Rock Rock          ->   0   ->   0   ( 0) 
Rock Paper         ->  −2   ->   3   (−1)
Rock Scissors      ->   1   ->   1   ( 1)
Paper Rock         ->   2   ->   2   ( 1)
Paper Paper        ->   0   ->   0   ( 0)
Paper Scissors     ->   3   ->   3   (−1)
Scissors Rock      ->  −1   ->   4   (−1)
Scissors Paper     ->  −3   ->   2   ( 1)
Scissors Scissors  ->   0   ->   0   ( 0)

Таким чином, якщо ми обчислимо D, а потім M , для отримання R нам потрібно лише зіставити 0 до 0; 1 і 2 до 1; 3 і 4 до -1. Це можна зробити шляхом індексації в масив з п'яти записів, рівний 0, 1 або −1. Оскільки індексація в MATL заснована на 1 та модульній основі, масив повинен бути [1, 1, −1, −1, 0](перший запис має індекс 1, останній має індекс 5 або еквівалентно 0). Нарешті, операції modulo 5, на щастя, можна уникнути, оскільки вона неявно здійснюється модульним індексуванням.

TT     % Push [1 1]
t_     % Duplicate, negate: pushes [−1 −1]
0      % Push 0
v      % Concatenate vertically into the 5×1 array [1; 1; −1; −1; 0]
i      % Input cell array of strings
c      % Convert to 2D char array, right-padding with zeros if necessary
1Z)    % Take the first column. Gives a 2×1 array of the initial letters
d      % Difference
)      % Index into array. Implicit display

5

CJam , 12 байт

0XXWW]rcrc-=

Два входи розділені пробілом. Їх порядок змінено щодо цього в тексті виклику.

Спробуйте в Інтернеті! Або перевірити всі тестові випадки .

Пояснення

Переклад моєї відповіді MATL . Це використовує той факт, що в CJam c(перетвореному в char) застосований на рядку перший характер. Також масив для відображення відрізняється тим, що індексація в CJam базується на 0.

0XXWW    e# Push 0, 1, 1, -1, -1
]        e# Pack into an array
rc       e# Read whitespace-separated token as a string, and take its first char
rc       e# Again
-        e# Subtract code points of characters
=        e# Index into array. Implicitly display

5

CJam, 15 14 12 байт

rW=rW=-J+3%(

Візьміть код ascii останнього символу кожного рядка, а потім поверне:

(a1 - a2 + 19) % 3 - 1

Перевірте це тут !



4

Java 7, 82 байти

int c(String...a){int x=(a[0].charAt(1)-a[1].charAt(1))%5/2;return x%2==x?x:x/-2;}

Безголівки:

int c(String... a){
   int x = (a[0].charAt(1) - a[1].charAt(1)) % 5 / 2;
   return x%2 == x
           ? x
           : x / -2;
}

Пояснення:

  • Другі букви o, aі c, з ASCII знаків після коми 111, 97і 99.
  • Якщо ми віднімаємо їх один від одного для тестових випадків, ми отримуємо такі результати:
    • 0 (Рок, Рок)
    • 14 (Рок, папір)
    • 12 (Папір, Ножиці)
    • -14 (Папір, Рок)
    • 0 (Папір, папір)
    • -2 (Папір, Ножиці)
    • -2 (Ножиці, Скеля)
    • 2 (Ножиці, папір)
    • 0 (Ножиці, Ножиці)
  • Якщо взяти по модулю 5 для кожного, ми отримуємо 4, 2, -4, -2, -2, 2.
  • xТепер для тестових випадків поділено на 2 :
    • x = 0 (рок, рок)
    • x = 2 (рок, папір)
    • x = 1 (папір, ножиці)
    • x = -2 (папір, рок)
    • x = 0 (папір, папір)
    • x = -1 (папір, ножиці)
    • x = -1 (ножиці, скеля)
    • x = 1 (ножиці, папір)
    • x = 0 (ножиці, ножиці)
  • Тільки те 2і -2є невірними, і мали бути -1і 1замість цього. Отже, якщо x%2 != x(все вище 1чи нижче -1) ми розділимо їх, -2щоб виправити ці два "крайові випадки".

Код тесту:

Спробуйте тут.

class M{
  static int c(String...a){int x=(a[0].charAt(1)-a[1].charAt(1))%5/2;return x%2==x?x:x/-2;}

  public static void main(String[] a){
    String R = "Rock",
           P = "Paper",
           S = "Scissors";
    System.out.println(c(R, R)); // 0
    System.out.println(c(R, P)); // -1
    System.out.println(c(R, S)); // 1
    System.out.println(c(P, R)); // 1
    System.out.println(c(P, P)); // 0
    System.out.println(c(P, S)); // -1
    System.out.println(c(S, R)); // -1
    System.out.println(c(S, P)); // 1
    System.out.println(c(S, S)); // 0
  }
}

Вихід:

0
-1
1
1
0
-1
-1
1
0

Чому другий лист з цікавості? У мене був такий самий підхід (якось), але я використав перший лист.
Чарівний восьминіг Урна

@carusocomputing Ну, я помітив, що більшість інших людей використовували або першу літеру, або довжину, і хотіли спробувати щось інше. Я вперше використовував треті літери ( c, p, i) зі значеннями ASCII 99, 112і 105, як здавалося , найбільш корисними, і зауважив , що це стало б 4, 2, 0 , якщо я зробив по модулю 5. Тільки тоді я зрозумів , я повинен був відняти як, так 4, 2 і 0 не мали великої користі. Після декількох непорозумінь навколо / проб і помилок я спробував другий лист і отримував більш корисні результати з тим самим модулем 5, який все ще присутній. Тоді я швидко прийшов до рішення, яке я представив вище. :)
Кевін Кройсейсен

@carusocomputing Хотіла спробувати унікальний підхід, і вважаючи, що я досить погана в таких рішеннях, вона не така коротка, як деякі інші рішення, але все ж унікальна (що була моєю початковою метою). :)
Кевін Круїссен

4

постійний струм, 18

1?Z9+2/rZ1+2/-3%-p

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

Зауважте, що два аргументи передаються (розділені пробілом) на одній лінії до STDIN. Арги містяться у квадратних дужках, так [ ]як це dcподобається його рядкам.

dcмає дуже обмежену обробку струн, але виявляється, що ви можете зробити Zкоманду, щоб отримати довжину рядка, яка, на щастя, відрізняється від "Rock", "Paper" та "Scissors", і може бути досить просто арифметично маніпулюють, щоб дати бажаний результат.



3

Піта, 16

t%+7h.+mx3ldQ3

Можливо, може бути і коротшим.

        x3ld      # lambda to get string length then XOR with 3
       m    Q     # map over the input (array of 2 strings)
     .+           # difference of the two results
    h             # flatten one-element array
  +7              # add 7
 %           3    # mod 3
t                 # subtract 1 and implicit print

Інтернет .


3

C #, 85 84 байт

Збережено 1 байт, завдяки TheLethalCoder

a=>b=>a==b?0:(a[0]=='R'&b[0]=='S')|(a[0]=='P'&b[0]=='R')|(a[0]=='S'&b[0]=='P')?1:-1;

Він приймає два рядки як вхідні дані і виводить ціле число. Існує нічия, якщо дві струни рівні, інакше вона перевіряє на перший характер струн, щоб визначити, який гравець виграє.


Збережіть один байт, використовуючи a=>b=>...
currying,

3

JavaScript, 37 , 32 , 31 байт

a=>b=>a==b?0:!(a+b)[12]^a>b||-1

Якщо дорівнює b, вивести нуль.

В іншому випадку, xor результат перевірки, якщо довжина не більше 12 (порівняння ножиць і паперу) з порівнянням більше b.
Якщо це поверне 1, поверніть його.

Якщо він повертає 0, використовуйте оператор АБО для заміни -1.


Не могли б ви записати це як функцію curried, a=>b=>щоб зберегти байт?
FlipTack

Так. Дякую @FlipTack
Grax32

2

Пакетна, 116 байт

@if %1==%2 echo 0&exit/b
@for %%a in (RockScissors PaperRock ScissorsPaper)do @if %%a==%1%2 echo 1&exit/b
@echo -1

2

Perl, 33 байти

32 байти коду + -pпрапор.

$_=/(.+) \1/?0:-/k P|r S|s R/||1

Щоб запустити його:

perl -pe '$_=/(.+) \1/?0:-/k P|r S|s R/||1' <<< "Rock Paper"

Збережені 3 байта, використовуючи регулярний вираз Retina Мартіна Ендер відповіді . (мій попередній регекс був /R.*P|P.*S|S.*R/)

Пояснення:

По-перше, /(.+) \1/перевіряє, чи містить вхід два рази одне і те ж слово, якщо так, результат є 0. В іншому випадку /k P|r S|s R/розбирається у випадку, коли є відповідь -1. Якщо цей останній регулярний вираз помилковий, то -/k P|r S|s R/помилковий, тому ми повертаємось 1.


2

Желе , 9 байт

L€^3Iæ%1.

Для цього використовується алгоритм відповіді Bash @ DigitalTrauma .

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

Як це працює

L€^3Iæ%1.  Main link. Argument: A (string array)

L€         Take the length of each string.
  ^3       XOR the lengths bitwise with 3.
    I      Increments; compute the forward difference of both results.
     æ%1.  Balanced modulo 1.5; map the results into the interval (-1.5, 1.5].

Блін, я збирався почати читати на Jelly. Ну добре, ось воно в піті . +1.
Цифрова травма

2

Japt , 19 байт

-Ms(4*(Uc -Vc)/MP¹r

Спробуйте тут!

Натхненний рішенням carusocomputing

Старе 53-байтне рішення

W=Ug c X=Vg c W¥X?0:W¥82©X¥83?1:W¥80©X¥82?1:W¥83©X¥80?1:J

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

Ще раз дякую, ETHproductions!


1
Ви можете почати з використання ©замість &&, змінивши Ug0 cна Ug c(те саме V) і замінити -1на J. Це ще трохи довше, ніж відповідь JS, хоча, можливо, ви можете взяти з цього кілька ідей
ETHproductions

@ETHproductions Дякую! Я не знаю, як я забуваю про це©
Олівер

1
Насправді ви просто можете це зробити W=Uc. Я не знаю, чому я все забуваю, що cпрацює на будь-якому рядку: P
ETHproductions

2

PHP, 55 53 байти

<?=(3-(ord($argv[2])%6%4-ord($argv[1])%6%4+3)%3*2)%3;
  • приймає значення ascii перших літер (з аргументів командного рядка): 82,80,83
  • % 6: 4,2,5
  • % 4: 0,2,1
  • різниця (ба):
    • PS: 1-2, SR: 2-0, RP: 2-0 -> -1 або 2; + 3,% 3 -> 2
    • SP: 2-1, RS: 0-2, PR: 0-2 -> -2 або 1; + 3,% 3 -> 1
    • RR, PP, SS: 0; + 3,% 3: 0
  • (3-2 * х): -1,1,3
  • % 3: -1,1,0

версія синуса, 49 46 байт

<?=2*sin(1.3*(ord($argv[2])-ord($argv[1])))|0;

відповідь на гольф у відповідь Carusocomputing :

3 байти, збережені користувачем @ user59178


1
Для версії sine для можна зберегти 3 байти, замінивши round(x)на2*x^0
user59178

2

Perl, 25 байт

$_=/kS|rR|sP/-/kP|rS|sR/

Код 24 байти +1 байт для -p опції.

Вхід повинен бути на stdin без роздільників, наприклад:

echo PaperRock | perl -pe'$_=/kS|rR|sP/-/kP|rS|sR/'

Перший регулярний пошук шукає виграш першого гравця, другий - його втрату. Різниця друкується.


1

Скала, 148 байт

object R extends App{val t=Seq('R','P','S')
val(a,b)=(args(0)(0),args(1)(0))
print(if(a==b)0 else if(t.indexOf(a)%3==(t.indexOf(b)-1)%3)-1 else 1)}

На щастя, оскільки крапки з комою потрібні для розділення декількох команд на одному рядку, Scala виграє від того, щоб мати форматний код гольфу!

У цій спробі гольфу я дізнався, що можна замінити

"somestring".charAt(index) 

з

"somestring"(index) 

оскільки Scala дозволяє обробляти рядки як масиви з метою отримання символів.


Це може бути надзвичайно гольф. Для початку вам в більшості проблем тут дозволено виконувати функцію замість повної програми, тож замість всього об’єкта розширюється додаток і витягуючи з аргументів, спробуйте щось на зразок: def g (a: Seq, b: Seq) = ...
Ітан

Крім того, вам не потрібно друкувати значення. Повернення його достатньо, що чудово під час гольфу по Скалі, оскільки повернення безкоштовне. А ще можна вдосконалити її, скориставшись трюком у відповіді Гроови, який майже однаково працює у Scala.
Етан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.