Garip ve vahşi fasulye oyunu


11

Belki bazılarınız zaten bu oyunu biliyorsunuz: farklı renklerde jöle fasulye koleksiyonunuz var. Her renk için, fasulye farklı tatlara sahip olabilir, bazıları iyi ve bazıları kötüdür ve bunları birbirinden ayıramazsınız. Belirli bir renkte bir fasulye seçmek zorundasınız ve iyi bir tane seçtiğiniz için dua edin.

Bu nedenle, (verilen listeden) seçtiğiniz bir rengi alan ve seçilen tadı rastgele döndüren en kısa programı yazın. Tadı yerleşik bir listeden seçilmelidir. Olası girdi ve çıktı listesi:

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

Kurallar:

  • Girişin her zaman giriş seçeneklerinden bir renk olacağını varsayabilirsiniz.
  • Vaka ve sondaki boşluklar ve / veya yeni satırlar önemli değildir.
  • Çıktı tekdüze rastgele olmalıdır: başarılı program yürütmeleri farklı sonuçlar vermelidir ve verilen tadı alma şansı bir listedeki tüm zevkler için aynı olmalıdır.

Bu , bu yüzden en kısa program kazanabilir!


Sorunuzun bir bölümünde, lezzetin belirli bir listeden seçileceğini ve bunu girdi olarak alacağımızı ima edersiniz. Ancak, örneklerinizde, bunun tersi görünüyor.
Okx

@ Tamam, üzgünüm, şimdi daha mı iyi? Hala burada yayınlamaya
Charlie

1
Belki tüm olası çıkışların aynı görünme oranlarına sahip olması için çıkışın düzgün bir şekilde rastgele olması gerektiğini belirtin, yoksa her listeden 2 seçenek ekleyebilirim.
LiefdeWen

@StefanDelport teşekkür ederim, düzeltildi!
Charlie

1
Şimdi biraz geç, ama muhtemelen blueberryolmamalıydı blue berry.
Jonathan Allan

Yanıtlar:


7

C # 418 313 305 271 bayt

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

C # için bile çok uzun ama nasıl daha kısa elde edemiyorum.

Tam / Biçimlendirilmiş sürüm:

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

Bu bir golf cehennemi! +1
Shaggy

@Shaggy Thanks :) Gerçekten naif bir şekilde yapmaya başladım ve yavaşça bir şeyler yapmanın daha kısa yolunu fark ettim. Kafamda sıkışıp kaldım, bir sözlüğe ihtiyacım vardı ve sonra cevabı ve bölmeyi kullanarak cevabını gördüm ve ışığa giden yolu fark ettim!
TheLethalCoder

5

05AB1E , 126 bayt

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

Açıklama:

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

Merak eden biri varsa, işte sıkıştırılmamış dize:

lawn clippingsjlimejmucusjpearqrotten eggsjbuttered popcornqtoothpastejblue berryqvomitjpeachqcanned dog foodjchocolateqstinky socksjtuttixfruttijbaby diapersjcoconut

Yine de bazı akıllı hileler ve sözlük kullanarak daha fazla sıkıştırabilirim.

Çevrimiçi deneyin!


Sen sıkıştırabilir "eougwt"için .•4Õ!Õ•için -1.
Outgolfer Erik

@EriktheOutgolfer I uzunluğunu karşılaştırıyordum, bu çalıştı eougwtve .•4Õ!Õ•yerine "eougwt"ve .•4Õ!Õ•. Hata.
Okx

5

JavaScript (ES6), 235 bayt

JS dizeleri sıkıştırmak nasıl anlamaya ihtiyacım var!

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]

Bu senin zevke "rasgele yeterli" değilse o zaman 7 bayt yerine eklemek new Dateile 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]

Dene

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
Güzel bir fikir eluaoi, kendim düşündüm ve "Oooh bak ne kadar zeki olduğumu" düşündüm sonra beni dövdü onu gördüm!
TheLethalCoder

new Date%a.length"tekdüze rastgele" değil.
Olivier Grégoire

Teşekkürler, @TheLethalCoder - O tembeldim, neredeyse 2. karakterlerin benzersizliğini kontrol etmekten rahatsız etmedim!
Shaggy

3
Heh, sanırım 4 ya da 5 kişi eluaoiaynı zamanda ortaya çıktı: P
ETHproductions 9:17

@ OlivierGrégoire, bu çözüm bu gereklilikten önce gelir ama Math.randombunun yerine başka bir seçenek ekledim .
Shaggy

4

Jöle , 101100 bayt

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

