O jogo de feijão estranho e selvagem


11

Talvez alguns de vocês já conheçam esse jogo: você tem uma coleção de jujubas de cores diferentes. Para cada cor, o feijão pode ter gostos diferentes, alguns são bons e outros ruins, e você não pode diferenciá-los. Você precisa escolher um feijão de uma determinada cor e rezar para escolher uma boa.

Portanto, escreva o programa mais curto que receba uma cor de sua escolha (de uma determinada lista) e retorne aleatoriamente o sabor selecionado. O sabor deve ser escolhido em uma lista interna. A lista possível de entradas e saídas é:

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

Regras:

  • Você pode supor que a entrada sempre será uma cor das opções de entrada.
  • Espaços de maiúsculas e minúsculas e / ou novas linhas não importam.
  • A saída deve ser uniformemente aleatória: execuções sucessivas de programas devem produzir resultados diferentes, e as chances de obter um determinado sabor devem ser as mesmas para todos os gostos de uma lista.

Isso é , então o programa mais curto pode ganhar!


Em uma parte da sua pergunta, você declara que o sabor será selecionado de uma determinada lista, o que implica que o receberemos como entrada. No entanto, em seus exemplos, parece o contrário.
Okx

@ Ok, desculpe, está melhor agora? Eu ainda estou me acostumando a postagem aqui ...
Charlie

1
Talvez afirme que a saída deve ser uniformemente aleatória, para que todas as saídas possíveis tenham as mesmas chances de aparecer, ou então eu posso apenas adicionar 2 opções de cada lista.
precisa saber é o seguinte

@StefanDelport obrigado, corrigido!
Charlie

1
É um pouco tarde agora, mas deveria ter sido blueberrynão blue berry.
Jonathan Allan

Respostas:


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

Muito tempo, mesmo para C #, mas não vejo como reduzi-lo.

Versão completa / formatada:

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

Isso é um inferno de golfe! +1
Shaggy

@ Shaggy Thanks :) Comecei a fazê-lo de uma maneira realmente ingênua e lentamente percebi a maneira mais curta de fazer as coisas. Eu estava preso na minha cabeça, eu precisaria de um dicionário e, em seguida, vi sua resposta usando a corda e a divisão e percebi o caminho para a 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‡

Explicação:

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

Se alguém está se perguntando, aqui está a string descompactada:

lawn clippingsjlimejmucusjpearqrotten eggsjbuttered popcornqtoothpastejblue berryqvomitjpeachqcanned dog foodjchocolateqstinky socksjtuttixfruttijbaby diapersjcoconut

Provavelmente posso comprimir mais usando alguns truques inteligentes e o dicionário.

Experimente online!


Você pode compactar "eougwt"para .•4Õ!Õ•para -1.
Erik the Outgolfer

@EriktheOutgolfer Quando tentei, estava comparando o comprimento de eougwte .•4Õ!Õ•, em vez de "eougwt"e .•4Õ!Õ•. Opa
Okx

5

JavaScript (ES6), 235 bytes

Eu preciso descobrir como comprimir seqüências de caracteres em 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]

Se isso não for "aleatório o suficiente" para o seu gosto, adicione 7 bytes substituindo 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]

Tente

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
Boa ideia com eluaoi, pensei sozinha e pensei: "Oooh, olhe como estou sendo esperta", depois vi você me derrotar!
TheLethalCoder

new Date%a.lengthnão é "uniformemente aleatório".
Olivier Grégoire

Obrigado, @TheLethalCoder - eu era tão preguiçoso, quase não me incomodei em verificar a singularidade após os 2º personagens!
Shaggy

3
Heh, acho que cerca de 4 ou 5 de nós eluaoi
inventamos

@ OlivierGrégoire, esta solução antecede esse requisito, mas eu adicionei outra opção que usa Math.random.
Shaggy

4

Geléia , 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

Experimente online!


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 ö

Experimente online!

