ロック、ポリグロット、はさみ


68

じゃんけんをする3言語の多言語のプログラムを作成します。

プログラムの任意のバージョンの入力は、常に文字列rockまたはpaperorのいずれかscissorsです。

最初の言語では、プログラムは入力に勝るじゃんけんの選択肢を出力する必要があります。

Input     Output
rock      paper
paper     scissors
scissors  rock

第2言語では、プログラムは入力を結び付けるじゃんけんの選択肢を出力する必要があります。

Input     Output
rock      rock
paper     paper
scissors  scissors

第3言語では、プログラムは入力に負けたじゃんけんの選択肢を出力する必要があります。

Input     Output
rock      scissors
paper     rock
scissors  paper

バイト単位の最短コードが優先されます。Tiebreakerは、より高い投票率の回答です。

入力および/または出力にはオプションで末尾の改行を含めることができますが、それ以外の場合はプレーンrock/ paper/ scissors文字列のみにする必要があります。必要に応じて、大文字ROCK、を使用できます。PAPERSCISSORS

同じ言語の異なるバージョン(Python 2と3など)を使用することはできません


言語エラーを終了することはできますか?
KritixiのLithos

2
@KritixiLithos メタコンセンサスに進みます。「エラーまたはキャッチされなかった例外で終了することは、STDOUTへの浮遊出力を生成しない限り、ここで問題ないと思います。」
カルビンの趣味

2
ポリグロットについては決して確信が持てませんが、異なる言語は異なる方法で入力を取得できますか?
ジョナサンアラン

3
@JonathanAllan大丈夫です。特定の形式の入力のみを持つ一部の言語セットでは、それが必要になります。
カルビンの趣味

トカゲ、スポックはどうなりましたか?bigbangtheory.wikia.com/wiki/Rock_Paper_Scissors_Lizard_Spock
Ole

回答:


60

Python、brainfuck、JavaScript、103 99バイト100バイト未満です!

0,[.5,];p=["rock","scissors","paper"]
1//1;lambda x:p[p.index(x)-1];"""
x=>p[-~p.indexOf(x)%3]//"""

Pythonでは、これは入力に勝る関数を定義し、brainfuckでは単なる猫プログラムであり、JavaScriptでは失われます。以下に、関数に名前f、およびJavaScriptとPython 3での入力を求めるプロンプトを表示するバージョンを示します。

0,[.5,];p=["rock","scissors","paper"]
1//1;f=lambda x:p[p.index(x)-1];"""
f=x=>p[-~p.indexOf(x)%3]//"""

1//1;"""
console.log(f(prompt())) // JavaScript
1//1"""; print(f(input())) # Python

オンラインで試す(古いバージョン):PythonbrainfuckJavaScript

説明:

Pythonでは"""..."""、複数行の文字列で、任意のトークンとして使用できます。スタンドアロンに配置すると、何も実行されません。これを使用して、JavaScriptコードをPythonから「非表示」にします。同じことは(0,[.5,])ビットにも当てはまります。これは、0とのリストを含むタプルであり、Python 51//1一部も//整数除算ですが、JavaScriptでコメントを開始します。これらのトークンを取り除いたコードは次のとおりです。

p=["rock","scissors","paper"]
lambda x:p[p.index(x)-1]

