Permainan kacang aneh dan liar


11

Mungkin sebagian dari Anda sudah tahu permainan ini: Anda memiliki koleksi jelly beans dengan warna berbeda. Untuk setiap warna, kacang dapat memiliki selera yang berbeda, ada yang baik dan ada yang buruk, dan Anda tidak dapat membedakannya. Anda harus memilih kacang yang diberi warna, dan berdoa Anda telah memilih yang baik.

Jadi, tulis program terpendek yang menerima warna pilihan Anda (dari daftar yang diberikan), dan secara acak mengembalikan rasa yang dipilih. Rasa harus dipilih dari daftar bawaan. Daftar input dan output yang mungkin adalah:

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

Aturan:

  • Anda dapat mengasumsikan bahwa input akan selalu berwarna dari pilihan input.
  • Kasing dan spasi tambahan dan / atau baris baru tidak masalah.
  • Output harus acak seragam: eksekusi program berturut-turut harus menghasilkan hasil yang berbeda, dan kemungkinan mendapatkan rasa yang diberikan harus sama untuk semua selera dalam daftar.

Ini , jadi semoga program terpendek menang!


Di salah satu bagian dari pertanyaan Anda, Anda menyatakan bahwa rasanya akan dipilih dari daftar yang diberikan, menyiratkan bahwa kami akan menerimanya sebagai masukan. Namun, dalam contoh Anda, tampaknya sebaliknya begitu.
Okx

@Okx maaf, apakah sekarang lebih baik? Saya masih terbiasa memposting di sini ...
Charlie

1
Mungkin nyatakan bahwa output harus acak acak sehingga semua output yang mungkin memiliki peluang yang sama muncul atau saya hanya dapat menambahkan 2 opsi dari setiap daftar.
LiefdeWen

@StefanDelport terima kasih, sudah diperbaiki!
Charlie

1
Ini agak terlambat sekarang, tetapi mungkin seharusnya blueberrytidak blue berry.
Jonathan Allan

Jawaban:


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

Terlalu lama bahkan untuk C # tetapi saya tidak bisa melihat bagaimana cara membuatnya lebih pendek.

Versi Lengkap / Terformat:

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

Benar-benar golf! +1
Shaggy

@Shaggy Terima kasih :) Saya mulai melakukannya dengan cara yang sangat naif dan perlahan menyadari cara yang lebih singkat dalam melakukan sesuatu. Saya telah memasukkannya ke dalam kepala saya, saya membutuhkan kamus dan kemudian melihat jawaban Anda menggunakan string dan membelah dan menyadari jalan menuju cahaya!
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‡

Penjelasan:

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

Jika ada yang bertanya-tanya, inilah string yang tidak dikompresi:

lawn clippingsjlimejmucusjpearqrotten eggsjbuttered popcornqtoothpastejblue berryqvomitjpeachqcanned dog foodjchocolateqstinky socksjtuttixfruttijbaby diapersjcoconut

Saya mungkin bisa mengompres lebih banyak menggunakan beberapa trik pintar dan kamus.

Cobalah online!


Anda dapat mengompres "eougwt"ke .•4Õ!Õ•untuk -1.
Erik the Outgolfer

@EriktheOutgolfer Ketika saya mencobanya, saya membandingkan panjang eougwtdan .•4Õ!Õ•, bukannya "eougwt"dan .•4Õ!Õ•. Ups.
Okx

5

JavaScript (ES6), 235 byte

Saya perlu mencari cara untuk kompres string di 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]

Jika itu tidak "cukup acak" untuk selera Anda kemudian menambahkan 7 bytes mengganti new Datedengan 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]

Cobalah

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
Gagasan yang bagus dengan eluaoi, saya memikirkannya sendiri dan berpikir, "Oooh, lihat betapa pandainya saya", lalu melihat Anda mengalahkan saya!
TheLethalCoder

new Date%a.lengthbukan "acak seragam".
Olivier Grégoire

Terima kasih, @TheLethalCoder - Saya malas, saya hampir tidak repot memeriksa keunikan melewati karakter ke-2!
Shaggy

3
Heh, saya kira sekitar 4 atau 5 dari kita muncul dengan eluaoiwaktu yang bersamaan: P
ETHproduk

@ OlivierGrégoire, solusi ini mendahului persyaratan itu tetapi saya telah menambahkan opsi lain yang menggunakan Math.randomsebagai gantinya.
Shaggy

