免责声明:虽然我已经在这个网站上娱乐了一段时间,这是我的第一个问题,所以请原谅任何轻微的错误。
当给我们布置作业时,我的老师真的很烦人,把我们必须单独做的所有问题都写了出来。因此,我要花很长时间才能把我要做的问题复制下来。我想,为了让我的生活更轻松,我会给他一个程序,让清单上的问题占用更少的空间。
在写下页面或问题编号的列表时,我们使用破折号来表示范围。例如,19-21变成了19, 20, 21。如果之间存在空白,则使用两个逗号分隔的范围:19-21, 27-31变为19, 20, 21, 27, 28, 29, 30, 31。
现在,你可能在想:“这看起来很微不足道”。事实上,这里和这里已经回答了这一点。
然而,有一个陷阱。如果我们有一个具有相同连续数字的范围,则可以省略重复数字。例如:15, 16, 17变成15-7,107, 108, 109变成107-9。对于奖金,如果最后一个连续的等号数字大于1,而上限的最后一个数字小于或等于下限的数字,则可以省略以下内容(如果这听起来令人困惑,那么很抱歉;也许有一些例子可以澄清这一点)。109-113变成109-3,因为较低的最后一个数字意味着增加10s的位置。
您的程序应该通过输入(无论您的语言标准是什么,还是函数)来获取一个整数列表。您可以决定此列表是逗号分隔的、空格分隔的,还是实际的列表/数组。
以最短的方式输出(首先按照范围的数目排序,然后输出包含在范围中的字符的总和)来使用此表示法来表示该列表。每个虚线范围必须位于同一行上,但范围可以用逗号或换行符分隔(允许尾随换行符或逗号)。这些范围必须是有序的。
因为我们学校的Wi太糟糕了,我得把文件尽量小一点才能寄给他。最短的代码(以字节为单位)获胜。
我的老师很马虎,所以有几件事可以帮助他。多重奖金通过乘法叠加,例如-10%的奖金(x90%)和-25% (x75%)的奖金= 90% * 75% =x67.5% (-32.5%的奖金)。
25-32降为25-2,则收取-50%的奖金。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!
发布于 2015-12-15 11:17:19
这是通过向上数,如果独立的项目是1,然后创建一个字符串从数字和数计数模10和一些乘法导致负是一个婊子。
gif显示8,9,10,11的输入并输出8-1。对于输入,-5,-4,-3,1,3,4,5 -5--3,1,3-5出来了。

发布于 2015-12-15 04:24:48
我使用以下测试数据:
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
];这个版本以所有奖金(c,d,e)满足问题(a)的要求,但挂在单页上。它还可以处理重复的(F)。它处理的负面页面减少到-10,000,这可以很容易地增加(大)的速度损失。
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(上面的输出显示空格,而不是实际的换行符,以求简洁)
这个稍长的版本还满足(e)的要求,并将单个页面显示为具有相同下限和上限的范围。
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发布于 2015-12-15 10:08:57
最后完成了三个挑战,分数低于100字节:D。
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 endfunction 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 在线,以查看它如何针对测试用例执行,复制粘贴函数,然后是以下代码:
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))https://codegolf.stackexchange.com/questions/66392
复制相似问题