奇妙で野生の豆ゲーム


11

このゲームを既に知っている人もいるかもしれません。さまざまな色のジェリービーンズのコレクションを持っています。すべての色について、豆は異なる味を持つことができ、いくつかは良いものと悪いものがあり、それらを区別することはできません。あなたは与えられた色の豆を選び、あなたが良いものを選択するように祈らなければなりません。

そのため、(指定されたリストから)選択した色を受け取り、選択した味をランダムに返す最短のプログラムを作成します。味は組み込みのリストから選択する必要があります。入力および出力の可能なリストは次のとおりです。

Input      Output choices [only one from the list]
--------------------------------------------------
green      lawn clippings, lime, mucus, pear
yellow     rotten eggs, buttered popcorn
blue       toothpaste, blue berry
orange     vomit, peach
brown      canned dog food, chocolate
white      stinky socks, tutti-frutti, baby diapers, coconut

ルール:

  • 入力は常に入力の選択肢からの色になると仮定できます。
  • 大文字小文字と末尾のスペースおよび/または改行は関係ありません。
  • 出力は一様にランダムである必要があります。連続したプログラムの実行では異なる結果が得られ、特定のテイストが得られる可能性はリスト内のすべてのテイストで同じである必要があります。

これはなので、最短のプログラムが勝つかもしれません!


あなたの質問の一部で、あなたは味が与えられたリストから選択されると述べ、それが入力としてそれを受け取ることを意味します。しかし、あなたの例では、反対のようです。
Okx

@Okx申し訳ありませんが、今は良いですか?私はまだここに投稿することに慣れています
チャーリー

1
可能性のあるすべての出力が同じオッズになるように、出力は一様にランダムでなければならないか、そうでない場合は各リストから2つのオプションを追加できます。
-LiefdeWen

@StefanDelportありがとう、修正しました!
チャーリー

1
少し遅れていますが、おそらくそうではblueberryないはずblue berryです。
ジョナサンアラン

回答:


7

C位、418の 313 305 271バイト

s=>{var a="lawn clippings,lime,mucus,pear|rotten eggs,buttered popcorn|toothpaste,blue berry|vomit,peach|canned dog food,chocolate|stinky socks,tutti-frutti,baby diapers,coconut".Split('|')["eluaoi".IndexOf(s[2])].Split(',');return a[new System.Random().Next(a.Length)];}

C#でも長すぎますが、それを短くする方法がわかりません。

フル/フォーマット済みバージョン:

using System;

class P
{
    static void Main()
    {
        Func<string, string> f = s =>
        {
            var a = "lawn clippings,lime,mucus,pear|rotten eggs,buttered popcorn|toothpaste,blue berry|vomit,peach|canned dog food,chocolate|stinky socks,tutti-frutti,baby diapers,coconut"
                    .Split('|')["eluaoi".IndexOf(s[2])].Split(',');

            return a[new System.Random().Next(a.Length)];
        };

        Console.WriteLine(f("green"));
        Console.WriteLine(f("yellow"));
        Console.WriteLine(f("blue"));
        Console.WriteLine(f("orange"));
        Console.WriteLine(f("brown"));
        Console.WriteLine(f("white"));

        Console.ReadLine();
    }
}

それはゴルフの地獄だ!+1
シャギー

@Shaggy Thanks :)私はそれを本当に素朴な方法で始め、徐々に物事の短い方法を実現しました。私はそれが頭の中に詰まっていたので、辞書が必要になり、文字列と分割を使用してあなたの答えを見て、光への道を実現しました!
TheLethalCoder

5

05AB1E、126バイト

¨¤.•4Õ!Õ•.•QCQΓ^ïTÁÕ#HвΘÊÓΘñ…~çÌùY$J*shÉÉk‹Ú&žвZÍζö<^'¢βŽÚq¡eζd`Ãó¨₅γ!i"v_Ym¤ÓδVË5¥vżQЉøΣγ9∞\L‰,ǝ¦8VÜUт:x+sм•'x'-:'q¡'j¡€.R‡

説明:

