태양계 만들기


39

소개

이것은 컴퓨터 게임을 할 때 최근에 직면 한 실제 문제를 기반으로하며 멋지게 만들 것이라고 생각했습니다 .

다양한 양의 열을 방출하는 7 가지 주요 스펙트럼 등급 이 있습니다. 별 주위의 행성의 지질학은 별에서받는 열의 양에 크게 영향을받습니다. 이것은 별의 스펙트럼 등급과 거리의 요인입니다. 따라서 수은은 실제로 녹고 해왕성은 얼었다.

내 게임의 은하는 절차 적으로 생성되며 주어진 별에 대해 무작위로 행성 유형을 선택하면 실제 'if statement hell'로 밝혀졌습니다!

도전

방법은 최소 열 임계 값, 최대 열 임계 값 및 난수를 기준으로 별 등급에 적합한 행성 유형 목록에서 하나의 행성을 선택해야합니다. 간단하게하기 위해이 과제는 태양처럼 G 등급의 별만 사용합니다.

입력

heat별에서 별이받는 열량을 나타내는 4에서 11 사이 의 정수 .

변수

이 표는를 기반으로 한 가능한 행성을 보여줍니다 heat. 방법은 먼저 열 최소 및 열 최대를 기준으로 사용 가능한 선택 범위를 좁히고 heat둘 사이 또는 그 사이에 있어야합니다. 예를 들어 사막, 철 및 용암이 유일한 선택에 10의 열을 전달했습니다.

Planet type    Heat min   Heat max   Random Chance
Gas Giant         4          9            15
Ice               4          6            10
Ice Giant         4          6            10
Gaia class        5          7            10
Dense Atmosphere  7          9            10
Desert            7          10           25
Iron              7          10           14
Lava             10          11           6

다음으로 (나머지 선택에서) 행성이 선택 될 확률은 임의의 확률을 모든 선택의 랜덤 확률의 합으로 나눈 것입니다.

위의 예에서 철이 선택 될 확률은입니다 14/(25+14+6).

산출

행성 유형을 문자열로 반환하십시오.

논리 화살촉을 피하기 위해 최선을 다하십시오. 가장 짧은 코드가 승리하고 창의력을 발휘합니다. 행복한 골프!


"Gaia class"의 "class"는 다른 모든 것과 같이 대문자로 표기해야합니까?
Jonathan Allan

@JonathanAllan 그것은 적절한 명사가 아니기 때문에 소문자입니다
Absinthe

1
@Absinthe 그렇다면 Dense A tmosphere 대문자 는 왜 ?
Outgolfer Erik

17
... 누군가 그런 말을 했습니까? | PPCG에 오신 것을 환영합니다. 멋진 첫 도전입니다!
user202729

3
@EricDuminil 일명 화살촉 안티 패턴, 일명 중첩 된 문장 지옥! wiki.c2.com/?ArrowAntiPattern
압생트

답변:


12

젤리 , 78 바이트

“'ĖøÆḳƙ’ḃ7ṣ6+\+3r/ċ€×“½½½½©ÐÇı‘
“ŀỊẋ8ƒ³ẈRɼƈñqẋẏȧɱḌ<ṄỴḳ⁾ÆʋeẒĊ'@ƬØƓƝ}ḟ¬»ỴW€ẋ"ÇẎX

문자 목록을 리턴 하는 정수 ( [4,11] )를 허용하는 모나드 링크 .

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

어떻게?

행성의 열 범위를 목록의 목록으로 작성하고 해당 목록에서 입력 열의 발생 횟수를 계산하여 가능한 행성 유형을 나타내는 0과 1의 목록을 얻은 다음 여덟 개의 행성 유형의 가능성 수를 곱합니다. 분포를 얻으십시오. 분포는 행성 유형 이름을 반복하는 데 사용되며 마지막으로 균일 한 무작위 선택이 이루어집니다.

“'ĖøÆḳƙ’ḃ7ṣ6+\+3r/ċ€×“½½½½©ÐÇı‘ - Link 1, getDistribution: integer
“'ĖøÆḳƙ’                        - base 250 integer = 39824688429662
        ḃ7                      - to bijective-base 7 = [1,1,2,4,7,1,4,4,6,2,2,2,2,1,5,3,3]
          ṣ6                    - split at sixes = [[1,1,2,4,7,1,4,4][2,2,2,2,1,5,3,3]]
             \                  - cumulative reduce with:
            +                   -   addition = [[1,1,2,4,7,1,4,4][3,3,4,6,8,6,7,7]]
              +3                - add three = [[4,4,5,7,10,4,7,7],[6,6,7,9,11,9,10,10]]
                 /              - reduce with:
                r               -   inclusive range = [[4,5,6],[4,5,6],[5,6,7],[7,8,9],[10,11],[4,5,6,7,8,9],[7,8,9,10],[7,8,9,10]]
                  ċ€            - count (input) in €ach e.g. for 5: [1, 1, 1, 0,0, 1, 0, 0]
                     “½½½½©ÐÇı‘ - list of code-page indices        [10,10,10,10,6,15,14,25]
                    ×           - multiply                         [10,10,10, 0,0,15, 0, 0]

