रोल डंगेसन और ड्रेगन पासा


20

मैं Dungeons और ड्रेगन खेलना चाहते हैं, लेकिन मैं किसी भी पासा नहीं है! आपकी चुनौती कुछ डी एंड डी पासा रोल करना है।

बैकस-नौर फॉर्म में इनपुट प्रारूप विनिर्देश है:

<valid-input>  ::= <opt-integer> "d" <integer> <opt-modifier>
<opt-integer>  ::= | <integer>
<opt-modifier> ::= | "+" <integer>
<integer>      ::= "0" | "1" | "2" | "3" | "4" | "5" |
                   "6" | "7" | "8" | "9" | <integer> <integer>

dरोल करने के लिए पासा की संख्या से पहले वैकल्पिक पूर्णांक है; यह कम से कम होना चाहिए 1, और 1आपूर्ति न होने पर चूक ।

dप्रत्येक मरने वाले पक्षों की संख्या के तुरंत बाद आवश्यक पूर्णांक ; यह कम से कम होना चाहिए 1। प्रत्येक मरने के पक्ष अलग-अलग लगातार सकारात्मक पूर्णांक होते हैं जो शुरू होते हैं 1

वैकल्पिक संशोधक हो सकता है +0, और यह +0निर्दिष्ट नहीं होने पर डिफॉल्ट करता है।

उदाहरण के लिए, इनपुट के लिए 2d10+5, आप 1 से 10 समावेशी से दो यादृच्छिक संख्याएँ उत्पन्न करते हैं, उन्हें एक साथ जोड़ते हैं, और 5 जोड़ते हैं। फिर आप परिणाम को आउटपुट करेंगे।

आप अमान्य इनपुट, जैसे प्राप्त करते हैं 2d, d20+, 0d4, 2d5+1+2, 2+2, या कुछ और है कि इस प्रारूप, आप उत्पादन करना चाहिए "फिट नहीं करता है Invalid input"। अन्यथा, आपको इनपुट के अनुसार भारित केवल एक ही यादृच्छिक पूर्णांक आउटपुट करना होगा। उदाहरण के लिए, 3d6अधिक उत्पादन करना चाहिए 10की तुलना में रों 4रों

परीक्षण के मामलों

Input      Minimum possible output    Maximum possible output
d1         1                          1
d6         1                          6
d1+3       4                          4
d20+3      4                          23
2d1        2                          2
2d6+2      4                          14
d01        1                          1
d01+0      1                          1
01d01+01   2                          2
3d20+10    13                         70

d          Invalid input
d0         Invalid input
d+0        Invalid input
d0+0       Invalid input
0d1        Invalid input
0d1+1      Invalid input
d1+        Invalid input
1d         Invalid input
1d1+       Invalid input
1d+1       Invalid input
2d+2d      Invalid input
d2+d2      Invalid input
d2+2+2     Invalid input
d2-1       Invalid input
-d2        Invalid input
-2d2       Invalid input
4*3        Invalid input
4*d2       Invalid input

यह , इसलिए बाइट्स में सबसे छोटा कोड जीत जाएगा!


1
है 02d05+073एक मान्य इनपुट?
MT0

2
इस सवाल के बारे कठिन हिस्सा इनपुट मान्य है, लेकिन पैरा जो सत्यापन नियमों का वर्णन स्वयं विरोधाभासी है। यह वर्णन करता है nऔर pवैकल्पिक के रूप में, लेकिन इनपुट जो उन्हें शामिल नहीं करना चुनते हैं ( d20+) अमान्य के रूप में।
पीटर टेलर

1
@PeterTaylor: मुझे लगता है +कि संशोधक pप्रदान किए जाने पर ही संकेत जोड़ा जाना चाहिए ।
प्रोग्रामफॉक्स