最初の行はp一目瞭然です。じゃんけんのさまざまな選択肢を含むリストを定義するだけです。2行目は、名前のない関数を定義します。この関数は、1つの引数を取りx、勝つ選択肢を返しますx(例:の前の要素p


JavaScriptでは//、単一行のコメントを示します。Pythonと同様に、単一のトークンは無視されるため、これらのトークンを取り除いたコードは次のとおりです。

p=["rock","scissors","paper"]
x=>p[-~p.indexOf(x)%3]

これは、最初にp選択肢を含むようにリストを設定し、次に選択肢を失う匿名関数を定義することにより、Pythonと同様に機能します。-~xと同じx+1ですが、優先順位が高いため、括弧をスキップできます。


Brainfuckでは、以下を除くすべてのキャラクター+-,.[]<>が削除されます。

,[.,][,,]
[.-]
>[-.]

このコマンドは、,1バイトの入力を読み取り、.それを出力して[...]、値がゼロ以外の間ループします。このプログラムは、入力を読み取り、文字\0が見つかるまで一度に1文字ずつ印刷します。コードにはそれがないため、プログラムの残りの部分は無視できます。実際には、これはユーザーが入力した内容をエコーバックし、効果的に結び付けます。


非常に似たソリューション取り組んでいましたが、あなたは私にそれを打ち負かしました:)。Javascript TIOリンクを更新する必要がありますが、他の2つとは異なります。
-DimP

2
x=>p[p.indexOf(x)+1]||"rock"//"""短縮できますx=>p[(p.indexOf(x)+1)%3]//"""
ルーク

13
+1 Brainfuckがそれほど隠されているのを見たことがない。通常、ポリグロットにもBFが含まれているかどうかは明らかです。これじゃない!
-vsz

BFプログラムを少し動かして1//1,[.5,];
1〜2

実際、[]2行目にある既存のものを使用して、より多くのバイトを節約できると思います。1//1,;lambda x:p[p.index(x,0)+-1];"""
ETHproductions

40

Python 2、Ruby、Retina、90 83バイト

値インクのおかげで-7バイト

s=['rock','paper','scissors']
print s[s.index((0and gets or input()))+(0and-2or-1)]

オンラインで試す:PythonRubyRetina

Rubyで勝ち、Pythonで敗れ、Retinaで結びつきます。このソリューションは0、Rubyでは真実だがPythonでは偽であるという事実を利用しています。また、PythonとRubyの両方で負のインデックスを使用します。


and演算子の優先順位はに優先するorため、s.index(0and STDIN.gets or input())動作します。また、RubyのgetsエイリアスですSTDIN.gets
バリューインク

10
さまざまな方法でコードをコメントアウトするだけでなく、+ 1
レオ

@ValueInkありがとうございます!私はRubyで入力を取得するために、より簡潔な方法でなければならなかった、それがあったが判明考え出し
数学中毒

21

V、脳FLAK、及びパイソン2、97、86、81、77、75のバイト

o='rock paper scissors'.split()
lambda s:o[o.index(s)-1]#ddt.C rHd*wywVp

@ nmjcman101のおかげで2バイト節約できました!

これはとても楽しかったです!お気に入りのエディター、お気に入りの非難解な言語、自分が書いた言語など、私が好きな言語の概要がクールだからです。(技術的にはpython 3のほうが優れていますが、python 2はゴルファーです¯\_(ツ)_/¯)。

オンラインでお試しください!Pythonで(出力が見えるように少し変更されています)、入力に失われたものを出力します。

オンラインでお試しください!Brain-Flakで、入力に関係するものを出力します。

オンラインでお試しください!Vでは、入力に勝るものを印刷します。

Vは印刷できないASCII文字に依存しているため、ここにhexdumpがあります。

00000000: 6f3d 2772 6f63 6b20 7061 7065 7220 7363  o='rock paper sc
00000010: 6973 736f 7273 272e 7370 6c69 7428 290a  issors'.split().
00000020: 6c61 6d62 6461 2073 3a6f 5b6f 2e69 6e64  lambda s:o[o.ind
00000030: 6578 2873 292d 315d 231b 6464 742e 4320  ex(s)-1]#.ddt.C 
00000040: 720e 1b48 642a 7779 7756 70              r..Hd*wywVp

説明:

Python

Pythonでは、これは非常に簡単です。3つの要素のリストを定義し、入力の直前に要素を返します。-1back要素を返すので、これは循環的に機能し、すべて非常に簡単で簡単です。それ以降#はすべてコメントです。

