Giữa các phân số


13

Giữa các phân số

Các thách thức:

Bạn sẽ cần tạo mã mất ít nhất 3 đầu vào; 2 số nguyên và "biểu diễn phân số" - loại nào phù hợp với ngôn ngữ của bạn để biểu thị số gia phân số) tức là. Nếu bạn chọn chuỗi, đầu vào sẽ là "1/4" hoặc bạn có thể chọn thêm 2 đầu vào số nguyên hoặc một tuple hoặc w / e.

Đầu vào có thể là bất cứ nơi nào hợp lý (STDIN, đối số chức năng, từ tệp, v.v.) và do đó có thể xuất (STDOUT, giá trị trả về của hàm, sang tệp, v.v.)

Quy tắc:

  1. "Phân số" đầu vào sẽ luôn là phân số hợp lệ, nhỏ hơn 1; ví dụ "1/4"
  2. Số nguyên đầu vào thứ hai sẽ luôn có giá trị cao hơn số nguyên đầu tiên. IE số nguyên đầu vào đầu tiên sẽ luôn có giá trị thấp hơn giá trị thứ hai.
  3. Các số nguyên đầu vào có thể âm.
  4. Các phân số xuất ra nên được giảm càng nhiều càng tốt (đơn giản hóa)

Mã sẽ cần xuất ra mọi "bước phân số" giữa 2 số theo gia số của phân số đầu vào.

Mã phải là một chương trình hoặc chức năng như được nêu ở đây

Ví dụ 1:

Đầu vào: -2,3,"1/2"

Đầu ra:

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

Ví dụ 2:

Đầu vào: 1,2,"2/3"

Đầu ra:

1
5/3
2

hoặc là

1
4/3
2

Lưu ý: Đếm có thể bắt đầu từ một trong hai hướng (cảm ơn bạn @Mego)

Đây là , vì vậy câu trả lời ngắn nhất bằng byte sẽ thắng.


Phân số có thể được lấy là 2 đầu vào số nguyên, tạo tổng số 4 đầu vào không?
Mego

Tôi nghĩ rằng tôi sẽ hạn chế tối đa 3 đầu vào - Tôi muốn xem mã cho 4 đầu vào là tốt
Alex Carlsen

Trong trường hợp đó, điều gì về việc có một danh sách / tuple / mảng / một số kiểu lặp khác có chứa hai số nguyên cho đầu vào thứ ba? Điều đó về cơ bản không khác gì 4 đầu vào số nguyên. Bạn cũng nên làm rõ rằng phân số sẽ không bằng 0.
Mego

@Mego Sau khi suy nghĩ kỹ, tôi không thể hiểu tại sao không nên cho phép Thay đổi thành "mã mất ít nhất 3 đầu vào"
Alex Carlsen

1
@beaker miễn là đầu ra là chính xác và đầu vào đến từ ít nhất 2 số nguyên, phần còn lại tùy thuộc vào bạn :) - Tôi đã giữ phần đầu vào khá mở, để xem các câu trả lời khác nhau
Alex Carlsen

Câu trả lời:


5

Octave, 34 30 byte

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

Bây giờ lấy phân số dưới dạng biểu thức số thay vì tử số và mẫu số riêng biệt.

Mẫu trên ideone


1
Vậy tại sao bạn không thể sử dụng @(a,b,c)rats(union([a:c:b],b))?
Luis Mendo

@LuisMendo Tôi có thể nếu các biểu thức toán học là các đầu vào có thể chấp nhận được (kết quả hiệu quả của 1/2một số thay vì đầu vào chuỗi), nhưng đó không phải là cách tôi diễn giải "biểu diễn phân số". Nếu OP đồng ý, tôi sẽ vui lòng cạo 4 byte.
cốc

Ồ, tôi hiểu rồi. Vâng, tôi đang sử dụng nó trong câu trả lời Matlab của tôi. Vì vậy, câu trả lời Mathicala rõ ràng, trừ khi "số hữu tỷ" là một loại dữ liệu cụ thể
Luis Mendo

