首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >告诉我我要做多少道数学题!

告诉我我要做多少道数学题!
EN

Code Golf用户
提问于 2015-06-02 20:43:55
回答 3查看 3.6K关注 0票数 36

我的老师总是给我一套最复杂的家庭作业数学题。比如:pg. 546: 17-19, 22, 26, pg. 548: 35-67 odd, 79, 80-86 even。我想事先知道我有多少时间用来做家庭作业,但我不想把这些都弄清楚。这就是为什么你的任务是为我编写程序。

Specifications

  • 您将得到一个字符串,详细说明我必须完成的问题,如args、stdio等。
  • 它们将是逗号分隔的(可能是comma-space分隔的)
  • 它将只包含一个数字形式的单个问题(例如,79)。
  • 17-18形式的范围(同样,您必须处理可选的空格)
  • 范围包括两端。
  • 范围将有选择地由oddeven后缀,您必须考虑到这一点。
  • 一组范围/页面将以表单pg. 545:中的页码加在前面,同样必须处理可选的空格。您可以安全地忽略这些问题,因为您需要处理所有页面上的问题。
  • 文本可以大写或小写,但不能两者兼而有之。
  • 返回,标准,等等我的家庭作业要做的问题的数目。
  • 由于这是密码-高尔夫,以字节为单位的最短代码将获胜!

测试用例

代码语言:javascript
运行
复制
pg. 546: 17-19, 22, 26, pg. 548: 35-67 odd, 79, 80-86 even   ->    27
pg. 34: 1                                                    ->    1
PG. 565: 2-5,PG.345:7                                        ->    5
pg. 343: 5,8,13 - 56 even,pg. 345: 34 - 78,80                ->    70
pg.492: 2-4 odd,7-9 even                                     ->    2
EN

回答 3

Code Golf用户

发布于 2015-06-03 04:22:29

因子- 488字节:

代码语言:javascript
运行
复制
USING: arrays ascii kernel math math.parser math.ranges pcre sequences ;
IN: examples.golf.homework

: c ( a -- b )
    >lower "(?:[,:]|^) *(\\d+) *(?:- *(\\d+) *(e|o)?)?" findall [
        rest [ second dup string>number swap or ] map
        dup length 1 = [ drop 1 ] [
            dup length 2 = [ first2 swap - 1 + ] [
                first3 "o" = [ [a,b] [ odd? ] count ] [
                    [a,b] [ even? ] count
                ] if
            ] if
        ] if
    ] map sum ;
票数 3
EN

Code Golf用户

发布于 2015-06-03 12:13:04

JavaScript (蜘蛛猴控制台)- 139

在命令行上测试就更容易了。

代码语言:javascript
运行
复制
for(r=/[:,] *(\d+)[- ]*(\d+)? *(o|e)?/gi,m=readline(z=0);f=r.exec(m);z+=!b||((p=b-a)%2||!c|a%2^/e/i.test(c))+p/(2-!c)|0)[,a,b,c]=f
print(z)

未高尔夫球:

代码语言:javascript
运行
复制
// any number set after "pg:" or a comma
// \1 is FROM, \2 is TO, \3 is odd/even 
r=/[:,] *(\d+)[- ]*(\d+)? *(o|e)?/gi;
m=readline();
z=0; // this is the sum.
while(f=r.exec(m)){
    [,from,to,oddEven]=f;
    if(!to) {
        z++;
    } else {
        if((to-from)%2) {
            // if to and from are not the same parity, add 1
            z++;
        } else {
            // if to and from are not the same parity...
            if(!oddEven) {
                // and we don't have a parity marker, add one
                z++;
            } else if(a%2 != /e/i.test(c)) {
                // if we do have a parity marker,
                // AND the parity of from and to matches the 
                // parity of the oddEven sign, then add 1
                z++;
            }
        }
        // then add the difference between to-from and
        // if oddEven exists, divide by two and round down
        z+=(to-from)/(oddEven?2:1)|0;
    }

}
print(z);
票数 3
EN

Code Golf用户

发布于 2015-06-03 10:39:00

JavaScript (ES6),149号

在Firefox中运行代码段来测试

代码语言:javascript
运行
复制
F=s=>s.replace(/([-,.:]) *(\d+) *(o?)(e?)/ig,(_,c,v,o,e)=>
  c=='-'?(t+=1+(o?(v-(r|1))>>1:e?(v-(-~r&~1))>>1:v-r),r=0)
  :c!='.'&&(t+=!!r,r=v)
,r=t=0)&&t+!!r

// Less golfed

U=s=>{
  var r = 0, // value, maybe range start
  t = 0; // total
  s.replace(/([-,.:]) *(\d+) *(o?)(e?)/ig, // execute function for each match
    (_ // full match, not used
     , c // separator char, match -:,.
     , v // numeric value
     , o // match first letter of ODD if present
     , e // match first letter of EVEN if present
    )=>
    {
      if (c == '-') // range end
      {
        t++; // in general, count range values as end - start + 1
        if (o) // found 'odd'
        {
          r = r | 1; // if range start is even, increment to next odd
          t += (v-r)>>1; // end - start / 2
        }
        else if (e) // found 'even'
        {
          r = (r+1) & ~1; // if range start is odd, increment to next even
          t += (v-r)>>1; // end - start / 2
        }
        else
        {
          t += v-r; // end - start
        }
        r = 0; // range start value was used
      }
      else if (c != '.') // ignore page numbers starting with '.'
      { 
        // if a range start was already saved, then it was a single value, count it
        if (r != 0) ++t;
        r = v; // save value as it counld be a range start
      }
    }
  )            
  if (r != 0) ++t; // unused, pending range start, was a single value
  return t
}

// TEST

out=x=>O.innerHTML+=x+'\n';

test=["pg. 546: 17-19, 22, 26, pg. 548: 35-67 odd, 79, 80-86 even",
"pg. 34: 1", "PG. 565: 2-5,PG.345:7",
"pg. 343: 5,8,13 - 56 even,pg. 345: 34 - 78,80"];

test.forEach(t=>out(t + ' --> ' + F(t)))
代码语言:javascript
运行
复制
<pre id=O></pre>
票数 1
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/51189

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档