Brain-Flak

これはブレインフラックで非常に簡単です。勝ち負けをしなければならないとしたら、これはおそらく数百バイトになります。しかし、これは実際には0バイトで機能します。プログラムの開始時に、すべての入力がスタックにロードされます。プログラムの最後に、スタック全体が暗黙的に印刷されます。

無関係な文字をすべて削除すると、頭脳が見るコードは

()[()]

これは単にに評価され1 + -1ますが、この値はまったく使用されないため、NOOPです。

V

ここで少し奇妙になります。Pythonリストに名前を付けるoことはarbitrary意的に思えるかもしれませんが、間違いではありません。Vではo、改行を開き、挿入モードにします。次に、

='rock paper scissors'.split()
lambda s:o[o.index(s)-1]#

バッファに挿入されます。その後、関連するコードは次のとおりです。

<esc>ddxxf'C r<C-n><esc>Hd*wywVp

説明:

<esc>                          " Return to normal mode
     dd                        " Delete this line. Now the cursor is on '='
       t.                      " Move the cursor forward to the "'"
         C                     " Delete everything after the "'", and enter insert mode
           r                   " From insert mode, enter '<space>r'
            <C-n>              " Autocomplete the current word based on what is currently in the buffer
                               " Since only one word starts with 'r', this will insert 'rock'
                 <esc>         " Leave back to normal mode
                      H        " Go to the first line (where the input is)
                       d*      " Delete everything up until the next occurence of the input
                         w     " Move forward one word
                          yw   " Yank the word under the cursor
                            Vp " And paste that word over the current line, delete everything else

@WheatWizard Pythonには、同じ理由はありません(同じ長さであることを除く)。しかし、それは遺跡のすべて V.中
DJMcMayhem

@WheatWizard Cause Vは本当に奇妙な言語であり、これは本当に奇妙なタスクです。すべてが文字のレイアウトに大きく依存している.split()ため、ソリューションに現れるさまざまな括弧や引用符を簡単に削除できます。
DJMcMayhem

スーパーマイナーですが、とにかく後で削除されるので、コマンドを作成するxxためにそれを取り出して置き換えることができます。編集:あなたはそれを作ることができるかもしれません?22f'='d*t.
nmjcman101

@ nmjcman101うーん、甘い、素晴らしいアイデア。ヒントをありがとう!
DJMcMayhem

16

CJamRetina、PHP、92 86 85バイト

ECHO["rock",0,"scissors","paper"][ORD(READLINE())%4];
#];"scissors  paper rock"S/rci=

-rフラグを使用してPHPで実行する必要があります。

CJamでお試しください

Retinaでお試しください

PHPで試してください

CJam

CJamでは、大文字はすべて事前定義された変数です。最初の行では、これらの値の多くが、いくつかの文字列および配列リテラルとともにスタックにプッシュされます。いくつかの増分、減分、およびその他の操作が実行されます。

その後、スタックは配列(])にラップされて破棄(;)されるため、他の要素はまったく関係ありません。メインのCJamプログラムは次のとおりです。

"scissors  paper rock"S/rci=

"scissors  paper rock"        e# Push this string
                      S/      e# Split it on spaces
                        r     e# Read the input
                         c    e# Cast to char (returns the first character in the string)
                          i   e# Cast to int (its codepoint)
                           =  e# Get the index of the split array (CJam has modular arrays)

網膜

これはほとんど不正行為のように感じます...

RetinaはECHO["rock",0,"scissors","paper"][ORD(READLINE())%4];、入力内の正規表現の一致をで置き換えます#];"scissors paper rock"S/rci=。何であれ、この正規表現マッチ、それは確かに何も一致していないrockpaperまたはscissors、そう何の置換は行われません。変更されていない入力は、暗黙的に出力されます。

PHP

2行目はコメントなので、無視されます。