4
@Doorknob, खैर, क्योंकि d13 और d17 D & D में उपयोग किए जाने वाले पासा नहीं हैं। डी एंड डी में डी 4, डी 6, डी 8, डी 10, डी 12 और डी 20 का उपयोग किया गया है। इसके अलावा, निश्चित रूप से ऐसे मामले हैं जहां एक रोल में विभिन्न प्रकार के पासा शामिल होंगे (उदाहरण के लिए, 1d4+1d6डॉग के साथ हमला करने वाले एक दुष्ट चुपके के लिए) या एक नकारात्मक होने p(जैसे, 1d20-1बिना रैंक / प्रशिक्षण और एक नकारात्मक क्षमता संशोधक के साथ कौशल की जांच के लिए)।
ब्रायन एस

2
आप usecase के बिना dnd खेलने जा रहे हैं 2d8 + 1d6 + 4? आपका बुरा समय आने वाला है
corsiKa

जवाबों:


12

पर्ल, 109 95 93 96 89 बाइट्स

s/^d/1d/;/^(\d+)d(\d+)(\+\d+)?$/;$d+=1+rand$2|0for
1..$1;$_=$1*$2?$d+$3:'Invalid input'

-pस्विच की आवश्यकता है , जो दो बाइट्स के लिए खाता है। Ideone पर इसे ऑनलाइन आज़माएं

यह काम किस प्रकार करता है

  • -pस्विच की वजह से , STDIN से एक लाइन पढ़ी जाती है और उसे स्टोर किया जाता है $_

  • यदि यह d से प्रारंभ नहीं होता है , तो कमांड 1 को s/^d/1d/प्रीपेन्ड करता है , अर्थात यदि dice की संख्या निर्दिष्ट नहीं की गई है।$_

  • नियमित अभिव्यक्ति /^(\d+)d(\d+)(\+\d+)?/जांच करता है कि लाइन एक नंबर, एक शाब्दिक के होते हैं , एक और नंबर और वैकल्पिक रूप से एक तिहाई संख्या एक से पहले + संकेत।

    यदि मिलान है, संख्या में सहेज लिया जाएगा $1, $2और $3

    इस मामले में, इनपुट केवल तभी करता है, तो वैध और हो जाएगा $1और $2दोनों सकारात्मक रहे हैं।

  • $d += 1 + rand $2 | 0एक छद्म-बेतरतीब ढंग से चुने गए पूर्णांक को पक्षों की निर्दिष्ट संख्या से $d(शुरू में शून्य के रूप में माना जाता है) जोड़ता है ।

  • for 1 .. $1 1 और पासा की संख्या के बीच प्रत्येक पूर्णांक के लिए एक बार ऊपर होता है।

  • कमांड $_ = $1 * $2 ? $d + $3 : 'Invalid input'निम्नलिखित करती है:

    • यदि $1 * $2शून्य है, तो यह अमान्य इनपुट पर सेट $_है ।

    • अन्यथा, इनपुट मान्य है और यह $_पासा रोल और संशोधक के योग पर सेट है।

  • की वजह से -pस्विच, पर्ल की सामग्री को प्रिंट $_

  • चूंकि आगे कोई इनपुट लाइन नहीं है, लिपि से बाहर निकलता है।


1
मेरा मानना ​​है कि, सामान्य रूप से, अतिरिक्त कमांड लाइन मापदंडों को प्रत्येक बाइट के लायक माना जाता है, लेकिन हाइफ़न मुक्त है। इस मामले में, -pआपको केवल एक ही लागत आएगी, जिससे यह 108 बाइट समाधान बन जाएगा।
अंडरग्राउंडोरेल

2
96 /^([1-9]\d*)?d([1-9]\d*)(\+\d+)?$/||die"Invalid input$/";$a+=1+int rand$2for(1..$1||1);$_=$a+$3
चर

1
@undergroundmonorail: मैंने देखा है कि लोगों को एक कमांड लाइन स्विच को एक, दो और यहां तक ​​कि तीन (व्हॉट्सएप की गिनती) बाइट्स के रूप में गिना जाता है। मैं इसे एक के रूप में गिनता हूं, लेकिन दो बाइट मुझे उचित लगती हैं।
डेनिस

1
@ मुझे लगता है कि आप या तो नहीं है। मैं |0इंट को कास्ट करने के लिए उपयोग करता हूं , क्योंकि randएक छद्म-बेतरतीब ढंग से फ्लोट चुना जाता है ।
डेनिस

