สร้างระบบพลังงานแสงอาทิตย์


39

Intro

นี่ขึ้นอยู่กับปัญหาจริงที่ฉันเพิ่งเผชิญในขณะที่สร้างเกมคอมพิวเตอร์ขึ้นมาและฉันคิดว่ามันน่าจะเป็นดี

ดาวฤกษ์มีสเปคตรัมหลักเจ็ดดวงที่ดับความร้อนได้หลายระดับ ธรณีวิทยาของดาวเคราะห์รอบดาวฤกษ์ได้รับอิทธิพลอย่างมากจากปริมาณความร้อนที่ได้รับจากดาวฤกษ์ซึ่งเป็นปัจจัยของชั้นสเปกตรัมและระยะทางจากดาวฤกษ์ ดังนั้นดาวพุธจึงละลายได้จริงดาวเนปจูนถูกแช่แข็ง

กาแลคซีในเกมของฉันนั้นถูกสร้างขึ้นตามขั้นตอนและการสุ่มเลือกประเภทดาวเคราะห์สำหรับดาวที่ให้นั้นกลายเป็น "คำแถลงนรก" ที่แท้จริง

ความท้าทาย

วิธีการของคุณควรเลือกดาวเคราะห์หนึ่งดวงจากรายการประเภทดาวเคราะห์ที่เหมาะสมกับชั้นของดาวโดยขึ้นอยู่กับเกณฑ์ความร้อนขั้นต่ำขีดจำกัดความร้อนสูงสุดและหมายเลขสุ่ม เพื่อความง่ายความท้าทายนี้จะใช้ดาว 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" ควรเป็นตัวพิมพ์ใหญ่เหมือนอย่างอื่นหรือไม่
Jonathan Allan

@JanathanAllan เป็นตัวพิมพ์เล็กเพราะมันไม่ใช่คำนามที่เหมาะสม
Absinthe

1
@Absinthe แล้วทำไมหนาแน่นA เป็นตัวพิมพ์ใหญ่ทำไม?
Erik the Outgolfer

17
... มีใครบอกว่า? | ยินดีต้อนรับสู่ PPCG และความท้าทายแรกที่ดี!
user202729

3
@EricDuminil หรือที่รู้จักกันในนาม anti-pattern หัวลูกศรหรือที่รู้จักกันดีว่า nested-if-statement-hell! wiki.c2.com/?ArrowAntiPattern
Absinthe

คำตอบ:


12

เยลลี่ , 78 ไบต์

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

ลิงก์ monadic ยอมรับจำนวนเต็ม (ใน[4,11] ) ซึ่งส่งคืนรายการของอักขระ

ลองออนไลน์!

อย่างไร?

สร้างช่วงความร้อนของดาวเคราะห์เป็นรายการและนับจำนวนเหตุการณ์ที่เกิดขึ้นจากความร้อนอินพุตในรายการเหล่านั้นเพื่อรับรายการของศูนย์และวัตถุที่เป็นตัวแทนของดาวเคราะห์ประเภทใดที่เป็นไปได้ รับการกระจาย การกระจายใช้เพื่อทำซ้ำชื่อประเภทดาวเคราะห์และในที่สุดก็มีการสุ่มเลือก

“'ĖøÆḳƙ’ḃ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

@Absinthe คุณสามารถโหวตได้ง่ายๆ หมายเหตุด้านข้าง: บน Code Golf โดยทั่วไปเราไม่ยอมรับคำตอบ
user202729

2
@ user202729 ฉันจะเพิ่มคะแนนในหนึ่งหรือสองวัน ฉันกำลังดูหน้า GitHub สำหรับ Jelly พยายามที่จะเปิดเผยรหัสนี้ ฉันเชื่อว่าบ้า! มีความเหมาะสมที่สุด :)
24718 Absinthe

2
@Absinthe ใช่ผมเชื่อว่าส่วนที่สื่อความหมายมักจะเป็นสิ่งที่ดีที่จะมีแม้กระทั่งสำหรับการส่งภาษาที่ไม่ใช่ความลับ :)
โจนาธานอัลลัน

3
พวกคุณเป็นบ้าจริง ๆ
Selvek

7

R , 225 223 183 ไบต์

ขอบคุณ Giuseppe สำหรับการรีแฟคเตอร์ที่ชาญฉลาดเพื่อนำมันลงไปที่ 188 ไบต์; ส่วนที่เหลืออีกห้าคนถูกโกนออกโดยใช้หมายเลขที่ซ้ำซ้อนน้อยลง

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 # :)
Absinthe

