Дивна і дика гра бобів


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 Спасибі :) Я почав робити це по-справжньому наївно і повільно усвідомив коротший спосіб робити речі. У мене це застрягло в голові, мені знадобиться словник, а потім побачив вашу відповідь, використовуючи рядок і розщеплення, і зрозумів шлях до світла!
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 Коли я спробував це, я порівнював довжину 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 - Я був такий ледачий, я майже не потрудився перевіряти неповторність повз 2-х символів!
Кудлатий

3
Хе, я думаю, що приблизно 4 або 5 з нас придумали eluaoiприблизно в один і той же час: P
ETHproductions

@ OlivierGrégoire, це рішення передує цій вимозі, але я додав інший варіант, який використовує Math.randomзамість цього.
Кудлатий


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 в документах;)
Shaggy

Вибачте, забув сказати, що ви також можете видалити пробіл і раніше ®.
Кудлатий

Приємно, майже саме те, що я мав. Вам потрібно лише 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...), тому що кидаючи його на int поверхи, роблячи деякі частини На 1 менше, ніж інші. А оскільки довжина у вашому випадку є змінною, вона також не розподіляється рівномірно (з можливістю бути довжиною 3).
Kevin 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!

Пояснення: Перше завдання риби - розібратися, що таке вхідне слово, зіг-нувши ліворуч. Риба може читати лише одну букву за один раз, і для цього потрібно руйнувати менше байтів. Спочатку риба читає першу букву і запитує, чи це "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?!;/

який друкує символи (використовуючи один із os у "кокосі"), поки не залишиться жодного.


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 . Залежно від того, наскільки ви суворі, ви не можете вважати це абсолютно рівномірно випадковим, але він повинен бути достатньо випадковим для вибору желе бобів.

EDIT 1: Збережено 9 байт, використовуючи лише 3-й символ кольору, натхненний іншими відповідями.

EDIT 2: Збережено 48 байт, помістивши кольоровий прапор та ароматизатор в одну колонку. У ВСТУП збережено багато символів.

EDIT 3: Збережено 8 байтів, замінивши INSERT INTO b(o)наINSERT b

EDIT 4: Збережено ще 31 байт, приєднавшись безпосередньо до віртуальної таблиці VALUESта, отже, усунувши CREATE TABLEі INSERT.

EDIT 5: Збережіть 41 байт, оновивши STRING_SPLITфункцію лише для SQL 2016 , що дозволяє мені усунути змінне та динамічне виконання SQL.



0

Математика, 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)))

Така ж ідея, як і інші, я можу просто заощадити трохи місця порівняно з іншими мовами. Стискання рядків здається втраченою причиною.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.