¨¤                              Get the second to last character of the string
  .•4Õ!Õ•                       Compressed string: "eougwt"
         .• .. •                Compressed base-27 string
                'x'-:           Replace "x" with "-" (for tutti-frutti)
                     'q¡        Split on 'q'
                        'j¡     Split each on 'j'
                           €    For each...
                             .R  Select a random element
                               ‡ Transliterate

誰かが疑問に思っているなら、ここに圧縮されていない文字列があります:

lawn clippingsjlimejmucusjpearqrotten eggsjbuttered popcornqtoothpastejblue berryqvomitjpeachqcanned dog foodjchocolateqstinky socksjtuttixfruttijbaby diapersjcoconut

おそらく、いくつかの巧妙なトリックと辞書を使用して、さらに圧縮することができます。

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


あなたは圧縮することができます"eougwt".•4Õ!Õ•は-1。
エリックアウトゴルファー

@EriktheOutgolferそれを試してみたとき、eougwtandの.•4Õ!Õ•代わりに"eougwt"andの長さを比較していました.•4Õ!Õ•。おっとっと。
Okx

5

JavaScript(ES6)、235バイト

JSで文字列を圧縮する方法を理解する必要があります。

c=>(a="lawn clippings,lime,mucus,pear|rotten eggs,buttered popcorn|toothpaste,blue berry|vomit,peach|canned dog food,chocolate|stinky socks,tutti-frutti,baby diapers,coconut".split`|`["eluaoi".search(c[2])].split`,`)[new Date%a.length]

それはあなたの好みのために「ランダム十分」ではありません場合は、7バイトの交換が追加new DateMath.random()

c=>(a="lawn clippings,lime,mucus,pear|rotten eggs,buttered popcorn|toothpaste,blue berry|vomit,peach|canned dog food,chocolate|stinky socks,tutti-frutti,baby diapers,coconut".split`|`["eluaoi".search(c[2])].split`,`)[Math.random()*a.length|0]

それを試してみてください

f=
c=>(a="lawn clippings,lime,mucus,pear|rotten eggs,buttered popcorn|toothpaste,blue berry|vomit,peach|canned dog food,chocolate|stinky socks,tutti-frutti,baby diapers,coconut".split`|`["eluaoi".search(c[2])].split`,`)[Math.random()*a.length|0]

r=(d=document).createElement("input");r.name="i";r.type="radio";l=d.createElement("label");j="Kiwi,sour_lemon,berryBlue,OrangeSherbet,rootBeer,Coconut".split`,`;for(s in e="green,yellow,blue,orange,brown,white".split`,`){r=r.cloneNode();l=l.cloneNode();l.setAttribute("for",r.id=r.value=e[s]);l.style.backgroundImage=`url(https://cdn-tp1.mozu.com/9046-11441/cms//files/${j[s]}.jpg)`;g.prepend(r,l);}onchange=_=>o.innerText=(v=(i=d.querySelector(":checked")).value)+": "+f(v,i.checked=0)
body{align-items:center;background:#eee;display:flex;flex-wrap:wrap;height:100vh;justify-content:center;margin:0;text-align:center;}#g{background:#fff;box-shadow:5px 5px 5px #ccc;padding:10px;}input{display:none;}label{background-repeat:no-repeat;background-size:contain;cursor:pointer;display:inline-block;height:64px;margin:10px;width:75px;}#o{font-family:monospace;font-size:18px;margin:10px auto;text-align:center;width:100%;}
<div id=g><pre id=o>click a jelly bean</pre></div>


3
との素敵なアイデアeluaoi、私は自分でそれを考えて、「ああ、私はどれだけ賢いのか見て」と思って、それからあなたが私を打ち負かしたのを見ました!
TheLethalCoder

new Date%a.length「一様にランダム」ではありません。
オリビエグレゴワール

おかげで、@ TheLethalCoder-私はその怠け者でした、私はほとんど2番目の文字を超えて一意性をチェックする気にしませんでした!
シャギー

3
ああ、私は4人か5人がeluaoi同じ頃に思いついたと思う。P
ETHproductions

@OlivierGrégoire、このソリューションはその要件よりも前ですが、Math.random代わりに使用する別のオプションを追加しました。
シャギー


3

Japt148 146バイト

`È}hpŠ1½ue ¼rry
lawn c¦ppÄ1Ò˜1muc«1pe‡
vÇ1pea®
ÐXky socks1ÉÍi-frÔk1baby ¹ap€s1¬¬n©
¯nšd ºg food1®o¬ÓŠ
݁ eggs1瘪 pop¬rn`·g`uÁ4`âUg2¹q1 ö

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

ShaggyとETHproductionsのおかげで6バイト節約


バイトを保存するR代わりに分割し0ます。また、eluaoi注文をいじって圧縮することもできます。
シャギー

@Shaggyどうすればバイトを節約できますか?qR同じ長さの電話をかける必要がありますか?
トム

ドキュメントのUnicodeショートカットを確認してください;)
Shaggy

