El extraño y salvaje juego de frijoles

11

Quizás algunos de ustedes ya conozcan este juego: tienen una colección de gomitas de diferentes colores. Para cada color, el frijol puede tener gustos diferentes, algunos son buenos y otros son malos, y no puede distinguirlos. Tienes que elegir un grano de un color dado y rezar para que selecciones uno bueno.

Por lo tanto, escriba el programa más corto que reciba un color de su elección (de una lista dada) y devuelva aleatoriamente el sabor seleccionado. El sabor tiene que ser elegido de una lista incorporada. La posible lista de entradas y salidas son:

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

Reglas:

  • Puede suponer que la entrada siempre será un color de las opciones de entrada.
  • Las mayúsculas y minúsculas y / o las líneas nuevas no importan.
  • La producción debe ser uniformemente aleatoria: las ejecuciones de programas sucesivas deben producir resultados diferentes, y las posibilidades de obtener un sabor determinado deben ser las mismas para todos los gustos en una lista.

Este es el , ¡así que gane el programa más corto!

Charlie
fuente
En una parte de su pregunta, declara que el sabor se seleccionará de una lista dada, lo que implica que lo recibiremos como entrada. Sin embargo, en sus ejemplos, parece que lo contrario es así.
Okx
@ Ok, lo siento, ¿es mejor ahora? Todavía me estoy acostumbrando a publicar aquí ...
Charlie
1
Tal vez indique que la salida debe ser uniformemente aleatoria para que todas las salidas posibles tengan las mismas probabilidades de aparecer o, de lo contrario, puedo agregar 2 opciones de cada lista.
LiefdeWen
@ StefanDelport gracias, arreglado!
Charlie
1
Es un poco tarde, pero probablemente debería haber sido blueberryno blue berry.
Jonathan Allan

Respuestas:

7

C #, 418 313 305 271 bytes

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

Demasiado tiempo incluso para C #, pero no puedo ver cómo hacerlo más corto.

Versión completa / formateada:

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
fuente
¡Eso es un gran campo de golf! +1
Shaggy
@ Shaggy Gracias :) Empecé haciéndolo de una manera muy ingenua y lentamente me di cuenta de la forma más corta de hacer las cosas. Lo tenía metido en mi cabeza. ¡Necesitaría un diccionario y luego vi su respuesta usando la cuerda y la división y me di cuenta del camino hacia la luz!
TheLethalCoder
5

05AB1E , 126 bytes

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

Explicación:

¨¤                              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 alguien se pregunta, aquí está la cadena sin comprimir:

lawn clippingsjlimejmucusjpearqrotten eggsjbuttered popcornqtoothpastejblue berryqvomitjpeachqcanned dog foodjchocolateqstinky socksjtuttixfruttijbaby diapersjcoconut

Sin embargo, probablemente pueda comprimirlo más usando algunos trucos inteligentes y el diccionario.

Pruébalo en línea!

Okx
fuente
Puede comprimir "eougwt"al .•4Õ!Õ•de -1.
Erik the Outgolfer
@EriktheOutgolfer Cuando intenté eso, estaba comparando la longitud de eougwty .•4Õ!Õ•, en lugar de "eougwt"y .•4Õ!Õ•. Ups
Okx
5

JavaScript (ES6), 235 bytes

¡Necesito descubrir cómo comprimir cadenas en 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 eso no es "lo suficientemente aleatorio" para sus gustos, agregue 7 bytes reemplazando new Datepor 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]

Intentalo

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>

Lanudo
fuente
3
Buena idea con eluaoi, lo pensé por mí mismo y pensé: "Oooh, mira lo inteligente que soy", ¡entonces te vi ganar!
TheLethalCoder
new Date%a.lengthno es "uniformemente al azar".
Olivier Grégoire
Gracias, @TheLethalCoder: ¡era tan vago, casi no me molesté en comprobar la unicidad más allá de los 2dos personajes!
Shaggy
3
Je, creo que a 4 o 5 de nosotros se nos ocurrió eluaoial mismo tiempo: P
ETHproductions
@ OlivierGrégoire, esta solución es anterior a ese requisito, pero he agregado otra opción que usa en su Math.randomlugar.
Shaggy
4

Gelatina , 101 100 bytes

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

Pruébalo en línea!

