ソーラーシステムを作成する


39

イントロ

これは、最近コンピューターゲームを作成しているときに直面した実際の問題に基づいており、素晴らしいラウンドに役立つと思いました。

星には、さまざまな量の熱を出す7つの主要なスペクトルクラスがあります。星の周りの惑星の地質は、星から受け取った熱の量に大きく影響されます。これは、スペクトルクラスと星からの距離の要因です。したがって、水星は実質的に融解しており、海王星は凍結しています。

私のゲームの銀河は手続き的に生成され、与えられた星の惑星タイプをランダムに選択することは、本当の「ifステートメント地獄」であることが判明しました!

チャレンジ

メソッドは、最小熱しきい値、最大熱しきい値、および乱数に基づいて、星のクラスに適した惑星タイプのリストから1つの惑星を選択する必要があります。簡単にするために、この課題では太陽のようにクラスGの星のみを使用します。

入力

heat惑星が星から受け取った熱量を表す4〜11の整数。

変数

この表は、に基づいて可能な惑星を示していますheat。あなたの方法は、最初に、ヒートミニとヒートマックスに基づいて利用可能な選択肢を狭めheat、2つまたはその間に収まる必要があります。例えば、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)です。

出力

惑星タイプを文字列として返します。

ロジックの矢じりを避けるために最善を尽くしてください。最短のコードが勝ち、創造性のすべてのポイント。ハッピーゴルフ!


「ガイアクラス」の「クラス」は、他のすべてのように大文字にする必要がありますか?
ジョナサンアラン

@JonathanAllanそれは固有名詞ではないので小文字です
アブサン

1
@Absintheでは、なぜ密集したA大気は大文字なのでしょうか?
エリックアウトゴルファー

17
...誰かがそれを言ったことがありますか?| PPCGへようこそ、最初の挑戦です!
user202729

3
@EricDuminil別名矢じりアンチパターン、別名nested-if-statement-hell!wiki.c2.com/?ArrowAntiPattern
アブサン

回答:


12

ゼリー、78 バイト

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

文字のリストを返す整数([4,11]内)を受け入れるモナドリンク

オンラインでお試しください!

どうやって?

惑星の熱範囲をリストのリストとして作成し、それらのリスト内の入力熱の発生をカウントして、可能な惑星タイプを表すゼロと1のリストを取得し、8つの惑星タイプの尤度数で乗算します。分布を取得します。分布は、惑星タイプ名を繰り返すために使用され、最終的に均一でランダムな選択が行われます。

“'ĖøÆḳƙ’ḃ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あなたは単に賛成票を投じることができます。サイドノート:コードゴルフでは、通常、回答は受け付けません。
user202729

2
@ user202729 1〜2日で投票を追加します。このコードを解明しようとするJellyのGitHubページを見ていました。私はクレイジーだと信じています!最も適切です:)
アブサン

2
@アブサンはい、説明的なセクションは非難解な言語の提出でも持っておくと良いことが多いと思います:)
ジョナサンアラン

3
あなたの人々は本当に正気ではありません。
セルベック

7

R225の 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

私は論理インデックスを保存するのではなく使用して疑うwithdata.framesubset短くなります。
ジュゼッペ


@Giuseppe、あなたはおそらく惑星データで私のトリックのいくつかを使用することでさらにいくつかのバイトを得ることができますが、私はまた、残りのデータから確率ベクトルを分離するというあなたのアイデアを使用して私のものを改善すると思います。
キリルL.

4

JavaScript 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]
ジョナサンアラン

私はあなたが交換することにより2を救うことができると思います(ただし、100%ではないよ)(z/16&15)z/16&15。かかわらず、あなたは3と6 ...使用のオフセットをベース8の圧縮を使用して6つのバイトを保存することができます[971,648,648,657,675,1636,932,445]z/8&7+3z%8+6z>>6:)
ジョナサン・アラン

@JonathanAllanオフセット!素晴らしいアイデア、thx
edc65

@JonathanAllan 優先順位が低いため(z/8&7)+4、括弧が必要です&7/8&(7+4)
-edc65

