मरने के लिए तैयार?


22

पृष्ठभूमि

टेबलटॉप रोल-प्लेइंग गेम में एन्नुइ का एक स्रोत कई पासा को शामिल करने वाले रोल के साथ काम कर रहा है। एक विघटन मंत्र को कास्टिंग करना तात्कालिक हो सकता है, लेकिन 40 पासा को एक साथ जोड़ना और जोड़ना निश्चित रूप से नहीं है!

इसे संभालने के लिए कई सुझावों पर RPG.stackexchange.com पर चर्चा की गई है । हालांकि, उनमें से कुछ, जैसे कि एक रोलर प्रोग्राम या औसत पासा का उपयोग करना, खिलाड़ियों से कुछ मजेदार और नियंत्रण की भावना को दूर करता है। अन्य, जैसे 4 पासा को रोल करना और कुल को 10 से गुणा करना, परिणाम को और अधिक आकर्षक बनाते हैं (जबकि विपरीत दिशा में पासा कार्य करता है)।

यह प्रश्न औसत परिणाम (माध्य) या इसकी स्विंगनेस (विचरण) को बदले बिना पासा रोल की संख्या को कम करने की एक विधि की चिंता करता है ।

अंकन और गणित

इस प्रश्न में, हम पासा रोल का प्रतिनिधित्व करने के लिए निम्नलिखित अधिसूचना का उपयोग करेंगे:

  • n d k (जैसे 40d6) एक k- पक्षीय मरने के n रोल के योग को संदर्भित करता है।
  • n d k * c (जैसे 4d6 * 10) एक स्थिर c द्वारा परिणाम को गुणा करने का वर्णन करता है।
  • हम रोल (जैसे 4d6 * 10 + 40d6) और स्थिरांक (जैसे 4d6 + 10) भी जोड़ सकते हैं।

एकल डाई रोल के लिए, हम यह दिखा सकते हैं:

  • माध्य : E [1d k ] = (k + 1) / 2
  • भिन्न : वार (१ डी के ) = (के -1) (के + १) / १२

माध्य और विचरण के मूल गुणों का उपयोग करते हुए, हम आगे भी इसका अनुमान लगा सकते हैं:

  • मीन : ई [ मीटरकश्मीर * एक + एन डी एल * + ] = हूं करें.ई. [1 दिन कश्मीर ] अरब [1 दिन। एल ]
  • भिन्न : वर ( m d k * a + n d l * b + c ] = a mM .Var (1d k ) + b ²। N .Var (1d l )

कार्य

तीन पूर्णांक n , k और r को देखते हुए , आपके प्रोग्राम को निम्नलिखित बाधाओं के साथ, अधिकांश r रोल्स में n d k सन्निकट करने का एक तरीका आउटपुट करना चाहिए :

  • समाधान में n d k के समान माध्य और विचरण होना चाहिए ।
  • समाधान में r की तुलना में कम या बराबर रोल की सबसे बड़ी संभव संख्या होनी चाहिए , क्योंकि अधिक रोल एक चिकनी वितरण का उत्पादन करता है।
  • आप केवल उपयोग करने के लिए अपने समाधान सीमित होना चाहिए कश्मीर तरफा पासा, जब तक आप (देखें नीचे) बोनस के लिए लक्ष्य कर रहे हैं।
  • यदि कोई समाधान नहीं है (जैसा कि आर बहुत छोटा है), तो प्रोग्राम को स्ट्रिंग "आई एएम ए सेक्सी शोल्ड गॉड ऑफ वॉर" का उत्पादन करना चाहिए।
  • मापदंडों को एक ही स्थान-पृथक स्ट्रिंग के रूप में पारित किया जाता है।
  • आप मान सकते हैं कि 1 ≤ n ≤ 100, 1 ≤ आरn और कहा कि कश्मीर 4, 6, 8, 10, 12 और 20 (मानक मेज में इस्तेमाल पासा) में से एक है।
  • आउटपुट नोटेशन में वर्णित प्रारूप में होना चाहिए (उदाहरण 4d6 * 10 + 5), वैकल्पिक स्थानों के साथ + s लेकिन कहीं और नहीं। यूनिट मल्टीप्लायर भी वैकल्पिक हैं: 4d6 * 1 और 4d6 दोनों मान्य हैं।

आप STDIN (या निकटतम वैकल्पिक), कमांड-लाइन तर्क या फ़ंक्शन तर्क के माध्यम से इनपुट लेकर एक प्रोग्राम या फ़ंक्शन लिख सकते हैं। परिणामों को STDOUT (या निकटतम विकल्प) पर मुद्रित किया जाना चाहिए या एक स्ट्रिंग के रूप में लौटाया जाना चाहिए।

उदाहरण

>> "10 6 10"
10d6
>> "10 6 4"
2d6*2+2d6+14
>> "10 6 3"
1d6*3+1d6+21
>> "10 6 2"
1d6*3+1d6+21
>> "10 6 1"
I AM A SEXY SHOELESS GOD OF WAR!

स्कोरिंग

सबसे छोटा कोड जीतता है। मानक नियम लागू होते हैं।

बोनस

-33% (घटाव से पहले राउंड डाउन) यदि आपका प्रोग्राम समाधान भी लौटाता है जिसमें कश्मीर के अलावा वैध पासा शामिल है (जहाँ मान्य मूल्य, जैसा कि ऊपर बताया गया है, 4, 6, 8, 10, 12 और 20 हैं)। यदि आप ऐसा करने के लिए चुनते हैं, तो आपको हमेशा उचित होने पर ऐसे समाधान वापस करने चाहिए , और उन समाधानों को संभालना चाहिए जो कई प्रकार के डाई का उपयोग करते हैं। उदाहरण:

>> "7 4 3"
3d6+7