1
@Vynce मैंने प्रश्न ( ideone.com/gLJfhO ) के लिए एक पर्मलिंक जोड़ा है । -eजब तक आप सिंगल कोट्स को डबल कोट्स से रिप्लेस नहीं करेंगे, तब तक समस्याग्रस्त रहेगा।
डेनिस

4

फोरट्रान: 145

character(1)a;read(*,*)s,a,j,a,k;n=0;if(k<0.or.a=="-")then;print*,"error k<0";stop;endif;do l=1,int(s);n=n+int(s*rand(0)+1);enddo;print*,n+k;end;

गालियाँ टाइपिंग निहित i-nहैं ( सभी पूर्णांक हैं, बाकी सब कुछ वास्तविक है)। माइनर कैविएट: इनपुट स्पेस अलग 2d10+5होना चाहिए , इसलिए इसे दर्ज किया जाना चाहिए 2 d 10 + 5, अन्यथा आपको ए मिलेगा input conversion error


4

रूबी, 116

वैकल्पिक रूबी संस्करण। मैं इसे नियमित अभिव्यक्तियों के बिना करने का एक तरीका खोजने की कोशिश कर रहा था, लेकिन आपको जो सत्यापन करना है, वह उनके बिना बहुत कठिन है।

gets=~/^(\d+)?d(\d+)(\+\d+)?$/
a=$1||?1
puts$~&&a>?0?eval("r=#{$3||0};#{a}.times{r+=rand(#$2)+1};r"):'Invalid input'

यह एक 112 है, डेनिस के चतुर पर्ल एल्गोरिथ्म का उपयोग:

$p='(\d*[1-9]\d*)'
puts~/^#$p?d#$p(\+\d+)?$/?eval("r=#{$3||0};#{$1||1}.times{r+=rand(#$2)+1};r"):'Invalid input'

@ m.buettner धन्यवाद! मुझे नहीं पता कि मुझे क्यों लगा कि इसे 0 होना है।
पॉल प्रेस्टिज

3

जवासिलेट, 158

m=prompt().match(/^([1-9]\d*)?d([1-9]\d*)(\+\d+)?$/);if(!m)alert("Invalid input");else{for(s=+m[3]|0,i=0;i<(+m[1]||1);i++)s+=Math.random()*+m[2]+1|0;alert(s)}

इससे बेहतर गोल्फ नहीं हो सकता। काम पर वापस जाने का समय आ गया है।


1
s="Invalid input";if(m=prompt().match(/^([1-9]\d*)?d([1-9]\d*)(\+\d+)?$/))for(s=m[3]|0,i=0;i<(m[1]||1);i++)s+=Math.random()*m[2]+1|0;alert(s)केवल 137 बाइट्स है।
डेनिस

2
प्रश्न पर टिप्पणियों के अनुसार, यह गलत उत्तर है क्योंकि यह इनपुट को अस्वीकार करता है 02d05+073
पीटर टेलर

3

GolfScript ( 120 106 बाइट्स)

.100?!1`*\+.43?)!'+0'*+.10,'d+':^*-!*.10,''*-^=*^1/{/n*}/~].,3=*3,or:x~;*{x~\{rand)+}+@*}'Invalid input'if

यह पहला संस्करण की तुलना में न केवल कम, लेकिन यह भी अधिक सुरुचिपूर्ण है। हिस्सा जो वास्तव में मरने रोलिंग है करता है

\{rand)+}+@*

बाकी मुख्य रूप से इनपुट सत्यापन, और पार्स करने के लिए कुछ वर्ण है।

# Start by converting valid inputs into valid inputs with all optional bits.
# Prepend a '1' if the string starts with 'd'.
.100?!1`*\+
# Append '+0' if there's no '+' in the string.
.43?)!'+0'*+
# Now we start knocking out the invalid inputs.
# If it contains a character other than [0-9d+], replace the string with ''.
.10,'d+':^*-!*
# If it doesn't contain exactly one 'd', exactly one '+', and the 'd' before the '+',
# replace the string with ''.
.10,''*-^=*
# Now we either have a valid string, an empty string, or a string which is almost valid
# but has some empty substrings which should be integers, or a forbidden 0 integer value.
# Replace the 'd' and '+' with newlines, eval the result, and gather into an array.
^1/{/n*}/~]
# If we had any empty parts, we'll have fewer than 3 items on the stack.
# In that case, replace with integer values which will fail the final validation step.
.,3=*3,or
# Final validation: number of dice * number of sides per die != 0.
:x~;*
# If we pass, do the actual die rolling. Otherwise give the error message.
{x~\{rand)+}+@*}'Invalid input'if

