이상하고 거친 콩 게임


11

어쩌면 당신 중 일부는 이미이 게임을 알고있을 것입니다 : 당신은 다른 색상의 젤리 빈 모음이 있습니다. 모든 색에 대해 콩은 다른 맛을 가질 수 있으며, 일부는 좋고 일부는 나쁘고 구별 할 수 없습니다. 당신은 주어진 색깔의 콩을 선택하고 좋은 것을 선택하기를기도해야합니다.

따라서 (선택한 목록에서) 원하는 색상을 수신하고 선택한 맛을 무작위로 반환하는 가장 짧은 프로그램을 작성하십시오. 내장 목록에서 취향을 선택해야합니다. 가능한 입력 및 출력 목록은 다음과 같습니다.

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

규칙 :

  • 입력이 항상 입력 선택의 색상이라고 가정 할 수 있습니다.
  • 대소 문자와 후행 공백 및 / 또는 줄 바꾸기는 중요하지 않습니다.
  • 출력은 균일하게 무작위로 이루어져야합니다. 성공적인 프로그램 실행은 다른 결과를 가져와야하며 주어진 맛을 얻을 가능성은 목록의 모든 맛에 대해 동일해야합니다.

이것은 이므로 가장 짧은 프로그램이 이길 수 있습니다!


귀하의 질문 중 일부에서, 귀하는 주어진 목록에서 취향이 선택 될 것이라고 말하며, 이는 입력으로 입맛을받을 것임을 암시합니다. 그러나 귀하의 예에서는 그 반대입니다.
Okx

@Okx 죄송합니다, 지금 더 나아 졌습니까? 아직도 여기에 게시하는 데 익숙해지고 있습니다.
Charlie

1
어쩌면 모든 가능한 출력이 같은 확률로 나타날 수 있도록 출력이 균일하게 랜덤해야한다고 말하거나 각 목록에서 2 개의 옵션을 추가 할 수 있습니다.
LiefdeWen

@StefanDelport 감사합니다!
Charlie

1
늦은 지금 조금, 그러나 아마 있었어야 blueberry하지 blue berry.
Jonathan Allan

답변:


7

C #을 418 313 305 271 바이트

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 #조차도 너무 길지만 더 짧은 방법을 알 수 없습니다.

풀 / 포맷 버전 :

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

그것은 골프의 지옥입니다! +1
얽히고 설킨

@Shaggy Thanks :) 나는 그것을 순진하게 시작했고 천천히 일을하는 짧은 방법을 깨달았습니다. 나는 그것이 내 머리에 붙어 있었는데 나는 사전이 필요합니다. 그리고 당신의 답을 줄을 사용하여 쪼개고 빛의 길을 깨달았습니다!
TheLethalCoder

5

05AB1E , 126 바이트

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

설명:

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

궁금한 사람이 있다면 다음은 압축되지 않은 문자열입니다.

lawn clippingsjlimejmucusjpearqrotten eggsjbuttered popcornqtoothpastejblue berryqvomitjpeachqcanned dog foodjchocolateqstinky socksjtuttixfruttijbaby diapersjcoconut

그래도 영리한 트릭과 사전을 사용하여 더 압축 할 수 있습니다.

온라인으로 사용해보십시오!


-1로 압축 "eougwt"할 수 있습니다 .•4Õ!Õ•.
아웃 골퍼 에릭

@EriktheOutgolfer 내가 그것을 시도했을 때, eougwt.•4Õ!Õ•대신에 "eougwt"와 의 길이를 비교 하고 .•4Õ!Õ•있었습니다. 죄송합니다.
Okx

5

자바 스크립트 (ES6), 235 바이트

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]

그 취향은 "무작위로 충분"아니에요 경우 7 바이트 교체 추가 new DateMath.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]

시도 해봐

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
와 함께 좋은 생각 eluaoi, 나는 그것을 혼자 생각하고 "아, 내가 얼마나 영리한지 봐"라고 생각했다.
TheLethalCoder

new Date%a.length"균일하게 무작위"가 아닙니다.
Olivier Grégoire

고마워, @TheLethalCoder-나는 게으르다, 나는 거의 두 번째 문자를 넘어 고유성을 확인 귀찮게하지 않았다!
얽히고 설킨

3
훗, 난 네 생각이나 우리의 5 내놓았다 eluaoi동시에 주위 : P
ETHproductions

@ OlivierGrégoire,이 솔루션은 그 요구 사항보다 우선하지만 Math.random대신 사용 하는 다른 옵션을 추가 했습니다.
얽히고 설킨


3

JAPT , 148 146 바이트

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

온라인으로 사용해보십시오!

