Trò chơi đậu kỳ lạ và hoang dã


11

Có thể một số bạn đã biết trò chơi này: bạn có một bộ sưu tập các hạt thạch có màu sắc khác nhau. Đối với mỗi màu sắc, đậu có thể có mùi vị khác nhau, một số tốt và một số xấu, và bạn không thể phân biệt chúng. Bạn phải chọn một hạt đậu có màu nhất định và cầu nguyện bạn đã chọn được một hạt tốt.

Vì vậy, hãy viết chương trình ngắn nhất nhận được màu bạn chọn (từ danh sách đã cho) và trả về ngẫu nhiên hương vị đã chọn. Hương vị phải được chọn từ một danh sách tích hợp. Danh sách đầu vào và đầu ra có thể là:

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

Quy tắc:

  • Bạn có thể giả định rằng đầu vào sẽ luôn là một màu từ các lựa chọn đầu vào.
  • Không gian trường hợp và dấu và / hoặc dòng mới không quan trọng.
  • Đầu ra phải ngẫu nhiên thống nhất: việc thực hiện chương trình thành công phải mang lại kết quả khác nhau và cơ hội nhận được một hương vị nhất định phải giống nhau cho tất cả các thị hiếu trong danh sách.

Đây là , vì vậy chương trình ngắn nhất có thể giành chiến thắng!


Trong một phần của câu hỏi của bạn, bạn nói rằng hương vị sẽ được chọn từ một danh sách nhất định, ngụ ý rằng chúng tôi sẽ nhận được nó làm đầu vào. Tuy nhiên, trong ví dụ của bạn, có vẻ như ngược lại là như vậy.
Okx

@Okx xin lỗi, bây giờ có tốt hơn không? Tôi vẫn đang quen với việc đăng bài ở đây ...
Charlie

1
Có thể nói rằng đầu ra phải ngẫu nhiên đồng đều để tất cả các đầu ra có thể có cùng tỷ lệ xuất hiện hoặc nếu không tôi chỉ có thể thêm 2 tùy chọn từ mỗi danh sách.
LiefdeWen

@StefanDelport cảm ơn bạn, đã sửa!
Charlie

1
Bây giờ hơi muộn, nhưng có lẽ blueberrykhông nên blue berry.
Jonathan Allan

Câu trả lời:


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

Quá dài ngay cả đối với C # nhưng tôi không thể thấy làm thế nào để rút ngắn hơn nữa.

Phiên bản đầy đủ / được định dạng:

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

Đó là một địa ngục của một sân golf! +1
Shaggy

@Shaggy Cảm ơn :) Tôi bắt đầu thực hiện nó một cách thực sự ngây thơ và từ từ nhận ra cách làm việc ngắn hơn. Tôi đã bị mắc kẹt trong đầu Tôi cần một cuốn từ điển và sau đó thấy câu trả lời của bạn bằng cách sử dụng chuỗi và tách và nhận ra đường dẫn đến ánh sáng!
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‡

Giải trình:

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

Nếu bất cứ ai thắc mắc, đây là chuỗi không nén:

lawn clippingsjlimejmucusjpearqrotten eggsjbuttered popcornqtoothpastejblue berryqvomitjpeachqcanned dog foodjchocolateqstinky socksjtuttixfruttijbaby diapersjcoconut

Tôi có lẽ có thể nén nó nhiều hơn bằng cách sử dụng một số thủ thuật thông minh và từ điển.

Hãy thử trực tuyến!


Bạn có thể nén "eougwt"thành .•4Õ!Õ•-1.
Erik the Outgolfer

@EriktheOutgolfer Khi tôi thử điều đó, tôi đã so sánh độ dài của eougwt.•4Õ!Õ•, thay vì "eougwt".•4Õ!Õ•. Giáo sư.
Okx

5

JavaScript (ES6), 235 byte

Tôi cần tìm ra cách nén các chuỗi trong 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]

Nếu điều đó không "đủ ngẫu nhiên" cho thị hiếu của bạn thì hãy thêm 7 byte thay thế new Datebằng 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]

Thử nó

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
Ý tưởng tuyệt vời với eluaoi, tôi đã nghĩ về nó một mình và nghĩ, "Ôi nhìn xem tôi thông minh đến mức nào" rồi thấy bạn đánh bại tôi!
TheLethalCoder

new Date%a.lengthkhông phải là "ngẫu nhiên thống nhất".
Olivier Grégoire

Cảm ơn, @TheLethalCoder - Tôi thật lười biếng, tôi gần như không buồn kiểm tra sự độc đáo qua các nhân vật thứ 2!
Shaggy

3
Heh, tôi nghĩ rằng khoảng 4 hoặc 5 người trong số chúng tôi đã đưa ra eluaoicùng một lúc: P
Sản phẩm ETH

@ OlivierGrégoire, giải pháp này có trước yêu cầu đó nhưng tôi đã thêm một tùy chọn khác sử dụng Math.randomthay thế.
Xù xì


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 ö