最初の行は、CJamパーツと同じアルゴリズムを使用しますが、結果の順序は異なります。


1
TIL PHP関数は大文字と小文字を区別しません。
-gcampbell

14

C、C ++、Python; 227の 226 216バイト

@Matのおかげで1バイト節約できました!

#include<stdio.h>/*
f=lambda a:"rock"if a[0]=="r"else"paper"if a[0]=="p"else"scissors"
"""*/
int f(char*b){puts(sizeof'b'-1?*b=='r'?"paper":*b=='s'?"rock":"scissors":*b=='r'?"scissors":*b=='s'?"paper":"rock");}
//"""

fすべての言語で関数を定義します。Cで勝ち、Pythonで結びつき、C ++で負けます。C ++が常に/ sを行うように

間の部分/**/、それはPythonでラムダ関数の宣言だしながら、CおよびC ++でのコメントブロックです。基本的に関数引数の最初の文字を比較し、その文字で始まる移動を返します。

"""sの間の部分はPythonの複数行の文字列ですが、CとC ++の両方の関数宣言です。sizeof'b'-1現在の言語がC of C ++であるかどうかを調べます。サイズが1以外の場合は真の値、それ以外の場合は偽の値になります。Cでは、文字リテラルは4バイトのlong型ですが、C ++では、シングルバイト型です。次に、言語が特定された後、入力の最初の文字を見て、それに応じて出力します。

C

オンラインでお試しください!

C ++

オンラインでお試しください!

Python

オンラインでお試しください!


4
「「」の間の部分はPythonのコメントブロックです」実際には複数行の文字列です。
ivzem17年

10

C ++、R、C; 252の 240 226 220 209バイト

#define b/*
M=function()cat(readline())
#*/
#import<stdio.h>
#define M()main(){int i=0;char t[9];char*u;char*s[]={"rock","paper","scissors"};scanf("%s",t);for(;*t-*s[i++];);puts(s[(i+=sizeof('a')==1)%3]);}
M()

文字リテラルのサイズがCでは4バイト、C ++では1バイトであるというCとC ++の違いを利用します。

C ++:

オンラインでお試しください!

R:

結果:

> #define b/*
> M=function()cat(readline())
> #*/
> #import<stdio.h>
> #define M()main(){int i=0;char t[9];char*u;char*s[]={"rock","paper","scissors"};scanf("%s",t);for(;*t-*s[i++];);puts(s[(i+=sizeof('a')==1)%3]);}
> M()
rock
rock

C:

オンラインでお試しください!


8

Gawk、Retina、Perl; 68バイト

{eval"\$_=uc<>"}{$_=/[Sk]/?"paper":/[Pc]/?"rock":"scissors"}{print}

(最後に改行がある)

Gawk(勝者)

Perlのためにいくつかのジャンク、次にa またはa が含まれているかどうかに応じて行の内容(変数は未定義であるため$_と同じです)を変更し、結果を出力します。エスケープシーケンスに関する警告は無視してください。$0_kc

{a_string_that_is_ignored}
{$_ = /[Sk]/ ? "paper" : /[Pc]/ ? "rock" : "scissors"}
{print}

網膜(ネクタイ)

Basic Sunsetなどと同じトリック:最初の行のいくつかの愚かな正規表現の一致を2番目の行の内容で置き換えるので、入力を渡します。

Perl(敗者)

行を読み取って大文字に変換し、それに含まれる文字に基づいて単語を選択し、結果を出力します。最初と最後のステップはeval、awkから隠すためにラップされています。

$_ = uc <>;
$_ = /[Sk]/ ? "paper" : /[Pc]/ ? "rock" : "scissors";
print $_

gawkは、網膜、perl -p。57バイト

コマンドラインスイッチはperl -p、このサイトの通常のルールによってプログラムの一部であると想定されているため、これをボーナスとして入力しています。

{eval"\$_=uc"}$_=/[Sk]/?"paper":/[Pc]/?"rock":"scissors"

再びRetinaの最終改行を使用します。今回perl -pは、出力を自動的に印刷するため、perlのオーバーヘッドが大幅に削減されます。割り当て$_awkの暗黙的な印刷をトリガーさせることができます。


おそらくそれらのそれぞれにTIOリンク(またはテストする同様のオンラインコンパイラ)を追加できますか?
ケビンCruijssen

@KevinCruijssenが追加されました。TIOの出力perl -pは空です。TIOのバグである必要があります。
ジル

7

> <>、Retina、Python 2:144 127 123バイト

スペースを削除することで@Loovjoのおかげで1バイト節約

@ mbomb007のおかげで、input代わりにraw_input

#v"PAPER"v?%4-2{"SCISSORS"v?%2:i
#>ooooo; >oooooooo<"ROCK"~<
a="KRS".index(input()[-1])
print["SCISSORS","ROCK","PAPER"][a]

TNBに課題として投稿し、この言語の組み合わせを試してみることにしました。

> <>

オンラインでお試しください!

IPは右に移動し始めます。

#                      Reflect the IP so that it now moves left and it wraps around the grid
i:                     Take one character as input and duplicate it

入力に使用できる文字は次のとおりですPRS(プログラムは最初の文字のみを使用するため)。それらのASCII値は8081および82です。

2%                     Take the modulo 2 of the character. Yields 0, 1, 0 for P, R, S respectively
?v                     If this value is non-zero (ie the input was ROCK), go down, otherwise skip this instruction

入力がロックである場合、これは何が起こるかです:

<                      Start moving to the left
~                      Pop the top most value on the stack (which is the original value of R and not the duplicate)
"KCOR"                 Push these characters onto the stack
<                      Move left
oooo                   Output "ROCK" as characters (in turn these characters are popped)
o                      Pop the top value on the stack and output it; but since the stack is empty, the program errors out and exits promptly.

それ以外の場合、入力がSCISSORSまたはの場合PAPER、これはIPが遭遇することです。

"SROSSICS"             Push these characters onto the stack
{                      Shift the stack, so the the original value of the first char of the input would come to the top
2-4%                   Subtract 2 and take modulo 4 of the ASCII-value (yields 2, 0 for P, S respectively)
?v                     If it is non-zero, go down, otherwise skip this instruction

入力がの場合PAPER

>ooooooooo             Output all characters on the stack (ie "SCISSORS")
<                      Start moving left
o                      Pop a value on the stack and output it; since the stack is empty, this gives an error and the program exits.

それ以外の場合(入力がの場合SCISSORS):

"REPAP"                Push these characters onto the stack
v>ooooo;               Output them and exit the program (without any errors).

網膜

オンラインでお試しください!

この場合、Retinaは2行の各ペアを一致と置換のペアと見なします。たとえば、最初の行に一致するものはすべて2番目の行に置き換えようとしますが、最初の行が一致することはないため、何にも置換されないため、入力は保持されます。

Python 2

オンラインでお試しください!

Pythonプログラムでは、入力を"sの間に入れる必要があります。

最初の2行はPythonのコメントです。

a="KRS".index(input()[-1])             # Get the index of the last character of the input in "KRS"
print["SCISSORS","ROCK","PAPER"][a]    # Print the ath index of that array

print最後の行の後のスペースは必要ないと思います。
-Loovjo

input()代わりに使用できますraw_input()
mbomb007

@Loovjoヒントをありがとう:)
Kritixi Lithos

動作していないよう@ mbomb007
KritixiのLithos

Pythonの部分は引用符で入力を取る場合、それは動作します@KritixiLithos
undergroundmonorail

0

Ruby、Clojure、Common Lisp-251バイト

(print(eval '(if()({(quote SCISSORS)(quote PAPER)(quote PAPER)(quote ROCK)(quote ROCK)(quote SCISSORS)}(read))(eval(quote(nth(position(read)(quote("SCISSORS""PAPER""ROCK")):test(quote string-equal))(quote(ROCK SCISSORS PAPER))))))))
;'['"'+gets+'"']))

空白を含むより読みやすいバージョン:

(print(eval '(if() ; distinguish between CLojure and Common Lisp
    ({(quote SCISSORS)(quote PAPER)(quote PAPER)
       (quote ROCK)(quote ROCK)(quote SCISSORS)}(read)) ; use hash-map as a function
    (eval(quote(nth ; find index of the input arg in the list
       (position(read)(quote("SCISSORS""PAPER""ROCK")):test(quote string-equal))  
    (quote(ROCK SCISSORS PAPER))))))))
 ;'['"'+gets+'"'])) ; ruby indexation

Clojureは常に勝ち、Rubyは常に引き分け、Common Lispは常に負けます。

Ruby 'の場合、s 内のすべては文字列です。2行にまたがっています。次に[]、文字列に文字列が存在する場合はそれ自体を返す文字列引数とともに演算子を使用します。結果が出力され、Rubyは入力をミラーリングするだけです。

2行目は、ClojureとCommon Lispのコメントです。束evalquoteClojureのは、すべてのシンボルが有効であることを確認する必要があるため、使用する必要があります。コードをさらに再利用するのは良いことですが、nth関数でもこれらの言語では異なるシグネチャを持っています。基本的にClojure if()はtrueと評価され、stdinから読み取られた引数を使用して可能なバリアントのハッシュマップが呼び出されると、最初のブランチに進みます。Common Lispは2番目のブランチに進み、リスト内のstdinから引数の位置を見つけ、結果のリストから対応する項目を返します。

Common Lispの部分はもっとゴルフできると思います。

オンラインで見る:RubyCommon LispClojure


0

Scala、JavascriptおよびOok、167バイト

s=>{var a="paper,scissors,rock".split(",")/*/**/a[-1]="rock"
return a[a.indexOf(s)-1];`*/a((a.indexOf(s)+1)%3)//`//Ook. Ook. Ook! Ook? Ook. Ook! Ook! Ook. Ook? Ook!
}

Scalaで 試してみるJavascriptで 試してみる

Scala-勝利

s=>{                                                      //define an anonymous function
  var a="paper,scissors,rock".split(",")                  //generate the array
  /* /* */ a[-1]="rock"                                   //scala supports nested comments,
  return a[a.indexOf(s)-1];`                              //so this comment...
  */                                                      //...ends here
  a((a.indexOf(s)+1)%3)                                   //return the winning string
  //`//Ook. Ook. Ook! Ook? Ook. Ook! Ook! Ook. Ook? Ook!  //another comment
}

Javascript-失う

s=>{                                                   //define an anonymous function
  var a="paper,scissors,rock".split(",")               //generate the array
  /*/**/                                               //a comment
  a[-1]="rock"                                         //put "rock" at index -1
  return a[a.indexOf(s)-1];                            //return the string that loses
  `*/a((a.indexOf(s)+1)%3)//`                          //a string
  //Ook. Ook. Ook! Ook? Ook. Ook! Ook! Ook. Ook? Ook!  //a comment
}

わかった!-関係

Ookの部分は、,[.,]Ookに翻訳された単純なBrainfuck Catプログラムです。

s=>{var a="paper,scissors,rock".split(",")/*/**/a[-1]="rock"   //random stuff
return a[a.indexOf(s)-1];`*/a((a.indexOf(s)+1)%3)//`//         //more random stuff
Ook. Ook. Ook! Ook? Ook. Ook! Ook! Ook. Ook? Ook!              //the program
}                                                              //random stuff

を使用する場合a[(a.indexOf(s)+2)%3]、設定する必要はありませんa[-1]="rock"。また、JavaScript文字列内にOokコードを配置することはできませんか?
ニール
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.