परीक्षण ढांचे के साथ ऑनलाइन डेमो


मैं सोच रहा हूँ तुम क्यों इस्तेमाल नहीं करते n./? हो सकता है कि यह भी 10,n*एक चरित्र कम के लिए।
हावर्ड

@ हॉवर्ड, पहले के लिए, क्योंकि यह कुछ परीक्षण मामलों को पारित करने के लिए एक अंतिम मिनट हैक था और मैंने इसे गोल्फ के बारे में नहीं सोचा था। दूसरे के लिए, यह कुछ अमान्य इनपुट को स्वीकार करेगा।
पीटर टेलर

2

जम्मू - 130 (? 45) चार

यह चुनौती नियमित भावों के प्रति थोड़ा पक्षपाती प्रतीत होती है, विशेषकर अमान्य इनपुट में अंतर करने के लिए। J में POSIX regex लाइब्रेरी है, इसलिए यह उतना बुरा नहीं है, लेकिन यह एकीकृत नहीं है क्योंकि यह Perl के साथ है, इसलिए J अन्य भाषाओं से बेहतर नहीं है।

+/@,`(1+?@#~)/`('Invalid input'"_)@.(0 e.$)0 1 1>.".>|.}.((,'?d','(\+[0-9]+)?$',~}.)'^([0-9]*[1-9][0-9]*)')(rxmatch rxfrom])1!:1]1

यदि आप केवल वैध अभिव्यक्तियों के लिए तर्क को लागू कर रहे हैं, जैसे कि पायथन / पीएचपी समाधान दिखाई देते हैं, तो यह अधिक उचित 45 वर्ण है:

+/,(1+[:?@#/1>.".;._2@,&'d')`".;._1'+',1!:1]1

उल्लेखनीय बिट्स:

  • 1!:1]1इनपुट है, और (rxmatch rxfrom])वह तर्क है जो सब-डेप्रिसिएशन मैच लौटाता है।

  • इनपुट कानूनी था या नहीं, इसे रेगेक्स मिलान द्वारा नियंत्रित किया जाता है, इसलिए हम डिफॉल्ट को n और p के साथ सेट कर सकते हैं 0 1 1>.। यह पीछे की ओर दिखता है (डिफ़ॉल्ट रूप से n 1 है और p 0 है) क्योंकि हमें |.पहले सूची को उल्टा ( ) करना था, ताकि अंत में तर्क सही क्रम में निष्पादित हो।

  • @.है एजेंडा संयोजन, अनिवार्य रूप से एक जम्मू-ish स्विच बयान। यदि मैच खाली हैं (यदि 0 $ हाप का एक ई.मेंट है:) 0 e.$, तो हम त्रुटि संदेश का उत्सर्जन करते हैं, अन्यथा हम पासा को लुढ़काते हैं: पासा #~को बाहर निकालने के लिए, 1+?रोल करने के लिए, और +/@,संशोधक p जोड़ने के लिए और योग।


क्या वह काम करता है 01d01+01?
सेस टिम्मरमैन

@CeesTimmerman मेरा बुरा। यह अब करता है।
एल्गोरिद्मशर्क

2

टाइनीमुश , 239