“ ... »ỴW€ẋ"ÇẎX - Main link: integer
“ ... »         - compressed string = "Ice\nIce Giant\nGaia class\nDense Atmosphere\nLava\nGas Giant\nIron\nDesert"
       Ỵ        - split at new lines = ["Ice","Ice Giant","Gaia class","Dense Atmosphere","Lava","Gas Giant","Iron","Desert"]
        W€      - wrap €ach in a list
            Ç   - call last link (1) as a monad e.g. for 5: [10,10,10,0,0,15,0,0]
           "    - zip with:
          ẋ     -   repeat e.g. for 5:  [["Ice","Ice","Ice","Ice","Ice","Ice","Ice","Ice","Ice","Ice"],["Ice Giant","Ice Giant","Ice Giant","Ice Giant","Ice Giant","Ice Giant","Ice Giant","Ice Giant","Ice Giant","Ice Giant"],["Gaia class","Gaia class","Gaia class","Gaia class","Gaia class","Gaia class","Gaia class","Gaia class","Gaia class","Gaia class"],["Gas Giant","Gas Giant","Gas Giant","Gas Giant","Gas Giant","Gas Giant","Gas Giant","Gas Giant","Gas Giant","Gas Giant","Gas Giant","Gas Giant","Gas Giant","Gas Giant","Gas Giant"]]
             Ẏ  - tighten               ["Ice","Ice","Ice","Ice","Ice","Ice","Ice","Ice","Ice","Ice","Ice Giant","Ice Giant","Ice Giant","Ice Giant","Ice Giant","Ice Giant","Ice Giant","Ice Giant","Ice Giant","Ice Giant","Gaia class","Gaia class","Gaia class","Gaia class","Gaia class","Gaia class","Gaia class","Gaia class","Gaia class","Gaia class","Gas Giant","Gas Giant","Gas Giant","Gas Giant","Gas Giant","Gas Giant","Gas Giant","Gas Giant","Gas Giant","Gas Giant","Gas Giant","Gas Giant","Gas Giant","Gas Giant","Gas Giant"]
              X - a random choice from that list

미친! 잘 했어.
압생트

@Absinthe 당신은 단순히 공감할 수 있습니다. 참고 : Code Golf에서는 일반적으로 답변을받지 않습니다.
user202729

2
@ user202729 하루나 이틀 안에 투표를 추가하겠습니다. Jelly가 GitHub 페이지를 살펴 보고이 코드를 풀려고했습니다. 나는 미친 생각합니다! 가장 적절하다 :)
Absinthe

2
@Absinthe 그렇습니다, 나는 설명 적이 지 않은 부분이 비-
Jonathan Allan

3
당신은 정말 미쳤어 요.
Selvek

7

R , 225 (223) 183 바이트

영리한 리팩토링을 통해 188 바이트로 줄인 Giuseppe에게 감사드립니다. 나머지 5 개는 덜 중복되는 숫자 표현을 사용하여 제거되었습니다.

i=scan()-4
sample(c("Gas Giant","Ice","Ice Giant","Gaia class","Dense Atmosphere","Desert","Iron","Lava")[l<-c(0,0,0,1,3,3,3,6)<=i&c(5,2,2,3,5,6,6,7)>=i],1,,c(3,2,2,2,2,5,2.8,1.2)[l])

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


그것은 좋은 접근 방법입니다. C #에서 이것을 선호한다면 if 문 미로를 제거하는 것에 대해 생각해야 할 수도 있습니다 :)
Absinthe

나는 논리적 인덱스를 저장하기보다는 사용하여 의심 with, data.frame그리고 subset짧아집니다.
주세페


@Giuseppe, 행성 데이터와 함께트릭을 사용하여 몇 바이트를 더 얻을 수는 있지만 확률 벡터를 나머지 데이터와 분리한다는 아이디어를 사용하여 광산을 향상시킬 것이라고 생각합니다.
Kirill L.

4

자바 스크립트 212

6 바이트 편집 thx Jonathan Allan 저장

h=>[963,640,640,649,667,1628,924,437].map((z,i)=>(z/8&7)+4>h|z%8+6<h?0:t=r.push(...Array(z>>6).fill(i)),r=[])&&"Gas Giant,Ice,Ice Giant,Gaia class,Dense Atmosphere,Desert,Iron,Lava".split`,`[r[t*Math.random()|0]]

덜 골프

