Lo strano e selvaggio gioco di fagioli


11

Forse alcuni di voi conoscono già questo gioco: hai una collezione di jelly bean di diversi colori. Per ogni colore, il fagiolo può avere gusti diversi, alcuni sono buoni e alcuni sono cattivi, e non puoi distinguerli. Devi scegliere un fagiolo di un determinato colore e pregare di averne selezionato uno buono.

Quindi, scrivi il programma più breve che riceve un colore di tua scelta (da un determinato elenco) e restituisce in modo casuale il gusto selezionato. Il gusto deve essere scelto da un elenco integrato. I possibili elenchi di ingressi e uscite sono:

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

Regole:

  • Puoi presumere che l'input sarà sempre un colore dalle scelte di input.
  • Gli spazi tra maiuscole e minuscole e / o le nuove righe non contano.
  • L'output deve essere uniformemente casuale: le esecuzioni successive del programma devono produrre risultati diversi e le possibilità di ottenere un determinato gusto devono essere le stesse per tutti i gusti in un elenco.

Questo è , quindi può vincere il programma più corto!


In una parte della tua domanda, dichiari che il gusto verrà selezionato da un determinato elenco, il che implica che lo riceveremo come input. Tuttavia, nei tuoi esempi, sembra che sia il contrario.
Okx,

@Okx scusa, ora va meglio? Mi sto ancora abituando a postare qui ...
Charlie,

1
Forse affermare che l'output deve essere uniformemente casuale in modo che tutte le possibili output abbiano le stesse probabilità di apparire oppure posso solo aggiungere 2 opzioni da ogni elenco.
Liefde:

@StefanDelport grazie, risolto!
Charlie,

1
E 'un po' tardi, ma probabilmente dovrebbe essere blueberrynon blue berry.
Jonathan Allan,

Risposte:


7

C #, 418 313 305 271 byte

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

Troppo a lungo anche per C # ma non riesco a vedere come accorciarlo.

Versione completa / formattata:

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

È un vero inferno! +1
Shaggy,

@Shaggy Grazie :) Ho iniziato a farlo in un modo davvero ingenuo e lentamente ho capito il modo più breve di fare le cose. L'ho bloccato nella mia testa, avrei bisogno di un dizionario e poi ho visto la tua risposta usando la corda e la scissione e ho realizzato il percorso verso la luce!
TheLethalCoder

5

05AB1E , 126 byte

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

Spiegazione:

¨¤                              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 qualcuno si sta chiedendo, ecco la stringa non compressa:

lawn clippingsjlimejmucusjpearqrotten eggsjbuttered popcornqtoothpastejblue berryqvomitjpeachqcanned dog foodjchocolateqstinky socksjtuttixfruttijbaby diapersjcoconut

Posso probabilmente comprimerlo di più usando alcuni trucchi intelligenti e il dizionario, però.

Provalo online!


È possibile comprimere "eougwt"per .•4Õ!Õ•per -1.
Erik the Outgolfer,

@EriktheOutgolfer Quando l'ho provato, ho confrontato la lunghezza di eougwte .•4Õ!Õ•, invece di "eougwt"e .•4Õ!Õ•. Ops.
Okx,

5

JavaScript (ES6), 235 byte

Devo capire come comprimere le stringhe in 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 questo non è "abbastanza casuale" per i tuoi gusti, aggiungi 7 byte sostituendoli new Datecon 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]

Provalo

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
Bella idea con eluaoi, ci ho pensato da solo e ho pensato: "Oooh guarda quanto sono intelligente", poi ti ho visto battere!
TheLethalCoder

new Date%a.lengthnon è "uniformemente casuale".
Olivier Grégoire,

Grazie, @TheLethalCoder - Ero così pigro, quasi non mi sono preoccupato di controllare l'unicità dopo il 2 ° personaggio!
Shaggy,

3
Eh, penso che circa 4 o 5 di noi si siano eluaoi
inventati

@ OlivierGrégoire, questa soluzione precede tale requisito, ma ho aggiunto un'altra opzione che utilizza Math.randominvece.
Shaggy,

4

Gelatina , 101 100 byte

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

Provalo online!


3

Japt , 148 146 byte

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

