首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >压缩这些页码!

压缩这些页码!
EN

Code Golf用户
提问于 2015-12-11 23:25:42
回答 7查看 1.2K关注 0票数 34

免责声明:虽然我已经在这个网站上娱乐了一段时间,这是我的第一个问题,所以请原谅任何轻微的错误。

背景

当给我们布置作业时,我的老师真的很烦人,把我们必须单独做的所有问题都写了出来。因此,我要花很长时间才能把我要做的问题复制下来。我想,为了让我的生活更轻松,我会给他一个程序,让清单上的问题占用更少的空间。

在写下页面或问题编号的列表时,我们使用破折号来表示范围。例如,19-21变成了19, 20, 21。如果之间存在空白,则使用两个逗号分隔的范围:19-21, 27-31变为19, 20, 21, 27, 28, 29, 30, 31

现在,你可能在想:“这看起来很微不足道”。事实上,这里这里已经回答了这一点。

然而,有一个陷阱。如果我们有一个具有相同连续数字的范围,则可以省略重复数字。例如:15, 16, 17变成15-7107, 108, 109变成107-9。对于奖金,如果最后一个连续的等号数字大于1,而上限的最后一个数字小于或等于下限的数字,则可以省略以下内容(如果这听起来令人困惑,那么很抱歉;也许有一些例子可以澄清这一点)。109-113变成109-3,因为较低的最后一个数字意味着增加10s的位置。

挑战

您的程序应该通过输入(无论您的语言标准是什么,还是函数)来获取一个整数列表。您可以决定此列表是逗号分隔的、空格分隔的,还是实际的列表/数组。

以最短的方式输出(首先按照范围的数目排序,然后输出包含在范围中的字符的总和)来使用此表示法来表示该列表。每个虚线范围必须位于同一行上,但范围可以用逗号或换行符分隔(允许尾随换行符或逗号)。这些范围必须是有序的。

因为我们学校的Wi太糟糕了,我得把文件尽量小一点才能寄给他。最短的代码(以字节为单位)获胜。

奖金

我的老师很马虎,所以有几件事可以帮助他。多重奖金通过乘法叠加,例如-10%的奖金(x90%)和-25% (x75%)的奖金= 90% * 75% =x67.5% (-32.5%的奖金)。

  • 有时他把他们放在错误的顺序(他不是一个数学老师)。如果你的程序可以接受没有排序的最小到最大的整数,那就拿-20%的奖金.
  • 我们的书很奇怪,每一节都从-10开始计算问题。如果你的程序可以接受负数,取-25%.
  • 如果它接受较低的最后一位数增加10's位置的奖金,例如将25-32降为25-2,则收取-50%的奖金。

测试用例

代码语言:javascript
复制
In:  1, 2, 3, 4, 5
Out: 1-5

In:  3, 4, 5, 9, 10, 11, 12
Out: 3-5, 9-12

In:  149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160
Out: 149-60

In: 1 2 3 4
Out: 1-4


For bonuses:

In: 109, 110, 111, 112, 113
Out: 109-3

In:  19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29
Out: 19-9

In: -3, -2, -1, 0, 1, 2
Out: -3-2

In: -3, -2, -1
Out: -3--1

将于2015年12月19日星期六接受答复。

GLHF!

EN

回答 7

Code Golf用户

回答已采纳

发布于 2015-12-15 11:17:19

LabVIEW,97*0.8*0.75*0.5 = 29.1 LabVIEW基元

这是通过向上数,如果独立的项目是1,然后创建一个字符串从数字和数计数模10和一些乘法导致负是一个婊子。

gif显示8,9,10,11的输入并输出8-1。对于输入,-5,-4,-3,1,3,4,5 -5--3,1,3-5出来了。

票数 5
EN

Code Golf用户

发布于 2015-12-15 04:24:48

Javascript ES6,229 * 80% * 75% * 50% = 68.7字节

测试输入

我使用以下测试数据:

