Le gibier étrange et sauvage

11

Peut-être que certains d'entre vous connaissent déjà ce jeu: vous avez une collection de bonbons à la gelée de différentes couleurs. Pour chaque couleur, le haricot peut avoir des goûts différents, certains sont bons et certains sont mauvais, et vous ne pouvez pas les distinguer. Vous devez choisir un haricot d'une couleur donnée et prier pour en avoir sélectionné une bonne.

Donc, écrivez le programme le plus court qui reçoit une couleur de votre choix (à partir d'une liste donnée), et renvoie aléatoirement le goût sélectionné. Le goût doit être choisi dans une liste intégrée. La liste possible des entrées et sorties est:

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

Règles:

  • Vous pouvez supposer que l'entrée sera toujours une couleur parmi les choix d'entrée.
  • Les espaces de casse et de fin et / ou les nouvelles lignes n'ont pas d'importance.
  • La sortie doit être uniformément aléatoire: les exécutions successives du programme doivent donner des résultats différents et les chances d'obtenir un goût donné doivent être les mêmes pour tous les goûts d'une liste.

C'est , alors que le programme le plus court gagne!

Charlie
la source
Dans une partie de votre question, vous déclarez que le goût sera sélectionné dans une liste donnée, ce qui implique que nous le recevrons en entrée. Cependant, dans vos exemples, il semble que ce soit le contraire.
Okx
@Okx désolé, est-ce mieux maintenant? Je m'habitue toujours à poster ici ...
Charlie
1
Peut-être indiquer que la sortie doit être uniformément aléatoire afin que toutes les sorties possibles aient les mêmes chances d'apparaître, sinon je peux simplement ajouter 2 options dans chaque liste.
LiefdeWen
@StefanDelport merci, fixe!
Charlie
1
Il est un peu tard, mais il aurait probablement dû être blueberrypas blue berry.
Jonathan Allan

Réponses:

7

C #, 418 313 305 271 octets

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

Trop long même pour C # mais je ne vois pas comment le raccourcir.

Version complète / formatée:

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
la source
C'est un sacré golf! +1
Shaggy
@Shaggy Merci :) J'ai commencé à le faire d'une manière vraiment naïve et j'ai lentement réalisé la façon la plus courte de faire les choses. Je l'avais coincé dans ma tête, j'avais besoin d'un dictionnaire, puis j'ai vu votre réponse en utilisant la chaîne et le fractionnement et j'ai réalisé le chemin vers la lumière!
TheLethalCoder
5

05AB1E , 126 octets

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

Explication:

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

Si quelqu'un se demande, voici la chaîne non compressée:

lawn clippingsjlimejmucusjpearqrotten eggsjbuttered popcornqtoothpastejblue berryqvomitjpeachqcanned dog foodjchocolateqstinky socksjtuttixfruttijbaby diapersjcoconut

Je peux probablement le compresser davantage en utilisant quelques astuces intelligentes et le dictionnaire.

Essayez-le en ligne!

Okx
la source
Vous pouvez compresser "eougwt"à .•4Õ!Õ•-1.
Erik the Outgolfer
@EriktheOutgolfer Lorsque j'ai essayé cela, je comparais la longueur de eougwtet .•4Õ!Õ•, au lieu de "eougwt"et .•4Õ!Õ•. Oups.
Okx
5

JavaScript (ES6), 235 octets

J'ai besoin de comprendre comment compresser des chaînes dans 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]

Si ce n'est pas "assez aléatoire" pour vos goûts, ajoutez 7 octets en remplaçant new Datepar 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]

Essayez-le

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>

Hirsute
la source
3
Belle idée avec eluaoi, j'y ai pensé par moi-même et j'ai pensé: "Oooh regarde comme je suis intelligent" puis je t'ai vu me battre!
TheLethalCoder
new Date%a.lengthn'est pas "uniformément aléatoire".
Olivier Grégoire
Merci, @TheLethalCoder - J'étais si paresseux, je n'ai presque pas pris la peine de vérifier l'unicité au-delà des 2e caractères!
Shaggy
3
Hé, je pense que 4 ou 5 d'entre nous sont arrivés à peu eluaoiprès au même moment: P
ETHproductions
@ OlivierGrégoire, cette solution est antérieure à cette exigence mais j'ai ajouté une autre option qui utilise à la Math.randomplace.
Shaggy
4

Gelée , 101100 octets

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

Essayez-le en ligne!

Erik le Outgolfer
la source
3