Çevrimiçi deneyin!


3

Japt , 148 146 bayt

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

Çevrimiçi deneyin!

Shaggy ve ETHproductions sayesinde 6 bayt tasarruf


Bayt kaydetmek Ryerine bölün 0. Ayrıca, eluaoisiparişle oynayarak sıkıştırabilirsiniz .
Shaggy

@Shaggy Bu nasıl bir bayt kurtarır? qRAynı uzunlukta olanı aramam gerekir ?
Tom

Dokümanlardaki Unicode kısayollarını kontrol edin;)
Shaggy

Maalesef, daha önce alanı kaldırabileceğinizi de unuttum ®.
Shaggy

Güzel, neredeyse tam olarak ne vardı. Dizede 6 karakterden sadece 5ine ihtiyacınız var, çünkü eksik olanın -1 dizini olacak ve bu nedenle dizideki son öğeyi alacak. eaiouDize olarak kullanırsanız , diziyi üç bayta kadar sıkıştırabilirsiniz (başka üç baytlık kombinasyonlar da olabilir).
ETHproductions

3

Piton 2 , 301 258 bayt

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*

Çevrimiçi deneyin!

@TheLethalCoder tarafından önerildiği gibi girişin 2. dizinini kullanmak için tuşları kısaltarak ve doğrudan bir liste kullanmak yerine virgüllere bölerek çok bayt kaydetti.


1
Kullan eluaoisen bayt kaydetmek gerekir sözlük anahtarlarını ve dize indeksi 2 ile erişime onu olarak.
TheLethalCoder

Büyük (y) to LethalCoder fikri
officialaimm

3

Jöle ,  95  94 bayt

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

(Küçük harf) karakterlerin listesini kabul eden ve karakterlerin listesini döndüren monadik bir bağlantı.

Çevrimiçi deneyin! veya 48'lik bir paket yiyin.

Nasıl?

Doksan dört baytın seksen dokuzu, sekiz dizenin sıkıştırılmış bir listesidir. Bunlardan ikisi boş teller ve diğer altı tanesi renklerden biri için yeni satır ayrı lezzetlerdir:

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

Programın geri kalanı, hangi listenin kullanılacağına karar vermek için girdiyi ayrıştırır, seçilen listeyi satır satırlarına böler ve rastgele bir öğe seçer:

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 bayt

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

Kendiniz test edin!

Kullanılarak golf edilebilir char[].

Ancak rastgele kısım açıkça kullanılmadan "eşit olarak dağıtılamaz" Random.nextInt(int). Eşit (int)(Math.random()*a.length)dağılmamış bile .


Hmm, neden new java.util.Random().nextInt(a.length)bunun yerine kullanmak zorunda (int)(Math.random()*a.length)
olduğunla

1
Math.random()bazı özgüllüklere sahip bir sayı sağlar (gücü 0ve işareti 0ve 52 rasgele bit). Yani 52 tane entropi kullanıyorsunuz . 3Örneğin, uzunluk 3 ile 2^52bölünemezse, rastgele dağıtılmaz. Bu nedenle Random.nextInt(int)(394 satırındaki javadoc değil gerçek java dosyası), sayının adil sayılar arasında olduğundan emin olmak için bir döngü mekanizmasına sahiptir. "Yeterince iyi" demedikçe, sadece Random.nextInt(n)adil.
Olivier Grégoire

@KevinCruijssen Benim hatam: 52 değil 53 rastgele bit.
Olivier Grégoire

1
Ah tamam, açıklama için teşekkürler. Yani Math.random(), 2^53çarptığınız sayıya eşit olarak bölünemediğinde kullanılamaz mı? Bu nedenle, 0-3 arasında rastgele bir sayı istiyorsanız, (int)(Math.random()*4)eşit olarak bölmek kabul edilebilir (dört kez 2251799813685248), ancak *3bunun yerine kullandığınızda (üç kez olan 3002399751580330.666...) değildir, çünkü bunu tabanlara dökmek, bazı parçaları yapmak 1 diğerlerinden daha küçük. Ve sizin durumunuzda uzunluk değişken olduğu için, eşit olarak dağılmamıştır (uzunluk 3 olma olasılığı ile).
Kevin Cruijssen

1
Evet, hepsini anladın! Birisi "rastgele" diyorsa, kullanın " Math.random()birisi" tekdüze "veya" oldukça "rastgele bir şey söylerse kullanın java.util.Random. Bu yüzden Shaggy'nin cevabından şikayet ettim.
Olivier Grégoire

1

> <> , 311 bayt

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