申し訳ありませんが、前にスペースを削除できると言うのを忘れていました®
シャギー

ナイス、ほぼ正確に私が持っていたもの。不足している文字のインデックスは-1になり、配列の最後の項目を取得するため、文字列には6文字のうち5文字しか必要ありません。eaiou文字列として使用する場合、3バイトに圧縮できます(他の3バイトの組み合わせがある場合があります)。
-ETHproductions

3

パイソン2301の 258バイト

lambda x:choice({'e':'lawn clippings,lime,mucus,pear','l':'rotten eggs,buttered popcorn','u':'toothpaste,blue berry','a':'vomit,peach','o':'canned dog food,chocolate','i':'stinky socks,tutti-frutti,baby diapers,coconut'}[x[2]].split(','))
from random import*

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

@TheLethalCoderで提案されているように、入力の2番目のインデックスを使用するためにキーを短くし、直接リストを使用する代わりにコンマで分割することにより、非常に多くのバイトを節約しました。


1
eluaoi辞書キーとして使用し、文字列のインデックス2を使用してアクセスすると、バイトを節約できます。
TheLethalCoder

LethalCoderのアイデアに大きな(y)
officialaimm

3

ゼリー 95  94 バイト

OḄị“÷Hnøgİỵ£@ḥEḶƑƤi÷Ḃ\oŻẆ#ụqU½b““¬ɗ-ṃȥḞ“'æLṬẏeṃɼẹ-N0ṁH)A“ḥĠḄĿĖṇ⁻Œḳ-¬"““I$aṇṾjð4“£Ʋṛ÷pḶƥƑL]p»ỴX

(小文字の)文字のリストを受け入れ、文字のリストを返す単項リンク。

オンラインでお試しください!または 48包みを食べます。

どうやって?

94バイトのうちの89バイトは、8つの文字列の圧縮リストです。これらのうち2つは空の文字列であり、他の6つはそれぞれ、色の1つに対して改行で区切られたフレーバーです。

“...““...“...“...““...“...»
“...““...“...“...““...“...»
“                         » - a compression of dictionary words & or strings
    ““   “   “   ““   “     - list separations
    ^            ^          - the two empty lists of characters
 ...^ ... ... ...^ ... ...  - bytes used to encode the data
 wht  org grn ylw^ blu brn  - with the colours indicated. For example:
  1 2  3   4   5 6  7   0   -   “ḥĠḄĿĖṇ⁻Œḳ-¬"» is a compression of:
                            -     word     + word   + string + word       + word
                             -     "rotten" + " egg" + "s\n"  + "buttered" + " popcorn"
                             - and is at the fifth index, relating to "yellow"

プログラムの残りの部分は、入力を解析して使用するリストを決定し、選択したリストを改行で分割し、ランダムな要素を選択します。

OḄị“...»ỴX - Main link:s e.g.: "blue"           "yellow"                  "brown"              "white"               "orange"                 "green"
O          - cast to ordinals  [98,108,117,101] [121,101,108,108,111,119] [98,114,111,119,110] [119,104,105,116,101] [111,114,97,110,103,101] [103,114,101,101,110]
 Ḅ         - from binary       3276             7125                      1151                 6899                  3272                     3489
  ị        - index into - 1 based and modular with 8 items so...
           -          indexes: 3276%8=4         7125%8=5                  1151%8=7             6899%8=3              3272%8=0                 3489%8=1
        Ỵ  - split at newlines (gets the list of flavours for the chosen colour)
         X - random choice (gets one of those flavours at random)

