Ułamki pośrednie


13

Ułamki pośrednie

Wyzwanie:

Konieczne będzie utworzenie kodu, który przyjmuje co najmniej 3 dane wejściowe; 2 liczby całkowite i „reprezentacja ułamkowa” - którykolwiek typ odpowiada Twojemu językowi do reprezentowania przyrostów ułamkowych), tj. Jeśli wybierzesz ciąg, wejście będzie miało wartość „1/4” lub możesz wybrać 2 dodatkowe liczby całkowite lub krotkę lub w / e.

Dane wejściowe mogą być w dowolnym miejscu uzasadnione (STDIN, argumenty funkcji, z pliku itp.), A więc mogą generować (STDOUT, wartość zwracana funkcji, do pliku itp.)

Zasady:

  1. Wejściowy „ułamek” zawsze będzie prawidłowym ułamkiem, mniejszym niż 1; przykład „1/4”
  2. Druga liczba całkowita wejściowa zawsze będzie miała wyższą wartość niż pierwsza liczba całkowita. IE pierwsza liczba całkowita wejściowa zawsze będzie miała niższą wartość niż druga.
  3. Wejściowe liczby całkowite mogą być ujemne.
  4. Frakcje wyjściowe powinny być maksymalnie zmniejszone (uproszczone)

Kod będzie musiał wyprowadzać każdy „krok ułamkowy” między 2 liczbami w przyrostach ułamka wejściowego.

Kod powinien być programem lub funkcją, jak podano tutaj

Przykład 1:

Wejście: -2,3,"1/2"

Wynik:

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

Przykład 2:

Wejście: 1,2,"2/3"

Wynik:

1
5/3
2

lub

1
4/3
2

Uwaga: liczenie można rozpocząć w dowolnym kierunku (dziękuję @Mego)

To jest , więc wygrywa najkrótsza odpowiedź w bajtach.


Czy ułamek ten można przyjąć jako 2 wartości całkowite, co daje 4 wartości całkowite?
Mego

Myślę, że źle trzymam ograniczenie maksymalnie 3 danych wejściowych - chciałbym również zobaczyć kod dla 4 danych wejściowych również
Alex Carlsen

W takim razie, co powiesz na posiadanie listy / krotki / tablicy / jakiegoś innego typu iterowalnego zawierającego dwie liczby całkowite dla trzeciego wejścia? To nie różni się zasadniczo od 4 liczb całkowitych. Powinieneś także wyjaśnić, że ułamek nie będzie równy 0.
Mego

@Mego Po przemyśleniu go przez, nie mogę zrozumieć, dlaczego nie powinno być dozwolone zmieniona na „kod, który trwa conajmniej 3 wejściami”
Alex Carlsen

1
@ beaker, o ile dane wyjściowe są prawidłowe, a dane wejściowe pochodzą od co najmniej 2 liczb całkowitych, reszta należy do Ciebie :) - część wejściowa była otwarta, aby zobaczyć różne odpowiedzi
Alex Carlsen

Odpowiedzi:


5

Oktawa, 34 30 bajtów

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

Teraz bierze ułamek jako wyrażenie liczbowe zamiast osobnego licznika i mianownika.

Próbka na ideone


1
Dlaczego więc nie możesz użyć @(a,b,c)rats(union([a:c:b],b))?
Luis Mendo

@LuisMendo Mogę, jeśli wyrażenia matematyczne są akceptowalnymi danymi wejściowymi (skuteczny wynik 1/2jako dane liczbowe zamiast ciągów znaków), ale nie w ten sposób interpretowałem „reprezentację ułamkową”. Jeśli PO zgodzi się, chętnie zgolę 4 bajty.
zlewka

Rozumiem. Używam tego w mojej odpowiedzi Matlaba. Podobnie odpowiada Mathematica, chyba że „liczba wymierna” jest konkretnym typem danych
Luis Mendo

@beaker faktycznie odpowiedziałem
Alex Carlsen,

@VisualBean Code już zaktualizowany.
zlewka

11

Mathematica, 16 bajtów

Range@##⋃{#2}&

Nienazwana funkcja, która bierze dwie liczby całkowite i liczbę wymierną i zwraca listę liczb, np .:

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

Mathematica Rangerobi dokładnie to, o co prosi wyzwanie, z tym wyjątkiem, że pomija górną granicę, jeśli różnica między dolną i górną granicą nie jest dokładnie wielokrotnością wielkości kroku. Dlatego bierzemy Union(używanie ) z listą zawierającą tylko górną granicę, która zapewnia, że ​​pojawia się dokładnie raz. Zauważ, że Unionposortuje wynik, ale i tak chcemy go posortować, ponieważ rozmiar kroku jest zawsze dodatni. Ponadto, ponieważ pracujemy z racjonalnymi, są one automatycznie redukowane tak bardzo, jak to możliwe.


10

T-SQL 2012+, 831 535 477 270 246 240 219 bajtów

Uwaga: jest to jedna linijka - sql nie ma wbudowanej funkcji zmniejszającej ułamek. Może nie być najlepszym językiem dla tego typu pytań. Jest czytelny dla człowieka (w pewnym sensie - w porównaniu do niektórych innych języków).

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

Wypróbuj online


Czy język nie nazywa się T-SQL, a nie „Sqlserver”?
David Conrad

1
@DavidConrad językiem jest TSQL, ale istnieją różne wersje sqlserver i TSQL do tego będzie działał dla sqlserver 2012 ze względu na słowo kluczowe IIF. Który użyłby słowa kluczowego CASE w starszych wersjach. Dodano twoją sugestię
t-clausen.dk

