var QUESTION_ID=106496,OVERRIDE_USER=20260;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/106496/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
RockPaper
.Odpowiedzi:
Groovy,
675650 bajtówWypróbuj online!
Okazuje się, że gra w kamień, papier, nożyczki ma całkiem fajną właściwość.
Biorąc pod uwagę ciągi a i b, weź pierwszą literę każdego z nich, to daje dwa z następujących:
R,P,S
Wyczerpująca lista możliwych wartości to (Po połączeniu 2 wyborów):
Reorganizacja listy w celu:
Daje nam sekwencję, która wygląda odwrotnie sinusoidalnie, i możesz faktycznie przedstawić tę formułę jako przybliżoną (a przez około mam na myśli zaledwie tyle, że wystarczy pracować, możesz uzyskać równanie, które jest martwe, ale kosztuje więcej bajtów):
Uproszczenie 4 / pi do 1.3 zostało najpierw zasugerowane przez @flawr, a następnie przetestowane przez @titus dla całkowitej oszczędności 6 bajtów.
Dzięki podwójnym właściwościom zaokrąglania Groovy daje to prawidłową moc wyjściową dla papierowych nożyczek.
05AB1E , 10 bajtów (nie konkurować)
Wypróbuj online!
Tę samą odpowiedź przeniesiono do 05AB1E za pomocą nowych poleceń dodanych 26.10.2017.
źródło
-sin(x) = sin(-x)
oznacza to, że po prostu odwrócenie kolejnościa
ib
i upuszczanie wiodącym-
? Poza tym wystarczające może być ustalenie przybliżenia4/Pi
podobnego1.273
, lub1.3
lub9/7
lub5/4
.sin(b-a)
zamiast-sin(a-b)
. Świetne znalezisko!1.3
zamiast4/Math.PI
; to wystarczająco dokładne.XX=ASCII=Y=Wanted output RR=82-82=0=0 PP=83-83=0=0 SS=80-80=0=0
C,
5035 bajtówZadzwoń
f
z ciągiem zawierającym obu graczy, bez separatora, a zwróci, czy pierwszy wygra.Wyjaśnienie:
Patrząc na dziewięć możliwych ciągów, okazuje się, że pary liter w kolumnach 7 i 8 są unikalne:
Przesunięcie przesunięte i dzikie, aby
short*
pobrać te pary liter i zinterpretować je jako liczby:Wtedy chodziło o brute-force, aby znaleźć
51
i4
pozostałości, które dotyczyło kolejno zmniejszających te numery do:Który jest po prostu idealny, aby sfinalizować jeszcze jedną resztę na końcu i zrównoważyć wynik.
Zobacz na żywo na Coliru
źródło
-f(i)
aby obliczyć wynik drugiego gracza - spowoduje nieoczekiwany wynik!-(f(i))
powinno działać dobrze. Makra są fajne!MATLAB / Octave ,
63 5452 bajtyJest to bardzo wygodne, że kody ASCII pierwszych liter
Rock,Paper,Scissors
sąR=82,P=80,S=83
. Jeśli odejmiemy79
, otrzymamy wygodnie3,1,4
, który wykorzystamy teraz jako indeksy macierzy: tutaj macierz 4x4 jest zakodowana na stałe, gdziei,j
-ty wpis odpowiada wynikowi, jeśli podłączysz wartości sprzed:Wypróbuj online!
źródło
Pure Bash, 31
Wzór na pożyczkę @ Dennisa :
Wypróbuj online .
Poprzednia odpowiedź:
Pure Bash,
43354
,5
,8
odpowiednio dla Rock, Paper, Scissors)XOR każdy z 3 otrzymując
7
,6
,11
(które wzięte mod 3. tego1
,0
,2
)Następnie odejmij i baw się modem 3, aby uzyskać pożądany wynik.
Wypróbuj online .
źródło
Python ,
4030 bajtówWypróbuj online!
tło
Zacząłem od szablonu funkcji
i przeprowadził wyszukiwanie siły z użyciem odpowiednich parametrów za pomocą następującego programu, a następnie wybrał jeden z implementacją o minimalnej długości.
Wypróbuj online!
źródło
Mathematica, 32 bajty
Nienazwana funkcja przyjmująca uporządkowaną parę list znaków, takich jak
{{"R","o","c","k"},{"P","a","p","e","r"}}
i zwracająca-1|0|1
.Chciałem, aby kod unikał nie tylko trzech słów wejściowych, ale także zbyt długiej nazwy funkcji
ToCharacterCode
; więc4,5,8
zamiast tego pracowałem z długością słów wejściowych i szukałem krótkiej funkcji tych długości, które dały odmienne odpowiedzi modulo 3. (Dzielenie całkowite przez 2 jest matematycznie obiecujące, ale te funkcje mają zbyt długie nazwy w Mathematica).Okazuje się, że biorąc silnię (długość - 3) daje odpowiedzi
1,2,120
, które są1,-1,0
modulo 3. Następnie po prostu obliczamy, modulo 3, różnicę dwóch wartości (poprzez iloczyn iloczynu{1,-1}.{x,y} = x-y
, co jest dobrym sposobem, gdy dwie wartości znajdują się na liście).źródło
Rubin,
363530 bajtówWypróbuj na ideone.com
Wyjście testowe:
Wykorzystuje fakt, że 7 z 9 poprawnych wyników jest generowanych po prostu przez porównanie leksykograficzne z wykorzystaniem operatora statku kosmicznego
<=>
. Po(a+b)[12]
prostu odwraca dane wejściowe do porównania, jeśli dane wejściowe sąPaper
iScissors
(a takżeScissors
Scissors
- ale to w0
drugą stronę).Dzięki Horváthowi Dávidowi za uratowanie mi postaci i GB za uratowanie mi kolejnej 5.
źródło
Python ,
39363433 bajtówWypróbuj online!
Jak to działa
Rzućmy okiem na kilka wartości długości sześciu kopii xi jednej kopii y modulo 7 .
Możemy zakodować wyniki ( {-1, 0, 1} ), mapując je na zbiór {0, 1, 2, 3} . Na przykład odwzorowanie t ↦ 2 - t osiąga to i jest własną odwrotnością.
Oznaczmy wyniku X i Y o o (x, y) . Następnie:
Na szczęście wszystkie bity w ostatnich kolumnach zgadzają się ze sobą, więc możemy LUB LUB utworzyć jedną liczbę całkowitą n i pobrać o (x, y) jako 2 - ((n ≫ o (x, y))% 4) . Wartość n wynosi 94 .
źródło
Siatkówka ,
3531 bajtówWypróbuj online!
Wyjaśnienie
Działa to w dwóch etapach. Najpierw drukujemy znaki minus dla odpowiednich danych wejściowych. Następnie drukujemy
0
krawaty i1
inne.To są dwa etapy. W
)
drugim etapie grupuje je razem, co*
czyni je suchym przebiegiem (co oznacza, że łańcuch wejściowy zostanie przywrócony po przetworzeniu, ale wynik zostanie wydrukowany) i\
wstrzymuje drukowanie końcowego podawania linii. Dwa etapy razem wydrukują,-
jeśli dotyczy.Pierwszym etapem jest
G
etap rep który tylko trzyma linię, jeśli zawiera ona albok P
,r S
albos R
. Odpowiadają one przypadkom, w których musimy generować dane wyjściowe-1
. Jeśli nie jest to jeden z tych przypadków, dane wejściowe zostaną zastąpione pustym ciągiem.Drugi etap zastępuje
.+
(cały ciąg, ale tylko jeśli zawiera co najmniej jeden znak) na-
. Więc to wypisuje-
dla tych trzech przypadków i nic innego.To dwa kolejne etapy. Pierwszy etap to
D
eduplikacja. Dopasowuje słowa i usuwa duplikaty. Więc jeśli i tylko jeśli dane wejściowe to remis, to spada drugie słowo.Drugi etap liczy liczbę dopasowań
.
, po których następuje dowolna postać. Jeśli dane wejściowe były remisowe, a drugie słowo zostało usunięte, skutkuje to0
. W przeciwnym razie drugie słowo jest nadal na swoim miejscu i istnieje jedno dopasowanie, więc drukowane jest1
zamiast niego.źródło
05AB1E ,
181715109 bajtów6 bajtów zapisanych dzięki sztuczce długości wejściowej Digital Trauma
Pobiera dane wejściowe jako
[SecondPlayersChoice,FirstPlayersChoice]
Wypróbuj online! lub Sprawdź poprawność wszystkich przypadków testowych
Alternatywne rozwiązanie 9-bajtowe:
íø¬ÇÆ>3%<
Wyjaśnienie
Poprzednie 15 bajtowe rozwiązanie
Wypróbuj online! lub Sprawdź poprawność wszystkich przypadków testowych
Wyjaśnienie
źródło
Ç¥13T/*.½ò
DLACZEGO TO DZIAŁA? NIKT NIE WIE.['R','P']
: P To jest część tego.Galaretka , 8 bajtów
Wypróbuj online! (pakiet testowy, dla zachowania przejrzystości rzutuje na liczbę całkowitą)
Jak to działa
źródło
Python 2 ,
4640 bajtówWypróbuj online!
Podziękowania dla @Dennis za umożliwienie mi pożyczenia jego kodu testowego Wypróbuj online i za zaoszczędzenie mi 6 bajtów.
Edytować
@ hashcode55 - W zasadzie tak, jak to opisujesz. (x! = y, -1) to sekwencja dwóch elementów, a [x [0] + y [0] w 'RPSR'] oblicza, który element wziąć. Jeśli pierwsza litera x + pierwsza litera y znajduje się na liście znaków, to zwróci wartość True lub 1, więc (x! = Y, -1) [1] zostanie zwrócona. Jeśli tak nie jest, to (x! = Y, -1) [0]. To staje się nieco trudne. Pierwszy element sam w sobie jest skutecznie kolejnym, jeśli. Jeżeli x! Znak + jest nieco podstępny i jeszcze raz dziękuję @Dennis za ten. X! = Y zwróci dosłowne Prawda lub Fałsz. Potrzebujemy 1 lub 0. Nadal nie wiem jak, ale + dokonuje tej konwersji. Mogę tylko założyć, że użycie operatora matematycznego na True / False wymusza postrzeganie go jako liczby całkowitej. Oczywiście + przed -1 nadal zwróci -1.
Mam nadzieję że to pomoże!
źródło
(x!=y,-1)
działa to tak, jakby jeśli lista wygenerowała wartość true, wówczas -1x!=y
. Jaki jest użytek z tego+
znaku? Bardzo pomocne byłoby źródło dokumentujące tego rodzaju składnię!+
- w tym przypadku jest to jednoznaczny plus+10
, i zasadniczo jest to krótki sposób na konwersję na liczbę całkowitą.JavaScript (ES6),
4638 bajtówWykorzystuje fakt, że Rock-Paper-Scissors jest cykliczny. JavaScript nie ma ani statku kosmicznego, ani zrównoważonych operatorów trójskładnikowych, w przeciwnym razie odpowiedź byłaby
(a,b)=>((b<=>'Rock')-(a<=>'Rock'))%%3
.Edycja: Zapisano 8 bajtów dzięki @WashingtonGuedes.
źródło
MATL ,
1413 bajtówWypróbuj online! Lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie
Jeśli kod ASCII pierwszej litery pierwszego ciągu zostanie odjęty od kodu drugiego ciągu, otrzymamy wartość w kolumnie D poniżej. Biorąc modulo 5 daje wartość M . Końcowa wartość w nawiasie to pożądany efekt, R .
Zatem jeśli obliczymy D, a następnie M , aby uzyskać R, musimy tylko odwzorować 0 na 0; 1 i 2–1; 3 i 4 do -1. Można tego dokonać poprzez indeksowanie do tablicy pięciu wpisów równych 0, 1 lub -1. Ponieważ indeksowanie w MATL jest oparte na 1 i modułowe, tablica powinna być
[1, 1, −1, −1, 0]
(pierwszy wpis ma indeks 1, ostatni indeks 5 lub równoważnie 0). Wreszcie, można na szczęście uniknąć operacji modulo 5, ponieważ jest ona domyślnie przeprowadzana przez indeksowanie modułowe.źródło
CJam , 12 bajtów
Dwa wejścia są oddzielone spacją. Ich kolejność jest odwrócona w stosunku do tej w tekście wyzwania.
Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie
Tłumaczenie mojej odpowiedzi MATL . Wykorzystuje to fakt, że w CJam
c
(konwersja na char) zastosowane do łańcucha przyjmuje swój pierwszy znak. Również tablica mapowania jest inna, ponieważ indeksowanie w CJam opiera się na 0.źródło
CJam,
151412 bajtówWeź kod ascii ostatniego znaku każdego łańcucha, a następnie zwróci:
(a1 - a2 + 19) % 3 - 1
Sprawdź to tutaj !
źródło
Python 3, 54 bajty
Wypróbuj online!
źródło
Java 7, 82 bajty
Nie golfowany:
Wyjaśnienie:
o
,a
ic
, z dziesiętnych ASCII111
,97
a99
.0
(Rock, Rock)14
(Kamień, papier)12
(Papier, nożyczki)-14
(Papier, kamień)0
(Papier, papier)-2
(Papier, nożyczki)-2
(Nożyczki, kamień)2
(Nożyczki, papier)0
(Nożyczki, nożyczki)4
,2
,-4
,-2
,-2
,2
.x
jest teraz dla przypadków testowych:2
i-2
są błędne i powinno być-1
i1
zamiast. Więc jeślix%2 != x
(wszystko powyżej1
lub poniżej-1
) dzielimy przez,-2
aby naprawić te dwa „przypadki brzegowe”.Kod testowy:
Wypróbuj tutaj.
Wynik:
źródło
c
,p
,i
) z wartości ASCII99
,112
i105
, jak wydawało się najbardziej przydatny, i zauważył, że to stać 4, 2, 0, jeśli zrobiłem modulo 5. Dopiero wtedy pomyślałem, musiałem odjąć obie, tak 4, 2 i 0 nie były zbyt przydatne. Po kilku nieudanych próbach / próbach i błędach spróbowałem drugiej litery i uzyskiwałem bardziej użyteczne wyniki z tym samym modulo 5 wciąż obecnym. Potem szybko doszedłem do rozwiązania, które przedstawiłem powyżej. :)dc, 18
Wypróbuj online .
Zauważ, że dwa argumenty są przekazywane (oddzielone spacjami) w jednym wierszu do STDIN. Argumenty są zawarte w nawiasach kwadratowych,
[ ]
ponieważ takdc
podoba się jego łańcuchy.dc
ma bardzo ograniczoną obsługę łańcuchów, ale okazuje się, że jedną z rzeczy, które możesz zrobić, jest użycieZ
polecenia, aby uzyskać długość łańcucha, która na szczęście jest różna dla „Rock”, „Paper” i „Scissors” i może być po prostu arytmetyczna zmanipulowane w celu uzyskania pożądanego rezultatu.źródło
PHP, 34 bajty
źródło
Pyth, 16 lat
Prawdopodobnie może być krótszy.
Online .
źródło
C #,
8584 bajtówZapisano 1 bajt dzięki TheLethalCoder
Akceptuje dwa ciągi jako dane wejściowe i generuje liczbę całkowitą. Remis, jeśli dwa struny są równe, w przeciwnym razie sprawdza pierwszy charachter strun, aby ustalić, który gracz wygra.
źródło
a=>b=>...
JavaScript,
37,32, 31 bajtówJeśli a jest równe b, wyprowadza zero.
W przeciwnym razie x lub wynik sprawdzenia, czy długość nie jest większa niż 12 (porównanie nożyczek i papieru) z porównaniem większej niż b.
Jeśli to zwraca 1, zwróć to.
Jeśli zwraca 0, użyj operatora OR, aby zastąpić -1.
źródło
a=>b=>
aby zapisać bajt?Partia, 116 bajtów
źródło
Perl, 33 bajty
32 bajty kodu +
-p
flaga.Aby uruchomić:
Zaoszczędzono 3 bajty, używając wyrażenia regularnego odpowiedzi Retina Martina Endera . (moim poprzednim wyrażeniem regularnym było
/R.*P|P.*S|S.*R/
)Wyjaśnienie:
Najpierw
/(.+) \1/
sprawdza, czy dane wejściowe zawierają dwa razy to samo słowo, jeśli tak, wynikiem jest0
. W przeciwnym razie/k P|r S|s R/
dotyczy przypadku, w którym znajduje się odpowiedź-1
. Jeśli to ostatnie wyrażenie jest fałszywe, to-/k P|r S|s R/
jest fałszywe, więc wracamy1
.źródło
Galaretka , 9 bajtów
Wykorzystuje algorytm z odpowiedzi Bash @ DigitalTrauma .
Wypróbuj online!
Jak to działa
źródło
Japt , 19 bajtów
Wypróbuj tutaj!
Zainspirowany rozwiązaniem carusocomputing
Stare 53-bajtowe rozwiązanie
Wypróbuj online!
Jeszcze raz dziękuję, ETHproductions!
źródło
©
zamiast&&
, zmieniającUg0 c
doUg c
(samoV
) i zastępowanie-1
zJ
. Jest to jednak nieco dłużej niż odpowiedź JS , być może możesz wziąć z tego kilka pomysłów©
W=Uc
. Nie wiem, dlaczego ciągle zapominam, żec
działa na dowolnym łańcuchu: PPHP,
5553 bajtówwersja sinusoidalna,
4946 bajtówodpowiedź golfa w carusocomputing :
3 bajty zapisane przez @ user59178
źródło
round(x)
z2*x^0
Perl, 25 bajtów
Kod 24 bajty +1 bajt dla
-p
opcji.Wejście powinno być ustawione na standardowe wejście bez separatorów, np .:
Pierwsze wyrażenie regularne szuka wygranej pierwszego gracza, drugie przegranej. Różnica jest drukowana.
źródło
Scala, 148 bajtów
Na szczęście, ponieważ średniki są wymagane do oddzielenia wielu poleceń w tej samej linii, Scala korzysta z formatowalnego kodu golfowego!
W tej próbie golfa nauczyłem się, że możesz go wymienić
z
ponieważ Scala pozwala traktować ciągi jako tablice w celu uzyskania znaków.
źródło