2

Java、288バイト

s->{String[]a="lawn clippings,lime,mucus,pear#rotten eggs,buttered popcorn#toothpaste,blue berry#vomit,peach#canned dog food,chocolate#stinky socks,tutti-frutti,baby diapers,coconut".split("#")["eluaoi".indexOf(s.charAt(2))].split(",");return a[new java.util.Random().nextInt(a.length)];}

自分でテストしてください!

を使用してゴルフすることができますchar[]

ただし、を明示的に使用しないと、ランダム部分を「均一に分散」することはできませんRandom.nextInt(int)。でも(int)(Math.random()*a.length)均一に分布されていません。


うーん、私はあなたが使用することを持っている理由についての説明を取得din't new java.util.Random().nextInt(a.length)の代わりに(int)(Math.random()*a.length)...
ケビンCruijssen

1
Math.random()いくつかの特異性(べき乗0と符号、0および52のランダムビット)を持つ数値を提供します。したがって、実際に、さらにチェックすることなく52のエントロピーを使用します。たとえば、lengthが3で割り切れない3場合、2^52ランダムに分散されません。これがRandom.nextInt(int)(行394のjavadocではなく実際のjavaファイル)にループ番号が公平な番号の間にあることを確認するためのメカニズムがある理由です。「十分だ」と言わない限り、Random.nextInt(n)公正です。
オリビエグレゴワール

私のミスを@KevinCruijssen:それは53ランダムビットではなく52だ
オリヴィエ・グレゴワール

1
ああ、説明ありがとう。だから、あなたがそれを掛ける数で均等に割ることができないMath.random()ときに使用する2^53ことはできませんか?したがって、0-3の乱数が必要な場合、(int)(Math.random()*4)均等に分割することは許容されます(4回2251799813685248)が、*3代わりに使用する場合は(3回です3002399751580330.666...)、intフロアにキャストして一部を作成するため、他の1よりも小さい。また、長さは可変であるため、均一に分散されません(長さ3になる可能性があります)。
ケビンCruijssen

1
うん、あなたはそれをすべて理解しました!誰かが「ランダム」と言う場合、を使用しますMath.random()。誰かが「一様に」または「かなり」ランダムに何かを言う場合、を使用しますjava.util.Random。それが私がシャギーの答えについて不平を言った理由でもあります。
オリビエグレゴワール

1

> <>、311バイト

</"y"/\_  _
v\i-?\x"sgge nettor"
v/"l"/\"nrocpop derettub"
v\i-?\x"etsaphtoot"
v/"o"/\"yrreb eulb"
v\i-?\x"etalocohc"
v/"n"/\"doof god dennac"
v\i-?\x"timov"
v/"n"/\"hcaep"
v\i-?\>x\/~~"srepaid ybab"
v"lime" x"sgnippilc nwal"
v"pear"x  _"sucum"
v    \~__>x\
v"coconut" x"skcos yknits"
>l?!;/\  \x_"itturf-ittut"

オンライン試すか、魚の遊び場で見る

SKの心地よいニットとDoof God Dennacが特徴です!

説明:魚の最初のタスクは、左側をジグザグに移動して入力語が何であるかを把握することです。魚は一度に1文字しか読むことができず、破壊的にこれを行うのに必要なバイト数が少なくなります。最初に、魚は最初の文字を読んで、それがそうであるかどうか尋ねます"y"—そうであるならば、単語は「黄色」です、さもなければ、それは進みます。次に、2番目の文字を読み取ります。-の場合"l"、単語は「青」で、それ以外の場合は移動します。等々。5文字を読み取り、それらが"y"Y ellow)、"l"(b L ue)、"o"(br O wn)、"n"(ora N ge)または"n"(gree N)にそれぞれ一致しない場合、色は「白」でなければなりません。

次はランダムビットです。2つの出力が可能な色の場合、これは非常に簡単です。たとえば、黄色の場合、魚はで次のコードを入力しますx