h=>( 
   r = [],
   // heat min,max and chance encoded in base 8 with offsets
   // min range 4 to 10, with offset 4, 0 to 6
   // max range 6 to 11, with offset 6, 0 to 5
   [(4-4)*8 + 9-6 + 15*64,
    (4-4)*8 + 6-6 + 10*64,
    (4-4)*8 + 6-6 + 10*64,
    (5-4)*8 + 7-6 + 10*64,
    (7-4)*8 + 9-6 + 10*64,
    (7-4)*8 + 10-6+ 25*64,
    (7-4)*8 + 10-6+ 14*64,
    (10-4)*8+ 11-6+  6*64]
   .forEach( (z,i) => (
      min = (z / 8 & 7) + 4, 
      max = z % 8 + 6,
      chance = z >> 6,
      min > h || max < h 
      ? 0 // out of range
      // add current position i repeated 'chance' times
      // array size in t
      : t = r.push(...Array(chance).fill(i))
   ),
   pos = r[t * Math.random() | 0],
   ["Gas Giant", "Ice", "Ice Giant", "Gaia class", "Dense Atmosphere", "Desert", "Iron", "Lava"][pos]
)

테스트

var F=
h=>[963,640,640,649,667,1628,924,437].map((z,i)=>(z/8&7)+4>h|z%8+6<h?0:t=r.push(...Array(z>>6).fill(i)),r=[])&&"Gas Giant,Ice,Ice Giant,Gaia class,Dense Atmosphere,Desert,Iron,Lava".split`,`[r[t*Math.random()|0]]

function test()
{
   var heat=+H.value
   var i,result,hashtable={},rep=1e5
   for (i=0;i<rep;i++)
     result = F(heat),
     hashtable[result] = -~hashtable[result]
 
   console.log('Input',heat)
   for (i in hashtable)
   {
     console.log(i,(hashtable[i]/rep*100).toFixed(2),'%')
   }
}
<input id=H type=number min=1 max =15 value=10>
<button onclick='test()'>Test</button>


기지의 몇 16 개 번호 1 꺼져 (해야한다 [3913, 2630, 2630, 2647, 2681, 6522, 3706, 1707])
조나단 앨런

나는 (그러나 100 %는 아님)로 대체 (z/16&15)하여 2를 절약 할 수 있다고 생각 z/16&15합니다. 에 관계없이, 당신은 세 가지 여섯 ... 사용의 오프셋 (offset) 기본 (8) 압축을 사용하여 6 바이트를 저장할 수 [971,648,648,657,675,1636,932,445]z/8&7+3, z%8+6z>>6:)
조나단 앨런

@JonathanAllan 오프셋! 좋은 생각, thx
edc65

(z/8&7)+4&7/8&(7+4)
@JonathanAllan

1
@Shaggy 당신은 바로 당신의 의견을 보았습니까? (long story short : no)
edc65

4

코코넛 , (214) 195 바이트

t->choice..sum([[n]*g(p)*(g(a)<t<g(b))for*n,a,b,p in'Gas Giant3AF_Ice37A_Ice Giant37A_Gaia class48A_Dense Atmosphere6AA_Desert6BP_Iron6BE_Lava9C6'.split('_')],[])
from random import*
g=int$(?,36)

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

파이썬 포트는 것 (203) 200 바이트 길이 :

lambda t:choice(sum([[n]*int(p,36)*(int(a)<t<int(b,36))for*n,a,b,p in'Gas Giant3AF_Ice37A_Ice Giant37A_Gaia class48A_Dense Atmosphere6AA_Desert6BP_Iron6BE_Lava9C6'.split('_')],[]))
from random import*

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


1
흥미롭게도 글을 쓰는 시점에서 파이썬 포트는 다른 모든 파이썬 솔루션보다 뛰어납니다!
Kirill L.

4

, 115111 바이트

≔I⁻N³θF⁸«≔§⪪”↷&∧⬤.YLφκ¦(⁼;σ≕]✂↙ζC” ιη¿›θη¿‹θ§η¹FI✂η²⊞υ黧⪪”↓(″1↨▷]U,&ζ^iI″RSY≡´⍘'#﹪υVw5Vu>D<U5r6⁰Q▷Z◨⌕⁸ΣεCZ”¶‽υ

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 편집 : @ASCII 전용 덕분에 4 바이트가 절약되었습니다. 설명:

≔I⁻N³θ

입력에서 3을 빼서 한 자릿수와 비교할 수 있습니다.

F⁸«≔§⪪”↷&∧⬤.YLφκ¦(⁼;σ≕]✂↙ζC” ιη

문자열 0715 0410 0410 1510 3710 3825 3814 696을 공백으로 나누고 (공백은 쉼표보다 압축하는 것이 좋지만 다른 문자는 시도하지 않았습니다) 각 부분을 반복합니다.

¿›θη¿‹θ§η¹FI✂η²⊞υι»

입력을 첫 번째와 두 번째 숫자와 비교하고 그 사이에 있으면 주어진 횟수만큼 루프 색인을 미리 정의 된 빈 목록으로 푸시하여 입력하십시오.