4

Jelly , 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

Cobalah 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 ö

Cobalah online!

Disimpan 6 byte berkat produk Shaggy dan ETH


Berpisah dan Rbukannya 0menyimpan satu byte. Selain itu, Anda mungkin dapat mengompres eluaoidengan bermain-main dengan pesanan.
Shaggy

@ Shaggy Bagaimana cara menyimpan satu byte? Saya perlu menelepon qRyang panjangnya sama?
Tom

Periksa pintasan Unicode di dokumen;)
Shaggy

Maaf, lupa mengatakan Anda dapat menghapus ruang sebelumnya ®juga.
Shaggy

Bagus, hampir persis seperti yang saya miliki. Anda hanya perlu 5 dari 6 karakter dalam string karena yang hilang akan memiliki indeks -1, dan karena itu mendapatkan item terakhir dalam array. Jika Anda menggunakan eaiousebagai string, Anda dapat memampatkannya menjadi tiga byte (mungkin ada kombinasi tiga byte lainnya).
ETHproduk

3

Python 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*

Cobalah online!

Disimpan sangat banyak byte dengan memperpendek tombol untuk menggunakan indeks input ke-2, seperti yang disarankan oleh @TheLethalCoder, dan dengan membelah koma alih-alih menggunakan daftar langsung.


1
Gunakan eluaoisebagai kunci kamus dan akses dengan indeks 2 dari string akan menghemat byte.
TheLethalCoder

Besar (y) untuk ide LethalCoder
officialaimm

3

Jelly ,  95  94 byte

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

Tautan monadik yang menerima daftar karakter (huruf kecil) dan mengembalikan daftar karakter.

Cobalah online! atau makan paket 48 .

Bagaimana?

Delapan puluh sembilan dari sembilan puluh empat byte adalah daftar terkompresi dari delapan string. Dua di antaranya adalah string kosong dan enam lainnya adalah masing-masing rasa yang dipisahkan baris baru untuk salah satu warna:

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

Sisa program mem-parsing input untuk memutuskan daftar mana yang akan digunakan, membagi daftar yang dipilih dengan baris baru dan memilih elemen acak:

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

Uji sendiri!

Bisa bermain golf dengan menggunakan a char[].

Namun bagian acak tidak dapat "didistribusikan secara seragam" tanpa penggunaan eksplisit Random.nextInt(int). Bahkan (int)(Math.random()*a.length)tidak terdistribusi secara merata.


Hmm, saya tidak mendapatkan penjelasan tentang mengapa Anda harus menggunakan new java.util.Random().nextInt(a.length)daripada (int)(Math.random()*a.length)..
Kevin Cruijssen

1
Math.random()menyediakan angka yang memiliki beberapa kekhususan (kekuatan 0dan tanda 0dan 52 bit acak). Jadi Anda benar-benar menggunakan entropi 52 tanpa pemeriksaan lebih lanjut. Jika panjang 3, misalnya, 2^52tidak dapat dibagi dengan 3. Jadi tidak didistribusikan secara acak. Inilah sebabnya mengapa Random.nextInt(int)(file java aktual, bukan javadoc, pada baris 394) memiliki mekanisme loop untuk memastikan nomor tersebut ada di antara angka-angka wajar. Kecuali saya berkata "itu cukup baik", hanya Random.nextInt(n)adil.
Olivier Grégoire

@KevinCruijssen Kesalahan saya: ini 53 bit acak, bukan 52.
Olivier Grégoire

1
Ah ok terima kasih untuk penjelasannya. Jadi Math.random()tidak dapat digunakan saat 2^53tidak dapat dibagi secara merata dengan jumlah yang Anda kalikan? Jadi, jika Anda ingin angka acak dari 0-3, (int)(Math.random()*4)dapat diterima untuk membagi secara merata (empat kali 2251799813685248), tetapi ketika Anda menggunakannya *3bukan (yang tiga kali 3002399751580330.666...), karena melemparkannya ke lantai, membuatnya menjadi beberapa bagian 1 lebih kecil dari yang lain. Dan karena panjang variabel dalam kasus Anda, panjangnya juga tidak terdistribusi secara merata (dengan kemungkinan panjangnya 3).
Kevin Cruijssen

1
Yap, kamu mengerti semuanya! Jika seseorang mengatakan "acak", gunakan Math.random(), jika seseorang mengatakan sesuatu secara acak "seragam" atau "cukup", gunakan java.util.Random. Itu juga sebabnya saya mengeluh tentang jawaban 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"