@beaker tôi đã thực sự trả lời
Alex Carlsen

@VisualBean Mã đã được cập nhật.
cốc

11

Toán học, 16 byte

Range@##⋃{#2}&

Hàm không tên có hai số nguyên và số hữu tỷ và trả về danh sách các số, ví dụ:

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

Mathicala Rangethực hiện chính xác những gì thử thách yêu cầu, ngoại trừ việc nó bỏ qua giới hạn trên nếu sự khác biệt giữa giới hạn dưới và giới hạn trên không chính xác là bội số của kích thước bước. Do đó, chúng tôi lấy Union(sử dụng ) với danh sách chỉ chứa giới hạn trên để đảm bảo rằng nó xuất hiện chính xác một lần. Lưu ý rằng Unionsẽ sắp xếp kết quả nhưng chúng tôi muốn nó được sắp xếp theo cách nào, vì kích thước bước luôn dương. Ngoài ra, vì chúng tôi đang làm việc với các lý trí, chúng sẽ tự động giảm càng nhiều càng tốt.


10

T-SQL 2012+, 831 535 477 270 246 240 219 byte

Xin lưu ý đây là một lớp lót - sql không có chức năng xây dựng để giảm phân số. Có thể không phải là ngôn ngữ tốt nhất cho loại câu hỏi này. Nó là con người có thể đọc được (loại - so với một số ngôn ngữ khác).

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

Dùng thử trực tuyến


Không phải ngôn ngữ được gọi là T-SQL, và không phải là "Sqlserver"?
David Conrad

1
@DavidConrad ngôn ngữ là TSQL, nhưng có các phiên bản khác nhau của sqlserver và TSQL cho việc này sẽ hoạt động cho sqlserver 2012 vì từ khóa IIF. Mà sẽ sử dụng từ khóa CASE trong các phiên bản cũ hơn. Đã thêm đề xuất của bạn
t-clausen.dk

Làm tốt lắm. Bạn có thể tiết kiệm một vài bằng cách thay đổi @nhoặc @dđơn giản @. Truy vấn CTE của bạn cho N có thể N AS(SELECT N FROM(VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1))M(N))hoặc N AS(SELECT 1N FROM sys.all_views). Cho rằng gần như được đảm bảo là một vài trăm trong quan điểm này, bạn cũng có thể giảm tham gia chéo. ISNULLngắn hơn COALESCEvà nên hoạt động
MickyT

@MickyT nhờ vào đề xuất của bạn và một vài thứ của riêng tôi, tôi đã cố gắng giảm độ dài 296 byte,
t-clausen.dk

Công việc tuyệt vời ở đó
MickyT


5

Haskell, 31 26 byte

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

Đánh giá lười biếng FTW! Bản giới thiệu:

*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]

(Ban đầu tôi bị cám dỗ bởi [a,a+c..b]ký hiệu của Haskell , nhưng nó có một số quirks cần một cái gì đó như f a b c|l<-[a,a+c..b-c/2]=l++[b|last l<b]cho 41 byte hoặc f a b c=[x|x<-[a,a+c..],x<b]++[b]cho 33.)


Tôi thích giải pháp của bạn! Tuy nhiên tôi nghĩ bạn cũng cần bao gồm import Data.Ratiotrong số byte của mình, tôi nghĩ bạn không thể sử dụng fmà không có điều đó, phải không?
flawr

2
@flawr: trường hợp cạnh đẹp: bạn không cần Data.Ratiocho fchính nó, vì nó đa hình cho tất cả các loại số. Tuy nhiên, khi bạn muốn gọi nó với các giá trị loại Ratio, thì bạn cần nhập. Thử thách chỉ yêu cầu "tạo mã mà ...", không sử dụng nó. Tôi nghĩ rằng nó tốt mà không cần nhập khẩu.
nimi

