Dziwna i dzika fasola

11

Być może niektórzy z was znają już tę grę: masz kolekcję żelków w różnych kolorach. Dla każdego koloru fasola może mieć różne smaki, niektóre są dobre, a niektóre złe i nie można ich rozróżnić. Musisz wybrać fasolę o danym kolorze i módl się, abyś wybrał dobrą.

Napisz najkrótszy program, który otrzyma wybrany kolor (z podanej listy) i losowo zwraca wybrany smak. Smak należy wybrać z wbudowanej listy. Możliwa lista wejść i wyjść to:

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

Zasady:

  • Możesz założyć, że dane wejściowe będą zawsze miały kolor z wybranych opcji wejściowych.
  • Wielkość liter i końcowe spacje i / lub znaki nowej linii nie mają znaczenia.
  • Dane wyjściowe muszą być jednolicie losowe: kolejne wykonywanie programu musi dawać różne wyniki, a szanse na uzyskanie określonego smaku muszą być takie same dla wszystkich smaków na liście.

To jest , więc może wygrać najkrótszy program!

Charlie
źródło
W jednej części pytania stwierdzasz, że smak zostanie wybrany z danej listy, co oznacza, że ​​otrzymamy go jako wkład. Jednak w twoich przykładach wydaje się, że jest odwrotnie.
Okx,
@Okx przepraszam, czy teraz jest lepiej? Nadal przyzwyczajam się do publikowania tutaj ...
Charlie,
1
Może stwierdzam, że dane wyjściowe muszą być jednolicie losowe, aby wszystkie możliwe wyniki miały takie same szanse pojawienia się, albo mogę po prostu dodać 2 opcje z każdej listy.
LiefdeWen,
@StefanDelport dziękuję, naprawiono!
Charlie,
1
To trochę późno, ale to powinno chyba być blueberrynie blue berry.
Jonathan Allan,

Odpowiedzi:

7

C #, 418 313 305 271 bajtów

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)];}

Zbyt długo, nawet dla C #, ale nie widzę, jak można go skrócić.

Wersja pełna / sformatowana:

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
źródło
To piekło golfa! +1
Kudłaty
@Shaggy Thanks :) Zacząłem robić to naprawdę naiwnie i powoli zdałem sobie sprawę z krótszego sposobu robienia rzeczy. Utknąłem w głowie, potrzebowałem słownika, a potem zobaczyłem twoją odpowiedź za pomocą sznurka i rozszczepiłem i zrozumiałem ścieżkę do światła!
TheLethalCoder
5

05AB1E , 126 bajtów

¨¤.•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‡

Wyjaśnienie:

¨¤                              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

Jeśli ktoś się zastanawia, oto nieskompresowany ciąg:

lawn clippingsjlimejmucusjpearqrotten eggsjbuttered popcornqtoothpastejblue berryqvomitjpeachqcanned dog foodjchocolateqstinky socksjtuttixfruttijbaby diapersjcoconut

Prawdopodobnie jednak mogę go bardziej skompresować za pomocą sprytnych sztuczek i słownika.

Wypróbuj online!

Okx
źródło
Możesz skompresować "eougwt"do .•4Õ!Õ•-1.
Erik the Outgolfer,
@EriktheOutgolfer Kiedy próbowałem, porównywałem długość eougwti .•4Õ!Õ•zamiast "eougwt"i .•4Õ!Õ•. Ups
Okx,
5

JavaScript (ES6), 235 bajtów

Muszę wymyślić, jak kompresować ciągi w 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]

Jeśli to nie jest „losowy wystarczająco” dla swoich upodobań następnie dodać 7 bajtów wymianie new Datez 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]

Spróbuj

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>

Kudłaty
źródło
3
Fajny pomysł eluaoi, pomyślałem o tym sam i pomyślałem: „Oooh, spójrz, jaki jestem sprytny”, a potem zobaczyłem, że mnie pobiłaś!
TheLethalCoder
new Date%a.lengthnie jest „jednolicie losowy”.
Olivier Grégoire,
Dzięki, @TheLethalCoder - byłem taki leniwy, że prawie nie zawracałem sobie głowy sprawdzaniem wyjątkowości po 2 znakach!
Shaggy
3
Heh, myślę, że 4 lub 5 z nas wymyśliło eluaoimniej więcej w tym samym czasie: P
ETHproductions
@ OlivierGrégoire, to rozwiązanie wyprzedza ten wymóg, ale dodałem inną opcję, która używa Math.random.
Shaggy
4

Galaretka , 101 100 bajtów

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

Wypróbuj online!

Erik the Outgolfer
źródło
3

Japt , 148 146 bajtów

