怪异和野豆游戏


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对不起,现在好点了吗?我仍然习惯在这里发布...
Charlie

1
也许声明输出必须是统一随机的,以便所有可能的输出都具有相同的出现几率,否则我可以从每个列表中添加2个选项。
LiefdeWen

@StefanDelport谢谢,固定!
查理

1
现在有点晚了,但是应该blueberry没有blue berry
乔纳森·艾伦,

Answers:


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谢谢:)我以一种非常幼稚的方式开始做这件事,并逐渐意识到做事的简短方式。我把它塞在脑海里,我需要一本字典,然后用字符串和拆分看到您的答案,并意识到通往光明的道路!
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。
暴民埃里克(Erik the Outgolfer)

@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-我很懒,我几乎没有打扰过第二个字符的唯一性!
毛茸茸的

3
嘿,我想大约有4到5个人是eluaoi在同一时间提出的:P
ETHproductions 2015年

@OlivierGrégoire,此解决方案早于该要求,但我添加了另一个Math.random替代方法。
毛茸茸的

4

果冻101100字节

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

在线尝试!


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

抱歉,忘了说您也可以删除空间®
毛茸茸的

很好,几乎就是我所拥有的。您只需要字符串中6个字符中的5个字符,因为缺失的字符的索引为-1,因此将获取数组中的最后一项。如果您将其eaiou用作字符串,则可以将其压缩为三个字节(可能还有其他三个字节的组合)。
ETHproductions '17

3

Python 2中301个 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所建议的)并通过逗号分隔而不是使用直接列表来节省很多字节。


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包

怎么样?

九十四个字节中的八十九个是八个字符串的压缩列表。其中两个是空字符串,另外六个是换行符分隔的一种颜色的味道:

“...““...“...“...““...“...»
“...““...“...“...““...“...»
“                         » - 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的熵,而没有任何进一步的检查。3例如,如果length为2^523 ,则不能被3整除。因此,它不是随机分布的。这就是为什么Random.nextInt(int)(第394行的实际Java文件,而非javadoc)具有循环机制,以确保该数字在公数之中。除非我说“足够好”,否则这Random.nextInt(n)是公平的。
奥利维尔·格雷戈尔

@KevinCruijssen我的错误:它的53个随机比特,而不是52
奥利维尔·格雷瓜尔

1
好的,谢谢您的解释。因此,Math.random()如果不能将2^53其除以您所乘的数字,就不能使用它吗?因此,如果您想要一个介于0 (int)(Math.random()*4)到3之间的随机数,可以将它平均除(四次2251799813685248),但是当您使用*3它时,则不是(三倍3002399751580330.666...),这是因为将其强制转换为int地板使其成为一部分比其他小1。由于长度在您的情况下是可变的,因此长度也不是均匀分布的(长度可能为3)。
Kevin Cruijssen

1
是的,您了解全部!如果有人说“随机”,请使用Math.random(),如果有人说“均匀”或“相当”随机的话,请使用java.util.Random。这就是为什么我抱怨Shaggy的回答。
奥利维尔·格雷戈尔(OlivierGrégoire),

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!

说明:这条鱼的第一个任务是通过在左手边作Z字形来弄清楚输入的单词是什么。鱼一次只能读取一个字母,并且破坏性地花费更少的字节。首先,鱼会读第一个字母并询问它"y"是否是-如果是,则单词是“黄色”,否则它将继续前进。然后,它读取第二个字母-如果是"l",则该单词为“ blue”,否则继续前进;等等。如果显示五个字母,它们不匹配"y"Ÿ ellow),"l"(B 大号 UE),"o"(BR Ø WN),"n"(ORA ñ GE)或"n"(格力ñ)分别接颜色一定是“白”。

接下来是随机位。对于具有两个可能输出的颜色,这非常简单-例如,对于黄色,鱼在处输入以下代码x

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

x套随机的方向:如果是向上或向左,周围的镜子鱼漩涡回的x,但如果它的正确或向下,显示是“臭鸡蛋”或“奶油爆米花”(反向)。

四向拆分(用于白色和绿色)比较杂乱,但它们遵循相同的基本原理—第一个是:

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

请注意,如果鱼从第一个开始游泳x,它会经过8 "秒钟,这会打开和关闭弦乐模式四次,然后撞到镜子并向下游泳。

为了得到最后四路分裂,鱼已经通过游泳er“石灰”和“梨”,其中新增的e = 14堆栈(和扭转它),所以我们必须先删除与~。四个分支之一还涉及遍历一个垃圾字符串,"> "用删除~~

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

最后,在将一种豆香添加到堆栈中后,鱼到达v最左侧一列的s 流,然后将其发送到

v    \
v    o
>l?!;/

打印字符(使用o“ coconut” 中的s之一)直到没有字符为止。


1

T-SQL,432 423 375 367 336 295 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()

(换行符仅供显示,不总计。)

根据我们的指南,输入是通过命名表t中的c列进行的。

我只是将输入表连接到一个充满有效颜色/风味组合的表,然后选择一个随机行。ORDER BY NEWID()在SQL中随机排序的一种常见方式。根据您的严格程度,您可能不会认为它是完全均匀随机的,但对于选择软心豆粒糖应该足够随机。

编辑1:受其他答案的启发,仅使用颜色的第3个字符保存了9个字节。

编辑2:通过将颜色标记和风味放在单个列中,节省了48个字节。许多字符保存在INSERT中。

编辑3:保存的8字节通过替换INSERT INTO b(o)INSERT b

编辑4:通过直接连接到的虚拟表VALUES并因此消除了CREATE TABLE和,又节省了31个字节INSERT

编辑5:通过升级到仅SQL 2016的STRING_SPLIT功能,可以节省41个字节,这使我消除了可变和动态SQL执行。


0

PHP,242字节

<?=($a=explode(_,[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'][$argn[2]]))[array_rand($a)];

在线尝试!


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技巧吗?我不知道mathematica,所以只是个主意。
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)))

和其他语言一样,与其他语言相比,我只能节省一些空间。压缩字符串似乎是一个失败的原因。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.