Hãy thử trực tuyến!

Đã lưu 6 byte nhờ Shaggy và ETHproductions


Chia nhỏ Rthay vì 0để lưu một byte. Ngoài ra, bạn có thể nén eluaoibằng cách chơi xung quanh với thứ tự.
Xù xì

@Shaggy Làm thế nào mà tiết kiệm được một byte? Tôi sẽ cần phải gọi qRđó là cùng một chiều dài?
Tom

Kiểm tra các phím tắt Unicode trong tài liệu;)
Shaggy

Xin lỗi, quên nói bạn có thể loại bỏ không gian trước ®quá.
Shaggy

Đẹp, gần như chính xác những gì tôi đã có. Bạn chỉ cần 5 trong số 6 ký tự trong chuỗi vì cái còn thiếu sẽ có chỉ số -1, và do đó sẽ có được mục cuối cùng trong mảng. Nếu bạn sử dụng eaioulàm chuỗi, bạn có thể nén nó xuống còn ba byte (có thể có các kết hợp ba byte khác).
Sản phẩm ETH

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*

Hãy thử trực tuyến!

Đã lưu rất nhiều byte bằng cách rút ngắn các khóa để sử dụng chỉ mục thứ 2 của đầu vào, như được đề xuất bởi @TheLethalCoder và bằng cách tách trên dấu phẩy thay vì sử dụng danh sách trực tiếp.


1
Sử dụng eluaoilàm khóa từ điển và truy cập nó với chỉ mục 2 của chuỗi sẽ giúp bạn tiết kiệm byte.
TheLethalCoder

Ý tưởng lớn (y) cho LethalCoder's
chính thức tuyên bố

3

Thạch ,  95  94 byte

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

Một liên kết đơn âm chấp nhận một danh sách các ký tự (chữ thường) và trả về một danh sách các ký tự.

Hãy thử trực tuyến! hoặc ăn một gói 48 .

Làm sao?

Tám mươi chín trong số chín mươi bốn byte là một danh sách nén gồm tám chuỗi. Hai trong số này là các chuỗi trống và sáu còn lại là mỗi hương vị riêng biệt cho một trong các màu:

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

Phần còn lại của chương trình phân tích cú pháp đầu vào để quyết định danh sách nào sẽ sử dụng, chia danh sách đã chọn theo dòng mới và chọn một phần tử ngẫu nhiên:

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

Tự kiểm tra!

Có thể được đánh golf bằng cách sử dụng a char[].

Tuy nhiên, phần ngẫu nhiên không thể được "phân phối đồng đều" mà không sử dụng rõ ràng Random.nextInt(int). Thậm chí (int)(Math.random()*a.length)không được phân phối đồng đều.


Hmm, tôi không nhận được lời giải thích về lý do tại sao bạn phải sử dụng new java.util.Random().nextInt(a.length)thay vì (int)(Math.random()*a.length)..
Kevin Cruijssen

1
Math.random()cung cấp một số có một số đặc tính (sức mạnh 0và dấu hiệu 0và 52 bit ngẫu nhiên). Vì vậy, bạn thực sự sử dụng một entropy 52 mà không cần kiểm tra thêm. 3Ví dụ, nếu độ dài 2^52không chia hết cho 3. Vì vậy, nó không được phân phối ngẫu nhiên. Đây là lý do tại sao Random.nextInt(int)(tệp java thực tế, không phải javadoc, ở dòng 394) có cơ chế lặp để đảm bảo số nằm trong số hợp lý. Trừ khi tôi nói "nó đủ tốt", chỉ Random.nextInt(n)có công bằng.
Olivier Grégoire

@KevinCruijssen Sai lầm của tôi: đó là 53 bit ngẫu nhiên, không phải 52.
Olivier Grégoire

1
À ok, cảm ơn đã giải thích. Vì vậy, Math.random()không thể được sử dụng khi 2^53không thể chia đều cho số bạn nhân nó với? Vì vậy, nếu bạn muốn một số ngẫu nhiên từ 0-3, (int)(Math.random()*4)có thể chấp nhận chia đều (bốn lần 2251799813685248), nhưng khi bạn sử dụng *3thay vào đó thì không (gấp ba lần 3002399751580330.666...), bởi vì chuyển nó thành int sàn, tạo một số phần 1 nhỏ hơn những người khác. Và vì độ dài có thể thay đổi trong trường hợp của bạn, nên nó cũng không được phân phối đồng đều (với khả năng là độ dài 3).
Kevin Cruijssen

1
Đúng, bạn đã hiểu tất cả! Nếu ai đó nói "ngẫu nhiên", hãy sử dụng Math.random(), nếu ai đó nói điều gì đó ngẫu nhiên "đồng đều" hoặc "khá", hãy sử dụng java.util.Random. Đó cũng là lý do tại sao tôi phàn nàn về câu trả lời của 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"