/\
\x"sgge nettor"
 \"nrocpop derettub"

xセット方向をランダム:背面に鏡の周りに魚の渦巻き、それは最高だか左かのx、しかし、それは右または下だ場合、それは「腐った卵」や「バターポップコーン」(逆に)を読み取ります。

4方向の分割(白と緑の場合)は乱雑ですが、それらは同じ一般的な原則に従います—最初は次のとおりです。

     >x\
"lime" x"sgnippilc nwal"
"pear"x   "sucum"
      __

魚が最初から泳いだ場合、x8 "秒間通過し、ストリングモードのオンとオフが4回切り替わり、鏡にぶつかって戻って泳ぐことに注意してください。

最後の4分割に取得するには、魚が泳ぐ通過しなければならないer追加「ライム」と「梨」、とe = 14我々は最初にそれを削除する必要がありますので、スタックに(と、それを逆に)~。4つのブランチの1つには"> "、で削除するジャンク文字列を泳ぐことも含まれ~~ます。

    \   /~~"srepaid ybab"
    e   "
    r    _
    \~  >x\
"coconut" x"skcos yknits"
        \x_"itturf-ittut"
         _

最後に、Beanフレーバーの1つをスタックに追加すると、魚vは左端の列のs のストリームに到達し、

v    \
v    o
>l?!;/

o残りがなくなるまで(「ココナッツ」のsの1つを使用して)文字を印刷します。


1

T-SQL、432 423 375 367 336 295バイト

最後に、セットベースの操作!!

SELECT TOP 1 SUBSTRING(value,2,99)
FROM t,STRING_SPLIT('elawn clippings-elime-emucus-epear-lrotten eggs-lbuttered popcorn-utoothpaste-ublue berry-avomit-apeach-ocanned dog food-ochocolate-istinky socks-itutti-frutti-ibaby diapers-icoconut','-')
WHERE SUBSTRING(c,3,1)=LEFT(value,1)
ORDER BY NEWID()

(改行は表示用であり、合計には含まれません。)

入力欄を経由してあるCという名前のテーブルにトンガイドラインごと

入力テーブルを有効な色/フレーバーの組み合わせでいっぱいのテーブルに単純に結合してから、ランダムな行を選択しています。ORDER BY NEWID()あるSQLでのソート順序をランダム化するための一般的な方法は。あなたがどれだけ厳しいかによって、完全に一様にランダムであるとは思わないかもしれませんが、ジェリービーンを選択するには十分にランダムでなければなりません。

編集1:他の回答に触発されて、色の3番目の文字のみを使用して9バイトを保存しました。

編集2:単一の列に色フラグとフレーバーを配置することにより48バイトを保存しました。INSERTで保存された多くの文字。

編集3:に置き換えINSERT INTO b(o)て8バイトを保存しましたINSERT b

編集4:の仮想テーブルに直接結合し、VALUESしたがってandを削除することにより、31バイトを節約CREATE TABLEしましたINSERT

編集5: SQL 2016のみのSTRING_SPLIT機能にアップグレードして41バイトを節約します。これにより、変数と動的SQLの実行を排除できます。



0

Mathematica、247バイト

R=RandomChoice
green=R@{lawn clippings,lime,mucus,pear}
yellow=R@{rotten eggs,buttered popcorn}
blue=R@{toothpaste,"blue berry"}
orange=R@{vomit,peach}
brown=R@{canned dog food,chocolate}
white=R@{stinky socks,tutti-frutti,baby diapers,coconut}
#&

入力 フォーム

[緑]


文字列にインデックスを付けてeluaoiトリックを使用できますか?私は数学を知らないので、ただのアイデアです。
TheLethalCoder

0

Clojure、231バイト

#(rand-nth({\e["lawn clippings""lime""mucus""pear"]\l["rotten eggs""buttered popcorn"]\u["toothpaste""blue berry"]\a["vomit""peach"]\o["canned dog food""chocolate"]\i["stinky socks""tutti-frutti""baby diapers""coconut"]}(get % 2)))

他のアイデアと同じ考え方で、他の言語と比べてスペースを節約できます。文字列の圧縮は失われた原因のようです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.