Shaggy 및 ETH 프로덕션 덕분에 6 바이트 절약


바이트를 저장하는 R대신에 분할하십시오 0. 또한 eluaoi순서대로 재생 하여 압축 할 수도 있습니다 .
얽히고 설킨

@Shaggy 바이트를 어떻게 절약 할 수 있을까요? qR같은 길이의 전화 를 해야 합니까?
Tom

문서에서 유니 코드 바로 가기를 확인하십시오;)
Shaggy

죄송합니다 ®. 전에도 공간을 제거 할 수 있다고 말하지 않았습니다 .
얽히고 설킨

좋아, 거의 내가 가진 걸로 누락 된 문자의 색인은 -1이므로 배열의 마지막 항목을 가져 오기 때문에 문자열에 6 개의 문자 중 5 개만 필요합니다. eaiou문자열로 사용 하는 경우 3 바이트로 압축 할 수 있습니다 (다른 3 바이트 조합이있을 수 있음).
ETHproductions

3

파이썬 2 , 301 258 바이트

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*

온라인으로 사용해보십시오!

@TheLethalCoder에서 제안한대로 입력의 두 번째 색인을 사용하도록 키를 단축하고 직접 목록을 사용하는 대신 쉼표로 분할하여 매우 많은 바이트를 절약했습니다.


1
eluaoi사전 키로 사용 하고 문자열의 인덱스 2로 액세스하면 바이트가 절약됩니다.
TheLethalCoder

큰 LethalCoder의 생각에 (Y)
officialaimm

3

젤리 ,  95  94 바이트

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

(소문자) 문자 목록을 승인하고 문자 목록을 리턴하는 모나드 링크.

온라인으로 사용해보십시오! 또는 48 패킷을 먹는다.

어떻게?

96 바이트 중 87 개는 8 개의 문자열로 구성된 압축 된 목록입니다. 이 중 두 개는 빈 문자열이고 다른 여섯 개는 각 색상 중 하나에 대해 개행으로 구분 된 맛입니다.

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

나머지 프로그램은 입력을 구문 분석하여 사용할 목록을 결정하고 선택한 목록을 줄 바꿈으로 나누고 임의의 요소를 선택합니다.

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

자바, 288 바이트

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

직접 테스트하십시오!

를 사용하여 골프를 칠 수 있습니다 char[].

그러나을 명시 적으로 사용하지 않으면 임의 부분을 "균일하게 분포"시킬 수 없습니다 Random.nextInt(int). (int)(Math.random()*a.length)균일하게 분배되지 도 않습니다.


흠, 나는 왜 당신이 .. new java.util.Random().nextInt(a.length)대신에 사용해야하는지에 대한 설명을 얻지 (int)(Math.random()*a.length)
못한다

1
Math.random()특정 특성을 갖는 숫자 (제곱 0과 부호 0및 임의의 52 비트)를 제공합니다. 따라서 실제로 더 이상 확인하지 않고 엔트로피 52를 사용 합니다. 3예를 들어 length가 2^523으로 나눌 수없는 경우 임의로 분포되지 않습니다. 그렇기 때문에 Random.nextInt(int)(394 행에서 javadoc이 아닌 실제 Java 파일) 숫자가 공정한 숫자인지 확인하는 루프 메커니즘이 있습니다. 내가 "충분하다"고 말하지 않으면 Random.nextInt(n)공정하다.
Olivier Grégoire

@KevinCruijssen 내 실수 : 52가 아닌 53 개의 랜덤 비트입니다.
Olivier Grégoire

1
아, 설명해 주셔서 감사합니다. 따라서 곱한 숫자로 균등하게 나눌 수없는 Math.random()경우에는 2^53사용할 수 없습니까? 따라서 0-3의 임의의 숫자를 원한다면 (int)(Math.random()*4)균등하게 나누기 (4 번 2251799813685248) 할 수 있지만 *3대신 사용 3002399751580330.666...하면 int 바닥에 캐스팅하여 일부 부품을 만들기 때문에 그렇지 않습니다 (3 번 ) 1은 다른 것보다 작습니다. 그리고 길이는 가변적이므로 길이가 3 일 가능성이있는 균일하게 분포되지 않습니다.
Kevin Cruijssen

1
네, 당신은 모든 것을 이해했습니다! 누군가가 "무작위"라고 말하면을 사용 Math.random()하고 누군가가 "균일하게"또는 "정당하게"무작위로 무언가를 말하면을 사용하십시오 java.util.Random. 그것이 제가 Shaggy의 답변에 대해 불평 한 이유이기도합니다.
Olivier Grégoire

1

> <> , 311 바이트

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

