Tulis sebuah program yang merupakan polyglot dalam tiga bahasa yang memainkan rock-paper-scissors .
Input untuk versi program apa pun selalu merupakan salah satu dari string rock
atau paper
atau scissors
.
Dalam bahasa pertama program harus menampilkan pilihan rock – paper – scissors yang mengalahkan input:
Input Output
rock paper
paper scissors
scissors rock
Dalam bahasa kedua program harus menampilkan pilihan rock – paper – scissors yang mengikat input:
Input Output
rock rock
paper paper
scissors scissors
Dalam bahasa ketiga program harus menampilkan pilihan rock-paper-scissors yang hilang dari input:
Input Output
rock scissors
paper rock
scissors paper
Kode terpendek dalam byte menang. Tiebreaker adalah jawaban dengan suara lebih tinggi.
Input dan / atau output secara opsional dapat memiliki trailing newline tetapi sebaliknya hanya berupa string rock
/ paper
/ scissors
. Anda dapat menggunakan huruf besar ROCK
, PAPER
, SCISSORS
jika diinginkan.
Anda tidak boleh menggunakan versi berbeda dari bahasa yang sama (mis. Python 2 dan 3).
Jawaban:
Python, brainfuck dan JavaScript,
10399 byte Yay di bawah 100 byte!Dalam Python, ini mendefinisikan fungsi yang mengalahkan input, di brainfuck itu hanya program kucing sederhana, dan dalam JavaScript itu hilang. Berikut adalah versi yang memberi nama fungsi
f
,, dan juga meminta input dalam JavaScript dan Python 3:Cobalah online (versi lama): Python , brainfuck , JavaScript
Penjelasan:
Dalam Python,
"""..."""
adalah string multiline, yang dapat digunakan sebagai token apa pun. Ketika ditempatkan berdiri sendiri itu tidak melakukan apa-apa sama sekali. Saya menggunakan ini untuk "menyembunyikan" kode JavaScript dari Python. Hal yang sama berlaku untuk(0,[.5,])
bit, itu hanya sebuah tuple yang berisi0
dan daftar5
, dan juga1//1
bagian,//
dalam Python adalah pembagian integer, tetapi memulai komentar dalam JavaScript. Berikut kode yang dilucuti dari token ini:Baris pertama cukup jelas, itu hanya mendefinisikan daftar
p
berisi pilihan yang berbeda di batu-kertas-gunting. Baris kedua mendefinisikan fungsi tanpa nama yang mengambil satu argumenx
,, dan memberikan kembali pilihan yang mengalahkanx
(mis. Elemen sebelumnyap
)Dalam JavaScript,
//
menunjukkan komentar satu baris. Mirip dengan Python, token tunggal diabaikan, jadi kode yang dilucuti dari token ini adalah:Ini bekerja mirip dengan Python, dengan terlebih dahulu mengatur daftar
p
untuk berisi pilihan dan kemudian mendefinisikan fungsi anonim yang memberikan pilihan yang hilang.-~x
sama sepertix+1
tetapi dengan diutamakan lebih tinggi sehingga saya dapat melewati parens.Di Brainfuck, setiap karakter kecuali
+-,.[]<>
dihapus, meninggalkan ini:Perintah
,
membaca satu byte input,.
mencetaknya dan[...]
loop sementara nilainya tidak nol. Apa yang dilakukan oleh program ini adalah membaca input dan mencetaknya satu karakter pada satu waktu sampai karakter\0
tersebut ditemukan. Karena kita tidak memilikinya dalam kode, kita dapat mengabaikan program lainnya. Akibatnya, ini hanya menggemakan kembali apa pun yang diketik pengguna, mengikat mereka secara efektif.sumber
x=>p[p.indexOf(x)+1]||"rock"//"""
dapat disingkat menjadix=>p[(p.indexOf(x)+1)%3]//"""
1//1,[.5,];
[]
di baris kedua untuk menghemat lebih banyak byte:1//1,;lambda x:p[p.index(x,0)+-1];"""
Python 2, Ruby, Retina,
9083 byte-7 byte berkat Value Ink
Cobalah secara Online: Python , Ruby , Retina
Menangkan di Ruby, kalah dalam Python, dan ikatan di Retina. Solusi ini memanfaatkan fakta yang
0
benar di Ruby tetapi falsey dengan Python. Itu juga menggunakan pengindeksan negatif di Python dan Ruby.sumber
and
memiliki operator lebih diutamakanor
, jadis.index(0and STDIN.gets or input())
berfungsi. Juga,gets
adalah alias untukSTDIN.gets
di Ruby.V, Brain-flak, dan Python 2,
97, 86, 81, 77, 75 byteDua byte disimpan berkat @ nmjcman101!
Ini sangat menyenangkan! Saya sangat suka jawaban ini karena ini adalah ikhtisar keren dari bahasa yang saya sukai: Editor favorit saya, bahasa non-esoterik favorit saya, dan bahasa yang saya tulis. (Secara teknis python 3 lebih baik, tetapi python 2 lebih golfier
¯\_(ツ)_/¯
).Cobalah online! dalam Python (sedikit dimodifikasi sehingga Anda dapat melihat output), yang mencetak apa yang hilang dari input.
Cobalah online! di Brain-Flak, yang mencetak apa yang terkait dengan input.
Cobalah online! dalam V, yang mencetak apa yang mengalahkan input.
Karena V bergantung pada karakter ASCII yang tidak dapat dicetak, berikut adalah hexdump:
Penjelasan:
Python
Dalam python, ini sangat mudah. Kami mendefinisikan daftar tiga elemen, dan mengembalikan elemen tepat sebelum input. Sejak
-1
mengembalikan elemen kembali, ini bekerja secara sirkuler, dan itu semua sangat mudah dan mudah. Kemudian, semuanya#
adalah komentar.Brain-Flak
Ini juga sangat mudah di otak-flak. Jika kita harus menang atau kalah, ini mungkin beberapa ratus byte. Tetapi ini sebenarnya bekerja dalam 0 byte. Pada awal program, semua input dimuat ke tumpukan. Pada akhir program, seluruh tumpukan dicetak secara implisit.
Setelah kita menghapus semua karakter yang tidak relevan, kode yang dilihat oleh brain-flak adalah
Yang hanya mengevaluasi
1 + -1
, tetapi karena nilai ini tidak digunakan sama sekali, itu adalah NOOP.V
Di sinilah agak aneh. Memberi nama daftar python
o
mungkin tampak sewenang-wenang, tetapi jelas tidak. Di V,o
buka baris baru, dan masukkan kami ke mode insert. Kemudian,dimasukkan ke dalam buffer. Setelah itu, kode yang relevan adalah:
Penjelasan:
sumber
.split()
lebih mudah untuk menyingkirkan berbagai kurung dan kutipan yang muncul dalam solusi Anda.xx
dan menggantinya dengan2
untuk membuat perintah2f'
karena='
akan dihapusd*
nanti. EDIT: Anda mungkin bisa membuatnyat.
?CJam , Retina , PHP,
928685 byteHarus dijalankan di PHP menggunakan
-r
flag.Cobalah di CJam
Cobalah di Retina
Coba di PHP
CJam
Dalam CJam, semua huruf kapital adalah variabel yang telah ditentukan. Pada baris pertama, banyak dari nilai-nilai ini didorong ke stack, bersama dengan beberapa string dan array literal. Beberapa peningkatan, penurunan, dan operasi lainnya dilakukan.
Setelah semua itu, tumpukan dibungkus dalam array (
]
) dan dibuang (;
), jadi tidak ada yang penting sama sekali. Program CJam utama adalah:Retina
Ini hampir terasa seperti selingkuh ...
Retina akan menggantikan setiap kecocokan dari regex
ECHO["rock",0,"scissors","paper"][ORD(READLINE())%4];
di input dengan#];"scissors paper rock"S/rci=
. Apapun regex ini cocok, tentu tidak cocok apa pun dirock
,paper
, atauscissors
, sehingga tidak ada substitusi dibuat. Input yang tidak dimodifikasi kemudian secara implisit dikeluarkan.PHP
Baris kedua adalah komentar, jadi itu diabaikan.
Baris pertama menggunakan algoritma yang sama dengan bagian CJam, tetapi dengan urutan hasil yang berbeda.
sumber
C, C ++, Python;
227226216 byteMenyimpan satu byte berkat @Mat!
Menentukan fungsi
f
dalam semua bahasa. Menang di C, mengikat Python, kalah dalam C ++. Seperti C ++ selalu / sBagian antara
/*
dan*/
adalah blok komentar di C dan C ++ sementara itu adalah fungsi lambda deklarasi di Python. Itu pada dasarnya membandingkan karakter pertama dari argumen fungsi dan mengembalikan langkah yang dimulai dengan huruf itu.Bagian antara
"""
s adalah string multiline dalam Python sementara itu adalah deklarasi fungsi di C dan C ++.sizeof'b'-1
mencari tahu apakah bahasa saat ini adalah C dari C ++. Ini memiliki nilai kebenaran jika ukurannya selain 1, nilai palsu sebaliknya. Dalam C karakter literal adalah tipe panjang 4-byte sementara di C ++ mereka adalah tipe byte tunggal. Kemudian setelah bahasanya diketahui, ia hanya melihat huruf pertama dari input dan output yang sesuai.C
Cobalah online!
C ++
Cobalah online!
Python
Cobalah online!
sumber
C ++, R, C;
252240226220209 byteMenggunakan perbedaan antara C dan C ++ bahwa ukuran literal karakter adalah 4 byte dalam C dan 1 byte dalam C ++.
C ++:
Cobalah online!
R:
Hasil:
C:
Cobalah online!
sumber
Gawk, Retina, Perl; 68 byte
(dengan baris baru di akhir)
Gawk (pemenang)
Beberapa sampah demi Perl, lalu ubah konten baris (
$_
, yang sama dengan$0
karena variabel_
tidak terdefinisi) tergantung pada apakah itu berisi ak
atau ac
, lalu cetak hasilnya. Abaikan peringatan tentang urutan pelarian, saya bermaksud melakukan itu.Retina (dasi)
Trik yang sama seperti Basic Sunset dan lainnya: ganti kecocokan dari beberapa regexp konyol di baris pertama dengan konten baris kedua, jadi teruskan inputnya.
Perl (pecundang)
Baca satu baris dan ubah menjadi huruf besar, lalu pilih kata berdasarkan huruf yang dikandungnya, dan cetak hasilnya. Langkah pertama dan terakhir dibungkus menggunakan
eval
untuk menyembunyikannya dari awk.Melongo, Retina,
perl -p
; 57 byteSaya memasukkan ini sebagai bonus karena saklar baris perintah
perl -p
seharusnya menjadi bagian dari program dengan aturan yang biasa di situs ini, yang akan membuatnya bukan polyglot.Lagi dengan baris baru terakhir untuk Retina . Kali ini, dengan
perl -p
untuk mencetak output secara otomatis, biaya overhead perl berkurang secara signifikan. Saya dapat membiarkan tugas$_
memicu cetakan tersirat dalam awk .sumber
perl -p
kosong, itu harus bug di TIO.> <>, Retina, Python 2:
144127123 byte1 byte disimpan berkat @Loovjo dengan menghapus spasi
4 byte disimpan berkat @ mbomb007 dengan menggunakan
input
sebagai gantinyaraw_input
Diposting di TNB sebagai tantangan , saya memutuskan untuk mencoba kombinasi bahasa ini.
> <>
Cobalah online!
IP mulai bergerak ke kanan.
Karakter yang mungkin akan dimasukkan ke dalam input adalah
PRS
(karena program hanya mengambil karakter pertama). Nilai ASCII mereka adalah80
,81
dan82
.Jika inputnya rock, maka inilah yang akan terjadi:
Jika tidak, jika inputnya adalah
SCISSORS
atauPAPER
, inilah yang akan dijumpai oleh IP:Jika inputnya adalah
PAPER
, maka:Kalau tidak (jika inputnya
SCISSORS
):Retina
Cobalah online!
Dalam hal ini, Retina menganggap setiap pasangan dari dua garis sebagai pasangan yang cocok dan pengganti. Misalnya, ia mencoba mengganti apa pun yang cocok dengan baris pertama dengan baris kedua, tetapi karena baris pertama tidak pernah cocok, itu tidak pernah menggantikannya dengan apa pun, sehingga menjaga input.
Python 2
Cobalah online!
Program Python membutuhkan input untuk diletakkan di antara
"
s.Dua baris pertama adalah komentar dalam Python.
sumber
print
di baris terakhir diperlukan.input()
bukanraw_input()
.Ruby, Clojure, Common Lisp - 251 bytes
Versi yang lebih mudah dibaca dengan spasi putih:
Clojure selalu menang, Ruby selalu imbang, Common Lisp selalu kalah.
Untuk Ruby, semua yang ada di dalam
'
adalah string. Itu membentang di dua baris. Kemudian ia menggunakan[]
operator dengan argumen string yang mengembalikan string itu sendiri jika ada dalam string. Hasilnya dicetak, Ruby hanya mencerminkan input.Baris kedua adalah komentar untuk Clojure dan Common Lisp. Banyak
eval
danquote
harus digunakan karena Clojure perlu memastikan bahwa semua simbol valid. Akan lebih baik untuk menggunakan kembali kode lebih tetapinth
fungsi bahkan memiliki tanda tangan yang berbeda dalam bahasa ini. Pada dasarnya untuk Clojureif()
mengevaluasi ke true dan pergi ke cabang pertama ketika peta hash dari varian yang mungkin disebut dengan argumen dibaca dari stdin. Lisp umum pergi ke cabang kedua, ia menemukan posisi argumen dari stdin dalam daftar dan mengembalikan item yang sesuai dari daftar yang dihasilkan.Saya kira bagian Common Lisp dapat golf lebih banyak.
Lihat online: Ruby , Common Lisp , Clojure
sumber
Scala, Javascript dan Ook, 167 byte
Coba di Scala Coba di Javascript Coba versi brainfuck dari Ook
Scala - menang
Javascript - kehilangan
Ook! - ikatan
Bagian Ook adalah program kucing brainfuck sederhana yang
,[.,]
ditranslasikan ke Ook.sumber
a[(a.indexOf(s)+2)%3]
maka Anda tidak perlu mengatura[-1]="rock"
. Juga, tidak bisakah Anda memasukkan kode Ook ke dalam string JavaScript juga?