Das seltsame und wilde Bohnenspiel


11

Vielleicht kennen einige von Ihnen dieses Spiel bereits: Sie haben eine Sammlung von Gummibärchen in verschiedenen Farben. Für jede Farbe kann die Bohne unterschiedliche Geschmäcker haben, einige sind gut und einige sind schlecht, und man kann sie nicht unterscheiden. Sie müssen eine Bohne einer bestimmten Farbe auswählen und beten, dass Sie eine gute ausgewählt haben.

Schreiben Sie also das kürzeste Programm, das eine Farbe Ihrer Wahl (aus einer bestimmten Liste) erhält und den ausgewählten Geschmack zufällig zurückgibt. Der Geschmack muss aus einer eingebauten Liste ausgewählt werden. Die mögliche Liste der Ein- und Ausgänge ist:

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

Regeln:

  • Sie können davon ausgehen, dass die Eingabe immer eine Farbe aus den Eingabemöglichkeiten sein wird.
  • Groß- und Kleinschreibung und nachgestellte Leerzeichen und / oder Zeilenumbrüche spielen keine Rolle.
  • Die Ausgabe muss einheitlich zufällig sein: Aufeinanderfolgende Programmausführungen müssen zu unterschiedlichen Ergebnissen führen, und die Chancen, einen bestimmten Geschmack zu erhalten, müssen für alle Geschmäcker in einer Liste gleich sein.

Dies ist , also kann das kürzeste Programm gewinnen!


In einem Teil Ihrer Frage geben Sie an, dass der Geschmack aus einer bestimmten Liste ausgewählt wird, was bedeutet, dass wir ihn als Eingabe erhalten. In Ihren Beispielen scheint das Gegenteil der Fall zu sein.
Okx

@ Okx sorry, ist es jetzt besser? Ich gewöhne mich immer noch daran, hier zu posten ...
Charlie

1
Vielleicht geben Sie an, dass die Ausgabe einheitlich zufällig sein muss, damit alle möglichen Ausgaben die gleiche Wahrscheinlichkeit haben, angezeigt zu werden, oder ich kann einfach 2 Optionen aus jeder Liste hinzufügen.
LiefdeWen

@StefanDelport danke, behoben!
Charlie

1
Es ist jetzt ein bisschen spät, aber es hätte wahrscheinlich blueberrynicht sein sollen blue berry.
Jonathan Allan

Antworten:


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

Selbst für C # zu lang, aber ich kann nicht sehen, wie ich es kürzer machen kann.

Vollversion / Formatierte Version:

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

Das ist ein verdammt guter Golf! +1
Shaggy

@Shaggy Danke :) Ich fing an, es wirklich naiv zu machen und erkannte langsam die kürzere Art, Dinge zu tun. Ich hatte es im Kopf, ich brauchte ein Wörterbuch und sah dann deine Antwort mit der Schnur und der Aufteilung und erkannte den Weg zum Licht!
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‡

Erläuterung:

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

Wenn sich jemand wundert, hier ist die unkomprimierte Zeichenfolge:

lawn clippingsjlimejmucusjpearqrotten eggsjbuttered popcornqtoothpastejblue berryqvomitjpeachqcanned dog foodjchocolateqstinky socksjtuttixfruttijbaby diapersjcoconut

Ich kann es wahrscheinlich mit ein paar cleveren Tricks und dem Wörterbuch mehr komprimieren.

Probieren Sie es online aus!


Sie können komprimieren , "eougwt"um .•4Õ!Õ•für -1.
Erik der Outgolfer

@EriktheOutgolfer Als ich das versuchte, verglich ich die Länge von eougwtund .•4Õ!Õ•anstelle von "eougwt"und .•4Õ!Õ•. Hoppla.
Okx

5

JavaScript (ES6), 235 Byte

Ich muss herausfinden, wie man Strings in JS komprimiert!

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]

Wenn das für Ihren Geschmack nicht "zufällig genug" ist, fügen Sie 7 Bytes hinzu, die durch ersetzt new Datewerden 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]

Versuch es

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
Schöne Idee mit eluaoi, ich habe selbst darüber nachgedacht und dachte: "Oh, schau, wie schlau ich bin", dann hast du gesehen, wie du mich geschlagen hast!
TheLethalCoder

new Date%a.lengthist nicht "einheitlich zufällig".
Olivier Grégoire

Danke, @TheLethalCoder - ich war so faul, ich habe mich fast nicht darum gekümmert, nach den 2. Zeichen nach Eindeutigkeit zu suchen!
Shaggy

3
Heh, ich denke, 4 oder 5 von uns haben sich eluaoiungefähr zur gleichen Zeit
ausgedacht

@ OlivierGrégoire, diese Lösung ist älter als diese Anforderung, aber ich habe eine andere Option hinzugefügt, die Math.randomstattdessen verwendet wird.
Shaggy


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 ö