Çevrimiçi deneyin veya balık oyun alanında izleyin

SK rahat dokumalar ve Doof God Dennac!

Açıklama: Balığın ilk görevi, sol tarafta zikzak yaparak giriş kelimesinin ne olduğunu bulmaktır. Balıklar bir seferde sadece bir harf okuyabilir ve bunu yıkıcı bir şekilde yapmak daha az bayt sürer. İlk olarak, balık ilk harfi okur ve olup olmadığını sorar "y"- eğer öyleyse, kelime "sarı" dır, aksi takdirde devam eder. Daha sonra ikinci harfi okur - eğer "l"kelime "mavi" ise, aksi halde devam eder; ve bunun gibi. Beş harf okursa ve sırasıyla "y"( Y ellow), "l"(b L ue), "o"(br O wn), "n"(ora N ge) veya "n"(gree N ) ile eşleşmezlerse , renk "beyaz" olmalıdır.

Sonra rastgele bit geliyor. İki olası çıkışa sahip renkler için bu oldukça basittir - sarı için, örneğin, balık aşağıdaki kodda şu kodu girer x:

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

xSetleri rastgele yönü: o kalmış veya bırakılırsa, aynalar etrafında balık girdaplar için geri x, ama doğru veya aşağı halinde bunun "çürük yumurta" ya da (ters olarak) "tereyağlı patlamış mısır" okur.

Dört yönlü bölünmeler (beyaz ve yeşil için) daha karışıktır, ancak aynı genel prensibi takip ederler - birincisi:

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

Balık ilkinden yüzerse , dize modunu dört kez açıp kapatan xsekiz "saniyeden geçer , bir aynaya çarpar ve tekrar yüzer.

Son dört-yollu bölünmüş ulaşmak için balık aracılığıyla yüzmek vardır eve reklemek "kireç" ve "armut" nin e = 14öncelikle o silmek zorunda böylece yığınına (ve bunu tersine) ~. Dört daldan biri, "> "sildiğimiz önemsiz bir ip üzerinden yüzmeyi de içerir ~~.

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

Son olarak, balığın lezzetlerinden birini ekledikten sonra, balık ven sol sütundaki s akışına ulaşır ve

v    \
v    o
>l?!;/

kalan hiçbir karakter okalmayıncaya kadar ("hindistancevizi" s karakterlerinden birini kullanarak) karakterler yazdırır .


1

T-SQL, 432423 3753673366295 bayt

Son olarak, set tabanlı bir işlem !!

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

(Satır kesmeleri görüntüleme içindir ve toplam olarak sayılmaz.)

Girdi sütun üzerinden gerçekleştirilir c isimli tablo içinde t , bizim kurallarımıza göre .

Giriş tablomuzu geçerli renk / lezzet kombinasyonlarıyla dolu bir tabloya katılıyorum, sonra rastgele bir satır seçiyorum. ORDER BY NEWID()olduğu SQL sıralama düzeni rastgele ortak bir yol . Ne kadar katı olduğunuza bağlı olarak, onu düzgün bir şekilde rastgele düşünmeyebilirsiniz, ancak jöle fasulye seçimi için yeterince rastgele olmalıdır.

DÜZENLEME 1: Diğer yanıtlardan esinlenerek rengin yalnızca 3. karakterini kullanarak 9 bayt kaydetti.

DÜZENLEME 2: Kaydedilen 48 , tek bir sütunda flaması ve lezzet koyarak bayt. INSERT içine birçok karakter kaydedildi.

DÜZENLEME 3:INSERT INTO b(o) ile değiştirilerek 8 bayt kaydedildiINSERT b

DÜZENLEME 4: Kayıtlı daha 31 sanal tabloya düz katılarak bayt VALUESve bu nedenle ortadan kaldırılması CREATE TABLEve INSERT.

EDIT 5:STRING_SPLIT Değişken ve dinamik SQL yürütmesini ortadan kaldırmama izin veren yalnızca SQL 2016 işlevine yükselterek 41 bayt kaydedin .


0

PHP , 242 bayt

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

Çevrimiçi deneyin!


0

Mathematica, 247 bayt

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

Giriş formu

[yeşil]


Dizeyi dizine ekleyebilir ve eluaoihileyi kullanabilir misiniz? Mathematica bilmiyorum, bu yüzden sadece bir fikir.
TheLethalCoder

0

Clojure, 231 bayt

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

Diğerleriyle aynı fikirde, diğer dillere kıyasla biraz yer kazanabilirim. Dizeleri sıkıştırmak kayıp bir neden gibi görünüyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.