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
.Antworten:
Groovy,
675650 BytesProbieren Sie es online!
Es stellt sich heraus, dass das Stein-, Papier- und Scherenspiel eine ziemlich coole Eigenschaft hat.
Nehmen Sie für die Zeichenfolgen a und b jeweils den ersten Buchstaben, so ergeben sich zwei der folgenden Ergebnisse:
R,P,S
Die vollständige Liste der möglichen Werte ist (wenn 2 Auswahlmöglichkeiten kombiniert werden):
Reorganisation der Liste zu:
Gibt uns eine Folge, die umgekehrt sinusförmig aussieht, und Sie können diese Formel tatsächlich als ungefähr darstellen (und mit ungefähr meine ich, gerade noch genug, um zu arbeiten, könnten Sie eine Gleichung erhalten, die tot ist, aber mehr Bytes kostet):
Die Vereinfachung von 4 / pi auf 1.3 wurde zuerst von @flawr vorgeschlagen und dann von @titus auf eine Gesamteinsparung von 6 Bytes getestet .
Unter Verwendung der doppelten Rundungseigenschaften von Groovy ergibt sich die richtige Ausgabe für Stein-Papier-Scheren.
05AB1E , 10 Bytes (nicht konkurrierend)
Probieren Sie es online!
Dieselbe Antwort wurde mit den neuen Befehlen, die am 26.10.2017 hinzugefügt wurden, auf 05AB1E portiert.
quelle
-sin(x) = sin(-x)
, das heißt einfach die Reihenfolge vona
und umkehrenb
und die Führung fallen lassen-
? Davon abgesehen könnte das Hardcodieren einer Annäherung von4/Pi
ähnlichem1.273
ausreichend sein, oder1.3
oder9/7
oder5/4
.sin(b-a)
anstelle von speichern-sin(a-b)
. Toller Fund!1.3
anstelle von mit multiplizieren4/Math.PI
. das ist ausreichend genau.XX=ASCII=Y=Wanted output RR=82-82=0=0 PP=83-83=0=0 SS=80-80=0=0
C,
5035 BytesRufe
f
mit einer Zeichenkette, die beide Spieler enthält, ohne Trennzeichen, und es wird zurückgegeben, ob der erste gewinnt.Erläuterung:
Anhand der neun möglichen Zeichenfolgen wird deutlich, dass die Buchstabenpaare in den Spalten 7 und 8 eindeutig sind:
Der Offset und der Savage Cast,
short*
um diese Buchstabenpaare abzurufen und als Zahlen zu interpretieren:Dann war es eine Frage der Brute-Force, die
51
und die4
Reste zu finden , die diese Zahlen sukzessive reduzierten, um:Das ist einfach perfekt, um am Ende noch einen Rest festzunageln und das Ergebnis zu kompensieren.
Sehen Sie es live auf Coliru
quelle
-f(i)
die Punktzahl des anderen Spielers - es kommt zu unerwarteten Ergebnissen!-(f(i))
sollte gut funktionieren. Makros machen Spaß!MATLAB / Octave ,
63 5452 BytesEs ist sehr praktisch, dass die ASCII-Codes der ersten Buchstaben von
Rock,Paper,Scissors
sindR=82,P=80,S=83
. Wenn wir subtrahieren, erhalten79
wir bequem3,1,4
, was wir jetzt als Matrixindizes verwenden: Hier wird eine 4x4-Matrix fest codiert, wobei deri,j
-te Eintrag dem Ergebnis entspricht, wenn Sie die Werte von gerade vorher eingeben:Probieren Sie es online!
quelle
Pure Bash, 31
Die Formel von Borrowing @ Dennis :
Probieren Sie es online aus .
Vorherige Antwort:
Pure Bash,
43354
,5
,8
jeweils für Stein, Papier, Schere)XOR mit jeweils 3 zu geben
7
,6
,11
(die , wenn mod 3 give genommen1
,0
,2
)Dann subtrahieren und mit Mod 3 fummeln, um das gewünschte Ergebnis zu erzielen.
Probieren Sie es online aus .
quelle
Python ,
40 bis30 BytesProbieren Sie es online!
Hintergrund
Ich habe mit der Funktionsvorlage begonnen
und führte mit dem folgenden Programm eine Brute-Force-Suche nach geeigneten Parametern durch und wählte dann einen mit einer Implementierung mit minimaler Länge aus.
Probieren Sie es online!
quelle
Mathematica, 32 Bytes
Unbenannte Funktion, die ein geordnetes Paar von Listen von Zeichen aufnimmt, z. B.
{{"R","o","c","k"},{"P","a","p","e","r"}}
und zurückgibt-1|0|1
.Ich wollte, dass der Code nicht nur die drei Eingabewörter, sondern auch den viel zu langen Funktionsnamen vermeidet
ToCharacterCode
. Also habe ich4,5,8
stattdessen mit der Länge der eingegebenen Wörter gearbeitet und nach einer kurzen Funktion dieser Längen gesucht, die eindeutige Antworten Modulo 3 ergab.Es stellt sich heraus, dass die Fakultät von (die Länge - 3) die Antworten ergibt
1,2,120
, die1,-1,0
Modulo 3 sind . Dann berechnen wir Modulo 3, die Differenz der beiden Werte (über das Skalarprodukt{1,-1}.{x,y} = x-y
, was ein guter Weg ist, wenn die zwei Werte sind in einer Liste).quelle
Ruby,
363530 BytesProbieren Sie es auf ideone.com
Testausgang:
Nutzt die Tatsache, dass 7 der 9 korrekten Ergebnisse nur durch einen lexikografischen Vergleich mit dem Raumschiffoperator generiert werden
<=>
. Das(a+b)[12]
kehrt nur die Eingaben zum Vergleich um, wenn die EingabenPaper
und sindScissors
(und auchScissors
Scissors
- aber das ist auch so0
oder so).Dank an Horváth Dávid für die Rettung eines Charakters und dank an GB für die Rettung weiterer 5.
quelle
Python ,
39363433 BytesProbieren Sie es online!
Wie es funktioniert
Werfen wir einen Blick auf einige Werte der Länge von sechs Kopien von x und einer Kopie von y modulo 7 .
Wir können die Ergebnisse ( {-1, 0, 1} ) codieren , indem wir sie der Menge {0, 1, 2, 3} zuordnen . Zum Beispiel erreicht die Abbildung t ↦ 2 - t dies und ist ihre eigene Inverse.
Wir bezeichnen das Ergebnis von x und y mit o (x, y) . Dann:
Glücklicherweise stimmen die Bits in den letzten Spalten alle überein, sodass wir sie ODER-verknüpfen können, um eine einzelne Ganzzahl n zu bilden und o (x, y) als 2 - ((n ≫ o (x, y))% 4 abzurufen. ) . Der Wert von n ist 94 .
quelle
Retina ,
35-31BytesProbieren Sie es online!
Erläuterung
Dies funktioniert in zwei Schritten. Zuerst drucken wir die Minuszeichen für die relevanten Eingaben. Dann drucken wir ein
0
für Krawatten und ein1
anderes.Dies sind zwei Stufen. Das
)
in der zweiten Stufe gruppiert sie, das*
macht sie zu einem Trockenlauf (was bedeutet, dass die Eingabezeichenfolge wiederhergestellt wird, nachdem sie verarbeitet wurden, aber das Ergebnis gedruckt wird) und\
unterdrückt das Drucken eines nachfolgenden Zeilenvorschubs. In den beiden Schritten wird-
gegebenenfalls ein ausgedruckt.Die erste Stufe ist eine
G
rep Stufe , die nur die Leitung hält , wenn er entweder enthältk P
,r S
oders R
. Diese entsprechen den Fällen, in denen wir ausgeben müssen-1
. Wenn dies nicht der Fall ist, wird die Eingabe durch eine leere Zeichenfolge ersetzt.Die zweite Stufe ersetzt
.+
(die gesamte Zeichenfolge, jedoch nur, wenn sie mindestens ein Zeichen enthält) mit-
. Dies gibt also ein-
für diese drei Fälle und sonst nichts aus.Dies sind zwei weitere Stufen. Die erste Stufe ist eine
D
Vervielfältigung. Es vergleicht Wörter und entfernt Duplikate. Wenn und nur wenn die Eingabe ein Gleichstand ist, wird das zweite Wort gelöscht.In der zweiten Stufe wird die Anzahl der Übereinstimmungen gezählt. Hierbei
.
handelt es sich um ein Leerzeichen, auf das ein beliebiges Zeichen folgt. Wenn die Eingabe ein Gleichstand war und das zweite Wort entfernt wurde, führt dies zu0
. Andernfalls ist das zweite Wort noch vorhanden und es gibt eine Übereinstimmung, sodass es1
stattdessen gedruckt wird.quelle
05AB1E ,
181715109 Bytes6 Bytes werden mit dem Eingabe-Längen-Trick von Digital Trauma gespeichert
Übernimmt die Eingabe als
[SecondPlayersChoice,FirstPlayersChoice]
Probieren Sie es online! oder Validiere alle Testfälle
Alternative 9-Byte-Lösung:
íø¬ÇÆ>3%<
Erläuterung
Vorherige 15-Byte-Lösung
Probieren Sie es online! oder Validiere alle Testfälle
Erläuterung
quelle
Ç¥13T/*.½ò
Warum es funktioniert? Niemand weiß.['R','P']
: P Es ist ein Hafen davon.Gelee , 8 Bytes
Probieren Sie es online! (Testsuite, aus Gründen der Übersichtlichkeit in Ganzzahl umgewandelt)
Wie es funktioniert
quelle
Python 2 ,
4640 BytesProbieren Sie es online!
Vielen Dank an @Dennis für das Ausleihen seines Online-Testcodes Try it und das Speichern von 6 Byte.
Bearbeiten
@ hashcode55 - Ziemlich genau wie du es beschreibst. (x! = y, -1) ist eine Folge von zwei Elementen und [x [0] + y [0] in 'RPSR'] berechnet, welches Element genommen werden soll. Befindet sich der erste Buchstabe von x + der erste Buchstabe von y in der Zeichenliste, wird er mit True oder 1 bewertet, sodass (x! = Y, -1) [1] zurückgegeben wird. Wenn nicht, dann ist (x! = Y, -1) [0]. Hier wird es etwas knifflig. Das erste Element ist an sich effektiv ein anderes, wenn. Wenn x! = Y ist, ist das erste Element True, andernfalls ist es False. Wenn x [0] + y [0] in 'RPSR' false ist, wird entweder True oder False zurückgegeben, je nachdem, ob x == y ist. Das + ist ein bisschen hinterhältig und nochmals vielen Dank an @Dennis für dieses. Das x! = Y gibt ein wahres oder falsches Literal zurück. Wir brauchen eine 1 oder eine 0. Ich weiß immer noch nicht genau, aber das + macht diese Konvertierung. Ich kann nur annehmen, dass durch die Verwendung eines mathematischen Operators für Wahr / Falsch erzwungen wird, dass er als ganzzahliges Äquivalent angesehen wird. Offensichtlich wird das + vor dem -1 immer noch -1 zurückgeben.
Hoffe das hilft!
quelle
(x!=y,-1)
funktioniert dies so, als ob, wenn die Liste ein true erzeugt, -1 elsex!=y
. Was ist die Verwendung dieses+
Zeichens? Eine Quelle, die diese Art von Syntax dokumentiert, wäre wirklich hilfreich!+
- in diesem Fall ist das ein unärgerliches Plus+10
und im Grunde eine kurze Möglichkeit, in eine Ganzzahl umzuwandeln.JavaScript (ES6),
4638 ByteNutzt die Tatsache, dass Stein-Papier-Scheren zyklisch sind. JavaScript hat weder Raumschiffe noch ausgeglichene ternäre Operatoren, sonst wäre die Antwort
(a,b)=>((b<=>'Rock')-(a<=>'Rock'))%%3
.Bearbeiten: 8 Bytes dank @WashingtonGuedes gespeichert.
quelle
MATL ,
1413 BytesProbieren Sie es online! Oder überprüfen Sie alle Testfälle .
Erläuterung
Wenn der ASCII-Code des Anfangsbuchstabens der ersten Zeichenfolge von dem der zweiten Zeichenfolge subtrahiert wird, erhalten wir den Wert in der Spalte D unten. Unter Modulo 5 ergibt den Wert M . Der endgültige Wert in Klammern ist das gewünschte Ergebnis, R .
Wenn wir also D und dann M berechnen , müssen wir nur 0 bis 0 abbilden , um R zu erhalten . 1 und 2 zu 1; 3 und 4 bis -1. Dies kann durch Indizieren in ein Array von fünf Einträgen erfolgen, die 0, 1 oder -1 entsprechen. Da die Indexierung in MATL 1-basiert und modular ist, sollte das Array
[1, 1, −1, −1, 0]
(der erste Eintrag hat Index 1, der letzte Index 5 oder gleichwertig 0) sein. Schließlich kann die Modulo 5-Operation zum Glück vermieden werden, da sie implizit durch die modulare Indizierung ausgeführt wird.quelle
CJam , 12 Bytes
Die beiden Eingänge sind durch Leerzeichen getrennt. Ihre Reihenfolge ist in Bezug auf das im Aufforderungstext umgekehrt.
Probieren Sie es online! Oder überprüfen Sie alle Testfälle .
Erläuterung
Übersetzung meiner MATL-Antwort . Hierbei wird die Tatsache ausgenutzt, dass in CJam
c
( in Zeichen konvertieren), das auf eine Zeichenfolge angewendet wird, das erste Zeichen verwendet wird. Das Array für die Zuordnung unterscheidet sich auch, da die Indizierung in CJam auf 0 basiert.quelle
CJam,
151412 BytesNehmen Sie den ASCII-Code des letzten Zeichens jeder Zeichenfolge und geben Sie Folgendes zurück:
(a1 - a2 + 19) % 3 - 1
Teste es hier !
quelle
Python 3, 54 Bytes
Probieren Sie es online!
quelle
Java 7, 82 Bytes
Ungolfed:
Erläuterung:
o
,a
undc
mit den ASCII - Dezimalzahlen111
,97
und99
.0
(Rock, Rock)14
(Stein, Papier)12
(Papier, Schere)-14
(Papier, Stein)0
(Papier, Papier)-2
(Papier, Schere)-2
(Schere, Rock)2
(Schere, Papier)0
(Schere, Schere)4
,2
,-4
,-2
,-2
,2
.x
ergibt sich nun für die Testfälle:2
und-2
sind falsch und sollten-1
und1
stattdessen gewesen sein. Also, wennx%2 != x
(alles darüber1
oder darunter-1
) wir teilen-2
, um diese beiden 'Randfälle' zu beheben.Testcode:
Probieren Sie es hier aus.
Ausgabe:
quelle
c
,p
,i
) mit den ASCII - Werten99
,112
und105
, wie sie am nützlichsten sein schienen, und bemerkte , wäre es worden , 4, 2, 0 , wenn ich Modulo tat 5. Erst dann ich dachte , ich beide abziehen musste, so die 4, 2 und 0 haben nicht viel gebracht. Nach einigem Herumstöbern / Ausprobieren habe ich den zweiten Buchstaben ausprobiert und mit demselben Modulo 5, das noch vorhanden ist, nützlichere Ergebnisse erzielt. Dann bin ich schnell zu der Lösung gekommen, die ich oben vorgestellt habe. :)dc, 18
Probieren Sie es online aus .
Beachten Sie, dass die beiden Argumente in einer Zeile an STDIN übergeben werden (durch Leerzeichen getrennt). Die Argumente sind in eckigen Klammern angegeben,
[ ]
dadc
die Zeichenfolgen so beliebt sind.dc
Die Handhabung von Strings ist sehr begrenzt, aber es hat sich herausgestellt, dass Sie denZ
Befehl verwenden können, um eine Stringlänge zu erhalten, die sich zum Glück für "Rock", "Paper" und "Scissors" unterscheidet und recht einfach arithmetisch sein kann manipuliert, um das gewünschte Ergebnis zu erzielen.quelle
PHP, 34 Bytes
quelle
Pyth, 16
Wahrscheinlich könnte kürzer sein.
Online .
quelle
C #,
8584 BytesDank TheLethalCoder 1 Byte gespart
Es akzeptiert zwei Zeichenfolgen als Eingabe und gibt eine Ganzzahl aus. Wenn die beiden Saiten gleich sind, gibt es einen Gleichstand, andernfalls wird nach dem ersten Charakter der Saiten gesucht, um festzustellen, welcher Spieler gewinnt.
quelle
a=>b=>...
JavaScript,
37,32, 31 BytesWenn a gleich b ist, wird Null ausgegeben.
Andernfalls xoder das Ergebnis der Prüfung, ob die Länge nicht größer als 12 ist (Vergleich von Schere und Papier) mit dem Vergleich von a größer als b.
Wenn dies 1 zurückgibt, geben Sie es zurück.
Wenn 0 zurückgegeben wird, verwenden Sie den OR-Operator, um ihn durch -1 zu ersetzen.
quelle
a=>b=>
, um ein Byte zu speichern?Batch, 116 Bytes
quelle
Perl, 33 Bytes
32 Byte Code +
-p
Flag.Um es auszuführen:
3 Bytes mit dem Regex von Martin Enders Retina- Antwort gespeichert . (mein vorheriger regulärer Ausdruck war
/R.*P|P.*S|S.*R/
)Erläuterung:
Zunächst wird
/(.+) \1/
überprüft , ob die Eingabe enthält zweimal das gleiche Wort, wenn ja, ist das Ergebnis0
. Ansonsten/k P|r S|s R/
befasst sich mit dem Fall, in dem die Antwort ist-1
. Wenn dieser letzte reguläre Ausdruck falsch ist, dann-/k P|r S|s R/
ist er falsch, also kehren wir zurück1
.quelle
Gelee , 9 Bytes
Hierbei wird der Algorithmus aus der Bash-Antwort von @ DigitalTrauma verwendet .
Probieren Sie es online!
Wie es funktioniert
quelle
Japt , 19 Bytes
Probieren Sie es hier aus!
Inspiriert von der Lösung von carusocomputing
Alte 53-Byte-Lösung
Probieren Sie es online!
Nochmals vielen Dank, ETHproductions!
quelle
©
statt&&
, die Änderung desUg0 c
zuUg c
(gleich mitV
) und Ersetzen-1
mitJ
. Es ist immer noch ein bisschen länger als die Antwort von JS , vielleicht können Sie ein paar Ideen daraus©
W=Uc
. Ich weiß nicht, warum ich immer wieder vergesse, dassc
das auf einer Saite funktioniert: PPHP,
5553 BytesSinus-Version,
4946 BytesEin Golf-Hafen der Antwort von Carusocomputing :
3 Bytes gespeichert von @ user59178
quelle
round(x)
durch2*x^0
Perl, 25 Bytes
Code 24 Byte + 1 Byte für die
-p
Option.Die Eingabe sollte auf stdin ohne Trennzeichen erfolgen, zB:
Der erste reguläre Ausdruck sucht nach dem Gewinn des ersten Spielers, der zweite nach seinem Verlust. Der Unterschied wird gedruckt.
quelle
Scala, 148 Bytes
Da Semikolons erforderlich sind, um mehrere Befehle in derselben Zeile zu trennen, profitiert Scala von formatierbarem Golfcode!
Bei diesem Golfversuch habe ich gelernt, dass Sie ersetzen können
mit
weil Sie mit Scala Zeichenfolgen als Arrays behandeln können, um Zeichen zu erhalten.
quelle