6
OOTS संदर्भ के लिए +1। ;) (ठीक है और क्योंकि यह एक बहुत अच्छी चुनौती है, वास्तव में।)
मार्टिन एंडर

1
हो सकता है कि इस सवाल को स्वाहा करने के लिए हमारी नई $ $ LaTeX $ क्षमताओं का उपयोग करें?
orlp

2
@UriZarfaty: मैंने LaTeX का उपयोग करने के लिए आपके सूत्र अपडेट किए। आशा है कि यह ठीक है। यदि आप इसे पसंद नहीं करते हैं, तो आप बस पोस्ट को वापस रोल कर सकते हैं और यह वापस चला जाएगा कि यह पहले कैसे था।
एलेक्स ए।

1
मैंने LaTeX एडिट को वापस ले लिया है, क्योंकि दुर्भाग्य से, इसे अब के लिए फिर से निष्क्रिय कर दिया जाएगा
मार्टिन एंडर

1
# सासंद - मुझे लगा कि यह "हैलो! मेरा नाम इनिगो मोंटोया है। आपने अपने पिता की हत्या कर दी है। मेरे मरने की तैयारी करो।"
scunliffe

जवाबों:


5

GolfScript ( 163 143 133 बाइट्स)

~@:^\?,{^base 0-}%{0\{.*+}/^=},.{{,}$-1=..&{[[1$[1$]/,(3$@]'d*+'1/]zip}%^@{-}/@)*.2/\1&'.5'*}{];'I AM A SEXY SHOELESS GOD OF WAR!'}if

ऑनलाइन डेमो

जब प्रकार के पासा नहीं मिलाते हैं, तो समस्या वर्गों की nतुलना में अधिक नहीं के योग के रूप में व्यक्त करने के लिए कम हो जाती है r, और kअंत में निरंतर की गणना को छोड़कर अप्रासंगिक है। इस उत्तर के थोक बहीखाता वांछित प्रारूप में परिणाम को व्यक्त करने के लिए आवश्यक है: वास्तविक गणना है ^\?,{^base}%{0\{.*+}/^=},गुणा कारकों को खोजने के लिए a, b, आदि .; और ^@{-}/@)*.2/स्थिरांक की गणना करने के लिए।

विच्छेदन

~                # Stack: n k r
@:^\?,{          # Store n in ^, and for 0 to n**r
  ^base 0-       #   convert to base n and remove 0s.
}%               # Stack: k [arrays of up to r values from 1 to n-1]
{0\{.*+}/^=},    # Filter them to arrays whose sum of squares is n,
                 #   i.e. to multipliers which have the right variance
.{               # If any multiplier array passes the filter...
  {,}$-1=        #   Pick one with the greater number of rolls
                 #   Stack: k [multipliers]
  ..&{           #   Map each distinct multiplier a...
    [[           #     Gather in nested array for later zip
      1$[1$]/,(  #       Split a copy of the multipliers around a to count the as
                 #       Let's denote that count as m
                 #       Stack: k [multipliers] a [ [ m
      3$@        #       Copy k and rotate the a inside the nested array
     ]           #       Stack: k [multipliers] [ [m k a]
      'd*+'1/    #       Push an array ['d' '*' '+'] and close nested array
    ]zip         #       Giving [[m 'd'] [k '*'] [a '+']]
                 #       which will be printed as mdk*a+
  }%             #   Stack: k [multipliers] [string representations of dice]
  ^@{-}/@)*      #   Compute (n - sum(multipliers)) * (k + 1)
                 #   That's twice the constant we need to add to fix the mean
  .2/\1&'.5'*    #   And convert it to a renderable form, including .5 if needed
}{               # Otherwise clear the stack and push the error message
  ];'I AM A SEXY SHOELESS GOD OF WAR!'
}if

1

अजगर, 487 461 452 - 33% = 303 बाइट्स

चूंकि किसी और ने ऐसा नहीं किया है, यहां एक समाधान है जो विभिन्न प्रकार के पासा को संभालता है। अन्य समाधान की तरह, यह संभव समाधानों की एक श्रृंखला उत्पन्न करता है और उन्हें फ़िल्टर करता है। यह इस तथ्य का उपयोग करता है कि (k + 1) (k-1) = k ^ 2-1 और कल्पना में दो अर्ध-खामियां (उफ़!): निरर्थक प्रपत्र 0d k * a (जो सहेजता है, को मुद्रित करने पर प्रतिबंध की कमी सभी 5 बाइट्स!), और रनिंग टाइम प्रतिबंध की कमी (यह बहुत जल्दी धीमा हो जाता है, हालांकि दिए गए सभी उदाहरणों को चलाते हैं)।

from itertools import*
N,K,R=map(int,input().split())
S=lambda l:sum([x[0]for x in l])
s=[x for x in product(*[[(n,k,a)for n in range(N*(K**2-1)/((k**2-1)*a**2)+1)]for a in range(1,N+1)for k in[4,6,8,10,12,20]if a**2<=N])if sum([n*(k**2-1)*a**2 for n,k,a in x])==N*K**2-N and S(x)<=R]
if s:s=max(s,key=S);print"+".join(["%sd%s*%s"%x for x in s]+[str(int(N*(K+1)/2.-sum([n*a*(k+1)/2.for n,k,a in s])))])
else:print"I AM A SEXY SHOELESS GOD OF WAR!"

Prettier आउटपुट के if x[0]बाद जोड़ें "%sd%s*%s"%x for x in s:

>> "7 4 3"
3d6+7
>> "10 6 3"
1d6*1+1d8*1+1d8*2+18
>> "10 6 2"
1d6*1+1d6*3+21
>> "10 6 1"
I AM A SEXY SHOELESS GOD OF WAR!
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.