온라인으로 시도 하거나 물고기 놀이터 에서 시청하십시오.

SK 아늑한 니트와 Doof God Dennac를 선보입니다!

설명 : 물고기의 첫 번째 임무는 왼쪽을 지그재그로 입력 단어가 무엇인지 알아내는 것입니다. 물고기는 한 번에 하나의 문자 만 읽을 수 있으며이를 파괴적으로 처리하는 데 더 적은 바이트가 필요합니다. 먼저, 물고기는 첫 글자를 읽고 그것이 맞는지 묻습니다 "y". 단어가 "노란색"이라면 그렇지 않으면 계속 진행합니다. 그런 다음 두 번째 문자를 읽습니다. "l"이 단어 인 경우 단어는 "파란색"입니다. 그렇지 않으면 계속 진행합니다. 등등. 이 다섯 글자를 읽고이 일치하지 않는 경우 "y"( Y의 ellow), "l"(ㄱ L의 단말을), "o"(BR O WN), "n"(ORA N GE) 또는 "n"(초 N )는 각각 다음 색상이 "흰색"이었음에 틀림 없다.

다음은 임의의 비트입니다. 두 가지 가능한 출력을 가진 색상의 경우 이것은 매우 간단합니다. 예를 들어 노란색의 경우 물고기는 다음 코드를 입력합니다 x.

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

x세트 무작위 방향 : 그것이야 또는 왼쪽 경우, 거울 주변에 물고기의 소용돌이는 위로 x하지만 바로 아래 있다면, 그것은 "썩은 달걀"또는 (반대로) "버터 팝콘"를 읽습니다.

4 방향 분할 (흰색 및 녹색)은 더 지저분하지만 동일한 일반 원칙을 따릅니다. 첫 번째는 다음과 같습니다.

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

물고기가 첫 번째에서 수영하면 x8 "초를 통과하여 문자열 모드를 4 번 켜고 끄면 거울에 부딪 히고 다시 수영합니다.

마지막 네 방향 분할에 도착하기 위해, 물고기는을 통해 수영을 가지고 er추가 "석회"와 "배"의 e = 14우리가 처음에 그것을 삭제해야하므로, 스택에 (그리고 역) ~. 네 가지 중 하나는 정크 문자열을 통한 수영 "> "과 관련이 ~~있습니다.

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

마지막으로, 콩 풍미 중 하나를 스택에 추가 한 후, 물고기 v는 가장 왼쪽 열의 s 스트림에 도달하여

v    \
v    o
>l?!;/

문자 o가 남을 때까지 문자를 인쇄합니다 ( "코코넛" 의 s 중 하나 사용 ).


1

T-SQL, 432 423 375 367 336 295 바이트

마지막으로 세트 기반 조작 !!

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

줄 바꿈은 표시 용이며 총계로 계산되지 않습니다.

입력 열 경유 C 라는 이름의 테이블에서 t , 우리의 가이드 라인에 따라 .

입력 테이블을 유효한 색상 / 맛 조합으로 가득 찬 테이블에 결합한 다음 임의의 행을 선택합니다. ORDER BY NEWID()입니다 SQL에서 정렬 순서를 무작위로하는 일반적인 방법은 . 얼마나 엄격한 지에 따라 완벽하게 균일하게 무작위로 고려하지는 않지만 젤리 빈 선택에는 충분히 무작위 적이어야합니다.

편집 1 : 다른 답변에서 영감을 얻은 색상의 세 번째 문자 만 사용하여 9 바이트를 절약했습니다.

편집 2 : 컬러 플래그와 플레이버를 단일 열에 넣어 48 바이트를 절약했습니다 . INSERT에 많은 문자가 저장되었습니다.

EDIT 3 : 저장된 8 대체하여 바이트 INSERT INTO b(o)INSERT b

편집 4 : 저장 더 31의 가상 테이블에 바로 가입하여 바이트 VALUES따라서를 제거 CREATE TABLE하고 INSERT.

편집 5 :STRING_SPLIT 변수 및 동적 SQL 실행을 제거 할 수있는 SQL 2016 전용 기능 으로 업그레이드하여 41 바이트를 절약하십시오 .



0

Mathematica, 247 바이트

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

입력 양식

[초록]


문자열에 색인을 작성하고 eluaoi트릭을 사용할 수 있습니까 ? 나는 수학을 모른다. 그래서 단지 아이디어.
TheLethalCoder

0

클로저, 231 바이트

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

다른 언어와 같은 생각으로 다른 언어에 비해 공간을 절약 할 수 있습니다. 문자열을 압축하면 잃어버린 원인으로 보입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.