Japt , 148 146 octets

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

Essayez-le en ligne!

6 octets enregistrés grâce à Shaggy et aux productions ETH

À M
la source
Répartissez sur Rau lieu de 0pour enregistrer un octet. En outre, vous pourrez peut-être compresser eluaoien jouant avec la commande.
Shaggy
@Shaggy Comment cela sauverait-il un octet? J'aurais besoin d'appeler qRquelle est la même longueur?
Tom
Vérifiez les raccourcis Unicode dans la documentation;)
Shaggy
Désolé, j'ai oublié de dire que vous pouvez également supprimer l'espace avant ®.
Shaggy
Sympa, presque exactement ce que j'avais. Vous n'avez besoin que de 5 des 6 caractères de la chaîne, car celui qui manque aura un index de -1 et obtient donc le dernier élément du tableau. Si vous utilisez eaioucomme chaîne, vous pouvez la compresser en trois octets (il peut y avoir d'autres combinaisons de trois octets).
ETHproductions
3

Python 2 , 301 258 octets

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*

Essayez-le en ligne!

Enregistrement de très nombreux octets en raccourcissant les clés pour utiliser le 2ème index de l'entrée, comme suggéré par @TheLethalCoder, et en divisant les virgules au lieu d'utiliser une liste directe.

Camarade SparklePony
la source
1
Utiliser eluaoicomme clés de dictionnaire et y accéder avec l'index 2 de la chaîne devrait vous faire économiser des octets.
TheLethalCoder
Big (y) à l'idée de LethalCoder
officialaimm
3

Gelée ,  95  94 octets

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

Un lien monadique acceptant une liste de caractères (en minuscules) et renvoyant une liste de caractères.

Essayez-le en ligne! ou mangez un paquet de 48 .

Comment?

Quatre-vingt-neuf des quatre-vingt-quatorze octets sont une liste compressée de huit chaînes. Deux d'entre elles sont des chaînes vides et les six autres sont chacune des saveurs séparées par une nouvelle ligne pour l'une des couleurs:

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

Le reste du programme analyse l'entrée pour décider quelle liste utiliser, divise la liste choisie par des retours à la ligne et sélectionne un élément aléatoire:

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
la source
2

Java, 288 octets

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

Testez-le vous-même!

Pourrait être joué au golf en utilisant un char[].

Cependant, la partie aléatoire ne peut pas être "uniformément distribuée" sans l'utilisation explicite de Random.nextInt(int). Même (int)(Math.random()*a.length)n'est pas uniformément distribué.

Olivier Grégoire
la source
Hmm, je ne comprends pas pourquoi vous devez utiliser new java.util.Random().nextInt(a.length)au lieu de (int)(Math.random()*a.length)..
Kevin Cruijssen
1
Math.random()fournit un nombre qui a certaines spécificités (une puissance 0et un signe de 0et 52 bits aléatoires). Vous utilisez donc une entropie de 52 sans autre vérification. Si la longueur est 3, par exemple, 2^52n'est pas divisible par 3. Donc, elle n'est pas distribuée au hasard. C'est pourquoi Random.nextInt(int)(fichier java réel, pas javadoc, à la ligne 394) a un mécanisme de boucle pour s'assurer que le nombre est parmi les bons nombres. À moins qu'on me dise "c'est assez bon", Random.nextInt(n)c'est juste.
Olivier Grégoire
@KevinCruijssen Mon erreur: c'est 53 bits aléatoires, pas 52.
Olivier Grégoire
1
Ah ok, merci pour l'explication. Math.random()Ne peut donc pas être utilisé lorsqu'il 2^53ne peut pas être divisé également par le nombre avec lequel vous le multipliez? Donc, si vous voulez un nombre aléatoire de 0 à 3, il (int)(Math.random()*4)est acceptable de le diviser également (quatre fois 2251799813685248), mais lorsque vous utilisez*3 place, ce n'est pas le cas (ce qui est trois fois 3002399751580330.666...), parce que le mouler dans des étages internes, en faisant certaines parties 1 plus petit que les autres. Et comme la longueur est variable dans votre cas, elle n'est pas non plus répartie uniformément (avec la possibilité d'être de longueur 3).
Kevin Cruijssen
1
Oui, vous avez tout compris! Si quelqu'un dit «aléatoire», utilisez Math.random(), si quelqu'un dit quelque chose de façon «uniforme» ou «assez» aléatoire, utilisez java.util.Random. C'est aussi pourquoi je me suis plaint de la réponse de Shaggy.
Olivier Grégoire
1

> <> , 311 octets

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

Essayez-le en ligne ou regardez-le au terrain de pêche

Avec des tricots confortables SK et Doof God Dennac!

Explication: La première tâche du poisson est de comprendre quel est le mot d'entrée en zigzaguant sur le côté gauche. Le poisson ne peut lire qu'une seule lettre à la fois, et cela prend moins d'octets pour le faire de manière destructive. Tout d'abord, le poisson lit la première lettre et demande si c'est "y"- si c'est le cas, le mot est "jaune", sinon il continue. Il lit ensuite la deuxième lettre - si c'est le cas "l", le mot est "bleu", sinon il continue; etc. Si elle lit cinq lettres et qu'elles ne correspondent pas "y"( Y ellow), "l"(b L ue), "o"(br O wn), "n"(ora N ge) ou "n"(gree N ) respectivement, alors la couleur doit avoir été "blanche".

Vient ensuite le bit aléatoire. Pour les couleurs avec deux sorties possibles, c'est assez simple - pour le jaune, par exemple, le poisson entre le code suivant dans x:

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

Le xdéfinit la direction au hasard: s'il est vers le haut ou vers la gauche, le poisson tourbillonne autour des miroirs vers le x, mais s'il est vers la droite ou vers le bas, il lit "œufs pourris" ou "pop-corn beurré" (en sens inverse).

Les divisions à quatre voies (pour le blanc et le vert) sont plus compliquées, mais elles suivent le même principe général - la première est:

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

Notez que si le poisson nage vers le haut depuis le premier x, il passe par huit "s, ce qui active et désactive le mode chaîne quatre fois, puis il frappe un miroir et nage vers le bas.

Pour accéder à la dernière fraction à quatre voies, le poisson doit nager à travers la eet rde « chaux » et « poire », ce qui ajoute e = 14à la pile (et arrière), donc il faut d' abord le supprimer avec~ . L'une des quatre branches implique également de nager à travers une chaîne indésirable "> ", que nous supprimons avec ~~.

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

Enfin, après avoir ajouté l'une des saveurs de haricots à la pile, le poisson atteint le flux de v s dans la colonne la plus à gauche, qui l'envoie à

v    \
v    o
>l?!;/

qui imprime des caractères (en utilisant l'un des os dans "coconut") jusqu'à ce qu'il n'en reste plus.

Pas un arbre
la source
1

T-SQL, 432 423 375 367 336 295 octets

Enfin, une opération basée sur un ensemble !!

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

(Les sauts de ligne sont affichés et ne sont pas comptés au total.)

L'entrée se fait via la colonne c dans le tableau nommé t , selon nos directives .

Je joins simplement notre table d'entrée à une table remplie de combinaisons de couleurs / saveurs valides, puis je sélectionne une ligne aléatoire. ORDER BY NEWID()est un moyen courant de randomiser l'ordre de tri dans SQL . Selon votre rigueur, vous ne le considérerez peut-être pas parfaitement uniformément aléatoire, mais il devrait être suffisamment aléatoire pour la sélection de jelly bean.

EDIT 1: économisé 9 octets en utilisant uniquement le 3ème caractère de la couleur, inspiré par d'autres réponses.

EDIT 2: économisé 48 octets en mettant l'indicateur de couleur et la saveur dans une seule colonne. Beaucoup de caractères enregistrés dans le INSERT.

EDIT 3: 8 octets enregistrés en remplaçant INSERT INTO b(o)parINSERT b

EDIT 4: économisé 31 octets supplémentaires en se joignant directement à la table virtuelle de VALUESet donc en éliminant le CREATE TABLEet INSERT.

EDIT 5: Économisez 41 octets en passant à la fonction SQL 2016 uniquement STRING_SPLIT, ce qui me permet d'éliminer l'exécution variable et dynamique de SQL.

BradC
la source
0

PHP , 242 octets

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

Essayez-le en ligne!

Jörg Hülsermann
la source
0

Mathematica, 247 octets

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

Formulaire de saisie

[vert]

J42161217
la source
Pouvez-vous indexer dans la chaîne et utiliser l' eluaoiastuce? Je ne connais pas mathématique donc juste une idée.
TheLethalCoder
0

Clojure, 231 octets

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

Même idée que les autres, je peux simplement économiser de l'espace par rapport aux autres langues. La compression des chaînes semble être une cause perdue.

MattPutnam
la source