1
@Shaggyはあなたのコメントの上にコメントを見ましたか?(長い話:いいえ)
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)

オンラインでお試しください!

Pythonポートの長さは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
興味深いことに、この記事を書いている時点では、Pythonポートは他のすべてのPythonソリューションに勝っています!
キリルL.

4

115 111バイト

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

オンラインでお試しください!リンクは、コードの詳細バージョンです。編集:@ASCIIのみのおかげで4バイトを保存しました。説明:

≔I⁻N³θ

1桁と比較できるように、入力から3を引きます。

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

文字列0715 0410 0410 1510 3710 3825 3814 696をスペースで分割し(スペースはコンマよりも圧縮しやすいようですが、他の文字は試しませんでした)、各部分をループします。

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

入力を1桁目と2桁目と比較し、その間にある場合は、ループインデックスを指定された回数だけ事前に定義された空のリストにプッシュし、入力します。

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

惑星のリストを改行で分割し(再び、何らかの理由でコンマよりも良い)、リストからランダムに選択されたインデックスに対応する要素を選択します。


良いですね。Random(u)は、各惑星のさまざまな確率をどのように考慮しますか?(炭については何も知りません)。
アブサン

「ループインデックスを事前定義された空のリストに指定された回数だけプッシュして、データを入力する」ため、planetTypeインデックスの正しい分布を持つリストからインデックスを選択しています。次に、選択したインデックスを使用して、planetType名を取得します。
ジョナサンアラン

@ジョナサンアランわかった、ありがとう
アブサン

111バイト、私は思う?一般的には、文字クラスの早い段階で文字を使用してみてください。compression#11を参照してください。デフォルトの順序は、別のバイトを保存しますが、あなただけのシンボルを持っている場合にのみ、それは基本的にだ
ASCIIのみ

@ASCIIのみ泥としてクリア...なぜそこに改行があるのに、他の文字列のためのスペースがあるのですか?
ニール

3

R196の 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文字列の周りに大量の引用文字が入らないように名前を収集します。

  • <andの>代わりに<=andを使用できるように、熱パラメータを調整し>=ます。

  • 熱データ形式をからHeat min, Heat maxに変更してHeat min, Heat Delta、2桁の数字を取り除きます。
    すべての数値を-3シフトすることにより置き換えられました

  • すべての惑星の確率を5で除算すると、桁数も少なくなります。

  • 不適切な惑星の確率を無効にするために、惑星の確率のベクトルとブールのベクトル(入力が熱要件を満たしているかどうかを示す)を乗算します。

おそらく、何らかの種類のデータ圧縮を適用することで、さらに数バイトが得られる可能性があります。
もうないと思う。


1
t=代わりにtext=3バイトも節約されます。
ジュゼッペ


ただし、明確な設定を行う必要はありますがread.csv、単一の列を使用しreadLinesて引用符を完全に削除することをお勧めしますn
ジュゼッペ

@Giuseppe、ただし、171バイトです。これは、演算子の優先順位を維持するために必要な括弧も削除したため、バージョンが誤った確率を与えるためです。それでも、素晴らしい提案です!
キリルL.

ああ、私はそれらの括弧がどこから来たのだろうと思った
ジュゼッペ

3

Python、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が惑星タイプの範囲内にある場合、確率に従ってリストに追加し、ランダムに1を出力します。

編集:Jonathan Frechの功績により-forループを再編集して、数バイトを削減しました。リストにアイテムを追加するより良い方法


3
PPCGへようこそ!バイトのカウント方法はわかりませんが、283バイトしか得られません。そのインデントが4バイトではなくタブの場合は少なくなります。
マーティンエンダー

1
i in range(x[1], x[2])仕様とは異なり、熱の上端を除外しませんか?
グレイファー


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

1
@Chromane申し訳ありませんが、コメントによって一部の文字が削除されたようです。
MoustacheMoses

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]

操作

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

後者の2つの配列の要素ごとの乗算である(trueそしてfalseように振る舞う01それぞれ)。これにより、各惑星クラスにランダムチャンスがある配列、または0、入力に基づいてそのクラスが不可能な場合にます。この配列は、ランダムサンプリングで重みとして使用されます

