Di antara fraksi

13

Di antara fraksi

Tantangan:

Anda harus membuat kode yang mengambil minimal 3 input; 2 bilangan bulat dan "representasi fraksi" - tipe yang sesuai dengan bahasa Anda untuk mewakili kenaikan fraksi) yaitu. Jika Anda memilih string, inputnya adalah "1/4" atau Anda bisa memilih 2 input integer tambahan atau tuple atau w / e.

Input dapat masuk akal (STDIN, argumen fungsi, dari file, dll.), Dan demikian juga dapat output (STDOUT, nilai pengembalian fungsi, ke file, dll.)

Aturan:

  1. Input "fraksi" akan selalu menjadi fraksi yang valid, kurang dari 1; contoh "1/4"
  2. Input integer kedua akan selalu memiliki nilai yang lebih tinggi dari integer pertama. Yaitu integer input pertama akan selalu memiliki nilai lebih rendah dari yang kedua.
  3. Bilangan bulat input bisa negatif.
  4. Fraksi yang dihasilkan harus dikurangi sebanyak mungkin (disederhanakan)

Kode tersebut harus menampilkan setiap "langkah fraksi" antara 2 angka dengan penambahan fraksi input.

Kode harus berupa program atau fungsi seperti yang dinyatakan di sini

Contoh 1:

Memasukkan: -2,3,"1/2"

Keluaran:

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

Contoh 2:

Memasukkan: 1,2,"2/3"

Keluaran:

1
5/3
2

atau

1
4/3
2

Catatan: Penghitungan dapat dimulai dari salah satu arah (terima kasih @Mego)

Ini adalah , jadi jawaban tersingkat dalam byte menang.

Alex Carlsen
sumber
Bisakah pecahan diambil sebagai 2 input integer, menghasilkan 4 total input?
Mego
Saya pikir saya tidak akan menahan maksimal 3 input - Saya juga ingin melihat kode untuk 4 input
Alex Carlsen
Dalam hal itu, bagaimana dengan memiliki daftar / tuple / array / beberapa jenis iterable lainnya yang mengandung dua bilangan bulat untuk input ketiga? Itu tidak berbeda secara fundamental dari 4 input integer. Anda juga harus mengklarifikasi bahwa fraksi tidak akan sama dengan 0.
Mego
@Mego Setelah memikirkannya, saya tidak bisa melihat mengapa itu tidak boleh Diubah menjadi "kode yang membutuhkan minimal 3 input"
Alex Carlsen
1
@ speaker selama output sudah benar dan input berasal dari minimal 2 integer, sisanya terserah Anda :) - saya sudah membuat bagian input cukup terbuka, untuk melihat jawaban yang berbeda
Alex Carlsen

Jawaban:

5

Oktaf, 34 30 byte

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

Sekarang anggap fraksi sebagai ekspresi numerik daripada pembilang dan penyebut yang terpisah.

Contoh di ideone

gelas kimia
sumber
1
Jadi mengapa Anda tidak bisa menggunakan @(a,b,c)rats(union([a:c:b],b))?
Luis Mendo
@LuisMendo I bisa jika ekspresi matematika adalah input yang dapat diterima (hasil efektif 1/2sebagai numerik daripada input string), tapi itu bukan cara saya menafsirkan "representasi fraksi". Jika OP setuju, saya akan senang untuk memotong 4 byte.
gelas kimia
Oh begitu. Yah, saya menggunakan itu dalam jawaban Matlab saya. Begitu juga jawaban Mathematica, kecuali "angka rasional" adalah tipe data spesifik
Luis Mendo
@ speaker saya benar-benar merespons
Alex Carlsen
@VisualBean Code sudah diperbarui.
gelas kimia
11

Mathematica, 16 byte

Range@##⋃{#2}&

Fungsi tanpa nama yang mengambil dua bilangan bulat dan bilangan rasional dan mengembalikan daftar bilangan, misalnya:

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

Mathematica Rangemelakukan persis apa yang diminta tantangan, kecuali bahwa ia menghilangkan batas atas jika perbedaan antara batas bawah dan batas atas bukan kelipatan dari ukuran langkah. Oleh karena itu kami mengambil Union(menggunakan ) dengan daftar yang hanya berisi batas atas yang memastikan bahwa itu muncul tepat satu kali. Perhatikan bahwa Unionakan mengurutkan hasilnya tetapi kami tetap ingin mengurutkannya, karena ukuran langkah selalu positif. Juga karena kami bekerja dengan rasional, mereka secara otomatis dikurangi sebanyak mungkin.

Martin Ender
sumber
10

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

Harap perhatikan ini adalah satu garis - sql tidak memiliki fungsi bawaan untuk mengurangi fraksi. Mungkin bukan bahasa terbaik untuk jenis pertanyaan ini. Ini dapat dibaca manusia (jenis - dibandingkan dengan beberapa bahasa lain).

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

Cobalah online

t-clausen.dk
sumber
Bukankah bahasa yang disebut T-SQL, dan bukan "Sqlserver"?
David Conrad
1
@ Davidvidon, bahasa adalah TSQL, tetapi ada berbagai versi sqlserver dan TSQL untuk ini akan berfungsi untuk sqlserver 2012 karena kata kunci IIF. Yang akan menggunakan KASUS kata kunci di versi yang lebih lama. Menambahkan saran Anda
t-clausen.dk
Kerja bagus. Anda dapat menyimpan beberapa dengan mengubah salah satu @natau @dke dataran @. Kueri CTE Anda untuk N bisa N AS(SELECT N FROM(VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1))M(N))atau N AS(SELECT 1N FROM sys.all_views). Mengingat bahwa hampir dijamin ada beberapa ratus dalam pandangan ini, Anda dapat mengurangi gabungan silang juga. ISNULLlebih pendek dari COALESCEdan seharusnya bekerja
MickyT
@MickyT terima kasih atas saran Anda dan beberapa saran saya sendiri, saya berhasil mengurangi panjangnya menjadi 296 byte,
t-clausen.dk
Kerja bagus di sana
MickyT
6