Dùng thử trực tuyến hoặc xem tại sân chơi cá

Với những chiếc khăn ấm cúng của SK và Doof God Dennac!

Giải thích: Nhiệm vụ đầu tiên của con cá là tìm ra từ đầu vào là gì bằng cách ngoằn ngoèo xuống phía bên tay trái. Cá chỉ có thể đọc một chữ cái tại một thời điểm và phải mất ít byte hơn để thực hiện việc này một cách triệt để. Đầu tiên, con cá đọc chữ cái đầu tiên và hỏi nó có phải không "y"- nếu có, từ này là "màu vàng", nếu không nó sẽ tiếp tục. Sau đó nó đọc chữ cái thứ hai - nếu nó "l", từ này là "màu xanh", nếu không nó sẽ tiếp tục; và như thế. Nếu nó đọc năm chữ cái và chúng không khớp "y"( Y ellow), "l"(b L ue), "o"(br O wn), "n"(ora N ge) hoặc "n"(gree N ), thì màu đó phải là "trắng".

Tiếp đến là bit ngẫu nhiên. Đối với các màu có hai đầu ra có thể, điều này khá đơn giản - ví dụ, màu vàng, cá nhập mã sau vào x:

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

Các xhướng đặt ngẫu nhiên: nếu nó lên hoặc sang trái, cá xoay quanh gương trở lại x, nhưng nếu nó đúng hoặc xuống, nó sẽ đọc "trứng thối" hoặc "bỏng ngô bơ" (ngược lại).

Các phân chia bốn chiều (cho màu trắng và màu xanh lá cây) thì lộn xộn hơn, nhưng chúng tuân theo cùng một hiệu trưởng chung - thứ nhất là:

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

Lưu ý rằng nếu con cá bơi lên từ cái đầu tiên x, nó sẽ đi qua tám "giây, bật và tắt chế độ chuỗi bốn lần, sau đó nó đập vào gương và bơi ngược xuống.

Để có được sự phân chia bốn chiều cuối cùng, cá phải bơi qua er"vôi" và "lê", thêm e = 14vào ngăn xếp (và đảo ngược nó), vì vậy trước tiên chúng ta phải xóa nó ~. Một trong bốn nhánh cũng liên quan đến việc bơi qua một chuỗi rác "> "mà chúng tôi xóa ~~.

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

Cuối cùng, sau khi thêm một trong các hương vị đậu vào ngăn xếp, cá đạt đến luồng vs ở cột ngoài cùng bên trái, gửi nó đến

v    \
v    o
>l?!;/

in các ký tự (sử dụng một trong các chữ otrong "dừa") cho đến khi không còn lại.


1

T-SQL, 432 423 375 367 336 295 byte

Cuối cùng, một hoạt động dựa trên thiết lập !!

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

(Ngắt dòng là để hiển thị và không được tính tổng cộng.)

Đầu vào là thông qua cột c trong bảng t được đặt tên , theo hướng dẫn của chúng tôi .

Tôi chỉ đơn giản là tham gia bảng đầu vào của chúng tôi vào một bảng có đầy đủ các kết hợp màu / hương vị hợp lệ, sau đó chọn một hàng ngẫu nhiên. ORDER BY NEWID()một cách phổ biến để ngẫu nhiên hóa thứ tự sắp xếp trong SQL . Tùy thuộc vào mức độ nghiêm ngặt của bạn, bạn có thể không xem xét nó hoàn toàn ngẫu nhiên, nhưng nó sẽ đủ ngẫu nhiên để lựa chọn hạt thạch.

EDIT 1: Đã lưu 9 byte bằng cách chỉ sử dụng ký tự thứ 3 của màu, lấy cảm hứng từ các câu trả lời khác.

EDIT 2: Đã lưu 48 byte bằng cách đặt cờ màu và hương vị trong một cột duy nhất. Rất nhiều ký tự được lưu trong INSERT.

EDIT 3: Đã lưu 8 byte bằng cách thay thế INSERT INTO b(o)bằngINSERT b

EDIT 4: Đã lưu thêm 31 byte bằng cách nối thẳng vào bảng ảo VALUESvà do đó loại bỏ CREATE TABLEINSERT.

EDIT 5: Lưu 41 byte bằng cách nâng cấp lên STRING_SPLITchức năng chỉ dành cho SQL 2016 , cho phép tôi loại bỏ thực thi SQL động và biến.


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

Hãy thử trực tuyến!


0

Toán học, 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}
#&

Mẫu đầu vào

[màu xanh lá]


Bạn có thể lập chỉ mục vào chuỗi và sử dụng eluaoithủ thuật? Tôi không biết toán học nên chỉ là một ý tưởng.
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)))

Cùng một ý tưởng như những người khác, tôi chỉ có thể tiết kiệm một số không gian so với các ngôn ngữ khác. Nén dây có vẻ như là một nguyên nhân bị mất.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.