代码语言:javascript
复制
var A1=[
  5,6,7,            // => 5-7     # (a) group pages 
  2,3,              // => 2-3,5-7 # (b) must be properly sorted
  -9,-8,-7,         // => -10--8  # (c) allow negative numbers
  29,30,31,32,      // => 29-2    # (d) lower last digit implies increasing the 10s place
  9,10,11,12,       // => 9-11    # NOT 9-2
  36,37,38,39,40,41,42,43,44,45,46,47, 
                    // => 36-47   # NOT 36-7
  99,100,101,102,   // => 99-102  # NOT 99-2
  109,110,111,112,  // => 109-2   # NOT 109-12
],
// more tests, not specified in the question
A2=[
  120,124,       // => 120,124 # (e) handle single pages
],
A3=[
  135,136,135    // => 135-6   # (f) handle duplicates
];

Basic: 229个字节

这个版本以所有奖金(c,d,e)满足问题(a)的要求,但挂在单页上。它还可以处理重复的(F)。它处理的负面页面减少到-10,000,这可以很容易地增加(大)的速度损失。

代码语言:javascript
复制
F=(a)=>{var R=[],i=NaN,l,u;a.map(x=>R[1e4+x]=x);R.concat('').map(x=>(i!=i&&(l=x,u=l-1),i=0,u=(x+="")-u-1?l=console.log(l+'-'+(u>0?(l.length-u.length||(z=>{for(;l[i]==u[i];i++);})(),u.length-i-2||u-l>9||i++,u.slice(i)):u))||x:x))}
F(A1.concat(A3)) --> -9--7 2-3 5-7 9-12 29-2 36-47 99-102 109-2 135-136

(上面的输出显示空格,而不是实际的换行符,以求简洁)

单页:233个字节

这个稍长的版本还满足(e)的要求,并将单个页面显示为具有相同下限和上限的范围。

代码语言:javascript
复制
G=(a)=>{var R=[],i=NaN,l,u;a.map(x=>R[1e4+x]=x);R.concat('').map(x=>(i!=i&&(l=x,u=l-1),i=0,u=(x+="")-u-1?l=console.log(l+'-'+(u-l&u>0?(l.length-u.length||(z=>{for(;l[i]==u[i];i++);})(),u.length-i-2||u-l>9||i++,u.slice(i)):u))||x:x))}
G(A1.concat(A2,A3)) --> -9--7 2-3 5-7 9-12 29-2 36-47 99-102 109-2 120-120 124-124
票数 5
EN

Code Golf用户

发布于 2015-12-15 10:08:57

Lua,322*80%*75%*50% = 96.6 Bytes

最后完成了三个挑战,分数低于100字节:D。

Golfed

代码语言:javascript
复制
function f(l)table.sort(l)l[#l+1]=-13 a=l[1]t,s=a,"" for _,v in next,l do if v-t>1 or t-v>1 then s,p,r=s..a.."-",""..t,""..a r:gsub("%d",function(c)p=r:find(c)~=r:len()and p:gsub("^(-?)"..c,"%1")or p r=r:gsub("^"..c,"")end)p=t-a<10 and t%10<a%10 and p:gsub("^(%d)","")or p s,a,t=s..p..",",v,v else t=v end end return s end

Ungolfed

代码语言:javascript
复制
function f(l)
    table.sort(l)
    l[#l+1]=-13 
    a=l[1] 
    t,s=a,"" 
    for _,v in next,l 
    do
        if v-t>1 or t-v>1
        then
            s,p,r=s..a.."-",""..t,""..a
            r:gsub("%d",function(c)
                p=r:find(c)~=#r and p:gsub("^(-?)"..c,"%1")or p
                r=r:gsub("^"..c,"")
            end)
            p=t-a<10 and t%10<a%10 and p:gsub("^(%d)","")or p
            s=s..p..","
            a,t=v,v
        else
            t=v
        end
    end
return s
end

您可以测试lua 在线,以查看它如何针对测试用例执行,复制粘贴函数,然后是以下代码:

代码语言:javascript
复制
a={1,2,3,4,5}
b={3,4,5,9,10,11,12,13,14,15,16,17,18,19,20,21}
c={149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160}
d={-7,8,5,-6,-5,6,7}
print(f(a))
print(f(b))
print(f(c))
print(f(d))
票数 3
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

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

复制
相关文章

相似问题

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