Ini adalah permainan tiga pemain, bermain dengan satu tangan.
Pada saat yang sama, setiap pemain menunjukkan tangannya dengan 0 hingga 5 jari terulur.
Jika semua pemain menunjukkan nomor (bahkan atau ganjil) yang sama, tidak ada pemenang. Tapi yang lain, pemain yang berbeda menunjukkan dua kemenangan lainnya.
P l a y e r s
A B C Winner
Even Even Even No winner
Odd Odd Odd No winner
Even Odd Odd Player A
Odd Even Even Player A
Even Odd Even Player B
Odd Even Odd Player B
Odd Odd Even Player C
Even Even Odd Player C
Alat yang diminta dapat menggunakan argumen (3 argumen sebagai angka antara 0 dan 5) atau STDIN (3 nilai per baris, dipisahkan oleh spasi).
Tidak perlu memeriksa input: Input tidak teratur dapat menghasilkan output yang tidak terduga.
Argumen atau nilai-nilai pada baris diberikan dari kiri ke kanan, dari pemain A ke pemain C .
Output hanya boleh berisi A
, B
atau C
(dikapitalisasi) atau string no one
(dalam huruf kecil, dengan ruang reguler).
Alat dapat berfungsi hanya sekali atau sebagai filter pada semua jalur input.
Kemenangan kode terpendek.
Jawaban:
APL (
3430)Penjelasan:
2|⎕
: baca sebaris input, ambil mod-2 dari setiap angka (berikan daftar, mis.1 0 1
)∘.=⍨
: membandingkan setiap elemen dalam vektor dengan setiap elemen dalam vektor, memberikan matriks+/
: jumlah baris dari matriks, memberi untuk setiap elemen berapa banyak elemen itu sama dengan. Jika ada dua yang sama dan satu berbeda, kita sekarang memiliki vektor seperti di2 1 2
mana1
menunjukkan yang berbeda. Jika semuanya sama, kita dapatkan3 3 3
.1⍳⍨
: temukan posisi1
. Jika tidak ada1
, ini mengembalikan satu lebih dari panjang vektor, dalam hal ini4
.⊃'ABC',⊂'no one'
: tampilkan string pada indeks yang diberikan.sumber
Mathematica,
45 43 4241 karakterContoh:
Solusi lain dengan
4342 karakter:sumber
Powershell, 65
sumber
Befunge-98,
61 5045 karakterMenggunakan ekspresi pintar Fors untuk memangkas beberapa karakter lagi. Sekarang single-line (yaitu Unefunge-compatible)! Dibaca sampai permainan dimenangkan; tambahkan
@
di akhir untuk program sekali pakai.Memperlakukan input mod 2 sebagai angka biner, seperti dengan jawaban JS saya, kemudian bergantung pada pencarian untuk AC dan jatuh kembali ke 'tidak ada' jika di luar batas (dengan menguji apakah karakternya ≥'A ', yang memungkinkan saya untuk menggunakan kode terdekat sebagai data: D).Variasi yang membaca baris input, menghasilkan output, membaca baris input baru, dll hingga permainan diputuskan (yaitu bukan 'tidak ada'):
sumber
APL, 30
Jika saya diizinkan mengubah variabel sistem dengan konfigurasi, 2 karakter dapat dicukur habis. (Secara khusus, mengubah indeks asal
⎕IO
ke 0)Yang krusial
Jika kita mewakili semua peluang dengan cara yang sama dan semua dengan cara yang sama, maka operasi kesetaraan pasangan-bijaksana dapat membedakan semua 4 kasus:
0 0
untuk B menang,0 1
untuk A menang, dll.Penjelasan
2|⎕
Mengambil input dan mod 22=/
Kesetaraan berpasangan1+
Tambahkan 1 untuk pengindeksan (array APL secara default adalah 1)'BA'('C',⊂'no one')
Array bersarang Memilih⊃
elemen yang benar dari array bersarangsumber
C: 88 karakter
Sayangnya C, seperti biasa, membutuhkan cukup banyak sampah yang tidak perlu. Tapi tetap saja, dalam bahasa apa orang bisa menulis
=**++b+**(++
dan itu sebenarnya berarti sesuatu? Cukup agung.Cukup berikan tiga angka sebagai argumen, dan voila!
sumber
*b[1]
dll tanpa perbedaan ukuran (meskipun beberapa kehilangan keanggunan .. :()s = "=**++b+**(++"
P dalam keseriusan, wow, bagaimana itu ... bagaimana itu bekerja? : Ob
, dan cukup cetak kondisinya, Anda harus bisa mengetahuinya. : D (pena dan kertas juga membantu, untuk tabel kebenaran yang dihasilkan)GolfScript (31 karakter)
Logika yang sangat sederhana: kurangi input modulo 2, lalu urutkan salinan. Item tengah dari array yang diurutkan adalah dalam mayoritas, jadi cari indeks yang berbeda (dan karenanya dalam minoritas).
sumber
Ruby (badan fungsi), 42 karakter
Dengan asumsi 3 argumen numerik
a
,b
danc
:Ruby (alat baris perintah), 61 karakter
Versi 1 hadir di 62 karakter:
Tapi, dengan membonceng jawaban Darren Stone , Versi 2 turun menjadi 61 karakter:
sumber
Ruby, 61 karakter
sumber
['no one',?C,?B,?A]
==%w(no\ one C B A)
(2 karakter tersimpan).JavaScript (simpul), 87 karakter
Untuk mendapatkan bola bergulir ... mengharapkan input sebagai tiga argumen tambahan. Manfaatkan pola berikut untuk input / output (
/
mewakili "tidak ada"):sumber
GolfScript,
363533 karakterMengambil input seperti yang dijelaskan dari STDIN. Anda juga dapat menguji kode secara online .
sumber
Perl, 84 karakter.
<>=~/(\d)/g
mem-parsing garis input menjadi digit yang berbedamap{$_%2
mengambil daftar ini dan menghitung nilai mod 2 (genap atau ganjil)oct"0b".join"",
mengambil daftar nilai mod ini, menggabungkannya menjadi string, menambahkan specifier oktal, dan mengubah string menjadi angka.Pada dasarnya apa yang saya lakukan adalah membuat tabel kebenaran, dan kemudian dengan hati-hati memesannya kembali sehingga saya memiliki operasi inversi
$x == 4
. Jadi jika$x >=4
, kami melakukan inversi[$x>=4?7-$x:$x]
yang kami gunakan untuk mengindeks ke dalam array('no one','C','B','A')
Ini bukan kode terpendek yang mungkin, tetapi sebenarnya bukan derau baris ... yang luar biasa dalam dirinya sendiri.
Perl: 74 karakter + 3 bendera = 77, jalankan dengan
perl -anE '(code)'
Ini adalah peningkatan, dengan memanfaatkan autosplit (the -a), katakan (the -E), dan akhirnya mencari tahu apa yang salah dengan perbandingan.
sumber
>=4
bukannya sederhana>3
? +1 untuk kiat yang'0b'.
tidak saya ketahui sebelumnyaCommon Lisp,
114 10670 karakterDari ketiga nilai tersebut, buat pasangan yang mewakili perbedaan paritas antara elemen yang berdekatan. Perlakukan itu sebagai nomor biner untuk diindeks ke dalam daftar hasil.
Algoritma yang lebih lama:
sumber
Python 2, 54
sumber
Mathematica
100 9489Testing
sumber
Haskell, 97
sumber
R 67
sumber
/usr/bin/R
) then enter the code above.scan()
is what will prompt you for the input: an example would be to type1[space]3[space]5[space][enter][enter]
and you will see the corresponding output (here,no one
) printed to the screen. You can download R here: cran.r-project.org/mirrors.htmlC, 85 chars
Not as short as my Ruby answer but I'm happy with it, considering the
main
cruft.sumber
Fish - 41
Stole FireFly's befunge answer and ported it to fish because using registers in fish allows us to shave off some characters. Lost a few characters on not having the horizontal if operator though.
This takes parameters in through arguments.
sumber
#@...<
at the end to save a char. Oh, and your current code looks like 42 chars to me, so decrement that char-count of yours. :)Smalltalk, 128 characters
send
value:
with a collectionsumber
JavaScript (ES6) / CoffeeScript, 50 bytes
Uses the truth table as per Firefly's answer but takes a more direct approach in character access:
Demo
sumber
Python 3, 115
sumber
Python 3, 114
sumber
Two different method in two different languages + variations -> 6 answers
There are essentially 2 way for this operation:
array
based: Built a binary number of 3 digit, than take answer from an arraycount
based: Count even and odd, and look if there is acount == 1
Perl 71 (array based + variation)
One of my shortest perl:
s/(.)\s*/$1&1/eg;
transform a string like1 2 3
into101
$==oct"0b".$_;
transform binary to oct (same as dec, under 8)$==$=>3?7-$=:$=;
if> 3
oper7-
. (From thereno one
== 0)say$=?chr 68-$=:"no one"
if not0
, print char from value, else printno one
.Perl 71 (array based)
slightly different in the print step: The output is based on an 'array'.
Perl 81 (count based)
Different meaning:
$c=A
Initialise a counter c withA
.map{$a[$_%2]=$c++;$b[$_%2]++}split
Counter b count even and odd, a only store which onesay$b[0]==1?$a[0]:
if even counter == 1 ? also print even player.$b[0]==2?$a[1]:
if even counter == 2 ? also print odd player.:"no one"
else printno one
.Bash 85 (array based)
This is based on my second perl version:
c=$((($1%2)<<2|($2&1)*2+($3%2)))
make the index pos.mod
and
*4
<<1
.((c>3))&&c=$((7-c))
if c >= 4 then c = 7-c.o=()
declare an arrayecho ${o[c]}
based on arrayBash 133 (count based)
a[$1&1]=A;a[$2&1]=B;a[$3&1]=C
store player into variable a[even] and a[odd]((b[$1&1]++));((b[$2&1]++));((b[$3&1]++))
count even/odd into b.case $b in 1) echo ${a[0]}
in case even counter==1 print even player2)echo ${a[1]};;
case even counter==2 print odd player*)echo no one;esac
else printno one
.Bash 133 (count based)
Same version, using bash's condition and command group instead of
case ... esac
sumber
Game Maker Language, 116
My new answer relies heavily on FireFly's formula:
The old code compiled with uninitialized variables as 0, 183 characters:
Edit #1 - Whole different code
sumber
Clojure, 116
sumber
vba, 116
call with
?z(1,2,3)
or assign to a variable withq=z(1,2,3)
, or even use as a UDF within excel, and use=z(1,2,3)
in your excel formulasumber
Python 3, 80 chars
Note: input must be '1' [odd] or '0' [even]. For example:
sumber
split
andjoin
so you can still use your (very smart)int(...input...)
idea. ?'0b'+
I think, at least it looks redundant to me, and justint(input(),2)
seems to work in a REPL.Java, 226 chars
sumber
C
10196C, probably the most trivial example (some ternary operations):
sumber