중간 분수


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 개 입력이어야합니다 코드"로 변경할 수 없습니다해야하는 이유를 볼 수 없습니다
알렉스 칼슨

1
@beaker만큼 출력이 올 바르고 입력이 개 정수이어야에서 오는대로, 나머지는 : 당신에게 달려 - 난, 입력 부분이 꽤 openended 유지 한 다른 대답을 볼 수
알렉스 칼슨

답변:


5

옥타브, 34 30 바이트

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

이제 분수를 개별 분자와 분모가 아닌 숫자 표현식으로 사용합니다.

이데온 샘플


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 코드가 이미 업데이트되었습니다.
beaker

11

수학, 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

온라인으로 사용해보십시오


"Sqlserver"가 아닌 T-SQL이라는 언어가 아닙니까?
David Conrad

1
@DavidConrad 언어는 TSQL이지만 다른 버전의 sqlserver가 있으며 이에 대한 TSQL은 키워드 IIF로 인해 sqlserver 2012에서 작동합니다. 이전 버전에서는 CASE 키워드를 사용합니다. 귀하의 제안을 추가
t-clausen.dk

잘 했어. @n또는 @dplain 로 변경하여 비용을 절약 할 수 있습니다 @. 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

@MickyT 당신의 제안과 내 자신의 몇 덕분에, 나는 길이를 296 바이트
줄였다

훌륭한 일
MickyT


5

하스켈, 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.
flawr

2
@flawr : 좋은 가장자리 경우 : 당신이 필요하지 않습니다 Data.Ratio에 대한 f이 모든 숫자 유형의 다형성 때문에, 그 자체. 그러나 type 유형의 값으로 호출 Ratio하려면 가져 오기가 필요합니다. 도전 과제는 코드를 "만들기 만하면됩니다"라는 것만 사용하면됩니다. 수입이 없으면 괜찮다고 생각합니다.
nimi

1
더 정확하게, 당신은 단지에 대한 가져 오기를 필요로 %테스트 분수를 만들 운영자 1 % 22 % 3. 나는 속이는 것이 아닙니다. 실제로 26 바이트를 파일에 넣고 해당 모듈에서 인터프리터를 실행하고 내가 표시 한 상호 작용을 가질 수 있습니다. ( import Data.Ratio대신 철자 %Data.Ratio.%
쓰면

5

MATL , 16 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 바이트.

함수는 다음과 같이 호출됩니다.

> 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

루비에서 가장 간단한 Rational형태 3(3/1)
Sherlock9

.step(b,c).map여기에서 바이트 수를 줄여야합니다
Charles Charles

(a==a.to_i)a%1==0-4 바이트 일 수 있습니다 .
MegaTom 2016 년

-2,3,1/2r(예 1) 마지막 3두 번 인쇄합니다 .
밸류 잉크

3

줄리아, 14 바이트

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

Julia의 범위가 이미 원하는 형식이므로 더 짧다는 점을 제외하면 Mathematica 답변과 비슷합니다. 숫자 모음도 반환합니다. 출력 예 :

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

SymPy가있는 Symbolic Toolbox / 옥타브가있는 Matlab, 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).
Sanchises

@sanchises 감사합니다! 지금 수정
Luis Mendo

또한, 나는 c당신이 사용할 수 있다고 생각합니다. 인용 할 때, 어느 유형이 분수 증분 [...] 또는 w / e를 나타내는 지 귀하의 언어에 맞습니다 . 나는 symbolic논리적이고 허용되는 (@VisualBean이 이것을 확인하고 싶을 수도 있음) 선택이 분명하다고 생각합니다 . 콜론 연산자의 결과는 symbolic배열 로 '업그레이드' 되므로 sym()호출을 완전히 제거 할 수 있습니다 .
Sanchises

@sanchises 감사합니다, 설명을 요청했습니다
Luis Mendo

2

자바 스크립트, 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 

자바 스크립트, 재귀, 라이브러리 또는 함수형 프로그래밍을 사용하지 않는 명령 방식.


1

스몰 토크 – 89 바이트

스몰 토크는 거의 경쟁이 치열합니다.

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

피 레트, 56 바이트

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

시작 (b), 끝 (e), 분자 (n) 및 분모 (d)를받습니다. 정수 범위를 작성하고, 정수를 나누고 목록에 끝을 추가합니다 (연결 한 후 정렬).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.