Provalo online!

Risparmiato 6 byte grazie a Shaggy e ETHproductions


Dividi Rinvece di 0salvare un byte. Inoltre, potresti essere in grado di comprimere eluaoigiocando con l'ordine.
Shaggy,

@Shaggy Come sarebbe salvare un byte? Dovrei chiamare qRqual è la stessa lunghezza?
Tom,

Controlla le scorciatoie Unicode nei documenti;)
Shaggy,

Spiacente, ho dimenticato di dire che puoi rimuovere anche lo spazio prima ®.
Shaggy,

Bello, quasi esattamente quello che avevo. Nella stringa sono necessari solo 5 dei 6 caratteri perché quello mancante avrà un indice di -1 e quindi ottiene l'ultimo elemento dell'array. Se lo usi eaioucome stringa, puoi comprimerlo fino a tre byte (potrebbero esserci altre combinazioni di tre byte).
ETHproductions

3

Pitone 2 , 301 258 byte

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*

Provalo online!

Ho salvato moltissimi byte accorciando i tasti per utilizzare il secondo indice dell'input, come suggerito da @TheLethalCoder, e suddividendo le virgole invece di utilizzare un elenco diretto.


1
Utilizzare eluaoicome chiavi del dizionario e accedervi con l'indice 2 della stringa dovrebbe risparmiare byte.
TheLethalCoder

Grande (y) all'idea di LethalCoder
officialaimm,

3

Gelatina ,  95  94 byte

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

Un collegamento monadico che accetta un elenco di caratteri (minuscoli) e restituisce un elenco di caratteri.

Provalo online! o mangia un pacchetto di 48 .

Come?

Ottantanove dei novantaquattro byte sono un elenco compresso di otto stringhe. Due di queste sono stringhe vuote e le altre sei sono linee separate per ogni colore per uno dei colori:

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

Il resto del programma analizza l'input per decidere quale elenco utilizzare, suddivide l'elenco selezionato per nuove righe e seleziona un elemento casuale:

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 byte

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

Provalo tu stesso!

Potrebbe essere giocato a golf usando a char[].

Tuttavia, la parte casuale non può essere "uniformemente distribuita" senza l'uso esplicito di Random.nextInt(int). Anche (int)(Math.random()*a.length)non è distribuito uniformemente.


Hmm, non ho la spiegazione del perché devi usare new java.util.Random().nextInt(a.length)invece di (int)(Math.random()*a.length)..
Kevin Cruijssen,

1
Math.random()fornisce un numero che ha alcune specificità (una potenza di 0e un segno di 0e 52 bit casuali). Quindi in realtà usi un'entropia di 52 senza ulteriori controlli. Se la lunghezza è 3, ad esempio, 2^52non è divisibile per 3. Quindi non viene distribuita casualmente. Questo è il motivo Random.nextInt(int)(il file java effettivo, non javadoc, alla riga 394) ha un meccanismo ad anello per assicurarsi che il numero sia tra i numeri giusti. A meno che non mi venga detto "è abbastanza buono", solo Random.nextInt(n)è giusto.
Olivier Grégoire,

@KevinCruijssen Il mio errore: 53 bit casuali, non 52.
Olivier Grégoire,

1
Ah ok, grazie per la spiegazione. Quindi Math.random()non può essere usato quando 2^53non può essere diviso uniformemente per il numero con cui lo moltiplichi? Quindi, se vuoi un numero casuale da 0-3, (int)(Math.random()*4)è accettabile dividerlo uniformemente (quattro volte 2251799813685248), ma quando lo usi *3invece non lo è (che è tre volte 3002399751580330.666...), perché lanciandolo su un piano interno, creando alcune parti 1 più piccolo di altri. E poiché la lunghezza è variabile nel tuo caso, non è nemmeno distribuita uniformemente (con la possibilità di essere lunghezza 3).
Kevin Cruijssen,

1
Sì, hai capito tutto! Se qualcuno dice "casuale", usa Math.random(), se qualcuno dice qualcosa in modo "uniforme" o "abbastanza" casuale, usa java.util.Random. Questo è anche il motivo per cui mi sono lamentato della risposta di Shaggy.
Olivier Grégoire,