1
Chính xác hơn, bạn chỉ cần nhập cho %toán tử để tạo phân số kiểm tra 1 % 22 % 3. Tôi không lừa dối ở đây: bạn thực sự có thể tự đặt 26 byte đó vào một tệp, chạy trình thông dịch trên mô-đun đó và có tương tác tôi hiển thị. (Bạn thậm chí có thể tránh gõ import Data.Ratiovào tương tác demo, nếu thay vào đó bạn đánh vần %Data.Ratio.%.)
Anders Kaseorg

5

MATL , 16 15 byte

3$:3Gvu9X10ZGZD

Điều này có thể thất bại cho mẫu số rất lớn. Tôi hy vọng định dạng đầu ra là chấp nhận được.

Hãy thử trực tuyến!

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

Ruby , 32 54 48 byte

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

Giải pháp này dựa trên câu trả lời Python của Mego và giả định rằng csẽ luôn là Rationalđịnh dạng phân số của Ruby. Hãy thử trực tuyến!

Chỉnh sửa: Đã sửa lỗi trong đó số nguyên không được trình bày như số nguyên. -6 byte nhờ Not That Charles và MegaTom.

Các chức năng được gọi theo cách này:

> 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) không nên đơn giản là 3?
edc65

RationalHình thức đơn giản nhất 3trong Ruby là(3/1)
Sherlock9

.step(b,c).mapnên giảm số byte ở đây
Không phải Charles

(a==a.to_i)có thể a%1==0cho -4 byte.
MegaTom

-2,3,1/2r(ví dụ 1) in 3hai lần cuối cùng .
Mực giá trị

3

Julia, 14 byte

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

Điều này tương tự như câu trả lời của Mathicala, ngoại trừ các phạm vi của Julia đã ở định dạng mong muốn, do đó, nó thậm chí còn ngắn hơn. Cũng trả về một bộ sưu tập các số. Ví dụ đầu ra:

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

Lưu ý rằng các số nguyên được hiển thị với 1 trong mẫu số và dấu gạch chéo kép được sử dụng cho các phân số. Để có được đầu ra chính xác như được xác định trong câu hỏi yêu cầu thêm một số mã:

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

3

Matlab với Hộp công cụ tượng trưng / Octave với SymPy, 27 byte

Cảm ơn @sanchises đã chỉ ra một lỗi, hiện đã được sửa

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

Đây là một chức năng ẩn danh. Để gọi nó, gán nó cho một biến hoặc sử dụng ans.

Thí dụ:

>> @(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]

Điều này không phù hợp với thông số kỹ thuật, vì giới hạn trên không phải luôn luôn được bao gồm (thử ví dụ 2).
Sanchise

@sanchise Cảm ơn! Đã sửa ngay
Luis Mendo

Ngoài ra, tôi nghĩ rằng để cbạn có thể sử dụng, tôi trích dẫn, bất kỳ loại nào phù hợp với ngôn ngữ của bạn để thể hiện mức tăng phân số [...] hoặc w / e . Tôi nghĩ khá rõ ràng đó symboliclà sự lựa chọn hợp lý và được phép (@VisualBean có thể muốn xác nhận điều này). Kết quả của toán tử dấu hai chấm sau đó được 'nâng cấp' thành một symbolicmảng, có nghĩa là bạn có thể thoát khỏi sym()cuộc gọi hoàn toàn.
Sanchise

@sanchises Cảm ơn, tôi đã yêu cầu làm rõ
Luis Mendo

2

Javascript, 108 90 86   81 byte

(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}

Một chức năng ẩn danh. Sau khi gán cho một biến được đặt tên với khoảng trắng:

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
}

Ví dụ kiểm tra:

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 

Một cách tiếp cận bắt buộc sử dụng javascript, không có đệ quy, thư viện hoặc lập trình chức năng.


1

Smalltalk - 89 byte

Đối với một lần Smalltalk gần như cạnh tranh!

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

Gọi như thế này:

> 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 byte

Giả sử bạn đã cài đặt MASSgói

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 byte

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

Đưa vào đầu (b), kết thúc (e), tử số (n) và mẫu số (d). Tạo một loạt các số nguyên, chia chúng thông qua và nối phần cuối vào danh sách (bằng cách liên kết và sau đó sắp xếp).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.