中间分数


13

中间分数

挑战:

您将需要创建至少需要3个输入的代码。2个整数和“小数表示形式”-哪种类型适合您的语言,以表示小数增量。如果选择字符串,则输入将为“ 1/4”,或者可以选择2个额外的整数输入或元组或w / e。

输入可以是任意合理的位置(STDIN,函数自变量,来自文件等),因此可以输出(STDOUT,函数返回值至文件等)。

规则:

  1. 输入的“分数”将始终是有效分数,小于1;例如“ 1/4”
  2. 第二个输入整数将始终具有比第一个整数高的值。IE,第一个输入整数将始终具有比第二个更低的值。
  3. 输入整数可以为负。
  4. 输出分数应尽可能减少(简化)

该代码将需要以输入分数的增量输出两个数字之间的每个“分数步”。

该代码应为此处所述的程序或函数

范例1:

输入: -2,3,"1/2"

输出:

 -2
 -3/2 
 -1 
 -1/2 
  0 
  1/2 
  1 
  3/2  
  2 
  5/2 
  3

范例2:

输入: 1,2,"2/3"

输出:

1
5/3
2

要么

1
4/3
2

注意:计数可以从任一方向开始(谢谢@Mego)

这是,因此最短的答案以字节为单位。


分数可以取为2个整数输入,总共输入4个吗?
Mego

我认为病态限制了最多3个输入的约束-我也希望看到4个输入的代码
Alex Carlsen

在那种情况下,让列表/元组/数组/其他可迭代类型包含第三个输入的两个整数怎么办?这与4个整数输入基本没有区别。您还应该阐明分数将不等于
0。– Mego

@Mego经过深思熟虑后,我看不到为什么不应该将其更改为“需要至少3个输入的代码”
Alex Carlsen

1
@beaker,只要输出正确且输入来自至少2个整数,其余的就由您决定:)-我一直将输入部分保持开放状态,以查看不同的答案
Alex Carlsen

Answers:


5

八度,34 30字节

@(a,b,c)rats(union([a:c:b],b))

现在将分数作为数字表达式,而不是单独的分子和分母。

ideone样品


1
那你为什么不能使用@(a,b,c)rats(union([a:c:b],b))呢?
Luis Mendo

@LuisMendo如果数学表达式是可接受的输入(1/2作为数字而不是字符串输入的有效结果),我可以,但是那不是我解释“分数表示”的方式。如果OP同意,我将很高兴削减4个字节。
烧杯

哦,我懂了。好吧,我在Matlab答案中使用了它。Mathematica显然会回答,除非“有理数”是一种特定的数据类型
Luis Mendo

我确实回应了@beaker
Alex Carlsen

@VisualBean代码已更新。
烧杯

11

Mathematica,16个字节

Range@##⋃{#2}&

一个未命名的函数,它使用两个整数和一个有理数,并返回一个数字列表,例如:

Range@##⋃{#2}&[-2, 3, 1/2]
(* {-2, -(3/2), -1, -(1/2), 0, 1/2, 1, 3/2, 2, 5/2, 3} *)

Mathematica的Range功能完全可以满足挑战的要求,但是如果下限和上限之间的差值不是步长的整数倍,它会忽略上限。因此,我们将Union(使用)与仅包含上限的列表一起使用,以确保其仅出现一次。请注意,这Union将对结果进行排序,但我们还是希望对结果进行排序,因为步长始终为正。另外,由于我们正在使用理性,因此会尽可能自动地减少它们。


10

T-SQL 2012+,831 535 477 270 246个 240 219字节

请注意,这是一个衬里-sql没有内置函数来减少分数。可能不是此类问题的最佳语言。它是人类可读的(与某些其他语言相比,有点)。

DECLARE @f INT=-5,@t INT=3,@n INT=3,@ INT=8;