@dig/t +
@op d=+
@lo d=d
@fail d=Invalid input
@cr .
@set .=com
&d .=$*:\ifelse(regmatch(%0,^(\\\\d+)?d(\\\\d+)(\\\\+\\\\d+)?$,0 1 2 3),ifzero(and(or(not(strlen(%q1)),%q1),%q2),Invalid input,add(die(usetrue(%q1,1),%q2),%q3)),Invalid input)

पहली चार लाइनें इस तथ्य से निपटती हैं कि "डी" सार्वभौमिक "डाउन" के लिए एक उपनाम है जिसमें अंतर्निहित विफलता संदेश के साथ बाहर निकलें जब यह मौजूद नहीं है; उपयोगकर्ता द्वारा परिभाषित आदेशों से पहले निकास स्कैन किए जाते हैं। शेष लाइनें उपयोगकर्ता द्वारा परिभाषित कमांड के साथ एक ऑब्जेक्ट बनाती हैं जो अंतर्निहित डाई () फ़ंक्शन का उपयोग करती है।


2

PHP, 129

<?eval(preg_filter(~Сף›ÔÖÀ›×£›Ö×£Ô£›ÔÖÀÛÐ,~ÛžÂÝÛÎÝÀÅÎÄ™×ÄÛ–ÔÔÃÛžÄیԞ‘›×ÎÓÛÍÖÖÄšœ—ÛŒÛÌÄ,$_GET[0])?:~šœ—ݶ‘‰ž“–›ß–‘Š‹ÝÄ);

एक अभिव्यक्ति बनाने के लिए एक regex का उपयोग करता है जो PHP तब मूल्यांकन करता है। इनपुट यूआरएल के माध्यम से खिलाया जाता है: 0 = तर्क । सुनिश्चित करें कि आप% 2b के लिए + urlencode करते हैं। यहाँ यह अधिक पठनीय रूप में दिखता है:

eval(preg_filter('/^(\\d)?d(\\d)(\\+\\d)?$/','$a="$1"?:1;for(;$i++<$a;$s+=rand(1,$2));echo$s$3;',$_GET[0])?:'echo"Invalid input";');

बिटवाइज़ में स्ट्रिंग्स का उपयोग करने से ~न केवल एक चरित्र बच जाता है क्योंकि आपको उद्धरण चिह्नों की आवश्यकता नहीं होती है (PHP मानता है कि वे तार हैं), बल्कि पात्रों को भी बचाता है क्योंकि आपको नियमित अभिव्यक्ति में बैकस्लैश से बचना नहीं है।

?:ऑपरेटर त्रिगुट ऑपरेटर का एक विशेष रूप है। $foo = $a ? $a : $bके रूप में ही है $foo = $a ?: $b


1

जावा, 378

बस सबसे अच्छा समाधान से जावा के साथ एक समाधान की कोशिश करना चाहता था। लेकिन हे: जावा किसी भी मामले में एक गोल्फ भाषा नहीं है!

यह कमांड लाइन से इनपुट प्राप्त करता है। पहला पैरामीटर args[0]इनपुट मान है।

class A{public static void main(String[]s){System.out.print(s[0].matches(
"(0+\\d+|[1-9]\\d*|)d(0+\\d+|[1-9]\\d*)(\\+\\d+)?")?z(s[0]):"Invalid input");}static int
z(String s){String[]a=s.split("d");String[]b=a[1].split("\\+");int c=a[0].isEmpty()?1:Byte.
decode(a[0]);int d=b.length<2?0:Byte.decode(b[1]);while(c-->0)d+=new java.util.Random().
nextInt(Byte.decode(b[0]))+1;return d;}}

क्या आप जानते हैं, कि decodeतुलना में कम है valueOf?


1

पायथन 3, 184 बाइट्स

import random,re
try:a,b,c=re.findall("^(\d*)d(\d+)(\+\d+)?$",input())[0];t=int(c or 0)+(sum(random.randint(1,int(b))for i in range(int(a or 1)))or q)
except:t="Invalid input"
print(t)

सभी टेस्ट पास करता है। यदि शून्य पासा की अनुमति दी गई थी, तो बाहर निकलने से यह 6 बाइट्स छोटा होगा (or q)