関数呼び出し

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

計算された重みの配列(4番目の入力引数)を使用して、文字列のセル配列(最初の入力引数)からセルの1つを選択します。具体的には、関数randsampleは重みを確率に自動的に正規化し、それらの確率でランダムに選択します。結果は、文字列を含むセル配列です。コード

{1}

関数の出力を構成するその文字列を抽出するために使用されます。


2
素晴らしい説明、ありがとう。素晴らしいスコアも。
アブサン


1

Perl 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]

オンラインでお試しください!


最小ヒートに1つを削除し、最大ヒートに1を追加すると(などの[Ice,4,5,11]代わりに[Ice,4,6,10]なります)、の<代わりに<=およびの>代わりに使用できるため>=、2バイトを節約できます。(はい、それは多くありません...)
ダダ

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

Forループが1行になりました。戻り値はなく、暗黙的な型へのバイト数が少なくなりました。

4つのスペースが削除されました(Kevinに感謝)

オンラインでお試しください!


私は一度もプログラムしたことがありませNimんが、ゴルフは4つのスペースでできると思いますfor n in[(。と3でif h>=n[1]and h<=n[2]
ケビンクルーイッセン

1

05AB1E78 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個別のビットマスクとランダムチャンス値(説明を参照)に分割することにより、割り当てを排除しhrange()、リスト内の内包表記。

以前のソリューション

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を取り、planet型を返す匿名関数を定義します。

各惑星タイプについて、13ビット値が計算されました。上位8ビットは、その惑星タイプの有効な発熱量のビットマスクを定義します。下位5ビットは、その惑星タイプのランダムチャンスです。たとえば、「ガイアクラス」は4〜7の発熱量に有効なタイプであるため、のマスクがあり0b00001111ます。10のランダムチャンスがある、または0b01010です。それらを組み合わせると0b0000111101010、「Gaiaクラス」タイプの13ビット値になります。各惑星タイプの13ビット値は連結されて、次の値を取得しますh(最下位の13ビットは「氷」惑星タイプ用です)。(新しい答えはこれらの値を結合しません)。

リスト内包表記は、13ビット値を反復処理して重みのリストを作成します。ここで、重みは、惑星タイプが特定の発熱量に対して有効な選択である場合はランダムなチャンスであり、それ以外の場合はゼロです。各惑星タイプについて、その惑星タイプ(h>>i&31)のランダムチャンスを抽出します。(h>>i+n+1&1)惑星タイプが発熱量の有効な選択である場合は1にn評価され、そうでない場合は0に評価されます。

ライブラリ関数random.choices(choices, weights)は、重みのリストに基づいて選択肢のリストから項目を選択します。


i+n+1することができますi-~nTIO
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

理想的に1つの文字列のみ出力がなければならないのにああ私は、それを感謝を取得
アブサン

@Absintheあなたは正しい、それはちょうど私自身のテストコードでした。今、あなたはあなたが望む熱値を入力することができ、1つの結果を返します
Asone Tuhid

1

Haskell377 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}Haskellのゴルフのヒントが、それはカウントされませんと言います)。プリント

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

(編集:除去&の基本ケースと、移動しmainて、四倍に変更されunzip、パターンガードとに切り替え>>=、次の提案 から Laikoni、おかげ!;からのアプローチを実装ゼリー溶液名を繰り返し、代わりに、明示的な型がもはや必要とされ; Laikoniによるもう1つのアドバイスは、さらに3バイトを節約します; IO関数にしました;実装されたアドバイスチャットルームからのをしました)。

オンラインでお試しください!


いいね!コメントがあふれないようにするには、モナドと男性の Haskellチャットルームに参加して、さらに答えを話し合うことができます。
ライコニ

0

Java 8、398 384バイト

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(の略Import-CSV)を使用してCSVファイルをインポートaします。

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
コードゴルフの質問への回答は、それらをゴルフする努力を示す必要があります。空白を削除するだけで、これをもっと短くすることができます。次のステップは、変数名を1文字の名前に短縮することです。
ovs
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.