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:
- Wejściowy „ułamek” zawsze będzie prawidłowym ułamkiem, mniejszym niż 1; przykład „1/4”
- 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.
- Wejściowe liczby całkowite mogą być ujemne.
- 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 golf golfowy , więc wygrywa najkrótsza odpowiedź w bajtach.
źródło
Odpowiedzi:
Oktawa,
3430 bajtówTeraz bierze ułamek jako wyrażenie liczbowe zamiast osobnego licznika i mianownika.
Próbka na ideone
źródło
@(a,b,c)rats(union([a:c:b],b))
?1/2
jako 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.Mathematica, 16 bajtów
Nienazwana funkcja, która bierze dwie liczby całkowite i liczbę wymierną i zwraca listę liczb, np .:
Mathematica
Range
robi 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 bierzemyUnion
(używanie⋃
) z listą zawierającą tylko górną granicę, która zapewnia, że pojawia się dokładnie raz. Zauważ, żeUnion
posortuje 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.źródło
T-SQL 2012+,
831535477270246240219 bajtówUwaga: 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).
Wypróbuj online
źródło
@n
czy@d
na 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))
lubN 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.ISNULL
jest krótszy niżCOALESCE
i powinien działaćPython 2, 81 bajtów
Wypróbuj online
źródło
Haskell,
3126 bajtówLeniwa ocena FTW! Próbny:
(Początkowo kusiła mnie
[a,a+c..b]
notacja Haskella , ale ma pewne dziwactwa, które wymagają czegoś takiego jakf a b c|l<-[a,a+c..b-c/2]=l++[b|last l<b]
41 bajtów lubf a b c=[x|x<-[a,a+c..],x<b]++[b]
33).źródło
import Data.Ratio
w swojej liczbie bajtów, myślę,f
że bez tego nie możesz użyć , prawda?Data.Ratio
dlaf
siebie, ponieważ jest polimorficzny dla wszystkich typów liczbowych. Jednak jeśli chcesz wywołać go z wartościami typuRatio
, potrzebujesz importu. Wyzwanie wymaga jedynie „stworzenia kodu, który ...”, a nie korzystania z niego. Myślę, że bez importu jest w porządku.%
operator potrzebuje tylko importu , aby utworzyć ułamki testowe1 % 2
i2 % 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ąć wpisywaniaimport Data.Ratio
interakcji demo, jeśli zamiast tego przeliterujesz%
jakoData.Ratio.%
.)MATL ,
1615 bajtówMoże to zawieść w przypadku bardzo dużych mianowników. Mam nadzieję, że format wyjściowy jest akceptowalny.
Wypróbuj online!
źródło
Rubin ,
325448 bajtówTo rozwiązanie jest oparte na odpowiedzi Python Mego i zakłada, że
c
zawsze będzie toRational
format 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:
źródło
Rational
formą3
w Ruby jest(3/1)
.step(b,c).map
powinien zmniejszyć liczbę bajtów tutaj(a==a.to_i)
może byća%1==0
dla -4 bajtów.-2,3,1/2r
(przykład 1) drukuje ostatnie3
dwa razy.Julia, 14 bajtów
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:
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:
źródło
Matlab z Symbolic Toolbox / Octave z SymPy, 27 bajtów
Dzięki @sanchises za wskazanie błędu, teraz poprawionego
To anonimowa funkcja. Aby go wywołać, przypisz go do zmiennej lub użyj
ans
.Przykład:
źródło
c
ciebie 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, żesymbolic
jest to logiczny i dozwolony (@VisualBean może chcieć to potwierdzić) wybór. Wynik działania dwukropka jest następnie „uaktualniany” dosymbolic
tablicy, co oznacza, że możeszsym()
całkowicie pozbyć się połączenia.JavaScript,
108 90 8681 bajtówAnonimowa funkcja. Po przypisaniu do nazwanej zmiennej z białą spacją:
Przykłady testowe:
Konieczne podejście przy użyciu javascript, bez rekurencji, biblioteki lub programowania funkcjonalnego.
źródło
Smalltalk - 89 bajtów
Po raz pierwszy Smalltalk jest prawie konkurencyjny!
Zadzwoń tak:
źródło
R - 71 bajtów
Zakłada, że
MASS
pakiet został już zainstalowanyźródło
Łeb, 56 bajtów
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).
źródło