我喜欢参加由美国数学荣誉协会Mu Alpha Theta举办的数学竞赛。在比赛中,我参加了一个30题的选择题测试.每个问题有五种选择,标有A到E。
我在考试中的分数是每一个正确答案4分,空白处零分,每一个错误答案负1分。
根据上面的评分系统,编写一个评分程序。输入应该有两个组件:一个应答键,后面跟着响应。留空的问题将作为空白输入。第一个输入必须只包含字母a(或a,您的选择),并且可以假定输入中没有空格。第二个输入必须只包含空格和字母a(或a)。没有实现30个问题测试的输入必须输出Invalid test作为输出。
输出应该是等级或Invalid test。
奖金
如果您的程序打印的数字为右,数字左空白,数字错误后,最终得分为(aR bB cW),删除20个字节。
CABBDCABECDBACDBEAACADDBBBEDDA //answer key
CABEDDABDC BACDBBAADE CBBEDDA //responses无奖金
73奖金
73 (20R 3B 7W)适用标准规则。以字节为单位的最短代码获胜。
发布于 2015-11-25 04:54:44
编辑:问题要求发生了变化。这个答案来自程序需要确保每个应答字符是make,每个响应字符是make或空格,它们都有30的长度,否则返回Invalid test。
(a,r)=>[...a].map((q,i)=>q>"E"|q<"A"?x=1:(c=r[l=i])==" "?0:c>"E"|c<"A"?x=1:c==q?s+=4:s--,s=x=0)&&x|l!=29|r.length!=30?"Invalid test":s(a,r)=> // a = answer string, r = responses string
[...a].map((q,i)=> // iterate over answers, q = answer, i = question number
q>"E"|q<"A"?x=1: // x = 1 if answer is invalid
(c=r[l=i])==" "?0: // c = question response, l = answer length, add 0 for space
c>"E"|c<"A"?x=1: // x = 1 if response is invalid
c==q?s+=4:s--, // add 4 if correct, subtract 1 if incorrect
s=x=0 // s = total score, x = is invalid
)&&
x|l!=29|r.length!=30? // check input lengths for validity
"Invalid test":
s // return the score<input type="text" id="answers" value="CABBDCABECDBACDBEAACADDBBBEDDA" /><br />
<input type="text" id="responses" value="CABEDDABDC BACDBBAADE CBBEDDA" /><br />
<button onclick='result.innerHTML=(
(a,r)=>[...a].map((q,i)=>q>"E"|q<"A"?x=1:(c=r[l=i])==" "?0:c>"E"|c<"A"?x=1:c==q?s+=4:s--,s=x=0)&&x|l!=29|r.length!=30?"Invalid test":s
)(answers.value,responses.value)'>Go</button><pre id="result"></pre>发布于 2015-11-25 17:57:26
Japt是JavaScript的简写版本。解释器
Ul ¥30©Vl ¥30«(U+V k"[A-E ]+" ?U¬r@VgZ ¥Y?X+4:VgZ ¥S?X:X-1,0 :`InvÃ. È.最后的两个.s应该分别是不可打印的Unicode字符U+0017和U+0099。
Ul ==30&&Vl ==30&&!(U+V k"[A-E ]+" ?Uq r@VgZ ==Y?X+4:VgZ ==S?X:X-1,0 :"Invalid test
// Implicit: U = first input, V = second input
Ul ==30&&Vl ==30&& // If both input lengths are 30, and
!(U+V k"[A-E ]+"? // removing all ABCDE and spaces from (U+V) results in an empty string:
Uq r@ ,0 // Reduce U with this function, starting with a value of 0:
VgZ ==Y? // If the matching char in V is equal to this char,
X+4 // return previous value + 4.
:VgZ ==S?X // Else if the matching char in V is a space, return previous value.
:X-1 // Else (if it's wrong), return previous value - 1.
:"Invalid test // Else, return "Invalid test".
// Implicit: output last expression我希望有一种更短的方法来确保两个长度相等于30。欢迎提出建议!
发布于 2016-01-12 16:47:18
->t,s{r=0;30.times{|i|r+=t[i]==s[i]?4:s[i]>' '?-1:0};t.size==30?r:'Invalid test'}样本运行:
2.1.5 :001 > ->t,s{r=0;30.times{|i|r+=t[i]==s[i]?4:s[i]>' '?-1:0};t.size==30?r:'Invalid test'}['CABBDCABECDBACDBEAACADDBBBEDDA','CABEDDABDC BACDBBAADE CBBEDDA']
=> 73
2.1.5 :002 > ->t,s{r=0;30.times{|i|r+=t[i]==s[i]?4:s[i]>' '?-1:0};t.size==30?r:'Invalid test'}['CCCATCH','CABEDDABDC BACDBBAADE CBBEDDA']
=> "Invalid test" https://codegolf.stackexchange.com/questions/64717
复制相似问题