Erik el Outgolfer
fuente
3

Japt , 148 146 bytes

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

Pruébalo en línea!

Guardado 6 bytes gracias a Shaggy y ETHproductions

Tom
fuente
Dividir en Rlugar de 0guardar un byte. Además, es posible que pueda comprimir eluaoijugando con el orden.
Shaggy
@ Shaggy ¿Cómo ahorraría eso un byte? Necesitaría llamar, ¿ qRcuál es la misma longitud?
Tom
Compruebe los accesos directos de Unicode en los documentos;)
Shaggy
Lo sentimos, olvidé decir que también puedes eliminar el espacio antes ®.
Shaggy
Bonito, casi exactamente lo que tenía. Solo necesita 5 de los 6 caracteres en la cadena porque el que falta tendrá un índice de -1 y, por lo tanto, obtiene el último elemento en la matriz. Si lo usa eaioucomo cadena, puede comprimirlo a tres bytes (puede haber otras combinaciones de tres bytes).
ETHproductions
3

Python 2 , 301 258 bytes

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*

Pruébalo en línea!

Ahorró muchos bytes al acortar las teclas para usar el segundo índice de la entrada, como lo sugiere @TheLethalCoder, y al dividir en comas en lugar de usar una lista directa.

Camarada SparklePony
fuente
1
Utilizar eluaoicomo las teclas del diccionario y acceder a él con el índice 2 de la cadena debería ahorrarle bytes.
TheLethalCoder
Big (y) a la idea de LethalCoder
officialaimm
3

Jalea ,  95  94 bytes

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

Un enlace monádico que acepta una lista de caracteres (en minúsculas) y devuelve una lista de caracteres.

Pruébalo en línea! o comer un paquete de 48 .

¿Cómo?

Ochenta y nueve de los noventa y cuatro bytes son una lista comprimida de ocho cadenas. Dos de estos son cadenas vacías y los otros seis son sabores separados por nueva línea para uno de los colores:

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

El resto del programa analiza la entrada para decidir qué lista usar, divide la lista elegida por nuevas líneas y elige un elemento aleatorio:

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
fuente
2

Java, 288 bytes

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

¡Pruébalo tú mismo!

Se puede jugar golf usando a char[].

Sin embargo, la parte aleatoria no se puede "distribuir uniformemente" sin el uso explícito de Random.nextInt(int). Incluso (int)(Math.random()*a.length)no está distribuido uniformemente.

Olivier Grégoire
fuente
Hmm, no tengo la explicación de por qué tienes que usar en new java.util.Random().nextInt(a.length)lugar de (int)(Math.random()*a.length)...
Kevin Cruijssen
1
Math.random()proporciona un número que tiene algunas especificidades (una potencia de 0y un signo de 0y 52 bits aleatorios). Entonces, en realidad usa una entropía de 52 sin ninguna otra verificación. Si la longitud es 3, por ejemplo, 2^52no es divisible por 3. Por lo tanto, no se distribuye al azar. Esta es la razón por la cual Random.nextInt(int)(el archivo java real, no javadoc, en la línea 394) tiene un mecanismo de bucle para asegurarse de que el número esté entre los números justos. A menos que me digan "es lo suficientemente bueno", solo Random.nextInt(n)es justo.
Olivier Grégoire
@KevinCruijssen Mi error: son 53 bits aleatorios, no 52.
Olivier Grégoire
1
Ah ok, gracias por la explicación. Entonces, Math.random()¿no se puede usar cuando 2^53no se puede dividir equitativamente por el número con el que se multiplica? Entonces, si desea un número aleatorio del 0-3, (int)(Math.random()*4)es aceptable dividirlo equitativamente (cuatro veces 2251799813685248), pero cuando lo usa, *3no lo es (que es tres veces 3002399751580330.666...), ya que lanzarlo al piso interior lo hace algunas partes 1 más pequeño que otros. Y dado que la longitud es variable en su caso, tampoco está distribuida uniformemente (con la posibilidad de ser longitud 3).
Kevin Cruijssen
1
¡Sí, lo entendiste todo! Si alguien dice "aleatorio", use Math.random(), si alguien dice algo "uniforme" o "bastante" aleatorio, use java.util.Random. Por eso también me quejé de la respuesta de Shaggy.
Olivier Grégoire
1