1

> <> , 311 byte

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

Provalo online o guardalo nel parco giochi per pesci

Con maglia accogliente SK e Doof God Dennac!

Spiegazione: Il primo compito del pesce è capire qual è la parola di input zig-zag in basso a sinistra. Il pesce può leggere solo una lettera alla volta e richiede meno byte per farlo in modo distruttivo. Innanzitutto, il pesce legge la prima lettera e chiede se è "y"- se lo è, la parola è "gialla", altrimenti va avanti. Quindi legge la seconda lettera - se lo è "l", la parola è "blu", altrimenti continua; e così via. Se legge cinque lettere e non corrispondono "y"( Y ellow), "l"(b L ue), "o"(br O wn), "n"(ora N ge) o "n"(gree N ) rispettivamente, il colore deve essere stato "bianco".

Poi arriva il bit casuale. Per i colori con due possibili risultati, questo è piuttosto semplice: per il giallo, ad esempio, il pesce inserisce il seguente codice in corrispondenza di x:

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

I xImposta la direzione in modo casuale: se è alto o sinistra, i vortici di pesce in tutto gli specchi Torna alla x, ma se si tratta di destra o in basso, si legge "uova marce" o "popcorn al burro" (in senso inverso).

Le divisioni a quattro vie (per bianco e verde) sono più disordinate, ma seguono lo stesso principio generale: il primo è:

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

Nota che se il pesce nuota verso l'alto dal primo x, passa attraverso otto "s, che attiva e disattiva la modalità stringa quattro volte, quindi colpisce uno specchio e nuota indietro.

Per arrivare all'ultima divisione a quattro vie, il pesce deve nuotare attraverso ee rdi "lime" e "pera", che si aggiungono e = 14allo stack (e lo invertono), quindi dobbiamo prima eliminarlo con ~. Uno dei quattro rami coinvolge anche il nuoto attraverso una corda spazzatura "> ", che eliminiamo con ~~.

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

Alla fine, dopo aver aggiunto uno degli aromi di fagioli allo stack, il pesce raggiunge il flusso di vs nella colonna più a sinistra, che lo invia a

v    \
v    o
>l?!;/

che stampa i caratteri (usando una delle os in "cocco") fino a quando non ne rimangono più.


1

T-SQL, 432 423 375 367 336 295 byte

Finalmente un'operazione basata sul set !!

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

(Le interruzioni di riga sono per la visualizzazione e non vengono conteggiate in totale.)

L'input avviene tramite la colonna c nella tabella t indicata , secondo le nostre linee guida .

Sto semplicemente unendo la nostra tabella di input a una tabella piena delle combinazioni colore / sapore valide, quindi selezionando una riga casuale. ORDER BY NEWID()è un modo comune per randomizzare l'ordinamento in SQL . A seconda di quanto sei severo, potresti non considerarlo perfettamente uniformemente casuale, ma dovrebbe essere sufficientemente casuale per la selezione di jelly bean.

EDIT 1: salvato 9 byte utilizzando solo il 3 ° carattere del colore, ispirato ad altre risposte.

EDIT 2: salvato 48 byte inserendo la bandiera del colore e il sapore in una singola colonna. Molti personaggi salvati nell'INSERTO.

EDIT 3: salvato 8 byte sostituendo INSERT INTO b(o)conINSERT b

EDIT 4: salvato altri 31 byte unendosi direttamente alla tabella virtuale di VALUESe quindi eliminando CREATE TABLEe INSERT.

EDIT 5: salva 41 byte eseguendo l'aggiornamento alla sola STRING_SPLITfunzione di SQL 2016 , che mi consente di eliminare l'esecuzione SQL dinamica e variabile.


0

PHP , 242 byte

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

Provalo online!


0

Mathematica, 247 byte

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

Modulo di input

[verde]


Puoi indicizzare la stringa e usare il eluaoitrucco? Non conosco la matematica, quindi solo un'idea.
TheLethalCoder

0

Clojure, 231 byte

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

Stessa idea delle altre, posso solo risparmiare un po 'di spazio rispetto ad altre lingue. La compressione delle stringhe sembra una causa persa.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.