ในระหว่างเศษส่วน


13

ในระหว่างเศษส่วน

ความท้าทาย:

คุณจะต้องสร้างรหัสที่ใช้เวลาอย่างน้อย 3 อินพุต 2 จำนวนเต็มและ "การแทนเศษส่วน" - ประเภทใดที่เหมาะกับภาษาของคุณสำหรับการเพิ่มขึ้นของเศษส่วน) เช่น หากคุณเลือกสตริงอินพุตจะเป็น "1/4" หรือคุณสามารถเลือกอินพุตจำนวนเต็มพิเศษ 2 รายการหรือ tuple หรือ w / e

อินพุตสามารถทำได้ทุกที่ที่เหมาะสม (STDIN, อาร์กิวเมนต์ของฟังก์ชั่น, จากไฟล์, เป็นต้น), และสามารถส่งออกได้ (STDOUT, ค่าส่งคืนของฟังก์ชัน, ไปยังไฟล์, ฯลฯ )

กฎ:

  1. อินพุต "เศษส่วน" จะเป็นเศษส่วนที่ถูกต้องน้อยกว่า 1 เสมอ ตัวอย่าง "1/4"
  2. จำนวนเต็มอินพุตที่สองจะมีค่าสูงกว่าจำนวนเต็มแรกเสมอ IE จำนวนเต็มอินพุตแรกจะมีค่าต่ำกว่าเสมอ
  3. จำนวนเต็มอินพุทอาจเป็นค่าลบ
  4. เศษส่วนที่ออกมาควรจะลดลงให้มากที่สุด (ประยุกต์)

รหัสจะต้องส่งออกทุก "เศษส่วนขั้นตอน" ระหว่าง 2 ตัวเลขในการเพิ่มขึ้นของเศษส่วนการป้อนข้อมูล

รหัสควรเป็นโปรแกรมหรือฟังก์ชั่นตามที่ระบุไว้ที่นี่

ตัวอย่างที่ 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

ในกรณีดังกล่าวการมีรายการ / tuple / array / ชนิดที่สามารถทวนอื่น ๆ ที่มีจำนวนเต็มสองจำนวนสำหรับอินพุตที่สาม นั่นไม่ได้เป็นพื้นฐานที่แตกต่างจากจำนวนเต็ม 4 อินพุต คุณควรชี้แจงด้วยว่าเศษส่วนจะไม่เท่ากับ 0
Mego

@Mego หลังจากที่คิดไปแล้วฉันไม่สามารถเห็นได้ว่าทำไมไม่อนุญาตให้เปลี่ยนเป็น "รหัสที่ใช้เวลาอย่างน้อย 3 อินพุต"
Alex Carlsen

1
@beaker ตราบใดที่เอาต์พุตถูกต้องและอินพุตมาจากจำนวนเต็ม atleast 2 ตัวที่เหลือก็ขึ้นอยู่กับคุณ :) - ฉันได้เปิดส่วนอินพุตไว้ค่อนข้างดีเพื่อดูคำตอบที่แตกต่างกัน
Alex Carlsen

คำตอบ:


5

อ็อกเทฟ34 34ไบต์

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

@ คนทำขนมปังฉันตอบกลับจริง
Alex Carlsen

@VisualBean Code อัปเดตแล้ว
บีกเกอร์

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" ใช่หรือไม่
David Conrad

1
@DavidConrad ภาษาคือ TSQL แต่มีเวอร์ชันที่แตกต่างกันของ sqlserver และ TSQL สำหรับสิ่งนี้จะใช้ได้กับ sqlserver 2012 เนื่องจากคำสำคัญ IIF ซึ่งจะใช้คำหลัก CASE ในรุ่นที่เก่ากว่า เพิ่มคำแนะนำของคุณ
t-clausen.dk

ทำได้ดีมาก คุณสามารถบันทึกไม่กี่โดยการเปลี่ยนแปลงอย่างใดอย่างหนึ่ง@nหรือจะธรรมดา@d @แบบสอบถาม CTE ของคุณหา N อาจจะหรือ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 ไบต์
t-clausen.dk

ทำงานได้ดีที่นั่น
MickyT


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]

(ตอนแรกฉันถูกล่อลวงด้วย[a,a+c..b]สัญกรณ์ของ Haskell แต่มีนิสัยใจคอบางอย่างที่ต้องการบางสิ่งบางอย่างเช่น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หากปราศจากสิ่งนั้นใช่ไหม
ข้อบกพร่อง

2
@flawr: กรณีขอบดี: คุณไม่จำเป็นต้องData.Ratioสำหรับfตัวเองเพราะมันเป็น polymorphic สำหรับทุกประเภทที่เป็นตัวเลข อย่างไรก็ตามเมื่อคุณต้องการเรียกมันด้วยค่าประเภทRatioแล้วคุณต้องนำเข้า ความท้าทายต้องการ "สร้างรหัสที่ ... " เท่านั้นไม่ใช้ ฉันคิดว่าใช้ได้ดีโดยไม่ต้องนำเข้า
nimi

1
แม่นยำมากขึ้นคุณจะต้องนำเข้าสำหรับ%ผู้ประกอบการในการสร้างเศษส่วนการทดสอบและ1 % 2 2 % 3ฉันไม่ได้โกงที่นี่: คุณสามารถใส่ 26 ไบต์เหล่านั้นลงในไฟล์ได้ด้วยตัวเองเรียกใช้ตัวแปลบนโมดูลนั้นและแสดงการโต้ตอบที่ฉันแสดง (คุณสามารถหลีกเลี่ยงการพิมพ์import Data.Ratioในการสาธิตถ้าคุณสะกด%เป็นแทนData.Ratio.%)
Anders Kaseorg

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

Ruby , 32 54 48 ไบต์

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

การแก้ปัญหานี้จะขึ้นอยู่กับชำเลืองไปที่คำตอบของงูหลามและสันนิษฐานว่าcจะเป็นRationalรูปแบบส่วนทับทิม ลองออนไลน์!

แก้ไข:แก้ไขข้อผิดพลาดที่ไม่ได้แสดงจำนวนเต็มเหมือนจำนวนเต็ม -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

Rationalรูปแบบที่ง่ายที่สุดของ3Ruby คือ(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

Matlab พร้อม Symbolic Toolbox / Octave ด้วย SymPy ขนาด 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

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}

ฟังก์ชั่นที่ไม่ระบุชื่อ หลังจากกำหนดให้กับตัวแปรที่ระบุชื่อพร้อมด้วย white space

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

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) สร้างช่วงของจำนวนเต็มหารค่าเหล่านั้นผ่านและต่อท้ายส่วนท้ายของรายการ (โดยการเชื่อมโยงจากนั้นเรียงลำดับ)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.