WITH C as(SELECT
top((@t*@-@f*@)/@n+1)ROW_NUMBER()OVER(ORDER BY @)M
FROM sys.messages)SELECT(SELECT
IIF(V%@=0,LEFT(V/@,9),CONCAT(V/MAX(M),'/',ABS(@)/MAX(M)))FROM c
WHERE V%M=0AND @%M=0)FROM(SELECT
@f*@+@n*~-M V FROM c)k

在线尝试


语言不是T-SQL,不是“ Sqlserver”吗?
戴维·康拉德

1
@DavidConrad语言是TSQL,但是有不同版本的sqlserver,由于关键字IIF,适用于sqlserver 2012的TSQL也适用。在旧版本中将使用关键字CASE。添加了您的建议
t-clausen.dk '16

做得好。您可以通过将@n或更改@d为plain 来节省一些@。您对N的CTE查询可以是N AS(SELECT N FROM(VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1))M(N))N AS(SELECT 1N FROM sys.all_views)。鉴于此视图几乎保证有数百个,因此您也可以减少交叉联接。 ISNULL短于COALESCE并且应该工作
MickyT '16

@MickyT多亏了您的建议和我的一些建议,我设法将长度减少了296个字节,
t-clausen.dk 2016年

那里的
出色

6

Python 2,81个字节

from fractions import*
a,b,c=map(Fraction,input())
while a<b:print a;a+=c
print b

在线尝试


5

Haskell,31个 26字节

f a b c=min[b]$a:f(a+c)b c

懒洋洋的评价FTW!演示:

*Main> import Data.Ratio
*Main Data.Ratio> f (-2) 3 (1%2)
[(-2) % 1,(-3) % 2,(-1) % 1,(-1) % 2,0 % 1,1 % 2,1 % 1,3 % 2,2 % 1,5 % 2,3 % 1]
*Main Data.Ratio> f 1 2 (2%3)
[1 % 1,5 % 3,2 % 1]

(起初,我被Haskell的[a,a+c..b]符号所吸引,但是它有一些怪异之处,例如f a b c|l<-[a,a+c..b-c/2]=l++[b|last l<b]需要41个字节或f a b c=[x|x<-[a,a+c..],x<b]++[b]33 个字节。)


我喜欢您的解决方案!但是我认为您也需要import Data.Ratio在字节数中包含它,我想您不能在其中使用f它,对吗?
瑕疵的2016年

2
@flawr:漂亮的边缘情况:你没有必要做Data.Ratiof本身,因为它是多态的所有数值类型。但是,当您要使用type值调用它时Ratio,则需要导入。挑战只需要“创建可...的代码”,而不必使用它。我认为没有导入就可以了。
nimi 2016年

1
更准确地说,您只需要%操作员导入即可创建测试分数1 % 22 % 3。我在这里不是在欺骗:您真的可以自己将这26个字节放入文件中,在该模块上运行解释器,并显示我的交互信息。(import Data.Ratio如果您拼写%Data.Ratio.%。,甚至可以避免在演示互动中输入内容。)
Anders Kaseorg 2016年

5

MATL16 15字节

3$:3Gvu9X10ZGZD

对于非常大的分母,这可能会失败。我希望输出格式可以接受。

在线尝试!

3$:    % take three inputs and generate range
3G     % push third input again
v      % vertically concatenate. Gives vertical array as output 
u      % get unique elements (i.e. remove the last one if it is repeated)
9X1    % predefined literal 'rat'
0ZG    % set rational format
ZD     % display using that format

5

红宝石32 54 48字节

->a,b,c{(a..b).step(c){|x|p x%1>0?x:x.to_i};p b}

该解决方案基于Mego的Python答案,并假定c它将始终是RationalRuby的分数格式。在线尝试!

编辑:修复了一个错误,该错误不会像整数一样显示整数。-6字节,感谢Not That Charles和MegaTom。

这些函数以这种方式调用:

> f=->a,b,c{(a..b).step(c){|x|p x%1>0?x:x.to_i};p b}
> f[1,4,Rational(2,3)]
1
(5/3)
(7/3)
3
(11/3)
4