Probieren Sie es online aus!

6 Bytes dank Shaggy und ETHproductions gespart


Aufteilen Rstatt 0um ein Byte zu speichern. Möglicherweise können Sie auch komprimieren, eluaoiindem Sie mit der Reihenfolge herumspielen.
Shaggy

@Shaggy Wie würde das ein Byte sparen? Ich müsste anrufen, qRwelche gleich lang ist?
Tom

Überprüfen Sie die Unicode-Verknüpfungen in den Dokumenten;)
Shaggy

Entschuldigung, ich habe vergessen zu sagen, dass Sie den Speicherplatz auch vorher entfernen können ®.
Shaggy

Schön, fast genau das, was ich hatte. Sie benötigen nur 5 der 6 Zeichen in der Zeichenfolge, da das fehlende einen Index von -1 hat und daher das letzte Element im Array erhält. Wenn Sie eaioudie Zeichenfolge verwenden, können Sie sie auf drei Byte komprimieren (möglicherweise gibt es auch andere Drei-Byte-Kombinationen).
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*

Probieren Sie es online aus!

Es wurden sehr viele Bytes gespeichert, indem die Schlüssel gekürzt wurden, um den zweiten Index der Eingabe zu verwenden, wie von @TheLethalCoder vorgeschlagen, und durch Aufteilen von Kommas anstelle einer direkten Liste.


1
Verwenden Sie eluaoials Wörterbuchschlüssel und greifen Sie mit Index 2 der Zeichenfolge darauf zu, um Bytes zu sparen.
TheLethalCoder

Groß (y) zu LethalCoders Idee
offiziell am

3

Gelee ,  95  94 Bytes

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

Ein monadischer Link, der eine Liste von (Klein-) Zeichen akzeptiert und eine Liste von Zeichen zurückgibt.

Probieren Sie es online aus! oder essen Sie eine Packung mit 48 Stück .

Wie?

Neunundachtzig der vierundneunzig Bytes sind eine komprimierte Liste von acht Zeichenfolgen. Zwei davon sind leere Zeichenfolgen und die anderen sechs sind jeweils durch Zeilenumbrüche getrennte Geschmacksrichtungen für eine der Farben:

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

Der Rest des Programms analysiert die Eingabe, um zu entscheiden, welche Liste verwendet werden soll, teilt die ausgewählte Liste durch Zeilenumbrüche und wählt ein zufälliges Element aus:

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

Testen Sie es selbst!

Könnte mit einem Golf gespielt werden char[].

Der zufällige Teil kann jedoch ohne die explizite Verwendung von nicht "gleichmäßig verteilt" werden Random.nextInt(int). Auch (int)(Math.random()*a.length)ist nicht gleichmäßig verteilt.


Hmm, ich verstehe nicht, warum Sie new java.util.Random().nextInt(a.length)statt ... verwenden müssen (int)(Math.random()*a.length).
Kevin Cruijssen

1
Math.random()liefert eine Zahl mit einigen Besonderheiten (Potenz 0und Vorzeichen von 0und 52 Zufallsbits). Also eigentlich Sie verwenden eine Entropie von 52 ohne weitere Prüfung. Wenn 3zum Beispiel die Länge 2^52nicht durch 3 teilbar ist , wird sie nicht zufällig verteilt. Aus diesem Grund verfügt die Random.nextInt(int)eigentliche Java-Datei, nicht Javadoc, in Zeile 394 über einen Schleifenmechanismus, um sicherzustellen, dass die Zahl unter den fairen Zahlen liegt. Wenn ich nicht sage "es ist gut genug", ist nur Random.nextInt(n)fair.
Olivier Grégoire

@ KevinCruijssen Mein Fehler: Es ist 53 zufällige Bits, nicht 52.
Olivier Grégoire

1
Ah ok, danke für die Erklärung. So Math.random()kann nicht verwendet werden , wenn 2^53nicht gleichmäßig durch die Anzahl Sie mehrfach unterteilt werden sie mit? Wenn Sie also eine Zufallszahl von 0 (int)(Math.random()*4)bis 3 möchten, ist es akzeptabel, sie gleichmäßig zu teilen (viermal 2251799813685248), aber wenn Sie sie *3stattdessen verwenden, ist dies nicht der Fall (dreimal 3002399751580330.666...), da sie auf int Etagen gegossen wird und einige Teile entstehen 1 kleiner als andere. Und da die Länge in Ihrem Fall variabel ist, ist sie auch nicht gleichmäßig verteilt (mit der Möglichkeit, Länge 3 zu sein).
Kevin Cruijssen

1
Ja, du hast alles verstanden! Wenn jemand "zufällig" sagt, verwenden Sie Math.random(), wenn jemand etwas "einheitlich" oder "ziemlich" zufällig sagt, verwenden Sie java.util.Random. Deshalb habe ich mich auch über Shaggys Antwort beschwert.
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"