§⪪”↓(″1↨▷]U,&ζ^iI″RSY≡´⍘'#﹪υVw5Vu>D<U5r6⁰Q▷Z◨⌕⁸ΣεCZ”¶‽υ

행성 목록을 줄 바꿈으로 분할하고 (어떤 이유로 쉼표보다 낫습니다) 목록에서 임의로 선택한 색인에 해당하는 요소를 선택하십시오.


좋은데 랜덤 (u)은 각 행성에 대해 다른 확률을 어떻게 고려합니까? (차콜에 대해서는 아무것도 모른다).
압생트

"지정된 빈 목록에 지정된 횟수만큼 루프 색인을 밀어 넣어 채우기 때문에 planetType 색인이 올바르게 분배 된 목록에서 색인을 선택합니다." 그런 다음 선택한 색인을 사용하여 planetType 이름을 가져옵니다.
Jonathan Allan

@JonathanAllan 감사합니다
Absinthe

111 바이트 라고 생각합니까? 일반적으로 문자 클래스의 앞부분에있는 문자를 사용해보십시오. 기본 순서는 다른 바이트를 저장하지만 기본적으로 기호 만있는 경우에만 해당됩니다
ASCII 전용

@ ASCII-only 진흙처럼 맑아 ... 왜 줄 바꿈이 더 좋으며 다른 문자열에는 공백이 있습니까?
Neil

3

R , 196 193 190 175 171 바이트

sample(readLines(,8),1,,c(3,2,2,2,2,5,2.8,1.2)*((x=scan()-3)>c(0,0,0,1,3,3,3,6)&x<c(7,4,4,5,7,8,8,9)))
Gas Giant
Ice
Ice Giant
Gaia class
Dense Atmosphere
Desert
Iron
Lava

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

@rturnbull 은이 솔루션에서 처음 영감을 받았지만, 두 제출물이 크게 발전함에 따라 이것은 본질적으로 의견에 매우 도움이 된 @Giuseppe와 저자의 아이디어가 혼합 된 것입니다. 다음은 바이트 카운트를 낮추는 데 도움이되는 주요 요점을 요약 한 것입니다.

  • 행성 데이터를 CSV로 인코딩readLines 문자열 주위에 많은 따옴표 문자를 사용하지 않고 이름을 수집합니다 .

  • 우리가 사용할 수 있도록 열 PARAMS을 조정 <하고 >대신 징후 <=>=.

  • 두 자리 숫자를 제거하기 위해 열 데이터 형식을에서 Heat min, Heat max로 변경 Heat min, Heat Delta
    모든 숫자를 -3으로 바꾸어 대체

  • 모든 행성 확률을 5로 나누면 몇 자릿수가 줄어 듭니다.

  • 부적합한 행성의 확률을 무효화하기 위해 행성 확률의 벡터에 부울 벡터 (우리의 입력이 열 요구 사항을 만족하는지 여부를 나타냄)를 곱합니다.

아마도 일종의 데이터 압축을 적용하면 몇 바이트를 더 얻을 수있을 것입니다.
더 이상은 아니라고 생각합니다.


1
t=대신 text=3 바이트도 절약됩니다.
주세페


그러나 확실한 대답 은 명시 적으로 설정해야하지만 read.csv단일 열을 사용 readLines하여 따옴표를 완전히 제거하는 것이 좋습니다n
Giuseppe

@Giuseppe는 연산자 우선 순위를 유지하는 데 필요한 괄호를 제거하고 버전에 잘못된 확률을 제공하므로 171 바이트입니다. 여전히 훌륭한 제안입니다!
Kirill L.

오 나는 .... 그 괄호가 왔던 곳 궁금
주세페

3

파이썬, 282 바이트 , 261 바이트 :

from random import*
i,p,l=input(),[('Gas Giant',3,11,15),("Ice",3,7,10),("Ice Giant",3,7,10),("Gaia Class",4,8,10),("Dense Atmosphere",6,10,10),("Desert",6,11,25),("Iron",6,11,14),("Lava",9,12,6)],[]
for x in p:exec"l+=x[0],;"*(x[1]<i<x[2])*x[3]
print choice(l)

아주 간단합니다-골프를 더 많이 할 수있을 것입니다-행성 범위와 확률 데이터를 표현하는 더 좋은 방법을 찾고 있습니다. i가 행성 유형의 범위에 있으면 확률에 따라 목록에 추가 한 다음 무작위로 인쇄합니다.

편집 : Jonathan Frech의 신용으로-for 루프를 수정하여 몇 바이트를 떨어 뜨립니다. 목록에 항목을 추가하는 더 좋은 방법


3
PPCG에 오신 것을 환영합니다! 바이트 수를 세는 방법을 모르지만 283 만 받고 있습니다. 들여 쓰기가 4 바이트 대신 탭이면 더 적습니다.
마틴 엔더