ฉันสงสัยว่าประหยัดดัชนีตรรกะมากกว่าการใช้with, data.frameและsubsetจะสั้นลง
Giuseppe


@Giuseppe คุณอาจได้รับอีกสองสามไบต์โดยใช้เทคนิคของฉันกับข้อมูลดาวเคราะห์แต่ฉันคิดว่าฉันจะปรับปรุงของฉันโดยใช้ความคิดของคุณในการแยกเวกเตอร์ความน่าจะเป็นออกจากส่วนที่เหลือของข้อมูล
Kirill L.

4

จาวาสคริปต์ 212

แก้ไข 6 ไบต์บันทึกขอบคุณ 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]]

golfed น้อย

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])
Jonathan Allan

ผมคิดว่า ( แต่ผมไม่ได้ 100%) คุณสามารถบันทึก 2 โดยการแทนที่ด้วย(z/16&15) z/16&15ไม่ว่าคุณจะสามารถบันทึก 6 ไบต์ได้อย่างไรโดยใช้การบีบอัดฐาน 8 พร้อมออฟเซ็ตสามและหก ... ใช้[971,648,648,657,675,1636,932,445]กับz/8&7+3, z%8+6และz>>6:)
Jonathan Allan

@Janathan ทั้งหมด offsets! ความคิดที่ดี, ขอบคุณ
edc65

@JanathanAllan ฉันต้องการวงเล็บ(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 อื่น ๆ ทั้งหมด!
Kirill L.

4

ถ่าน , 115 111 ไบต์

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

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด แก้ไข: บันทึกแล้ว 4 ไบต์ด้วย @ ASCII-only คำอธิบาย:

≔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) ในความน่าจะเป็นที่แตกต่างกันสำหรับแต่ละดาวเคราะห์เป็นอย่างไร (ฉันไม่รู้อะไรเกี่ยวกับถ่าน)
Absinthe

มันคือการเลือกดัชนีจากรายการที่มีการแจกแจงที่ถูกต้องของดัชนี planetType เนื่องจาก "กดดัชนีลูปตามจำนวนครั้งที่กำหนดไปยังรายการที่ว่างที่กำหนดไว้ล่วงหน้า จากนั้นใช้ดัชนีที่เลือกเพื่อรับชื่อ planetType
Jonathan Allan

@JonathanAllan เข้าใจแล้วขอบคุณ
Absinthe

111 bytesฉันคิดว่า? โดยทั่วไปให้ลองใช้อักขระก่อนหน้าในคลาสอักขระดูการบีบอัด # 11 คำสั่งซื้อเริ่มต้นจะบันทึกไบต์อื่น แต่โดยทั่วไปก็ต่อเมื่อคุณมีสัญลักษณ์
เท่านั้น ASCII เท่านั้นเท่านั้น

@ ASCII- ชัดเจนเหมือนโคลน ... ทำไมบรรทัดใหม่ถึงดีกว่านั่น แต่มีช่องว่างสำหรับสตริงอื่น
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เพื่อหลีกเลี่ยงอักขระคำพูดจำนวนมากรอบสตริง

  • tweaking params ความร้อนเพื่อให้เราสามารถใช้<และ>สัญญาณแทนและ<=>=

  • การเปลี่ยนรูปแบบข้อมูลความร้อนจากHeat min, Heat maxเป็นHeat min, Heat Deltaเพื่อกำจัดตัวเลขสองหลัก
    แทนที่ด้วยการขยับตัวเลขทั้งหมดด้วย -3

  • การหารความน่าจะเป็นของดาวเคราะห์ทั้งหมดด้วย 5 ซึ่งส่งผลให้ตัวเลขน้อยลงด้วยเช่นกัน

  • การคูณเวกเตอร์ของความน่าจะเป็นดาวเคราะห์กับเวกเตอร์ของบูลีน (ระบุว่าการป้อนข้อมูลของเราเป็นไปตามข้อกำหนดด้านความร้อน) เพื่อลบล้างความน่าจะเป็นของดาวเคราะห์ที่ไม่เหมาะสม

อาจได้รับอีกสองสามไบต์โดยใช้การบีบอัดข้อมูลบางประเภท
ฉันคิดว่าไม่อีกต่อไป


