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
.Jawaban:
Groovy,
675650 BytesCobalah online!
Ternyata permainan rock, kertas, gunting memiliki properti yang cukup keren.
Diberikan string a dan b, ambil huruf pertama dari masing-masing, ini menghasilkan dua berikut:
R,P,S
Daftar lengkap dari nilai yang mungkin adalah (Ketika 2 pilihan digabungkan):
Mengatur ulang daftar ke:
Memberi kami urutan yang terlihat berbanding terbalik dengan sinusoidal, dan Anda benar-benar dapat mewakili rumus ini kira-kira (dan kira-kira maksud saya hanya cukup untuk bekerja, Anda bisa mendapatkan persamaan yang mati tetapi membutuhkan lebih banyak byte):
Penyederhanaan 4 / pi menjadi 1,3 disarankan pertama kali oleh @ flawr dan kemudian diuji oleh @titus untuk penghematan total 6 byte.
Menggunakan sifat pembulatan ganda groovy, ini menghasilkan output yang benar untuk batu-kertas-gunting.
05AB1E , 10 byte (tidak bersaing)
Cobalah online!
Jawaban yang sama porting ke 05AB1E menggunakan perintah baru yang ditambahkan 10/26/2017.
sumber
-sin(x) = sin(-x)
, itu berarti hanya membalik urutana
danb
dan menjatuhkan terkemuka-
? Selain itu, hardcoding perkiraan4/Pi
seperti1.273
bisa mencukupi, atau1.3
atau9/7
atau5/4
.sin(b-a)
alih - alih-sin(a-b)
. Great ditemukan!1.3
bukannya4/Math.PI
; itu cukup tepat.XX=ASCII=Y=Wanted output RR=82-82=0=0 PP=83-83=0=0 SS=80-80=0=0
C,
5035 bytePanggil
f
dengan string yang berisi kedua pemain, tanpa pemisah, dan itu akan mengembalikan apakah yang pertama menang.Penjelasan:
Dengan melihat sembilan string yang mungkin, ternyata pasangan surat pada kolom 7 dan 8 unik:
Pemain offset dan buas untuk
short*
mengambil pasangan surat ini, dan menafsirkannya sebagai angka:Maka itu adalah masalah kekerasan untuk menemukan
51
dan4
sisanya, yang diterapkan berturut-turut mengurangi angka-angka ini menjadi:Yang sempurna untuk memperbaiki sisa lain di akhir, dan mengimbangi hasilnya.
Lihat langsung di Coliru
sumber
-f(i)
untuk menghitung skor pemain lain - hasil yang tidak terduga akan dihasilkan!-(f(i))
seharusnya bekerja dengan baik. Makro itu menyenangkan!MATLAB / Oktaf ,
63 5452 byteSangat nyaman bahwa kode ASCII dari huruf pertama
Rock,Paper,Scissors
adalahR=82,P=80,S=83
. Jika kita mengurangi79
kita dengan mudah3,1,4
, yang akan kita gunakan sekarang sebagai indeks matriks: Di sini 4x4-matrix di-hardcode, di manai,j
entri-ke-1 sesuai dengan hasil jika Anda memasukkan nilai dari sebelumnya:Cobalah online!
sumber
Pure Bash, 31
Meminjam @ rumus Dennis :
Cobalah online .
Jawaban sebelumnya:
Pure Bash,
43354
,5
,8
masing-masing untuk Rock, Paper, Scissors)XOR masing-masing dengan 3 untuk memberikan
7
,6
,11
(yang ketika diambil mod 3 memberi1
,0
,2
)Kemudian kurangi dan mainkan dengan mod 3 untuk mendapatkan hasil yang diinginkan.
Cobalah online .
sumber
Python ,
4030 byteCobalah online!
Latar Belakang
Saya sudah mulai dengan templat fungsi
dan menjalankan pencarian brute-force untuk parameter yang sesuai menggunakan program berikut, lalu memilih satu dengan implementasi minimal-panjang.
Cobalah online!
sumber
Mathematica, 32 byte
Fungsi tanpa nama mengambil pasangan daftar karakter yang dipesan, seperti
{{"R","o","c","k"},{"P","a","p","e","r"}}
, dan kembali-1|0|1
.Saya ingin kode untuk menghindari tidak hanya tiga kata input, tetapi juga nama fungsi yang terlalu panjang
ToCharacterCode
; jadi saya bekerja dengan panjang4,5,8
kata-kata input sebagai gantinya, dan mencari fungsi pendek dari panjang yang memberikan jawaban yang berbeda modulo 3. (Divisi integer dengan 2 secara matematis menjanjikan, tetapi fungsi-fungsi tersebut memiliki nama terlalu panjang di Mathematica.)Ternyata mengambil faktorial (panjang - 3) memberikan jawaban
1,2,120
, yaitu1,-1,0
modulo 3. Kemudian kita hanya menghitung, modulo 3, perbedaan dua nilai (melalui produk titik{1,-1}.{x,y} = x-y
, yang merupakan cara yang baik ketika dua nilai ada dalam daftar).sumber
Ruby,
363530 byteCobalah di ideone.com
Output tes:
Mengambil keuntungan dari kenyataan bahwa 7 dari 9 hasil yang benar dihasilkan hanya dengan melakukan perbandingan leksikografis menggunakan operator pesawat ruang angkasa
<=>
. The(a+b)[12]
hanya membalikkan masukan untuk perbandingan jika inputPaper
danScissors
(dan jugaScissors
Scissors
- tapi itu0
baik cara putaran).Dengan terima kasih kepada Horváth Dávid karena telah menyelamatkan saya sebuah karakter, dan terima kasih kepada GB karena telah menyelamatkan saya 5 lagi.
sumber
Python ,
39363433 byteCobalah online!
Bagaimana itu bekerja
Mari kita lihat beberapa nilai dari panjang enam salinan x dan satu salinan y modulo 7 .
Kami dapat menyandikan hasil ( {-1, 0, 1} ) dengan memetakannya ke dalam set {0, 1, 2, 3} . Sebagai contoh, pemetaan t ↦ 2 - t mencapai ini dan merupakan kebalikannya sendiri.
Mari kita menyatakan hasil dari x dan y oleh o (x, y) . Kemudian:
Untungnya, bit-bit pada kolom terakhir semua setuju dengan satu sama lain, sehingga kita bisa OR mereka untuk membentuk satu bilangan bulat n dan mengambil o (x, y) sebagai 2 - ((n »o (x, y))% 4) . Nilai n adalah 94 .
sumber
Retina ,
3531 byteCobalah online!
Penjelasan
Ini bekerja dalam dua langkah. Pertama, kami mencetak tanda minus untuk input yang relevan. Kemudian kami mencetak
0
untuk ikatan dan1
sebaliknya.Ini dua tahap. Pada
)
tahap kedua mengelompokkan mereka bersama-sama,*
membuat mereka menjalankan kering (yang berarti string input akan dikembalikan setelah mereka diproses, tetapi hasilnya akan dicetak) dan\
menekan pencetakan dari linefeed baris tambahan. Dua tahap bersama-sama akan mencetak a-
jika berlaku.Tahap pertama adalah
G
tahap rep yang hanya membuat garis jika mengandung baikk P
,r S
ataus R
. Ini sesuai dengan kasus-kasus di mana kita perlu output-1
. Jika bukan salah satu dari kasus itu, input akan diganti dengan string kosong.Tahap kedua menggantikan
.+
(seluruh string, tetapi hanya jika mengandung setidaknya satu karakter) dengan-
. Jadi ini mencetak-
untuk tiga kasus dan tidak ada yang lain.Ini adalah dua tahap lagi. Tahap pertama adalah
D
eduplikasi. Ini cocok dengan kata-kata dan menghapus duplikat. Jadi jika dan hanya jika inputnya adalah seri, ini akan menghilangkan kata kedua.Tahap kedua menghitung jumlah kecocokan
.
, yang merupakan spasi diikuti oleh karakter apa pun. Jika input adalah seri, dan kata kedua telah dihapus, ini menghasilkan0
. Kalau tidak, kata kedua masih ada di tempatnya, dan ada satu yang cocok, jadi ia mencetaknya1
.sumber
05AB1E ,
181715109 byte6 byte disimpan dengan trik panjang input Trauma Digital
Mengambil input sebagai
[SecondPlayersChoice,FirstPlayersChoice]
Cobalah online! atau Validasi semua kasus uji
Alternatif solusi 9 byte:
íø¬ÇÆ>3%<
Penjelasan
Solusi 15 byte sebelumnya
Cobalah online! atau Validasi semua kasus uji
Penjelasan
sumber
Ç¥13T/*.½ò
MENGAPA BEKERJA? NOBODY TAHU.['R','P']
: P Ini port dari ini.Jelly , 8 byte
Cobalah online! (test suite, gips ke integer untuk kejelasan)
Bagaimana itu bekerja
sumber
Python 2 ,
4640 byteCobalah online!
Dengan banyak terima kasih kepada @ Dennis karena telah mengizinkan saya meminjam nya Cobalah kode tes online dan untuk menyelamatkan saya 6 byte.
Sunting
@ hashcode55 - Cukup banyak seperti yang Anda gambarkan. (x! = y, -1) adalah urutan dua elemen dan [x [0] + y [0] di'RPSR '] adalah menghitung elemen yang akan diambil. Jika huruf pertama x + huruf pertama y ada dalam daftar karakter maka akan bernilai True atau 1 sehingga (x! = Y, -1) [1] akan dikembalikan. Jika tidak maka (x! = Y, -1) [0]. Di sinilah agak sulit. Elemen pertama itu sendiri efektif jika. Jika x! = Y maka elemen pertama akan Benar jika tidak maka akan Salah jadi jika x [0] + y [0] dalam'RPSR 'salah maka Benar atau Salah akan dikembalikan tergantung pada apakah x == y. + Agak licik dan sekali lagi terima kasih kepada @Dennis untuk yang ini. X! = Y akan mengembalikan Benar Benar atau Salah. Kami memerlukan angka 1 atau 0. Saya masih tidak tahu bagaimana caranya tetapi tanda + melakukan konversi ini. Saya hanya dapat berasumsi bahwa dengan menggunakan operator matematika pada Benar / Salah itu memaksa untuk dilihat sebagai bilangan bulat yang setara. Jelas tanda + di depan -1 masih akan mengembalikan -1.
Semoga ini membantu!
sumber
(x!=y,-1)
ini berfungsi seperti jika, jika daftar menghasilkan true maka -1 lainx!=y
. Apa gunanya+
tanda itu? Sebuah sumber yang mendokumentasikan sintaks semacam ini akan sangat membantu!+
- dalam hal ini, itu merupakan nilai tambah yang tidak disadari, seperti+10
, dan pada dasarnya adalah cara singkat untuk mengonversi ke bilangan bulat.JavaScript (ES6),
4638 byteMemanfaatkan fakta bahwa Rock-Paper-Gunting adalah siklik. JavaScript tidak memiliki pesawat ruang angkasa atau operator ternary yang seimbang, jika tidak jawabannya adalah
(a,b)=>((b<=>'Rock')-(a<=>'Rock'))%%3
.Sunting: Disimpan 8 byte berkat @WashingtonGuedes.
sumber
MATL ,
1413 byteCobalah online! Atau verifikasi semua kasus uji .
Penjelasan
Jika kode ASCII dari huruf awal dari string pertama dikurangi dari yang dari string kedua kita mendapatkan nilai di kolom D di bawah ini. Mengambil modulo 5 memberikan nilai M . Nilai akhir dalam kurung adalah hasil yang diinginkan, R .
Jadi jika kita menghitung D dan kemudian M , untuk mendapatkan R kita hanya perlu memetakan 0 ke 0; 1 dan 2 hingga 1; 3 dan 4 hingga −1. Ini dapat dilakukan dengan mengindeks ke dalam array dari lima entri sama dengan 0, 1 atau −1. Karena pengindeksan dalam MATL adalah berbasis 1 dan modular, array harus
[1, 1, −1, −1, 0]
(entri pertama memiliki indeks 1, yang terakhir memiliki indeks 5 atau setara dengan 0). Akhirnya, operasi modulo 5 untungnya dapat dihindari, karena secara implisit dilakukan oleh pengindeksan modular.sumber
CJam , 12 byte
Kedua input dipisahkan oleh ruang. Urutan mereka dibalik sehubungan dengan itu dalam teks tantangan.
Cobalah online! Atau verifikasi semua kasus uji .
Penjelasan
Terjemahan dari jawaban MATL saya . Ini mengeksploitasi fakta bahwa dalam CJam
c
(convert to char) yang diterapkan pada string mengambil karakter pertamanya. Juga, array untuk pemetaan berbeda karena pengindeksan di CJam berbasis 0.sumber
CJam,
151412 byteAmbil kode ascii karakter terakhir dari setiap string, lalu kembalikan:
(a1 - a2 + 19) % 3 - 1
Uji di sini !
sumber
Python 3, 54 byte
Cobalah online!
sumber
Java 7, 82 byte
Tidak Disatukan:
Penjelasan:
o
,a
danc
, dengan desimal ASCII111
,97
dan99
.0
(Rock, Rock)14
(Batu, Kertas)12
(Kertas, Gunting)-14
(Kertas, Batu)0
(Kertas, Kertas)-2
(Kertas, Gunting)-2
(Gunting, Rock)2
(Gunting, Kertas)0
(Gunting, Gunting)4
,2
,-4
,-2
,-2
,2
.x
sekarang adalah yang berikut untuk kasus uji:2
dan-2
salah, dan seharusnya-1
dan1
sebaliknya. Jadi jikax%2 != x
(semuanya di atas1
atau di bawah-1
) kita bagi dengan-2
memperbaiki dua 'kasus tepi' ini.Kode uji:
Coba di sini.
Keluaran:
sumber
c
,p
,i
) dengan nilai ASCII99
,112
dan105
, karena mereka tampaknya paling berguna, dan melihat itu akan menjadi 4, 2, 0 jika aku modulo 5. Hanya kemudian kupikir aku harus mengurangi keduanya, sehingga 4, 2 dan 0 tidak banyak digunakan. Setelah beberapa berkeliaran / trial-and-error saya mencoba huruf kedua dan mendapatkan hasil yang lebih bermanfaat dengan modulo 5 yang sama masih ada. Kemudian saya dengan cepat sampai pada solusi yang saya sajikan di atas. :)dc, 18
Cobalah online .
Perhatikan bahwa kedua args diteruskan (dipisahkan spasi) pada satu baris ke STDIN. Args terkandung dalam tanda kurung siku
[ ]
karena ini adalah bagaimanadc
suka senar.dc
memiliki penanganan string yang sangat terbatas, tetapi ternyata salah satu hal yang dapat Anda lakukan adalah menggunakanZ
perintah untuk mendapatkan panjang string, yang untungnya berbeda untuk "Rock", "Paper" dan "Scissors", dan dapat dengan sederhana hanya secara aritmatika dimanipulasi untuk memberikan hasil yang diinginkan.sumber
PHP, 34 byte
sumber
Pyth, 16
Mungkin bisa lebih pendek.
Online .
sumber
C #,
8584 byteDisimpan 1 byte, terima kasih kepada TheLethalCoder
Ini menerima dua string sebagai input, dan output integer. Ada seri, jika kedua senar sama, jika tidak maka cek untuk karakter pertama dari string, untuk menentukan, pemain mana yang menang.
sumber
a=>b=>...
JavaScript,
37,32, 31 byteJika a sama dengan b, hasilkan nol.
Sebaliknya, untuk hasil pemeriksaan jika panjangnya tidak lebih dari 12 (perbandingan Gunting dan Kertas) dengan perbandingan lebih besar dari b.
Jika ini mengembalikan 1, kembalikan.
Jika mengembalikan 0, gunakan operator ATAU untuk mengganti dengan -1.
sumber
a=>b=>
untuk menyimpan byte?Batch, 116 byte
sumber
Perl, 33 byte
32 byte kode +
-p
bendera.Untuk menjalankannya:
Disimpan 3 byte dengan menggunakan regex jawaban Retina Martin Ender . (regex saya sebelumnya adalah
/R.*P|P.*S|S.*R/
)Penjelasan:
Pertama,
/(.+) \1/
periksa apakah input mengandung dua kali kata yang sama, jika demikian, hasilnya adalah0
. Kalau tidak,/k P|r S|s R/
berurusan dengan kasus di mana jawabannya-1
. Jika regex terakhir ini salah, maka-/k P|r S|s R/
itu salah, jadi kami kembali1
.sumber
Jelly , 9 byte
Ini menggunakan algoritma dari jawaban Bash @ DigitalTrauma .
Cobalah online!
Bagaimana itu bekerja
sumber
Japt , 19 byte
Coba di sini!
Terinspirasi oleh solusi carusocomputing
Solusi 53-byte lama
Cobalah online!
Terima kasih lagi, ETHproductions!
sumber
©
alih-alih&&
, mengubahUg0 c
toUg c
(sama denganV
) dan mengganti-1
denganJ
. Ini masih sedikit lebih lama daripada jawaban JS , mungkin Anda dapat mengambil beberapa ide dari itu©
W=Uc
. Saya tidak tahu mengapa saya terus lupa bahwa ituc
bekerja pada string apa pun: PPHP,
5553 byteversi sinus,
4946 bytepelabuhan golf jawaban carusocomputing :
3 byte disimpan oleh @ user59178
sumber
round(x)
dengan2*x^0
Perl, 25 byte
Kode 24 byte +1 byte untuk
-p
opsi.Masukan harus pada stdin tanpa pemisah, mis:
Regexp pertama mencari pemain pertama yang menang, yang kedua untuk kekalahannya. Perbedaannya dicetak.
sumber
Scala, 148 byte
Untungnya, karena titik koma diperlukan untuk memisahkan beberapa perintah pada baris yang sama, Scala mendapat manfaat dari memiliki kode golf yang dapat diformat!
Dalam upaya bermain golf ini saya belajar bahwa Anda dapat menggantikannya
dengan
karena Scala memungkinkan Anda memperlakukan string sebagai array untuk mendapatkan karakter.
sumber