Probieren Sie es online aus oder schauen Sie es sich auf dem Fischspielplatz an

Mit SK kuscheligen Strickwaren und Doof God Dennac!

Erläuterung: Die erste Aufgabe des Fisches besteht darin, das eingegebene Wort durch Zick-Zack-Verfahren auf der linken Seite herauszufinden. Der Fisch kann jeweils nur einen Buchstaben lesen, und es werden weniger Bytes benötigt, um dies destruktiv zu tun. Zuerst liest der Fisch den ersten Buchstaben und fragt, ob es so ist "y"- wenn ja, ist das Wort "gelb", sonst geht es weiter. Es liest dann den zweiten Buchstaben - wenn ja "l", ist das Wort "blau", sonst geht es weiter; und so weiter. Wenn es liest fünf Buchstaben und sie stimmen nicht überein "y"( Y ellow), "l"(b L ue), "o"(br O wn), "n"(ora N ge) oder "n"(Gree N ) , die jeweils, muss die Farbe gewesen sein "weiß".

Als nächstes kommt das zufällige Bit. Für die Farben mit zwei möglichen Ausgaben ist dies ziemlich einfach - für Gelb gibt der Fisch beispielsweise den folgenden Code an x:

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

Das xlegt die Richtung zufällig fest: Wenn es oben oder links ist, wirbelt der Fisch um die Spiegel zurück zum x, aber wenn es rechts oder unten ist, liest es "faule Eier" oder "gebuttertes Popcorn" (umgekehrt).

Die Vier-Wege-Teilungen (für Weiß und Grün) sind unordentlicher, folgen jedoch demselben allgemeinen Prinzip - das erste ist:

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

Beachten Sie, dass der Fisch, wenn er von Anfang an nach oben schwimmt, xacht "Sekunden durchläuft , wodurch der Saitenmodus viermal ein- und ausgeschaltet wird. Dann trifft er auf einen Spiegel und schwimmt wieder nach unten.

Um zum letzten Vier-Wege-Split zu gelangen, muss der Fisch durch das eund rvon "Limette" und "Birne" schwimmen , die e = 14dem Stapel hinzugefügt werden (und ihn umkehren), also müssen wir das zuerst mit löschen ~. In einem der vier Zweige schwimmt man auch durch eine Junk-Zeichenfolge, "> "mit der wir löschen ~~.

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

Schließlich erreicht der Fisch nach dem Hinzufügen eines der Bohnenaromen zum Stapel den Strom von vs in der Spalte ganz links, an den er gesendet wird

v    \
v    o
>l?!;/

Hiermit werden Zeichen gedruckt (mit einem der os in "Kokosnuss"), bis keine mehr übrig sind.


1

T-SQL, 432 423 375 367 336 295 Byte

Endlich eine satzbasierte Operation !!

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

(Zeilenumbrüche dienen zur Anzeige und werden insgesamt nicht gezählt.)

Die Eingabe erfolgt über Spalte c in benannte Tabelle t , gemäß unseren Richtlinien .

Ich füge unsere Eingabetabelle einfach einer Tabelle mit den gültigen Farb- / Geschmackskombinationen hinzu und wähle dann eine zufällige Zeile aus. ORDER BY NEWID()ist eine gängige Methode zum Randomisieren der Sortierreihenfolge in SQL . Abhängig davon, wie streng Sie sind, können Sie es möglicherweise nicht als vollkommen gleichmäßig zufällig betrachten, aber es sollte ausreichend zufällig für die Auswahl von Jelly Beans sein.

BEARBEITEN 1: 9 Bytes wurden gespeichert, indem nur das 3. Zeichen der Farbe verwendet wurde, inspiriert von anderen Antworten.

BEARBEITEN 2: 48 Bytes wurden gespeichert, indem das Farbflag und der Geschmack in eine einzelne Spalte eingefügt wurden. Viele Zeichen im INSERT gespeichert.

3 EDIT: Gespeicherte 8 Bytes durch den Austausch INSERT INTO b(o)mitINSERT b

EDIT 4: Sparte 31 weitere Bytes, indem Sie sich direkt der virtuellen Tabelle von anschließen VALUESund daher das CREATE TABLEund eliminieren INSERT.

BEARBEITEN 5: Sparen Sie 41 Bytes, indem Sie auf die Nur-SQL 2016- STRING_SPLITFunktion aktualisieren , wodurch ich die variable und dynamische SQL-Ausführung eliminieren kann.


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

Probieren Sie es online aus!


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

Eingabeformular

[Grün]


Können Sie in den String indizieren und den eluaoiTrick anwenden? Ich kenne Mathematica nicht, also nur eine Idee.
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)))

Dieselbe Idee wie die anderen, ich kann im Vergleich zu anderen Sprachen nur etwas Platz sparen. Das Komprimieren von Zeichenfolgen scheint eine verlorene Sache zu sein.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.