Cobalah online , atau tonton di taman bermain ikan

Menampilkan rajutan SK yang nyaman dan Doof God Dennac!

Penjelasan: Tugas pertama ikan adalah untuk mencari tahu apa kata input dengan zig-zag di sisi kiri. Ikan hanya dapat membaca satu huruf pada satu waktu, dan dibutuhkan lebih sedikit byte untuk melakukan ini secara destruktif. Pertama, ikan membaca huruf pertama dan bertanya apakah itu "y"- jika ya, kata itu "kuning", kalau tidak ia akan melanjutkan. Itu kemudian membaca huruf kedua - jika itu "l", kata itu "biru", jika tidak bergerak; dan seterusnya. Jika membaca lima huruf dan tidak cocok "y"( Y ellow), "l"(b L ue), "o"(br O wn), "n"(ora N ge) atau "n"(gree N ) masing-masing, maka warnanya pastilah "putih".

Selanjutnya datang bit acak. Untuk warna dengan dua kemungkinan keluaran, ini cukup mudah - untuk kuning, misalnya, ikan memasukkan kode berikut di x:

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

Yang xmengatur arah secara acak: jika itu naik atau turun, ikan berputar di sekitar cermin kembali ke x, tetapi jika itu benar atau turun, itu berbunyi "telur busuk" atau "popcorn mentega" (terbalik).

Perpecahan empat arah (untuk putih dan hijau) lebih berantakan, tetapi mereka mengikuti prinsip umum yang sama - yang pertama adalah:

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

Perhatikan bahwa jika ikan berenang dari yang pertama x, ia melewati delapan "detik, yang mengaktifkan dan menonaktifkan mode string empat kali, kemudian menyentuh cermin dan berenang kembali.

Untuk mencapai pemisahan empat arah terakhir, ikan harus berenang melalui edan rdari "kapur" dan "pir", yang menambah e = 14tumpukan (dan membalikkannya), jadi pertama-tama kita harus menghapusnya dengan ~. Salah satu dari empat cabang juga melibatkan berenang melalui string sampah "> ", yang kita hapus ~~.

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

Akhirnya, setelah menambahkan salah satu rasa kacang ke tumpukan, ikan mencapai aliran vs di kolom paling kiri, yang mengirimkannya ke

v    \
v    o
>l?!;/

yang mencetak karakter (menggunakan salah satu huruf os di "kelapa") sampai tidak ada yang tersisa.


1

T-SQL, 432 423 375 367 336 295 byte

Akhirnya, operasi berbasis 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()

(Jeda baris untuk tampilan dan tidak dihitung secara total.)

Input melalui kolom c pada tabel bernama t , sesuai pedoman kami .

Saya hanya bergabung dengan tabel input kami ke tabel yang penuh dengan kombinasi warna / rasa yang valid, lalu memilih baris acak. ORDER BY NEWID()adalah cara umum untuk mengacak urutan di SQL . Tergantung pada seberapa ketat Anda, Anda mungkin tidak menganggapnya acak sempurna, tetapi harus cukup acak untuk pemilihan jelly bean.

EDIT 1: Disimpan 9 byte dengan hanya menggunakan karakter warna ke-3, terinspirasi oleh jawaban lain.

EDIT 2: Disimpan 48 byte dengan meletakkan bendera warna dan rasa dalam satu kolom. Banyak karakter yang disimpan di INSERT.

EDIT 3: Disimpan 8 byte dengan mengganti INSERT INTO b(o)denganINSERT b

EDIT 4: Menyimpan 31 byte lebih banyak dengan bergabung langsung ke tabel virtual VALUESdan karenanya menghilangkan CREATE TABLEdan INSERT.

EDIT 5: Hemat 41 byte dengan memutakhirkan ke STRING_SPLITfungsi SQL-only 2016 , yang memungkinkan saya untuk menghilangkan variabel dan eksekusi SQL dinamis.


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

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

Formulir input

[hijau]


Bisakah Anda mengindeks ke dalam string dan menggunakan eluaoitriknya? Saya tidak tahu matematika jadi hanya sebuah ide.
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)))

Gagasan yang sama seperti yang lain, saya hanya bisa menghemat ruang dibandingkan dengan bahasa lain. Senar yang menekan tampaknya seperti penyebab yang hilang.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.