Puan taş-kağıt-makas


70

"Rock", "Paper" veya "Scissors" dizgelerinin iki dize girişi göz önüne alındığında, RPS turunun sonucunu belirler . İlk oyuncu kazanırsa Çıkış 1, ikinci oyuncu kazanırsa -1, beraberlik için 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

Girdi olarak "Rock", "Paper" ve "Scissors" dizelerini kullanmalısınız. İlk oyuncuların seçiminin (sürekli olarak) birinci mi yoksa ikinci mı olacağını mı seçebilirsiniz. Alternatif olarak, bunları tek karakterli veya boş bir ayırıcı ile tek bir giriş olarak alabilirsiniz. Giriş, giriş biçiminizdeki üç seçeneğin 9 olası eşleşmesinden birini garanti eder.

Çıktı 1, 0 veya -1 sayı veya dize gösterimi olmalıdır. Yüzen iyi. Yani vardır +1, +0,ve -0.

İlgili: Bir RPS oyunu kodlama


Liderler Sıralaması:


Boş ayırıcılı tek bir giriş, örneğin "duvar kağıdı" anlamına mı geliyor?
Emigna

1
@Emigna Evet, ancak büyük harf olarak RockPaper.
xnor

15
Bu beklediğimden çok daha eğlenceli oldu, Lordum bunu yapmanın bazı harika yolları var.
Magic Octopus Urn

Giriş iki dizenin bir dizisi olabilir mi?
Luis Mendo

@LuisMendo Evet.
xnor

Yanıtlar:


73

Groovy, 67 56 50 Bayt

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

Çevrimiçi deneyin!

Taş, kağıt, makas oyunu oldukça güzel bir özelliğe sahip olduğu ortaya çıktı.
Verilen a ve b dizgileri, her birinin ilk harfini alır, bu, aşağıdakilerden ikisiyle sonuçlanır:R,P,S

Olası değerlerin ayrıntılı listesi: (2 seçenek birleştirildiğinde):

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

Listeyi şu şekilde yeniden düzenleme:

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

Bize ters sinüzoidal görünen bir dizi verir ve aslında bu formülü yaklaşık olarak gösterebilir (ve yaklaşık olarak çalışmak için neredeyse zar zor demek, ölü bir ama daha fazla baytlık bir denklem elde edebilirsiniz):

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

4 / pi'nin 1.3'e basitleştirilmesi ilk önce @flawr tarafından önerildi ve ardından @titus tarafından toplam 6 bayt tasarruf için test edildi .

Denklem Açıklaması

Groovy'nin çift yuvarlama özellikleri kullanıldığında, bu, taş-kağıt-makas için doğru çıktıya yol açar.


05AB1E , 10 bayt (rekabet etmeyen)