Dobra robota. Można zapisać kilka zmieniając albo @nczy @dna zwykły @. Twoje zapytanie CTE dla N może być N AS(SELECT N FROM(VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1))M(N))lub N AS(SELECT 1N FROM sys.all_views). Biorąc pod uwagę, że w tym widoku prawie na pewno jest kilkaset, możesz również zmniejszyć połączenia krzyżowe. ISNULLjest krótszy niż COALESCEi powinien działać
MickyT,

@MickyT dzięki twoim sugestiom i kilku własnym, udało mi się skrócić długość o 296 bajtów,
t-clausen.dk 19.04.2016

Świetna robota
MickyT


5

Haskell, 31 26 bajtów

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

Leniwa ocena FTW! Próbny:

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

(Początkowo kusiła mnie [a,a+c..b]notacja Haskella , ale ma pewne dziwactwa, które wymagają czegoś takiego jak f a b c|l<-[a,a+c..b-c/2]=l++[b|last l<b]41 bajtów lub f a b c=[x|x<-[a,a+c..],x<b]++[b]33).


Podoba mi się twoje rozwiązanie! Jednak myślę, że musisz również uwzględnić import Data.Ratiow swojej liczbie bajtów, myślę, fże bez tego nie możesz użyć , prawda?
flawr

2
@flawr: ładny przypadek na krawędzi: nie potrzebujesz Data.Ratiodla fsiebie, ponieważ jest polimorficzny dla wszystkich typów liczbowych. Jednak jeśli chcesz wywołać go z wartościami typu Ratio, potrzebujesz importu. Wyzwanie wymaga jedynie „stworzenia kodu, który ...”, a nie korzystania z niego. Myślę, że bez importu jest w porządku.
nimi

1
Mówiąc dokładniej, %operator potrzebuje tylko importu , aby utworzyć ułamki testowe 1 % 2i 2 % 3. Nie oszukuję tutaj: naprawdę możesz sam umieścić te 26 bajtów w pliku, uruchomić interpreter na tym module i mieć wyświetloną interakcję. (Możesz nawet uniknąć wpisywania import Data.Ratiointerakcji demo, jeśli zamiast tego przeliterujesz %jako Data.Ratio.%.)
Anders Kaseorg 15.04.16

5

MATL , 16 15 bajtów

3$:3Gvu9X10ZGZD

Może to zawieść w przypadku bardzo dużych mianowników. Mam nadzieję, że format wyjściowy jest akceptowalny.

Wypróbuj 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

5

Rubin , 32 54 48 bajtów

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

To rozwiązanie jest oparte na odpowiedzi Python Mego i zakłada, że czawsze będzie to Rationalformat ułamkowy Ruby. Wypróbuj online!

Edycja: Naprawiono błąd, w którym liczby całkowite nie były prezentowane jak liczby całkowite. -6 bajtów dzięki Not That Charles i MegaTom.

Funkcje są wywoływane w następujący sposób:

> 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) nie powinno być po prostu 3?
edc65

Najprostszą Rationalformą 3w Ruby jest(3/1)
Sherlock9

.step(b,c).mappowinien zmniejszyć liczbę bajtów tutaj
Nie, że Charles

(a==a.to_i)może być a%1==0dla -4 bajtów.
MegaTom

-2,3,1/2r(przykład 1) drukuje ostatnie 3dwa razy.
Wartość tuszu

3

Julia, 14 bajtów

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

Jest to podobne do odpowiedzi Mathematica, z tym wyjątkiem, że zakresy Julii są już w pożądanym formacie, więc jest jeszcze krótszy. Zwraca również zbiór liczb. Przykładowe dane wyjściowe:

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

Zauważ, że liczby całkowite są wyświetlane z mianownikiem 1, a ułamki używane są z podwójnym ukośnikiem. Aby uzyskać wynik dokładnie taki, jak zdefiniowano w pytaniu, potrzebny jest dodatkowy kod:

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

3

Matlab z Symbolic Toolbox / Octave z SymPy, 27 bajtów

Dzięki @sanchises za wskazanie błędu, teraz poprawionego

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

To anonimowa funkcja. Aby go wywołać, przypisz go do zmiennej lub użyj ans.

Przykład:

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

Nie jest to zgodne ze specyfikacją, ponieważ górna granica nie zawsze jest uwzględniona (spróbuj przykład 2).
Sanchises

@sanchises Thanks! Poprawione teraz
Luis Mendo

A także, myślę, że dla cciebie możesz użyć, cytuję, dowolnego typu , który pasuje do twojego języka do reprezentowania przyrostów ułamkowych [...] lub w / e . Myślę, że jest całkiem jasne, że symbolicjest to logiczny i dozwolony (@VisualBean może chcieć to potwierdzić) wybór. Wynik działania dwukropka jest następnie „uaktualniany” do symbolictablicy, co oznacza, że ​​możesz sym()całkowicie pozbyć się połączenia.
Sanchises

@sanchises Dzięki, poprosiłem o wyjaśnienia
Luis Mendo

2

JavaScript, 108 90 86   81 bajtów

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

Anonimowa funkcja. Po przypisaniu do nazwanej zmiennej z białą spacją:

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
}

Przykłady testowe:

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 

Konieczne podejście przy użyciu javascript, bez rekurencji, biblioteki lub programowania funkcjonalnego.


1

Smalltalk - 89 bajtów

Po raz pierwszy Smalltalk jest prawie konkurencyjny!

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

Zadzwoń tak:

> 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 bajtów

Zakłada, że MASSpakiet został już zainstalowany

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

Łeb, 56 bajtów

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

Pobiera na początku (b), końcu (e), liczniku (n) i mianowniku (d). Tworzy zakres liczb całkowitych, dzieli je przez i dodaje koniec do listy (łącząc, a następnie sortując).

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.