`È}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 ö

Wypróbuj online!

Zaoszczędź 6 bajtów dzięki Shaggy i ETHproductions

Tomek
źródło
Podziel na Rzamiast 0zapisać bajt. Ponadto możesz kompresować eluaoi, grając z rozkazem.
Kudłaty
@Shaggy Jak to by uratowało bajt? Musiałbym zadzwonić o qRtej samej długości?
Tom
Sprawdź skróty Unicode w dokumentach;)
Shaggy
Przepraszam, zapomniałem powiedzieć, że możesz wcześniej usunąć to miejsce ®.
Kudłaty
Fajnie, prawie dokładnie to, co miałem. Potrzebujesz tylko 5 z 6 znaków w ciągu, ponieważ brakujący będzie miał indeks -1, a zatem pobierze ostatni element w tablicy. Jeśli użyjesz go eaioujako ciągu, możesz go skompresować do trzech bajtów (mogą istnieć inne kombinacje trzech bajtów).
ETHproductions
3

Python 2 , 301 258 bajtów

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*

Wypróbuj online!

Zaoszczędzono bardzo wiele bajtów, skracając klawisze, aby użyć drugiego indeksu danych wejściowych, jak sugeruje @TheLethalCoder, i dzieląc przecinki zamiast korzystania z bezpośredniej listy.

Towarzyszu SparklePony
źródło
1
Użyj eluaoijako kluczy słownika i uzyskaj do nich dostęp z indeksem 2 ciągu, aby zaoszczędzić bajty.
TheLethalCoder
Big (y) do LethalCoder za pomysł
officialaimm
3

Galaretka ,  95  94 bajtów

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

Monadyczny link akceptujący listę (małych liter) znaków i zwracający listę znaków.

Wypróbuj online! lub zjedz paczkę 48 .

W jaki sposób?

Osiemdziesiąt dziewięć z dziewięćdziesięciu czterech bajtów to skompresowana lista ośmiu ciągów. Dwa z nich to puste ciągi znaków, a pozostałe sześć to smaki oddzielone nową linią dla jednego z kolorów:

“...““...“...“...““...“...»
“...““...“...“...““...“...»
“                         » - 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"

Reszta programu analizuje dane wejściowe, aby zdecydować, której listy użyć, dzieli wybraną listę na nowe linie i wybiera losowy element:

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)
Jonathan Allan
źródło
2

Java, 288 bajtów

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)];}

Sprawdź to sam!

Można grać w golfa za pomocą char[].

Jednak części losowej nie można „równomiernie rozłożyć” bez wyraźnego użycia Random.nextInt(int). Nawet (int)(Math.random()*a.length)nie jest równomiernie rozmieszczony.

Olivier Grégoire
źródło
Hmm, nie rozumiem, dlaczego musisz używać new java.util.Random().nextInt(a.length)zamiast (int)(Math.random()*a.length)...
Kevin Cruijssen
1
Math.random()zapewnia liczbę, która ma pewne cechy szczególne (moc 0i znak 0i 52 losowe bity). Tak więc faktycznie używasz entropii 52 bez dalszej kontroli. Jeśli 3na przykład długość 2^52nie jest podzielna przez 3. Zatem nie jest losowo rozkładana. Właśnie dlatego Random.nextInt(int)(rzeczywisty plik java, nie javadoc, w linii 394) ma mechanizm pętli, aby upewnić się, że liczba ta należy do uczciwych liczb. O ile nie powiedziano mi, że „jest wystarczająco dobry”, tylko Random.nextInt(n)jest sprawiedliwy.
Olivier Grégoire,
@KevinCruijssen Mój błąd: 53 losowe bity, a nie 52.
Olivier Grégoire,
1
Ach, ok, dzięki za wyjaśnienie. Więc Math.random()nie można go użyć, gdy 2^53nie można go równomiernie podzielić przez liczbę, z którą się pomnożymy? Więc jeśli chcesz losową liczbę od 0-3, (int)(Math.random()*4)dopuszczalne jest równomierne podzielenie jej (czterokrotnie 2251799813685248), ale kiedy używasz *3zamiast niej, nie jest (co jest trzykrotnie 3002399751580330.666...), ponieważ rzutowanie na int podłogi powoduje utworzenie niektórych części 1 mniejszy niż inne. A ponieważ długość jest zmienna w twoim przypadku, nie jest ona również równomiernie rozłożona (z możliwością uzyskania długości 3).
Kevin Cruijssen
1
Tak, wszystko zrozumiałeś! Jeśli ktoś powie „losowo”, użyj Math.random(), jeśli ktoś powie coś „jednolicie” lub „dość” losowo, użyj java.util.Random. Dlatego też narzekałem na odpowiedź Kudłaty.
Olivier Grégoire,
1

> <> , 311 bajtów

</"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"

Wypróbuj online lub obejrzyj na placu zabaw dla ryb

Z przytulnymi dzianinami SK i Doof God Dennac!

Objaśnienie: Pierwszym zadaniem ryby jest ustalenie, jakie jest słowo wejściowe, zygzakiem w dół po lewej stronie. Ryba może czytać tylko jedną literę na raz i zajmuje to mniej bajtów, aby zrobić to destrukcyjnie. Najpierw ryba czyta pierwszą literę i pyta, czy to jest "y"- jeśli tak, to słowo jest „żółte”, w przeciwnym razie idzie dalej. Następnie odczytuje drugą literę - jeśli jest "l", słowo jest „niebieskie”, w przeciwnym razie przesuwa się; i tak dalej. Jeśli odczytuje pięć liter, a nie pasują one odpowiednio "y"( Y ellow), "l"(b L ue), "o"(br O wn), "n"(ora N ge) lub "n"(gree N ), wówczas kolor musi być „biały”.

Dalej jest bit losowy. W przypadku kolorów z dwoma możliwymi wyjściami jest to dość proste - na przykład dla żółtego ryba wprowadza następujący kod w x:

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

Te xzestawy kierunku losowo: czy to w górę lub w lewo, gdy wiruje wokół ryby z powrotem do lustra x, ale jeśli jest to prawo lub w dół, czyta „zgniłe jaja” lub „masłem popcorn” (w tył).

Podziały czterokierunkowe (dla bieli i zieleni) są bardziej chaotyczne, ale mają tę samą ogólną zasadę - pierwsza to:

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

Zauważ, że jeśli ryba płynie w górę od pierwszego x, przechodzi przez osiem "sekund, które cztery razy włączają i wyłączają tryb struny, następnie uderza w lustro i płynie z powrotem w dół.

Aby dostać się do ostatniej four-way split ryby muszą pływać przez ei rz „wapna” i „gruszki”, co dodać e = 14do stosu (i odwrócić go), więc najpierw trzeba usunąć to z ~. Jedna z czterech gałęzi obejmuje również przepuszczanie niepotrzebnego ciągu "> ", który usuwamy ~~.

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

Wreszcie, po dodaniu jednego ze smaków fasoli do stosu, ryba dociera do strumienia vs w lewej kolumnie, która wysyła go do

v    \
v    o
>l?!;/

który drukuje znaki (używając jednego z o„kokosowego”), dopóki nie pozostanie żaden.

Nie drzewo
źródło
1

T-SQL, 432 423 375 367 336 295 bajtów

Wreszcie operacja oparta na zestawie !!

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()

(Podziały wierszy są wyświetlane i nie są liczone łącznie).

Dane wejściowe są przez kolumnę c w nazwanej tabeli t , zgodnie z naszymi wytycznymi .

Po prostu łączę naszą tabelę wprowadzania z tabelą pełną prawidłowych kombinacji kolorów / smaków, a następnie wybieram losowy wiersz. ORDER BY NEWID()jest powszechnym sposobem losowego sortowania w SQL . W zależności od tego, jak jesteś surowy, możesz nie uznać go za całkowicie jednolicie losowy, ale powinien być wystarczająco losowy, aby wybrać żelki.

EDYCJA 1: Zaoszczędź 9 bajtów, używając tylko 3. znaku koloru, zainspirowanego innymi odpowiedziami.

EDYCJA 2: Zaoszczędź 48 bajtów, umieszczając flagę koloru i smak w jednej kolumnie. Wiele znaków zapisanych w WSTAWIENIU.

EDYCJA 3: Zapisano 8 bajtów, zastępując INSERT INTO b(o)jeINSERT b

EDYCJA 4: Zaoszczędź 31 bajtów więcej, łącząc się bezpośrednio z wirtualną tabelą, VALUESa tym samym eliminując CREATE TABLEi INSERT.

EDYCJA 5: Zaoszczędź 41 bajtów, aktualizując do STRING_SPLITfunkcji tylko SQL 2016 , co pozwala mi wyeliminować zmienne i dynamiczne wykonywanie SQL.

BradC
źródło
0

PHP , 242 bajty

<?=($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)];

Wypróbuj online!

Jörg Hülsermann
źródło
0

Mathematica, 247 bajtów

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}
#&

Formularz wejściowy

[Zielony]

J42161217
źródło
Czy możesz zaindeksować ciąg i skorzystać z eluaoipodstępu? Nie znam matematyki, to tylko pomysł.
TheLethalCoder
0

Clojure, 231 bajtów

#(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)))

Tak samo jak inne, mogę po prostu zaoszczędzić trochę miejsca w porównaniu do innych języków. Kompresowanie łańcuchów wydaje się straconą przyczyną.

MattPutnam
źródło