Economizou 6 bytes graças a Shaggy e ETHproductions


Divida em Rvez de 0salvar um byte. Além disso, você pode comprimir eluaoibrincando com o pedido.
Shaggy

@ Shaggy Como isso salvaria um byte? Eu precisaria chamar qRqual é o mesmo comprimento?
Tom

Verifique os atalhos Unicode nos documentos;)
Shaggy

Desculpe, esqueci de dizer que você pode remover o espaço antes ®também.
Shaggy

Bom, quase exatamente o que eu tinha. Você só precisa de 5 dos 6 caracteres da string, porque o que falta tem um índice de -1 e, portanto, obtém o último item da matriz. Se você usar eaioucomo string, poderá compactá-lo para três bytes (pode haver outras combinações de três 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*

Experimente online!

Salvei muitos bytes encurtando as teclas para usar o segundo índice da entrada, conforme sugerido por @TheLethalCoder, e dividindo em vírgulas em vez de usar uma lista direta.


1
Use eluaoicomo as chaves do dicionário e acesse-o com o índice 2 da string para economizar bytes.
TheLethalCoder

Big (y) para a idéia de LethalCoder
officialaimm

3

Geléia ,  95  94 bytes

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

Um link monádico que aceita uma lista de caracteres (minúsculos) e retorna uma lista de caracteres.

Experimente online! ou coma um pacote de 48 .

Quão?

Oitenta e nove dos noventa e quatro bytes são uma lista compactada de oito seqüências de caracteres. Dois deles são cadeias vazias e os outros seis são sabores separados por nova linha para uma das cores:

“...““...“...“...““...“...»
“...““...“...“...““...“...»
“                         » - 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 restante do programa analisa a entrada para decidir qual lista usar, divide a lista escolhida por novas linhas e escolhe um elemento aleatório:

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

Teste você mesmo!

Pode ser jogado golfe usando um char[].

No entanto, a parte aleatória não pode ser "uniformemente distribuída" sem o uso explícito de Random.nextInt(int). Mesmo (int)(Math.random()*a.length)não é distribuído uniformemente.


Hmm, eu di não obter a explicação sobre por que você tem que usar new java.util.Random().nextInt(a.length)em vez de (int)(Math.random()*a.length)..
Kevin Cruijssen

1
Math.random()fornece um número que tem algumas especificidades (uma potência 0e um sinal de 0e 52 bits aleatórios). Então você realmente usa uma entropia de 52 sem qualquer verificação adicional. Se comprimento é 3, por exemplo, 2^52não é divisível por 3. Portanto, não é distribuído aleatoriamente. É por isso que Random.nextInt(int)(o arquivo java real, não o javadoc, na linha 394) possui um mecanismo de loop para garantir que o número esteja entre os números justos. A menos que eu diga "é bom o suficiente", apenas Random.nextInt(n)é justo.
Olivier Grégoire

@KevinCruijssen Meu erro: são 53 bits aleatórios, não 52.
Olivier Grégoire

1
Ah ok, obrigado pela explicação. Portanto, Math.random()não pode ser usado quando 2^53não pode ser dividido igualmente pelo número com o qual você o multiplica? Portanto, se você deseja um número aleatório de 0 a 3, (int)(Math.random()*4)é aceitável dividi-lo uniformemente (quatro vezes 2251799813685248), mas quando você o usa, *3não é (o que é três vezes 3002399751580330.666...), porque convertê-lo para int pavimenta, fazendo algumas partes 1 menor que os outros. E como o comprimento é variável no seu caso, também não é distribuído uniformemente (com a possibilidade de ser o comprimento 3).
Kevin Cruijssen

1
Sim, você entendeu tudo! Se alguém disser "aleatório", use Math.random(), se alguém disser algo como "uniformemente" ou "razoavelmente" aleatoriamente, use java.util.Random. Foi também por isso que reclamei da resposta 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"

Experimente online ou assista no playground de peixes

Com malhas confortáveis ​​da SK e Doof God Dennac!

Explicação: A primeira tarefa do peixe é descobrir qual é a palavra de entrada zig-zagging no lado esquerdo. O peixe pode ler apenas uma letra de cada vez e são necessários menos bytes para fazer isso de forma destrutiva. Primeiro, o peixe lê a primeira letra e pergunta se é "y"- se é, a palavra é "amarela", caso contrário, segue em frente. Em seguida, ele lê a segunda letra - se for "l", a palavra é "azul"; caso contrário, segue em frente; e assim por diante. Se ele lê cinco letras e eles não coincidem "y"( Y ellow), "l"(b L ue), "o"(br S WN), "n"(ora N GE) ou "n"(Gree N ), respectivamente, em seguida, a cor deve ter sido "branco".

Em seguida, vem o bit aleatório. Para as cores com duas saídas possíveis, isso é bastante direto - para amarelo, por exemplo, o peixe insere o seguinte código no x:

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

Ele xdefine a direção aleatoriamente: se estiver para cima ou para a esquerda, o peixe gira em torno dos espelhos de volta para o x, mas se estiver certo ou para baixo, ele lê "ovos podres" ou "pipoca amanteigada" (ao contrário).

As divisões de quatro direções (para branco e verde) são mais confusas, mas seguem o mesmo princípio geral - a primeira é:

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

Observe que, se o peixe nada desde o primeiro x, ele passa por oito "segundos, que ativam e desativam o modo de seqüência de caracteres quatro vezes, depois atingem um espelho e nadam de volta para baixo.

Para chegar à última divisão de quatro vias, o peixe precisa nadar através de ee rde "lima" e "pêra", que são adicionados e = 14à pilha (e revertida), portanto, primeiro precisamos excluí-la com ~. Um dos quatro ramos também envolve nadar através de uma cadeia de lixo eletrônico "> ", com a qual excluímos ~~.

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

Finalmente, depois de adicionar um dos sabores de feijão à pilha, o peixe atinge o fluxo de vs na coluna mais à esquerda, que o envia para

v    \
v    o
>l?!;/

que imprime caracteres (usando um dos os em "coco") até não sobrar nenhum.


1

T-SQL, 432 423 375 367 336 295 bytes

Finalmente, uma operação baseada em conjunto !!

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

(As quebras de linha são para exibição e não são contadas no total.)

A entrada é via coluna c na tabela nomeada t , de acordo com nossas diretrizes .

Estou simplesmente juntando nossa tabela de entrada a uma tabela cheia de combinações válidas de cores / sabores e selecionando uma linha aleatória. ORDER BY NEWID()é uma maneira comum de randomizar a ordem de classificação no SQL . Dependendo de sua rigidez, você pode não considerá-lo perfeitamente uniforme e aleatório, mas deve ser suficientemente aleatório para a seleção de jujubas.

EDIÇÃO 1: salvou 9 bytes usando apenas o terceiro caractere da cor, inspirado em outras respostas.

EDIÇÃO 2: salvou 48 bytes colocando o sinalizador e o sabor da cor em uma única coluna. Muitos caracteres salvos no INSERT.

EDIÇÃO 3: salvou 8 bytes substituindo INSERT INTO b(o)porINSERT b

EDIT 4: Economizou mais 31 bytes ingressando diretamente na tabela virtual VALUESe, portanto, eliminando o CREATE TABLEe INSERT.

EDIÇÃO 5: economize 41 bytes atualizando para a STRING_SPLITfunção somente SQL 2016 , o que me permite eliminar a execução SQL dinâmica e variável.


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

Experimente online!


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

input forma

[verde]


Você pode indexar na string e usar o eluaoitruque? Eu não sei mathematica, apenas uma ideia.
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)))

Mesma idéia que as outras, posso economizar um pouco de espaço em comparação com outros idiomas. A compactação de strings parece uma causa perdida.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.