> <> , 311 bytes

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

Pruébelo en línea o mírelo en el área de juegos para peces

¡Con SK cosidos acogedores y Doof God Dennac!

Explicación: La primera tarea del pez es descubrir cuál es la palabra de entrada zigzagueando por el lado izquierdo. El pez solo puede leer una letra a la vez, y se necesitan menos bytes para hacerlo de forma destructiva. Primero, el pez lee la primera letra y le pregunta si es así, "y"si es así, la palabra es "amarilla", de lo contrario continúa. Luego lee la segunda letra: si es así "l", la palabra es "azul"; de lo contrario, continúa; y así. Si se lee cinco letras y no coinciden "y"( Y ellow), "l"(b L ue), "o"(br O wn), "n"(ora N ge) o "n"(Gree N ), respectivamente, a continuación, el color debe haber sido "blanco".

Luego viene el bit aleatorio. Para los colores con dos salidas posibles, esto es bastante sencillo: para el amarillo, por ejemplo, el pez ingresa el siguiente código en x:

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

Los xconjuntos de la dirección al azar: si está arriba o izquierda, los remolinos de peces alrededor de los espejos atrás a la x, pero si es derecha o hacia abajo, se lee "huevos podridos" o "palomitas de maíz con mantequilla" (a la inversa).

Las divisiones de cuatro vías (para el blanco y el verde) son más desordenadas, pero siguen el mismo principio general: el primero es:

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

Tenga en cuenta que si el pez nada hacia arriba desde el primero x, pasa a través de ocho "s, que activa y desactiva el modo de cuerda cuatro veces, luego golpea un espejo y nada hacia abajo.

Para llegar a la última de cuatro vías de división, el pescado tiene que nadar a través de la ey rde la "cal" y "pera", que se suman e = 14a la pila (y revertirla), por lo que primero tenemos que eliminar eso con ~. Una de las cuatro ramas también implica nadar a través de una cadena de basura "> ", que eliminamos con ~~.

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

Finalmente, después de agregar uno de los sabores de frijoles a la pila, el pescado alcanza el flujo de vs en la columna más a la izquierda, que lo envía a

v    \
v    o
>l?!;/

que imprime caracteres (usando uno de los os en "coco") hasta que no quede ninguno.

No un arbol
fuente
1

T-SQL, 432 423 375 367 336 295 bytes

¡Finalmente, una operación basada en conjuntos!

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

(Los saltos de línea son para mostrar y no se cuentan en total).

La entrada se realiza a través de la columna c en la tabla con nombre t , según nuestras pautas .

Simplemente estoy uniendo nuestra tabla de entrada a una tabla llena de combinaciones válidas de color / sabor, luego seleccionando una fila aleatoria. ORDER BY NEWID()es una forma común de aleatorizar el orden de clasificación en SQL . Dependiendo de cuán estricto sea usted, es posible que no lo considere perfectamente uniforme al azar, pero debería ser lo suficientemente aleatorio para la selección de gominolas.

EDITAR 1: guardado 9 bytes usando solo el tercer carácter del color, inspirado en otras respuestas.

EDIT 2: se guardaron 48 bytes poniendo la bandera de color y el sabor en una sola columna. Muchos personajes guardados en el INSERT.

EDITAR 3: guardado 8 bytes reemplazando INSERT INTO b(o)conINSERT b

EDIT 4: ahorró 31 bytes más uniéndose directamente a la tabla virtual de VALUESy, por lo tanto, eliminando el CREATE TABLEy INSERT.

EDITAR 5: Ahorre 41 bytes actualizando a la STRING_SPLITfunción solo SQL 2016 , lo que me permite eliminar la ejecución variable y dinámica de SQL.

BradC
fuente
0

PHP , 242 bytes

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

Pruébalo en línea!

Jörg Hülsermann
fuente
0

Mathematica, 247 bytes

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

Formulario de entrada

[verde]

J42161217
fuente
¿Puedes indexar en la cadena y usar el eluaoitruco? No sé matemática, así que solo es una idea.
TheLethalCoder
0

Clojure, 231 bytes

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

La misma idea que las demás, puedo ahorrar algo de espacio en comparación con otros idiomas. Comprimir cadenas parece una causa perdida.

MattPutnam
fuente