Ç¥13T/*.½ò

Çevrimiçi deneyin!

10/26/2017 eklenmiş yeni komutları kullanarak 05AB1E'ye verilen aynı cevap.


3
Eğer kullanarak daha kısa gelemedi o -sin(x) = sin(-x), bu sadece sırası ters gelir ave bve lider bırakarak -? Bunun dışında, 4/Pibenzer bir yaklaşımın sabit kodlanması 1.273yeterli olabilir 1.3veya 9/7veya 5/4.
kusur

2
Not: Ayrıca, çevrimiçi denemek için bir bağlantı yapmayı öneririm, böylece benim gibi insanlar sizin gönderiminizle oynayabilirler =)
kusur 21

3
Bunun sin(b-a)yerine 1 byte kaydedebilirsiniz -sin(a-b). Harika bul!
Titus

2
Tarafından çarpılarak başka 7 bayt kaydet 1.3yerine 4/Math.PI; bu yeterince kesin.
Titus

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 bayt

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

fAyırıcı olmadan, her iki oyuncuyu içeren bir dize ile arayın ve ilk kazanırsa kazanır.

Açıklama:

Olası dokuz dizgeye bakıldığında, 7. ve 8. sütunlardaki harf çiftlerinin benzersiz olduğu ortaya çıkmıştır:

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

Ofset ve vahşi short*, bu harf çiftlerini almak ve bunları sayı olarak yorumlamak için kullanıldı:

29285
29545
21107
107
25968
21363
29555
27491
20595

O zaman ardı ardına bu sayıları azaltan uygulanan 51ve 4kalanları bulmak kaba kuvvet meselesiydi :

3 0 0 1 1 1 2 2 2

Bu, sonunda başka bir kalan daha fazla şey atmak ve sonucu dengelemek için mükemmeldir.

Coliru'da canlı görün


Sadece -f(i)diğer oyuncunun puanını hesaplamak için hesaplama yapmak gibi bir şey yapmayın - beklenmedik sonuç ortaya çıkacak!
nneonneo

4
@nneonneo -(f(i))iyi çalışması gerekir. Makrolar eğlencelidir!
saat

18

MATLAB / Octave , 63 54 52 bayt

İlk harflerinin ASCII kodları olduğunu çok uygundur Rock,Paper,Scissorsvardır R=82,P=80,S=83. Çıkartırsak 79rahatça 3,1,4elde ederiz, ki bu şimdi matris endeksleri olarak kullanacağız: Burada bir 4x4-matris kodlanmış, burada i,jgirdi, hemen önce değerleri girerseniz sonucun karşılığıdır:

     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)

Çevrimiçi deneyin!


16

Saf Bash, 31

Dennis'in formülüne göre borçlanma :

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

Çevrimiçi deneyin .


Önceki cevap:

Saf Bash, 43 35

echo $[(7+(${#2}^3)-(${#1}^3))%3-1]
  • Her arg dize uzunluğunu alın ( 4, 5, 8sırasıyla Kaya, Kağıt için, Makas)
  • 3 ile her vermek üzere XOR 7, 6, 11(ki mod 3 elde alındığında 1, 0, 2)

  • Ardından istenen sonucu elde etmek için çıkartın ve mod 3 ile oynayın.

Çevrimiçi deneyin .


15

Python , 40 , 30 bayt

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

Çevrimiçi deneyin!

Arka fon

İşlev şablonu ile başladım

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

ve aşağıdaki programı kullanarak uygun parametreler için kaba kuvvet araştırması yürüttü, ardından minimum uzunluktaki bir uygulama ile seçildi.

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

Çevrimiçi deneyin!


14

Mathematica, 32 bayt

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

Adsız işlev, gibi sıralı karakter listelerini alan {{"R","o","c","k"},{"P","a","p","e","r"}}ve döndüren adsız işlev -1|0|1.

Kodun yalnızca üç giriş sözcüğünden değil, aynı zamanda çok uzun işlev adından da kaçınmasını istedim ToCharacterCode; bu yüzden 4,5,8bunun yerine giriş kelimelerinin uzunluğu ile çalıştım ve farklı cevaplar veren modulo 3'e sahip uzunlukların kısa bir fonksiyonuna baktım.

Faktörün alınmasının (uzunluk - 3) 1,2,120, 1,-1,0modulo 3 olan cevapları verdiğini {1,-1}.{x,y} = x-yortaya koymaktadır. iki değer bir listededir).


1
"Görünüşe
bakılırsa

12

Ruby, 36 35 30 bayt

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

İdeone.com'da deneyin

Test çıkışı:

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

9 doğru sonucun 7'sinin sadece uzay gemisi operatörünü kullanarak bir sözlükbilimsel karşılaştırma yaparak üretilmesi gerçeğinden faydalanır <=>. (a+b)[12]Girişler ise sadece karşılaştırmak için girişler ters Paperve Scissors(ve ayrıca Scissors Scissors- ama bu 0her iki şekilde yuvarlak).

Horváth Dávid sayesinde bana bir karakter kaydettiğin için ve GB de başka bir tane kaydettiğim için teşekkürler.


İsimsiz bir lambda kullanabilir ve 2 karakter kaydedebilirsiniz.
GB

@ TR Fonksiyona bir isim vermezsem nasıl çağırmam gerekir? Bu beni aldatıyor. Ama diğer ipucu için teşekkürler - Buna bakmıştım ama ScissorsScissors 16 yaşında olduğu için reddettim, ama bunun gerçekten önemli olmadığını görüyorum. :-)
Gareth


@Dennis Atamadan arayamazsınız. Beni aldatmak ve bir isim tanımlamak zorunda olan isimsiz işlevleri olmayan diller üzerinde haksızlık hissi veriyor.
Gareth

Tabi ki yapabilirsin. tio.run/nexus/…
Dennis

10

Python , 39 36 34 33 bayt

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

Çevrimiçi deneyin!

Nasıl çalışır

Altı kopya x uzunluğunun birkaç değerine ve y modulo 7'nin bir kopyasına bakalım .

                                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

Sonuçları ( {-1, 0, 1} ) {0, 1, 2, 3} kümesine eşleyerek kodlayabiliriz . Örneğin, haritalama t - 2 - t bunu başarır ve kendi tersidir.

En sonucunu göstersin x ve y ile o (x, y) . Sonra:

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₂

Neyse ki, hücreler içerisinde bit tüm birbiriyle uyumlu, bu yüzden TD bunları tek bir tam sayı oluşturmak üzere olabilir n ve almak için o (x, y) olarak 2 - ((n »O (x, y))% 4) . Değeri n olan 94 .


9

Retina , 35 31 bayt

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

Çevrimiçi deneyin!

açıklama

Bu iki adımda çalışır. İlk önce ilgili girdiler için eksi işaretlerini yazdırıyoruz. Sonra bir 0bağlar ve 1başka şeyler için basarız .

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

Bu iki aşamadır. )Birlikte ikinci aşama grupları tanesi, *bunları bir kuru çalışma yapar (bu işlendikten sonra giriş dizesi geri anlamına gelir, ancak sonuç basılacak) ve \bir arka satır besleme baskı bastırır. İki aşama birlikte -uygulanabilirse yazdırılacaktır .

Birinci aşama a, Go da içeriyorsa, sadece satır tutar temsilcisi aşaması k P, r Sya da s R. Bunlar, çıkmamız gereken durumlara karşılık gelir -1. Bu durumlardan biri değilse, giriş boş bir dizeyle değiştirilecektir.

İkinci aşama .+(dizenin tamamı, ancak yalnızca en az bir karakter içeriyorsa) ile değiştirilir -. Yani bu -, bu üç dava için bir baskı yapar, başka bir şey yapmaz.

D`\w+
 .

Bu iki aşama daha. İlk aşama bir Deduplikasyondur. Kelimeleri eşleştirir ve kopyaları siler. Yani eğer ve giriş bir bağ ise, bu ikinci kelimeyi düşürür.

İkinci aşama ., herhangi bir karakterin izlediği boşluk olan eşleşme sayısını sayar . Giriş bir bağsa ve ikinci sözcük kaldırıldıysa, bu sonuçlanır 0. Aksi takdirde, ikinci kelime hala yerindedir ve bir eşleşme vardır, bu yüzden bunun 1yerine yazdırır .


İşte giriş dizgisi uzunluklarına göre farklı bir yaklaşım . Sizinkinden daha uzun, ama merak ediyorum daha fazla golf atılabilir mi?
Dijital Travma

@DigitalTrauma gerçekten zarif bir fikir, ama onu kısaltacak bir şey göremiyorum. Bence yine de göndermelisin (ve ilk satırı başlığa taşırsan, TIO bunu bayt sayısına dahil etmez).
Martin Ender

8

05AB1E , 18 17 15 10 9 bayt

Digital Trauma'nın giriş uzunluğu numarasıyla 6 bayt kurtarıldı

€g3^Æ>3%<

Girişi alır [SecondPlayersChoice,FirstPlayersChoice]

Çevrimiçi deneyin! veya Tüm test durumlarını doğrula

Alternatif 9 bayt çözüm: íø¬ÇÆ>3%<

açıklama

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

Önceki 15 baytlık çözüm

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

Çevrimiçi deneyin! veya Tüm test durumlarını doğrula

açıklama

 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

Benim eğlenceli olanı yendin: ( Ç¥13T/*.½òNEDEN ÇALIŞIYOR? NOBODY KNOWS.
Magic Octopus Urn

@ MagicOctopusUrn: Uuuh, bu kesinlikle garip bir tanesi. Giriş formatı, int olarak çıktı olarak döndürmek için ne olabilir?
Emigna


@MagicOctopusUrn: Evet, bunu unuttum. Bu mücadeleye en sevdiğim cevap :)
Emigna

6

Jöle , 8 bayt

L€Iµ-*×Ṡ

Çevrimiçi deneyin! (Test paketi, netlik için tamsayıya çevirir)

Nasıl çalışır

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 bayt

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

Çevrimiçi deneyin!

@Dennis'e ödünç almama izin verdiği için teşekkür ederim. Çevrimiçi test kodunu deneyin ve beni 6 bayt kurtardığın için.

Düzenle

@ hashcode55 - Anladığınız kadarıyla. (x! = y, -1) iki elemanlı bir sekanstır ve 'RPSR'] 'de [x [0] + y [0], hangi öğenin alınacağını hesaplar. Eğer ilk x + harfi ilk y harfi karakter listesinde ise, o zaman True ya da 1 olarak değerlendirilir, böylece (x! = Y, -1) [1] döndürülür. Öyleyse, (x! = Y, -1) [0]. Burası biraz zorlaştığı yer. İlk eleman kendi içinde etkili bir başka ise. Eğer x! = Y ise, ilk eleman True olur, aksi takdirde False olur, böylece 'RPSR' içindeki x [0] + y [0] yanlış ise, x == y'ye bağlı olarak True ya da False döndürülür. + Biraz sinsi ve bunun için @Dennis için tekrar teşekkürler. X! = Y değişmez bir Doğru veya Yanlış döndürecektir. 1 veya 0 değerine ihtiyacımız var. Hala nasıl olduğunu tam olarak bilmiyorum ama + bu dönüşümü yapıyor. Sadece True / False üzerinde matematiksel bir operatör kullanarak bunun tamsayı eşdeğeri olarak görülmeye zorlandığını varsayabilirim. Açıkça görüldüğü gibi -1 önünde + hala -1 döndürür.

Bu yardımcı olur umarım!


Selam! Lütfen bu sözdiziminin nasıl çalıştığını söyler misiniz? Mantıksal olarak tahmin etmek (x!=y,-1)gerekirse, liste doğruysa -1'den başka bir şey oluşturuyorsa , bu gibi çalışır x!=y. Bu +işaret ne işe yarar ? Bu tür bir sözdizimini belgeleyen bir kaynak gerçekten yararlı olacaktır!
hashcode55

@ hashcode55 - Cevabımı bir açıklama ekledim.
ElPedro

Buradaki belirsizliğinize cevap vermek için +- bu durumda, bu +10normal bir artı gibi , ve aslında bir tamsayıya dönüştürmenin kısa bir yoludur.
FlipTack

@FlipTack teşekkürler. Tür ne yaptığını tahmin etti ama doğru açıklama için teşekkürler.
ElPedro

@ElPedro Çok teşekkürler! Bu gerçekten bana yardımcı oldu.
hashcode55

5

JavaScript (ES6), 46 38 bayt

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

Taş-Makas-Makasın döngüsel olması gerçeğinden faydalanır. JavaScript'in ne uzay gemisi ne de dengeli üçlü operatöre sahip olması gerekmez, aksi takdirde cevap verilebilir (a,b)=>((b<=>'Rock')-(a<=>'Rock'))%%3.

Düzenleme: @WashingtonGuedes sayesinde 8 bayt kaydedildi.


1
@WashingtonGuedes Bundan daha iyisini yapabilirim!
Neil

1 byte'ı kurtarmak için köri olabilir
MayorMonty

koşmaya çalıştım ve her zaman 0
Vitim.us

5

MATL , 14 13 bayt

TTt_0vic1Z)d)

Çevrimiçi deneyin! Veya tüm test durumlarını doğrulayın .

açıklama

İlk dizinin ilk harfinin ASCII kodu, ikinci dizeninkinden çıkarılırsa, aşağıdaki D sütununda değeri alırız . Modulo 5 alarak M değerini verir . Parantez içindeki son değer, istenen sonucu 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)

Dolayısıyla, D'yi ve sonra M'yi hesaplarsak , R'yi elde etmek için sadece 0 ila 0 eşlememiz gerekir; 1 ve 2 ila 1; 3 ve 4 ila −1. Bu, 0, 1 veya −1'e eşit beş giriş dizisine endeksleyerek yapılabilir. MATL'deki indeksleme 1 tabanlı ve modüler olduğundan, dizi olmalıdır [1, 1, −1, −1, 0](ilk girdi dizin 1, son dizin 5 veya eşdeğer 0'dır). Son olarak, modulo 5 işleminden şansı kaçınılabilir, çünkü modüler indeksleme ile dolaylı olarak gerçekleştirilir.

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 bayt

0XXWW]rcrc-=

İki giriş boşlukla ayrılmıştır. Sıraları, zorluk metninde buna göre tersine çevrilir.

Çevrimiçi deneyin! Veya tüm test durumlarını doğrulayın .

açıklama

Benim çevrilmesi Matl cevap . Bu c, bir dize üzerine uygulanan CJam'da ( char'a dönüştür) ilk karakterini almasından yararlanır . Ayrıca, eşleme için dizi farklıdır çünkü CJam'deki indeksleme 0-temellidir.

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 bayt

rW=rW=-J+3%(

Her dizenin son karakterinin ascii kodunu alın, sonra döner:

(a1 - a2 + 19) % 3 - 1

Burada test et !



4

Java 7, 82 bayt

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

Ungolfed:

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

Açıklama:

  • İkinci harfler o, ave cASCII ondalık ile 111, 97ve99 .
  • Bunları test durumları için birbirimizden çıkarırsak aşağıdaki sonuçları alırız:
    • 0 (Kaya, Kaya)
    • 14 (Taş, Kağıt)
    • 12 (Kağıt, Makas)
    • -14 (Kağıt, Kaya)
    • 0 (Kağıt, Kağıt)
    • -2 (Kağıt, Makas)
    • -2 (Makas, Kaya)
    • 2 (Makas, Kağıt)
    • 0 (Makas, Makas)
  • Her biri için modulo 5 alırsak, aldığımız 4, 2, -4, -2, -2, 2.
  • xŞimdi ikiye bölünerek test durumları için şu şekilde:
    • x = 0 (Kaya, Kaya)
    • x = 2 (Taş, Kağıt)
    • x = 1 (Kağıt, Makas)
    • x = -2 (Kağıt, Kaya)
    • x = 0 (Kağıt, Kağıt)
    • x = -1 (Kağıt, Makas)
    • x = -1 (Makas, Kaya)
    • x = 1 (Makas, Kâğıt)
    • x = 0 (Makas, Makas)
  • Sadece 2ve -2yanlış -1ve 1yerine ve olması gerekirdi . Öyleyse, x%2 != x(yukarıdaki 1veya altındaki her şey -1), -2bu iki 'uç vakayı' düzeltmek için böleriz .

Test kodu:

Burada dene.

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

Çıktı:

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

Neden meraktan ikinci mektup? Aynı yaklaşıma sahiptim (biraz) ama ilk harfi kullandım.
Magic Octopus Urn

@carusocomputing Pekala, diğer insanların çoğunun ilk mektubu veya uzunluğu kullandığını ve başka bir şey denemek istediğini fark ettim. Ben ilk üçüncü harfler (kullanılan c, p, iASCII değerleri ile) 99, 112ve 105böylece, bunlar en yararlı görünüyordu ve ben ancak o zaman modulo 5. yaptıysam 4, 2, 0 ben hem çıkarmak zorunda düşündüm olacaktı fark 4, 2 ve 0 çok işe yaramadı. Etrafta biraz dolanmadan sonra / deneme yanılma ikinci mektubu denedim ve hala aynı modulo 5 ile daha kullanışlı sonuçlar alıyordum. Sonra hızla yukarıda sunduğum çözüme ulaştım. :)
Kevin Cruijssen

@carusocomputing Eşsiz bir yaklaşım denemek istedi ve bu tür çözümlerde oldukça kötüyüm göz önüne alındığında, diğer bazı çözümler kadar kısa değil, yine de benzersiz (ki bu benim ilk amacımdı). :)
Kevin Cruijssen

4

dc, 18

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

Çevrimiçi deneyin .

İki yolun bir satırda STDIN'e (boşlukla ayrılmış) geçtiğini unutmayın. Args köşeli parantez içinde bulunan [ ]bu nasıl olduğu gibi dconun dizeleri sever.

dcsahip çok sınırlı dize işleme, ama çıkıyor yapabileceğiniz şeylerden biri kullanmaktır ZNeyse ki "Kaya" için ayrı bir dize uzunluğunu almak için komut, "Kağıt" ve "Makas" ve sadece aritmetik olarak oldukça olabilir istenen sonucu vermek için manipüle edilir.



3

Pyth, 16

t%+7h.+mx3ldQ3

Muhtemelen daha kısa olabilirdi.

        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

Çevrimiçi .


3

C #, 85 84 bayt

TheLethalCoder sayesinde 1 bayt kaydedildi

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;

İki dizgeyi girdi olarak kabul eder ve bir tamsayı çıkarır. Eğer iki tel eşitse, bir kravat vardır, aksi halde hangi oyuncunun kazanacağını belirlemek için tellerin ilk karakterini kontrol eder.


a=>b=>...
Currying

3

JavaScript, 37 , 32 , 31 bayt

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

Eşittir b ise, sıfır çıkışı.

Aksi takdirde, uzunluğu 12'den büyük değilse (Makas ve Kağıdın karşılaştırılması) b'den büyük olanın karşılaştırılmasıyla kontrol edin.
Bu 1 döndürürse, geri döndürün.

0 döndürürse, -1 ile değiştirmek için OR işlecini kullanın.


Bunu a=>b=>bir bayttan tasarruf etmek için köreli bir işlev olarak yazabilir misiniz ?
FlipTack

Evet. Thank @ @FlipTack
Grax32

2

Toplu iş, 116 bayt

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

32 bayt kodu + -pbayrak.

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

Çalıştırmak için:

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

Martin Ender'in Retina cevabının regex'ini kullanarak 3 bayt kurtarıldı . (önceki regex'im /R.*P|P.*S|S.*R/)

Açıklama:

İlk olarak, /(.+) \1/girişin aynı kelimenin iki katı içerip içermediğini kontrol eder, öyleyse sonuç 0. Aksi halde, /k P|r S|s R/cevabın bulunduğu durumla ilgilenir -1. Eğer bu son regex yanlışsa, o -/k P|r S|s R/zaman sahtedir, o yüzden geri döneriz 1.


2

Jöle , 9 bayt

L€^3Iæ%1.

Bu @ DigitalTrauma'nın Bash cevabındaki algoritmayı kullanır .

Çevrimiçi deneyin!

Nasıl çalışır

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

Kahretsin, Jelly'i okumaya başlamak üzereydim. Oh iyi, işte burada pyth . +1.
Dijital Travma

2

Japt , 19 bayt

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

Burada dene!

Carusocomputing'in çözümünden ilham aldı

Eski 53 Baytlık Çözüm

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

Çevrimiçi deneyin!

Tekrar teşekkürler, ETHproductions!


1
Sen kullanarak başlayabileceğini ©yerine &&değişen Ug0 ciçin Ug c(aynı V) ve değiştirme -1ile J. Yine de JS'nin cevabından biraz daha uzun , belki bundan biraz fikir alabilirsin
ETHproductions

@ETHproductions Teşekkürler! Nasıl unutacağımı bilmiyorum©
Oliver

1
Aslında sadece yapabilirsin W=Uc. Neden cherhangi bir
ipte

2

PHP, 55 53 bayt

<?=(3-(ord($argv[2])%6%4-ord($argv[1])%6%4+3)%3*2)%3;
  • ilk harflerin ascii değerlerini alır (komut satırı argümanlarından): 82,80,83
  • % 6: 4,2,5
  • % 4: 0,2,1
  • fark (ba):
    • PS: 1-2, SR: 2-0, RP: 2-0 -> -1 veya 2; + 3,% 3 -> 2
    • SP: 2-1, RS: 0-2, PR: 0-2 -> -2 veya 1; + 3,% 3 -> 1
    • RR, PP, SS: 0; + 3,% 3: 0
  • (3-2 * x): -1,1,3
  • % 3: -1,1,0

sinüs versiyonu, 49 46 bayt

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

bir golfed liman carusocomputing's cevap :

@ User59178 tarafından kaydedilen 3 bayt


1
Için sinüs sürümü round(x)ile değiştirerek 3 bayt tasarruf edebilirsiniz2*x^0
user59178

2

Perl, 25 bayt

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

Kod 24 bayt + 1 bayt -pSeçenek .

Giriş, ayırıcılar olmadan stdin'de olmalıdır, örneğin:

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

İlk regexp ilk oyuncu kazancını, ikincisi de kaybını arar. Fark yazdırılır.


1

Scala, 148 bayt

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

Neyse ki, noktalı virgüllerin aynı satırda birden çok komutu ayırması gerektiğinden, Scala biçimlendirilebilir golf koduna sahip olmanın avantajlarından faydalanır!

Bu golf denemesinde yerini alabileceğinizi öğrendim.

"somestring".charAt(index) 

ile

"somestring"(index) 

Çünkü Scala, karakterleri elde etmek amacıyla dizeleri diziler olarak görmenizi sağlar.


Bu derece golf olabilir. Yeni başlayanlar için buradaki zorlukların çoğunda eksiksiz bir program yerine bir işlev yerine getirmenize izin verilir, bu nedenle tüm nesne yerine uygulama özelliğini genişletir ve argümanlardan çekerek, şöyle bir şey deneyin: def g (a: Seq, b: Seq) = ...
Ethan

Ek olarak, değeri yazdırmanıza gerek yoktur. Geri dönüş yeterlidir, bu Scala'da golf oynamak için harikadır, çünkü geri dönüş ücretsizdir. Ve Scala'da neredeyse aynı şekilde çalışan Groovy cevaplarında verilen numarayı kullanarak daha da geliştirebilirsiniz.
Ethan
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.