मैं हालांकि BNF को गलत समझता हूं। यह पेज मदद करता है।
सेस टिम्मरमैन

किसी और के लाभ के लिए, जो आश्चर्य करता है कि रेगेक्स एक छोर पर लंगर डाले हुए है, लेकिन दूसरे पर नहीं: पायथन की re.matchशुरुआत में अंत में नहीं बल्कि अंत में लंगर डाले । मैं किसी भी अन्य regex पुस्तकालय के बारे में पता नहीं है जो ऐसा करता है।
पीटर टेलर

1
इनिशियल करके एक छोटी बचत होती है t=int(c or 0); और यह संभव हो सकता है कि आपके उत्तर को मौजूदा पायथन वन (जो व्हॉट्सएप का कम इस्तेमाल करता है) के साथ जोड़कर एक जोड़े को और अधिक बचाया जा सके।
पीटर टेलर

0

जावास्क्रिप्ट 134

m=prompt().match(/^((?!0)\d*)d((?!0)\d+)(\+\d+)?$/);alert(m?eval('for(o=m[3]|0,i=m[1]||1;i--;)o+=m[2]*Math.random()+1|0'):'Invalid input')


वैसे समानताएं हैं, यह एक ही भाषा / एल्गोरिथ्म है ... लेकिन मुझे लगा कि मेरे कोड (और regex) में एक अलग उत्तर पोस्ट करने के लिए पर्याप्त अंतर हैं।
माइकल एम।

प्रश्न पर टिप्पणियों के अनुसार, यह गलत उत्तर है क्योंकि यह इनपुट को अस्वीकार करता है 02d05+073
पीटर टेलर

0

रूबी, 167 147

/^(\d+)?d(\d+)(\+\d+)?$/.match gets
abort'Invalid input'if !$~||$1==?0||!$2||$2==?0
p eval(([0]*($1||1).to_i).map{rand($2.to_i)+1}*?+)+($3||0).to_i

सभी काम करने के लिए एक regexp का उपयोग करता है। जब से मैं उपयोग कर रहा हूँ \d+, केवल बातें मैं अमान्य इनपुट के लिए जांच करने की जरूरत है कि वहाँ एक मैच था, कि न तो कर रहे हैं nऔर न ही mथे 0वहाँ एक था, और उस m। यदि उनमें से कोई भी पाया जाता है, तो यह एक संदेश ( 'Invalid input') के साथ गर्भपात करता है । तब यह केवल परिणाम को प्रिंट करता है, क्योंकि यह अब तक गर्भपात होता अगर इनपुट अमान्य था।

परिणाम-मुद्रण वह दिलचस्प नहीं है, लेकिन ...

([0]*($1||1).to_i)    # create an array of n elements (1 if there is no n)
.map{rand($2.to_i)+1} # fill it up with random numbers, where the number x is 1 < x < m+1
.inject(:+)           # add them all up
+($3||0).to_i         # and finally add the modifier (0 if there is none)

मैं बाद में बदल .inject(:+)गया eval(...*?+), लेकिन विचार एक ही है।


0

पायथन 3, 204 बी

मेरा आवश्यक त्रुटि से निपटने और पढ़ने d20के 1d20बजाय मौजूदा पायथन जवाब को धड़कता है0d20 :)

import random,re
try:a,b,c=re.findall('^([1-9]\d*)?d(\d+)(\+\d+)?$',input())[0];I=int;R=sum(random.randrange(I(b))+1for x in[0]*(1if a==''else I(a)))+(0if c==''else I(c))
except:R='Invalid input'
print(R)

2 टाइपो को ठीक करने के लिए संपादित: I(x) => I(c) ,Invalid Input => Invalid input

रेगेक्स को ठीक करने के लिए संपादित: \+?(\d*) => (\+\d+)?


स्पष्ट प्रश्न के अनुसार, यह गलत उत्तर है क्योंकि यह इनपुट को स्वीकार करता है 3d20+
पीटर टेलर

अच्छी बात! # फिलर
एलेक्जेंडर-ब्रेट

और नहीं 01d01+01
सेस टिम्मरमैन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.