(3/1)不应简单地为3?
edc65 '16

Ruby中最简单的Rational形式3(3/1)
Sherlock9

.step(b,c).map应该减少此处的字节数
并不是说Charles

(a==a.to_i)可以是a%1==0-4个字节。
MegaTom,

-2,3,1/2r(示例1)将最后一次打印3两次。
价值墨水

3

朱莉娅,14个字节

f(a,b,c)=a:c:b

这类似于Mathematica的答案,只是Julia的范围已经处于所需的格式,因此甚至更短。还返回数字的集合。输出示例:

11-element StepRange{Rational{Int64},Rational{Int64}}:
 -3//1,-5//2,-2//1,-3//2,-1//1,-1//2,0//1,1//2,1//1,3//2,2//1

请注意,整数在分母中显示为1,并且分数使用双斜杠。要完全按照问题中的定义获得输出,需要更多代码:

f(a,b,c)=map(x->println(x.num,x.den<2?"":"/$(x.den)"),a:c:b)

3

具有Symbolic Toolbox的Matlab /具有SymPy的Octave,27字节

感谢@sanchises指出了一个错误,现已更正

@(a,b,c)sym(union(a:c:b,b))

这是一个匿名函数。要调用它,请将其分配给变量或使用ans

例:

>> @(a,b,c)sym(union(a:c:b,b))
ans = 
    @(a,b,c)sym(union(a:c:b,b))
>> ans(-2,3,1/2)
ans =
[ -2, -3/2, -1, -1/2, 0, 1/2, 1, 3/2, 2, 5/2, 3]

由于不总是包含上限,因此这不符合规范(尝试示例2)。
桑契斯,2016年

@sanchises谢谢!已更正
路易斯·门多

另外,我想为c您提供引用的任何一种适合您的语言的分数增量[...]或w / e。我认为很明显,这symbolic是一个合理的选择(@VisualBean可能要确认这一点)。然后将冒号运算符的结果“升级”为symbolic数组,这意味着您可以sym()完全摆脱调用。
桑契斯

@sanchises谢谢,我要求澄清
路易斯·门多

2

Javascript,108 90 86   81个字节

(a,b,n,d)=>{var s="";for(a=a*d;a<b*d;a+=n)s+=(a%d?a+"/"+d:a/d)+" ";s+=b;return s}

匿名函数。分配给带空格的命名变量后:

var f=(a,b,n,d)=>
{ var s="";
  for(a=a*d; a<b*d; a+=n)
    s+= (a%d ? a + "/" + d : a/d) + " ";
  s+=b;
  return s
}

测试示例:

console.log(f(1,2,1,8)); //writes:
1 9/8 10/8 11/8 12/8 13/8 14/8 15/8 2

console.log(f(-3,3,4,7)); // writes:
-3 -17/7 -13/7 -9/7 -5/7 -1/7 3/7 1 11/7 15/7 19/7 3 

使用javascript的命令式方法,无需递归,库或函数式编程。


1

Smalltalk – 89个字节

Smalltalk几乎是一次竞争!

Number extend[p:e q:i[|h|self to:e by:i do:[:x|h:=x. x printNl].h=e ifFalse:[e printNl]]]

像这样打电话:

> 2 p:5 q:1/2
2
5/2
3
7/2
4
9/2
5

> 1 p:2 q:2/3
1
5/3
2

1

R-71字节

假设您已经安装了该MASS软件包

f=function(x,y,z)MASS::fractions(union(seq(x,y,eval(parse(text=z))),y))

> f(1, 2, '1/3')
[1]   1 4/3 5/3   2
> f(2, 5, '1/2')
[1]   2 5/2   3 7/2   4 9/2   5

1

Pyret,56个字节

{(b,e,n,d):link(e,map(_ / d,range(b * d, e * d))).sort()}

取开始(b),结束(e),分子(n)和分母(d)。创建一个整数范围,将整数除以并将末尾附加到列表中(通过链接然后排序)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.