1
t=แทนที่จะเป็นtext=จะบันทึก 3 ไบต์เช่นกัน
จูเซปเป้


คำตอบที่เป็นของแข็ง แต่ใช้read.csvสำหรับคอลัมน์เดียวปัญหาreadLinesในการกำจัดของคำพูดทั้งหมดถึงแม้ว่าคุณจะต้องกำหนดอย่างชัดเจนn
จูเซปเป้

@Giuseppe มีขนาด 171 ไบต์เนื่องจากคุณได้ลบวงเล็บที่จำเป็นในการรักษาลำดับความสำคัญของโอเปอเรเตอร์และเวอร์ชันของคุณอาจมีความผิดพลาด ยังเป็นข้อเสนอแนะที่ยอดเยี่ยม!
คิริลล์ลิตร

โอ้ฉันสงสัยว่าวงเล็บเหล่านี้มาจากไหน ....
จูเซปเป้

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 อยู่ในช่วงประเภทดาวเคราะห์ให้ผนวกเข้ากับรายการตามความน่าจะเป็นจากนั้นจึงสุ่มพิมพ์หนึ่งรายการ

แก้ไข: ด้วยการมอบเครดิตให้แก่ Jonathan Frech - ทำการวนลูปใหม่ให้หลุดออกไปสองสามไบต์ วิธีที่ดีกว่าในการเพิ่มรายการต่อท้ายรายการ


3
ยินดีต้อนรับสู่ PPCG! ไม่แน่ใจว่าคุณนับจำนวนไบต์ได้อย่างไร แต่ฉันได้รับเพียง 283 น้อยลงถ้าเยื้องนั้นเป็นแท็บแทนที่จะเป็น 4 ไบต์
Martin Ender

1
การi in range(x[1], x[2])แยกนั้นไม่รวมถึงขอบบนของความร้อนไม่เหมือนกับสเปคหรือเปล่า
Graipher

1
270 ไบต์
Jonathan Frech

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)

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]กำหนดอาร์เรย์ของค่าโอกาสสุ่ม

การดำเนินการ

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

คือการคูณองค์ประกอบที่ชาญฉลาดของสองอาร์เรย์หลัง ( trueและfalseทำตัวเหมือน0และ1ตามลำดับ) สิ่งนี้จะช่วยให้อาเรย์ที่แต่ละชั้นดาวเคราะห์มีทั้งโอกาสสุ่มหรือ0ถ้าชั้นนั้นเป็นไปไม่ได้ขึ้นอยู่กับการป้อนข้อมูล อาร์เรย์นี้จะใช้เป็นน้ำหนักในการสุ่มตัวอย่าง

การเรียกฟังก์ชั่น

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

เลือกหนึ่งในเซลล์จากเซลล์อาร์เรย์ของสตริง (อาร์กิวเมนต์อินพุตแรก) โดยใช้อาร์เรย์ที่คำนวณน้ำหนัก (อาร์กิวเมนต์อินพุตที่สี่) โดยเฉพาะอย่างยิ่งฟังก์ชั่นrandsampleจะปรับน้ำหนักให้เป็นปกติโดยอัตโนมัติจากนั้นทำการสุ่มเลือกด้วยความน่าจะเป็นเหล่านั้น ผลลัพธ์คืออาร์เรย์เซลล์ที่มีสตริง รหัส

{1}

ถูกใช้เพื่อแยกสตริงนั้นซึ่งถือเอาท์พุทฟังก์ชั่น


2
คำอธิบายที่ดีขอบคุณ คะแนนที่ดีเกินไป
Absinthe


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]

ลองออนไลน์!