1
i in range(x[1], x[2])사양과 달리 열의 상단을 제외 하지 않습니까?
Graipher


1
이것이 도움이 될 수 있습니까? p,d="Gas Giant,Ice,Ice Giant,Gaia class,Dense Atmosphere,Desert,Iron,Lava".split(","),[ord(i)-10 for i in"#"] d=[[p[x//3]]+d[x:x+3]for x in range(0,len(d),3)]
MustacheMoses

1
@Chromane 사과는 주석이 일부 문자를 제거 한 것으로 보입니다.
MustacheMoses

2

옥타브 , 통계 패키지와 함께 178 176 174 158 바이트를

@(h)randsample(strsplit('Gas Giant,Ice,Ice Giant,Gaia class,Dense Atmosphere,Desert,Iron,Lava',','),1,1,('UPPPP_TL'-70).*(h>'IIIJLLLO'-70&h<'PMMNPQQR'-70)){1}

이 코드는 숫자를 입력하고 문자열을 출력하는 익명 함수를 정의합니다.

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

설명

코드

@(h)

input으로 익명 함수를 정의합니다 h.

'Gas Giant,Ice,Ice Giant,Gaia class,Dense Atmosphere,Desert,Iron,Lava'

를 사용하여 쉼표로 분할됩니다

strsplit(...,',')

결과는 문자열로 구성된 셀형 배열이며 각 문자열은 행성 클래스입니다.

코드

'IIIJLLLO'-70

표시된 문자열을 정의하고 70해당 문자의 코드 포인트에서 뺍니다 . 이 최소 열 값의 어레이 제공 마이너스 1 이다, [3 3 3 4 6 6 6 9].

비슷하게,

'PMMNPQQR'-70

최대 열 값의 배열 생성 더하기 1 ,이다 [10 7 7 8 10 11 11 12].

비교

h>...&h<...

가능한 플래닛 클래스를 포함 true하거나 false나타내는 배열을 제공 하십시오.

반면에

'UPPPP_TL'-70

랜덤 확률 값의 배열을 정의합니다 [15 10 10 10 10 25 14 6].

작업

(...).*(...)

소자 현명한 후자의 두 배열의 승산 (인 truefalse행동하라 등 01각각이). 이것은 각 행성 클래스가 무작위 확률을 가지거나 0입력에 기반하여 해당 클래스가 불가능한 배열을 제공합니다 . 이 배열은 랜덤 샘플링에서 가중치로 사용됩니다

함수 호출

randsample(...,1,1,...)

계산 된 가중치 배열 (4 번째 입력 인수)을 사용하여 문자열의 셀 배열 (첫 번째 입력 인수)에서 셀 중 하나를 선택합니다. 특히이 함수 randsample는 가중치를 확률로 자동 정규화 한 다음 해당 확률로 무작위 선택을 수행합니다. 결과는 문자열을 포함하는 셀형 배열입니다. 코드

{1}

함수 출력을 구성하는 해당 문자열을 추출하는 데 사용됩니다.


2
좋은 설명 감사합니다. 좋은 점수도 있습니다.
압생트

2

파이썬 3 , 263 바이트

from random import*
P=lambda h:"Gas Giant|Ice|Ice Giant|Gaia class|Dense Atmosphere|Desert|Iron|Lava".split("|")[choices(*list(zip(*filter(lambda x:h in range(*x[2:]),zip(*[[int(x,32)for x in"0f4a1a472a473a584a7a5p7b6e7b76ac"][a::4]for a in(0,1,2,3)]))))[:2])[0]]

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


1

펄 5 ( -p), 230 바이트

@a=(['Gas Giant',4,9,15],[Ice,4,6,10],['Ice Giant',4,6,10],['Gaia class',5,7,10],['Dense Atmosphere',7,9,10],[Desert,7,10,25],[Iron,7,10,14],[Lava,10,11,6]);//;map{push@b,($$_[0])x($$_[3]*($$_[1]<=$'&&$'<=$$_[2]))}@a;$_=$b[rand@b]

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


당신이 분 가열 한을 제거하고 (줄 것이다 최대 가열 한 추가하면 [Ice,4,5,11]대신 [Ice,4,6,10]등) 당신은 사용할 수 있습니다 <대신 <=하고 >대신 >=하여 2 바이트를 절약. (그래, 그다지 많지 않다 ...)
Dada

1

, (314) 298 294 바이트

import random,sequtils
proc c(h:int)=
 var a= @[""]
 a.del 0
 for n in[("Gas Giant",4,9,15),("Ice",4,6,10),("Ice Giant",4,6,10),("Gaia Class",5,7,10),("Dense Atmosphere",7,9,10),("Desert",7,10,25),("Iron",7,10,14),("Lava",10,11,6)]:(if h>=n[1]and h<=n[2]:a.add repeat(n[0],n[3]))
 echo random a

한 줄로 된 루프의 경우, 암시 적 유형에 대한 바이트 수가 줄어 듭니다.

4 개의 공백이 제거되었습니다 ( Kevin에게 감사 )

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


에 프로그래밍 한 적이 Nim없지만 네 공간을 골프로 칠 수 있다고 생각합니다 for n in[(. 에서 세 개 if h>=n[1]and h<=n[2]입니다.
케빈 Cruijssen

1

05AB1E , 78 76 바이트

”Œï²°™Ä²° Gaia classêη•™Äµ‰Ÿ± Lava”#8äðýā<•ŒEŽuS,•2ôו9èÁnÇ∞Λ•SÌ2ôεŸIå}ÏSΩè

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

설명

”Œï²°™Ä²° Gaia classêη•™Äµ‰Ÿ± Lava”
끈을 밀다 Gas Giant Ice Giant Gaia class Dense Atmosphere Ice Desert Iron Lava

#                                          # split on spaces
 8ä                                        # divide into 8 parts
   ðý                                      # join each by spaces
     ā<                                    # push the range [0 ... 7]
       •ŒEŽuS,•                            # push 151010101025146
               2ô                          # split into pieces of 2
                                           # results in [15, 10, 10, 10, 10, 25, 14, 6]
                 ×                         # repeat each number in the range by these amounts
                                           # results in ['000000000000000', '1111111111', '2222222222', '3333333333', '4444444444', '5555555555555555555555555', '66666666666666', '777777']
                  •9èÁnÇ∞Λ•                # push 2724355724585889
                           S               # split to list of digits
                            Ì              # decrement each twice
                                           # results in [4,9,4,6,5,7,7,9,4,6,7,10,7,10,10,11]
                             2ô            # split into pieces of 2
                                           # results in [[4, 9], [4, 6], [5, 7], [7, 9], [4, 6], [7, 10], [7, 10], [10, 11]]
                               εŸIå}       # apply to each pair
                                Ÿ          # range [a ... b]
                                 Iå        # check if input is contained in the range
                                           # ex, for input 10: [0, 0, 0, 0, 0, 1, 1, 1]
                                    Ï      # keep only the indices which are true
                                           # ex, for input 10: ['5555555555555555555555555', '66666666666666', '777777']
                                     S     # split to list of digits
                                      Ω    # pick one at random
                                       è   # index into the list of strings with this

1

Python 3, 199 194 바이트

from random import*
lambda n:choices("Ice|Ice Giant|Gas Giant|Gaia class|Dense Atmosphere|Desert|Iron|Lava".split('|'),[(0x33b2a53d4a>>5*i&31)*(0xc07878380e3f0707>>8*i+n-4&1)for i in range(8)])

분할 h별도의 비트 마스크 우연 값 (설명 참조) 할당을 제거하여 몇 바이트의 저장에 h와 단순화 range()지능형리스트에 있습니다.

이전 솔루션

from random import*
h=0xc033c39e3270a0e51fbc1d40ea
lambda n:choices("Ice|Ice Giant|Gas Giant|Gaia class|Dense Atmosphere|Desert|Iron|Lava".split('|'),[(h>>i&31)*(h>>i+n+1&1)for i in range(0,104,13)])

int를 가져 와서 행성 유형을 반환하는 익명 함수를 정의합니다.

각 행성 유형에 대해 13 비트 값이 계산되었습니다. 상위 8 비트는 해당 행성 유형에 유효한 열 값의 비트 마스크를 정의합니다. 맨 아래 5 비트는 해당 행성 유형에 대한 확률입니다. 예를 들어 "Gaia class"는 열 값 4 ~ 7에 유효한 유형이므로 마스크는 0b00001111입니다. 확률은 10 또는 0b01010입니다. 이들을 결합 0b0000111101010하면 "Gaia 클래스"유형 의 13 비트 값이 됩니다. 각 행성 유형의 13 비트 값은 값을 얻기 위해 연결됩니다 h(최저 13 비트는 "Ice"행성 유형 의 값임 ). (최신 답변은 이러한 값을 결합하지 않습니다).

목록 이해는 13 비트 값을 반복하여 가중치 목록을 작성합니다. 여기서 행성 유형이 주어진 열 값에 대해 올바른 선택이면 가중치는 임의의 확률이며 그렇지 않으면 0입니다. 각 행성 유형에 (h>>i&31)대해 해당 행성 유형에 대한 랜덤 확률을 추출합니다. (h>>i+n+1&1)행성 유형이 열 값에 유효한 선택이면 1로 n평가되고 그렇지 않으면 0으로 평가됩니다.

라이브러리 기능 random.choices(choices, weights)은 가중치 목록을 기반으로 선택 목록에서 항목을 선택합니다.


i+n+1일 수 있습니다 i-~n. TIO
ovs

1

루비 , 214 (193) 189 바이트

->h{'Gas Giant,Desert,Iron,Lava,Ice,Ice Giant,Gaia class,Dense Atmosphere'.split(?,).zip(31006330.digits,75449887.digits,[15,25,14,6]).flat_map{|n,m,x,r|m<h-3&&x>h-3?[n]*(r||10):[]}.sample}

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


죄송합니다. 결과를 얻지 못했습니다. 목록의 첫 번째 항목입니까?
압생트

@Absinthe 제목을 추가했습니다. 다시 확인하십시오. 그것은 4에서 11 열 수준과 각각에 대해 무작위로 생성 된 행성이다
Asone Tuhid

아, 감사합니다. 이상적으로는 하나의 문자열 출력 만 있어야합니다.
Absinthe

@Absinthe 당신 말이 맞아요, 그건 내 테스트 코드 일뿐입니다. 이제 원하는 열 값을 입력하면 1 개의 결과를 반환 할 수 있습니다.
Asone Tuhid

1

하스켈 , 377 364 358 318 312 270 265 262 256 251 바이트

import System.Random
f h|x<-[n|(n,(a,b,c))<-zip(lines"Gas Giant\nIce\nIce Giant\nGaia class\nDense Atmosphere\n
Desert\nIron\nLava")$zip3[4,4,4,5,7,7,7,10][9,6,6,7,9,10,10,11][15,10,10,10,10,25,14,6],h<=
b,h>=a,_<-[1..c]]=(x!!)<$>randomRIO(0,length x-1)

(더 나은 인쇄를 위해 줄 바꿈을 추가했습니다). 이 작업은 "인쇄"가 아니라 "반환"이라고 표시되므로 f임의로 선택된 행성 이름을 IO모나드 로 반환하는 함수입니다 f :: Int -> IO String.

(가) main됩니다 main = do {f 10 >>= print}( 하스켈은 팁 골프를 치는 것은 그것을 계산하지 않습니다 말한다). 인쇄물

"Iron"     -- or "Desert", or "Lava"

(편집 : 제거 &의 기본 케이스는, 이동되지 main밖으로, 4 배로 및 변경 unzip, 패턴 가드로 전환하고 >>=다음과 같은 제안 에서 Laikoni을 , 감사합니다!;로부터 접근 구현 젤리 솔루션을 이름을 반복하는 대신, 명시 적 유형이 더 이상 필요 Laikoni의 또 다른 조언은 3 바이트를 더 절약하고 IO기능으로 만들었습니다 . 채팅 룸에서 조언 을 구현 했습니다 ).

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


좋은! 주석 이 넘치지 않게하려면 Haskell Chat of Monads and Men 대화방에 참여 하여 답변에 대해 자세히 논의 할 수 있습니다.
Laikoni

0

자바 8, 398384 바이트

n->{String r="",a[];for(String x:"456789~Gas Giant~15;456~Ice~10;456~Ice Giant~10;567~Gaia class~10;789~Dense Atmosphere~10;78910~Desert~25;78910~Iron~14;1011~Lava~6".split(";"))if(x.split("~")[0].contains(n))r+=x+";";long t=0,u=0;for(String x:(a=r.split(";")))t+=new Long(x.split("~")[2]);t*=Math.random();for(String x:a)if((u+=new Long((a=x.split("~"))[2]))>t)return a[1];return"";}

확실히 더 골프를 칠 수는 있지만 Java에서는 Strings와의 조합 가능성이 그리 쉽지 않습니다.

설명:

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

n->{                // Method with String as both parameter and return-type
  String r="",      //  Temp-String, starting empty
         a[];       //  Temp String-array
  for(String x:"456789~Gas Giant~15;456~Ice~10;456~Ice Giant~10;567~Gaia class~10;789~Dense Atmosphere~10;78910~Desert~25;78910~Iron~14;1011~Lava~6".split(";"))
                    //  Loop over the String-parts in the format "heats~type~probability"
    if(x.split("~")[0].contains(n))
                    //   If the heats contains the input
      r+=x+";";     //    Append this entire String-part to the temp-String `r`
  long t=0,u=0;     //  Temp numbers, both starting empty
  for(String x:(a=r.split(";")))
                    //  Loop over the temp-String parts:
    t+=new Long(x.split("~")[2]);
                    //   Sum their probabilities
  t*=Math.random(); //  Get a random number in the range [0,sum_of_probabilities)
  for(String x:a)   //  Loop over the temp-String parts again
    if((u+=new Long((a=x.split("~"))[2]))>t)
                    //   The moment the current probability-sum is > the random number
      return a[1];  //    Return the Type of planet
  return"";}        //  Mandatory return we won't encounter (which returns nothing)

0

최소 , 280 277 바이트

:a ' =b (("Gas Giant" 4 9 15) ("Ice" 4 6 10) ("Ice Giant" 4 6 10) ("Gaia Class" 5 7 10) ("Dense Atmosphere" 7 9 10) ("Desert" 7 10 25) ("Iron" 7 10 14) ("Lava" 10 11 6)) (=n (a n 1 get >= a n 2 get <= and) ((n 0 get b append #b) n 3 get times) when) foreach b b size random get

스택에서 열로 시작하여 스택에 끈을 남깁니다. Python 2 답변과 동일한 일반적인 프로세스입니다.

설명

min은 연결되어 있습니다.

:a ' =b                               ;Set the value on the stack (heat) to a, set empty quot to b
(("Gas Giant" 4 9 15) ("Ice" 4 6 10) ("Ice Giant" 4 6 10) ("Gaia Class" 5 7 10) ("Dense Atmosphere" 7 9 10) ("Desert" 7 10 25) ("Iron" 7 10 14) ("Lava" 10 11 6)) ;Data to be iterated over
(=n                                   ;  set n to current item
 (a n 1 get >= a n 2 get <= and)      ;    check if n is between the min (2nd elment of n) and max (3rd element of n) heat
 (
  (n 0 get b append #b) n 3 get times ;      insert the name(1st element of n) into the quot of names (b) a number of times corresponding to the 4th element of n
 ) when                               ;    when the previous check is true
) foreach                             ;  for every quot in previous data
b b size random get                   ;choose a random element from the list of names

0

PowerShell, 56 + 135 (CSV 파일) + 1 (파일 이름) = 192 바이트

param($z)ipcsv a|?{$z-in$_.m..$_.x}|%{,$_.p*$_.r}|Random

온라인으로 사용해보십시오! (아래에 설명 된 임시 CSV 파일을 생성하는 약간 수정 된 버전입니다)

다음을 포함하는 로컬 디렉토리에 이름이 지정된 ipcsv(축약 형)을 사용하여 CSV 파일을 가져 옵니다.Import-CSVa

P,m,x,r
Gas Giant,4,9,15
Ice,4,6,10
Ice Giant,4,6,10
Gaia class,5,7,10
Dense Atmosphere,7,9,10
Desert,7,10,25
Iron,7,10,14
Lava,10,11,6

그러면 다음과 같은 반복 가능한 해시 테이블이 자동으로 생성됩니다.

@{P=Gas Giant; m=4; x=9; r=15}
@{P=Ice; m=4; x=6; r=10}
...

우리는 다음 사용 Where-Object(는 ?) 우리의 입력 정수 해당 항목 꺼내 $z입니다 -in범위 $_.m$_.x(즉, 그것은 열 범위의 참조). 그런 다음 해당 이름의 확률에 따라 이름의 배열을 만드는 Foreach-Object루프 ( %) 로 펌핑 합니다. 예를 들어 15 "Gas Giant"열이 일치하면 문자열 배열이 만들어 집니다. 그런 다음 Get-Random적절한 가중치를 사용하여 적절한 문자열을 꺼내는 것을 넣습니다 .


-1

PHP , 1236 바이트

<?php
$heat = (int)fgets(STDIN);
$planets =
    [
        'Gas Giant' =>        ['heat_min' => 4, 'heat_max' => 9, 'selection_chance' => 15],
        'Ice' =>              ['heat_min' => 4, 'heat_max' => 6, 'selection_chance' => 10],
        'Ice Giant' =>        ['heat_min' => 4, 'heat_max' => 6, 'selection_chance' => 10],
        'Gaia class' =>       ['heat_min' => 5, 'heat_max' => 7, 'selection_chance' => 10],
        'Dense Atmosphere' => ['heat_min' => 7, 'heat_max' => 9, 'selection_chance' => 10],
        'Desert' =>           ['heat_min' => 7, 'heat_max' => 10, 'selection_chance' => 25],
        'Iron' =>             ['heat_min' => 7, 'heat_max' => 10, 'selection_chance' => 14],
        'Lava' =>             ['heat_min' => 10, 'heat_max' => 11, 'selection_chance' => 6],
    ];
foreach ($planets as $planet) {
    $chance_sum += ($heat >= $planet['heat_min'] && $heat <= $planet['heat_max']) * $planet['selection_chance'];
}
while (true) {
    foreach ($planets as $name => $planet) {
        $prob = 100 * ($heat >= $planet['heat_min'] && $heat <= $planet['heat_max']) * $planet['selection_chance'] / $chance_sum;
        if (rand(0, 100) < $prob) {
            echo $name."\n";
            exit;
        }
    }
}
?>

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


5
코드 골프 질문에 대한 답변은 골프를 타는 데 노력을 보여야합니다. 공백을 제거하면 훨씬 짧아 질 수 있습니다 . 다음 단계는 변수 이름을 단일 문자 이름으로 줄이는 것입니다.
ovs
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.