Странная и дикая бобовая игра

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
@ Хорошо, извини, теперь лучше? Я все еще привыкаю к ​​публикации здесь ...
Чарли
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();
    }
}
TheLethalCoder
источник
Это адский гольф! +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

Я, вероятно, могу сжать это больше, используя некоторые хитрые уловки и словарь.

Попробуйте онлайн!

Okx
источник
Вы можете сжать "eougwt"до .•4Õ!Õ•-1.
Эрик Outgolfer
@EriktheOutgolfer Когда я попробовал это, я сравнивал длину eougwtи .•4Õ!Õ•, а не "eougwt"и .•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 Dateна Math.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
@ OlivierGrégoire, это решение предшествует этому требованию, но я добавил другой вариант, который использует Math.randomвместо этого.
Лохматый
4

Желе , 101 100 байт

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

Попробуйте онлайн!

Эрик Outgolfer
источник
3

Japt , 148 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 ö

Попробуйте онлайн!

Сохранено 6 байтов благодаря Shaggy и ETHproductions

Том
источник
Разделить Rвместо того, 0чтобы сохранить байт. Кроме того, вы можете сжать eluaoi, играя с заказом.
Лохматый
@ Shaggy Как это сохранить байт? Мне нужно было бы позвонить, qRкоторый такой же длины?
Том
Проверьте ярлыки Unicode в документах;)
Лохматый
Извините, забыл сказать, что вы тоже можете убрать пробел ®.
Лохматый
Хорошо, почти точно, что я имел. Вам нужно только 5 из 6 символов в строке, потому что недостающий будет иметь индекс -1 и, следовательно, получает последний элемент в массиве. Если вы используете eaiouв качестве строки, вы можете сжать ее до трех байтов (могут быть другие трехбайтовые комбинации).
ETHproductions
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*

Попробуйте онлайн!

Сохранено очень много байтов путем сокращения ключей для использования 2-го индекса ввода, как предложено @TheLethalCoder, и путем разделения на запятые вместо использования прямого списка.

Товарищ Спаркл Пони
источник
1
Использование eluaoiв качестве словарных ключей и доступ к нему с индексом 2 строки должно сэкономить вам байты.
TheLethalCoder
Большая (у) идея LethalCoder
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)не распределяется равномерно.

Оливье Грегуар
источник
Хм, я не получаю объяснения о том, почему вы должны использовать new java.util.Random().nextInt(a.length)вместо (int)(Math.random()*a.length)..
Кевин Круйссен
1
Math.random()предоставляет число, которое имеет некоторые особенности (степень 0и знак 0и 52 случайных бита). Так ты на самом деле используете энтропию 52 без какой-либо дополнительной проверки. Если длина 3, например, 2^52не делится на 3. Таким образом, она не распределяется случайным образом. Вот почему Random.nextInt(int)(фактический java-файл, а не javadoc, в строке 394) имеет механизм цикла, чтобы убедиться, что число находится среди честных чисел. Если мне не сказали "это достаточно хорошо", только Random.nextInt(n)честно.
Оливье Грегуар
@KevinCruijssen Моя ошибка: это 53 случайных бита, а не 52.
Оливье Грегуар
1
Ах, хорошо, спасибо за объяснение. Так Math.random()не может быть использовано, когда 2^53не может быть равномерно разделено на число, на которое вы умножаете его? Поэтому, если вам нужно случайное число от 0 до 3, (int)(Math.random()*4)допустимо равномерно разделить его (четыре раза 2251799813685248), но когда вы используете *3вместо этого, это не так (то есть три раза 3002399751580330.666...), потому что приведение его к целым этажам, создание некоторых частей 1 меньше, чем другие. А так как длина в вашем случае переменная, она также распределена неравномерно (с возможностью длины 3).
Кевин Круйссен
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!

Объяснение: Первая задача рыбы - выяснить, что такое входное слово, зигзагообразно вниз по левой стороне. Рыба может читать только одно письмо за раз, и для этого требуется меньше байтов. Сначала рыба читает первую букву и спрашивает, если это "y"- если это так, слово «желтый», в противном случае оно движется дальше. Затем он читает вторую букву - если это "l"слово «синий», в противном случае оно движется дальше; и так далее. Если он читает пять букв, и они не совпадают"y" ( Y ellow), "l"(b L ue), "o"(br O wn), "n"(ora N ge) или "n"(gree N ) соответственно, то цвет должен быть «белым».

Далее идет случайный бит. Для цветов с двумя возможными выходами это довольно просто - для желтого, например, рыба вводит следующий код в x:

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

В xустанавливает направление случайным образом : если это вверх или влево, рыба завихрения вокруг зеркала обратно к x, но правильно ли это или вниз, он читает «тухлые яйца» или «маслом попкорн» (в обратном порядке ).

Четырехсторонние расщепления (для белого и зеленого) более сложны, но они следуют одному и тому же общему принципу - первое:

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

Обратите внимание, что если рыба подплывает с первого раза, xона проходит через восемь "секунд, что включает и выключает режим струн четыре раза, затем ударяется о зеркало и плавает обратно вниз.

Чтобы добраться до последнего четырехстороннего раскола, рыба должна проплыть через e и rиз «извести» и «груша», которые добавляют e = 14в стек (и обратной его), поэтому мы должны сначала удалить , что с ~. Одна из четырех веток также включает плавание через ненужную строку "> ", которую мы удаляем ~~.

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

Наконец, после добавления одного из компонентов бобов в стек, рыба достигает потока vs в крайнем левом столбце, который отправляет ее в

v    \
v    o
>l?!;/

который печатает символы (используя один из o «кокос»), пока не останется ни одного.

Не дерево
источник
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()

(Разрывы строк предназначены для отображения и не учитываются в целом.)

Ввод осуществляется через колонку с в имени таблицы т , согласно нашим правилам .

Я просто соединяю нашу входную таблицу с таблицей, полной допустимых комбинаций цвет / вкус, а затем выбираю случайную строку. ORDER BY NEWID()это распространенный способ рандомизации порядка сортировки в SQL . В зависимости от вашей строгости, вы можете не считать его абсолютно равномерно случайным, но оно должно быть достаточно случайным для выбора желейных бобов.

РЕДАКТИРОВАТЬ 1: Сохранение 9 байтов, используя только 3-й символ цвета, вдохновленный другими ответами.

РЕДАКТИРОВАТЬ 2: сохранить 48 байтов, поместив флаг цвета и аромат в одном столбце. Много символов, сохраненных в INSERT.

РЕДАКТИРОВАТЬ 3: Сохранено 8 байтов путем замены INSERT INTO b(o)наINSERT b

РЕДАКТИРОВАТЬ 4: Сэкономить еще 31 байт, присоединившись непосредственно к виртуальной таблице VALUESи, следовательно, исключив CREATE TABLEи INSERT.

РЕДАКТИРОВАТЬ 5: Сохранить 41 байт путем обновления до функции SQL 2016-only STRING_SPLIT, которая позволяет исключить переменное и динамическое выполнение SQL.

BradC
источник
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}
#&

Форма ввода

[Зеленый]

J42161217
источник
Можете ли вы индексировать строку и использовать 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)))

Та же идея, что и у других, я могу просто сэкономить место по сравнению с другими языками. Сжатие строк кажется потерянным делом.

MattPutnam
источник