หากคุณลบหนึ่งไปยังนาทีความร้อนและเพิ่มหนึ่งในความร้อนสูงสุด (ที่จะให้[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 ช่อง (ขอบคุณเควิน )

ลองออนไลน์!


ฉันไม่เคยตั้งโปรแกรมNimมา แต่ฉันคิดว่าคุณสามารถเล่นกอล์ฟได้สี่ที่: หนึ่งที่for n in[(; if h>=n[1]and h<=n[2]และสามที่
Kevin 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 คลาส" เป็นชนิดที่ถูกต้องสำหรับค่าความร้อน 4-7 0b00001111จึงมีหน้ากากของ แต่ก็มีโอกาสสุ่ม 10 0b01010หรือ การรวมผลลัพธ์เหล่านั้นให้เป็นค่า 13 บิต0b0000111101010สำหรับประเภท "คลาส Gaia" ค่า 13 บิตสำหรับดาวเคราะห์แต่ละชนิดถูกต่อกันเพื่อรับค่าh(13 บิตต่ำสุดสำหรับดาวเคราะห์ประเภท "น้ำแข็ง") (คำตอบที่ใหม่กว่าไม่รวมค่าเหล่านี้)

รายการความเข้าใจซ้ำกว่าค่า 13 บิตเพื่อสร้างรายการของน้ำหนักโดยที่น้ำหนักเป็นโอกาสสุ่มถ้าประเภทดาวเคราะห์เป็นตัวเลือกที่ถูกต้องสำหรับค่าความร้อนที่กำหนดและไม่มีค่าเป็นศูนย์ สำหรับดาวเคราะห์แต่ละประเภท(h>>i&31)แยกโอกาสแบบสุ่มสำหรับดาวเคราะห์ประเภทนั้น (h>>i+n+1&1)ประเมินเป็น 1 ถ้าประเภทดาวเคราะห์เป็นตัวเลือกที่ถูกต้องสำหรับค่าความร้อนnและประเมินเป็น 0

ฟังก์ชั่นห้องสมุดrandom.choices(choices, weights)เลือกรายการจากรายการตัวเลือกตามรายการของน้ำหนัก


i+n+1i-~nสามารถ TIO
ovs

1

Ruby , 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

@Absinthe ฉันเพิ่มหัวเรื่องแล้วให้ตรวจสอบอีกครั้ง มันคือระดับความร้อนทั้งหมดตั้งแต่ 4 ถึง 11 และดาวเคราะห์ที่สร้างขึ้นสำหรับแต่ละคน
Asone Tuhid

อ่าฉันได้รับมันขอบคุณแม้ว่าโดยหลักแล้วควรจะมีเพียงหนึ่งสายออก
Absinthe

@Absinthe คุณถูกต้องนั่นเป็นเพียงรหัสทดสอบของฉันเองตอนนี้คุณสามารถป้อนค่าความร้อนที่คุณต้องการและส่งกลับ 1 ผลลัพธ์
Asone Tuhid

1

Haskell , 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)

(ฉันได้เพิ่ม linebreaks สำหรับงานพิมพ์ที่ดีกว่า) งานกล่าวว่า "กลับ" ไม่ "พิมพ์" เพื่อให้fเป็นฟังก์ชั่นที่ส่งกลับชื่อดาวเคราะห์สุ่มเลือกลงที่monad,IOf :: Int -> IO String

mainคือmain = do {f 10 >>= print}( Haskell เคล็ดลับการเล่นกอล์ฟบอกว่ามันไม่ได้นับ) พิมพ์

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

(แก้ไข: ลบ&เคสฐานmainออกแล้วย้ายออกเปลี่ยนเป็นสี่unzipส่วนและเปลี่ยนเป็นรูปแบบการ์ดและ>>=ทำตามคำแนะนำ จาก Laikoniขอบคุณ! ใช้แนวทางจากโซลูชันของเยลลี่แทนการทำซ้ำชื่อไม่ต้องการประเภทที่ชัดเจนอีกต่อไป คำแนะนำอื่น ๆ โดย Laikoni ช่วยประหยัดได้ 3 ไบต์อีกครั้งทำให้เป็นIOฟังก์ชั่นคำแนะนำที่นำมาใช้จากห้องแชท)

ลองออนไลน์!


ดี! เพื่อหลีกเลี่ยงความคิดเห็นที่ท่วมท้นคุณสามารถเข้าร่วมห้องแชท Haskell ของ Monads and Menเพื่อหารือเกี่ยวกับคำตอบของคุณเพิ่มเติม
Laikoni

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"";}

แน่นอนว่ามันสามารถตีกอล์ฟได้มากกว่านี้ แต่ความน่าจะเป็นเมื่อใช้ร่วมกับ Strings นั้นไม่ใช่เรื่องง่ายใน Java

คำอธิบาย:

ลองออนไลน์

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

คำอธิบาย

โปรดทราบว่าขั้นต่ำคือการต่อข้อมูล

: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 ชั่วคราวที่อธิบายด้านล่าง)

นำเข้าไฟล์ CSV โดยใช้ipcsv(ย่อมาจากImport-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

ซึ่งจะสร้าง hashtable ที่ทำซ้ำได้โดยอัตโนมัติในสิ่งต่อไปนี้:

@{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.