Python 2, 81 byte

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

Cobalah online

Mego
sumber
5

Haskell, 31 26 byte

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

FTW evaluasi malas! Demo:

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

(Saya awalnya tergoda oleh [a,a+c..b]notasi Haskell , tetapi memiliki beberapa kebiasaan yang mengharuskan sesuatu seperti f a b c|l<-[a,a+c..b-c/2]=l++[b|last l<b]41 byte atau f a b c=[x|x<-[a,a+c..],x<b]++[b]33.)

Anders Kaseorg
sumber
Saya suka solusi Anda! Namun saya pikir Anda perlu memasukkan import Data.Ratiodalam hitungan byte Anda juga, saya pikir Anda tidak dapat menggunakan ftanpa itu, kan?
flawr
2
@ flawr: kasus tepi yang bagus: Anda tidak perlu Data.Ratiountuk fdirinya sendiri, karena itu polimorfik untuk semua jenis numerik. Namun, ketika Anda ingin menyebutnya dengan nilai tipe Ratio, maka Anda perlu impor. Tantangannya hanya perlu "membuat kode yang ...", bukan untuk menggunakannya. Saya pikir tidak apa-apa tanpa impor.
nimi
1
Lebih tepatnya, Anda hanya perlu impor untuk %operator untuk membuat fraksi uji 1 % 2dan 2 % 3. Saya tidak curang di sini: Anda benar-benar dapat menempatkan 26 byte tersebut di file sendiri, menjalankan interpreter pada modul itu, dan memiliki interaksi yang saya tampilkan. (Anda bahkan bisa menghindari mengetik import Data.Ratiodalam interaksi demo, jika Anda mengeja %sebagai Data.Ratio.%.)
Anders Kaseorg
5

MATL , 16 15 byte

3$:3Gvu9X10ZGZD

Ini mungkin gagal untuk penyebut yang sangat besar. Saya harap format output dapat diterima.

Cobalah online!

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
Luis Mendo
sumber
5

Ruby , 32 54 48 byte

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

Solusi ini didasarkan pada jawaban Python Mego dan mengasumsikan bahwa cakan selalu menjadi Rational, format pecahan Ruby. Cobalah online!

Edit: Memperbaiki bug di mana bilangan bulat tidak disajikan seperti bilangan bulat. -6 byte terima kasih kepada Not That Charles dan MegaTom.

Fungsi dipanggil dengan cara ini:

> 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
Sherlock9
sumber
(3/1) bukan hanya 3?
edc65
Yang paling sederhana Rationalbentuk 3di Ruby adalah(3/1)
Sherlock9
.step(b,c).mapharus mengurangi jumlah byte di sini
Bukan berarti Charles
(a==a.to_i)bisa a%1==0untuk -4 byte.
MegaTom
-2,3,1/2r(contoh 1) mencetak 3dua kali terakhir .
Nilai Tinta
3

Julia, 14 byte

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

Ini mirip dengan jawaban Mathematica, kecuali bahwa rentang Julia sudah dalam format yang diinginkan, sehingga bahkan lebih pendek. Juga mengembalikan koleksi angka. Contoh output:

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

Perhatikan bahwa bilangan bulat ditampilkan dengan 1 dalam penyebut, dan garis miring digunakan untuk pecahan. Untuk mendapatkan output persis seperti yang didefinisikan dalam pertanyaan memerlukan beberapa kode lagi:

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

Matlab dengan Symbolic Toolbox / Octave with SymPy, 27 byte

Terima kasih kepada @sanchises karena menunjukkan kesalahan, sekarang diperbaiki

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

Ini adalah fungsi anonim. Untuk menyebutnya, tetapkan ke variabel atau gunakanans .

Contoh:

>> @(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]
Luis Mendo
sumber
Ini tidak sesuai dengan spesifikasi, karena batas atas tidak selalu termasuk (coba contoh 2).
Sanchises
@ menyimpan Terima kasih! Diperbaiki sekarang
Luis Mendo
Dan juga, saya pikir untuk cAnda dapat menggunakan, saya kutip, jenis apa pun yang sesuai dengan bahasa Anda untuk mewakili peningkatan fraksi [...] atau w / e . Saya pikir cukup jelas bahwa symbolicini adalah pilihan yang logis dan diizinkan (@VisualBean mungkin ingin mengkonfirmasi ini). Hasil dari operator usus besar kemudian 'ditingkatkan' menjadi sebuah symbolicarray, yang berarti Anda dapat menyingkirkan sym()panggilan itu sama sekali.
Sanchises
@ menyembunyikan Terima kasih, saya sudah meminta klarifikasi
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}

Fungsi anonim. Setelah penugasan ke variabel bernama dengan spasi putih:

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
}

Contoh uji:

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 

Pendekatan imperatif menggunakan javascript, tidak ada rekursi, pustaka atau pemrograman fungsional.

traktor53
sumber
1

Smalltalk - 89 byte

Untuk sekali ini Smalltalk hampir kompetitif!

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

Panggil seperti ini:

> 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

sumber
1

R - 71 byte

Mengasumsikan Anda telah menginstal MASSpaket

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
bouncyball
sumber
1

Pyret, 56 byte

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

Dibawa di awal (b), akhir (e), pembilang (n), dan penyebut (d). Membuat serangkaian bilangan bulat, membaginya melalui dan menambahkan akhir ke daftar (dengan menautkan dan kemudian menyortir).

MLavrentyev
sumber