Liczba mieszana do niewłaściwej frakcji
W tym wyzwaniu zamienisz liczbę mieszaną na niewłaściwy ułamek.
Ponieważ niepoprawne ułamki używają mniejszej liczby, kod będzie musiał być jak najkrótszy.
Przykłady
4 1/2
9/2
12 2/4
50/4
0 0/2
0/2
11 23/44
507/44
Specyfikacja
Możesz założyć, że mianownik wejścia nigdy nie będzie wynosił 0. Dane wejściowe zawsze będą miały format, w x y/z
którym x, y, z są dowolnymi liczbami całkowitymi nieujemnymi. Nie musisz upraszczać danych wyjściowych.
To jest golf golfowy, więc wygrywa najkrótszy kod w bajtach.
code-golf
number
parsing
rational-numbers
Downgoat
źródło
źródło
x
,y
iz
być ujemne?x,y,z
być oddzielnymi danymi wejściowymi? Większość odpowiedzi zakłada, że format wejściowy jest rzeczywiście obowiązkowyx y/z
, ale niektóre nie, dlatego na to pytanie należy uzyskać ostateczną odpowiedź.Odpowiedzi:
Japt, 10 bajtów
Woohoo, obecnie bije CJam!
Wypróbuj online!
Jak to działa
źródło
LabVIEW, 29 LabVIEW Prymitywy
źródło
CJam,
161514 bajtówlub
Sprawdź to tutaj.
Wyjaśnienie
Druga wersja unika używania zmiennej poprzez nieco większe przesunięcie stosu.
źródło
'//~\S/1$b'/@
jest to 13 bajtów. Edycja : oh zapomniałem danych wejściowychl
.Mathematica, 58 bajtów
Zwraca uproszczony wynik. Jeśli wyprowadzenie liczby wymiernej zamiast łańcucha jest w porządku, możemy zapisać 19 bajtów:
źródło
PowerShell,
474442 bajtówPrzekreślone 44 jest nadal regularne 44; (
Grał w golfa kilka bajtów za pomocą wyrażenia regularnego
-split
. Grał jeszcze w golfa dzięki TessellatingHeckler , zmieniając wyrażenie regularne.$args-split'\D'
Trwa nasz argumentu wejściowego i dzieli się na znaki nie-cyfrowych. Tutaj wykonuje dwa podziały, jeden na białych/
znakach , a drugi na postaci. Wyniki są następnie zapisywane w trzech zmiennych przy jednoczesnym przypisaniu. Następnie formułujemy dane wyjściowe ciągu jako ($l
liczbę eft pomnożącą enominator$d
plus$n
umerator) wykonaną jako blok kodu,/
ukośnik, a następnie$d
ponownie enominator.źródło
-split ' |/'
aby zapisać jedną postać za pomocą wyrażenia „dopasuj albo to | lub tamto”, albo użyj,-split '\D'
aby podzielić na wszystko, co nie jest cyfrą, a s (h) ma dwa znaki. Jeśli @Downgoat chce być nieco elastyczny w formacie wyjściowym,'{0}*{2}+{1};{2}'-f($args-split'\D')|iex
ma 40 bajtów i ma znacznie lepszą wydajność, ponieważ liczby są nawet jedne nad drugimi !$l,$n,$d=$args-split'\D';+$l*$d+$n;$d
jest jeszcze krótszy i ma 37 lat i logicznie jest zgodny z tym samym wzorem, co tutaj.Java z dziesięciostopowym biegunem lasera 1,03, 79 + 25 (import) = 104 bajty
Wymaga
import sj224.tflp.math.*;
To prawie na pewno zadziała również z wersją 1.04, ale do tej pory przetestowałem ją tylko z wersją 1.03, ponieważ miałem już skonfigurowany projekt Java z wersją 1.03 na ścieżce kompilacji.
źródło
JavaScript (ES6),
4441 bajtówZaoszczędź 3 bajty dzięki @ETHproductions !
Wyjaśnienie
Bardzo prosty.
Test
Test nie ma przypisania destrukcyjnego do działania w większości przeglądarek.
Pokaż fragment kodu
źródło
[p,q,r]=
w miejscup=
, a następnie zastąpićp[0]
,p[1]
ip[2]
zp
,q
ir
, odpowiednio. Po tej zmianie otrzymuję 41:m=>([p,q,r]=m.match(/\d+/g),+q+p*r+"/"+r)
m.split(/\W/g)
do zapisania bajtuJulia,
5850 bajtówJest to anonimowa funkcja, która przyjmuje ciąg znaków i zwraca
Rational
obiekt typu. Aby to nazwać, nadaj mu nazwę, npf=s->...
.Możemy skorzystać z faktu, że dane wejściowe można nieznacznie manipulować, aby były wyrażeniem, które można uznać za racjonalne. W szczególności liczba całkowita plus wartość wymierna jest wartością wymierną, a racjonalne są oznaczone podwójnymi ukośnikami. Więc jeśli się odwrócimy
4 1/2
się4+1//2
, oceniana będzie wynik9//2
.Nie golfowany:
źródło
Smalltalk - 76 znaków
Dane wejściowe dokładnie pasują do ogranicznika tablicy i nieodłącznej reprezentacji ułamkowej Smalltalk. Gdyby po prostu nie był tak gadatliwy, mógłby być poważnym przeciwnikiem!
Szkoda, że uproszczenie nie było wymogiem, Smalltalk robi to automatycznie!
źródło
Bash + coreutils, 28
$@
rozwija się do wszystkich parametrów wiersza poleceń, więc${@/\// }
rozwija się do wszystkich parametrów wiersza poleceń z/
zastąpionymi przez, które są umieszczane na
dc
stosie. Reszta to prosta manipulacja stosami i arytmetyka.źródło
Haskell ,
746763 bajtówWypróbuj online!
Wyjaśnienie
Jak się zorientował H.PWiz , możemy tutaj użyć leksyk Haskella, aby rozbić sznurek na części. (Wcześniej korzystałem
span(>'/')
) I Laikoni wskazał, że<$>
działa tak samomapSnd
odData.Tuple
.Strażnik wzorów dzieli nasz kod na trzy liczby, których chcemy użyć
lex
.lex
przywołuje leksykon haskell, aby zerwać pierwszy token. Zwraca listę z każdym elementem reprezentującym możliwy sposób parsowania łańcucha. Te elementy są krotkami, przy czym pierwszy element jest pierwszym tokenem, a reszta ciągu jest drugim elementem. Ponieważ format wejściowy jest bardzo regularny, zawsze będziemy mieli tylko jedną analizę, więc zawsze możemy wziąć pierwszą. Pierwszą rzeczą, którą robimy, jest wywołanielex
na wejściuNastępnie odwijamy go z listy, dając nam 2-krotkę
Pierwszy token będzie całą częścią mieszanej frakcji, pozostawiając frakcję poprzedzoną spacją, aby nadal analizować. Ponieważ krotki są
Functors
, możemy użyć(<$>)
aliasu,fmap
aby zastosowaćlex
do drugiego elementu krotki.To zjada przestrzeń i odrywa następny token, licznik naszej frakcji. Teraz łączymy to z dopasowaniem wzorca za pomocą
<-
. Nasz wzór toa
chwyta całą część frakcji, naszego pierwszego tokena.:_
rozpakowuje listę wynikającą z naszego drugiegolex
.c
chwyta drugi żeton, który sprawdziliśmy, czyli licznik ułamka. Wszystko, co pozostaje, jest z tym związanes:d
co dzieli go na pierwszy znak, co gwarantuje format to/
a reszta, która będzie mianownikiem.Po przeanalizowaniu danych wejściowych wykonujemy obliczenia:
Gdzie
r
jest funkcja odczytu, którą związaliśmy wcześniej.Należy zauważyć, że
lex
zwraca listę pustą, jeśli się nie powiedzie, i niepustą, jeśli się powiedzie. Dlaczego to nie jestMaybe
nie wiem.źródło
/
JavaScript ES6, 62 bajty
źródło
[b,c]=
zamiastb=
, a następnie używaćb
zamiastb[0]
ic
zamiastb[1]
. Możesz także zmienić układ równania, aby w ogóle nie potrzebujesz nawiasów:p=prompt;[b,c]=p(a=+p()).split
/;alert(+b+c*a+"/"+c)
Perl,
826138 bajtówTo może być bardziej golfa.
Zmiany
split
i 5 za pomocą<>
zamiast<STDIN>
.źródło
#!perl -paF/\D/
(9 bajtów) możesz użyć$_=$F[0]*$F[2]+$F[1]."/$F[2]"
.#!perl
Część shebang i wysuw nie liczą. To tylko 38 bajtów.Mathematica, 51 bajtów
Co ciekawe, Mathematica obsługuje to za pomocą wbudowanego. Jeśli wypisywanie liczby jest dozwolone, potrzebujemy tylko 28 bajtów:
źródło
Java,
159148142120110 bajtówZaoszczędziłem sporo bajtów dzięki FlagAsSpam.
źródło
Long b=new Long(a[0]),c=new Long((a=a[1].split("/"))[0]),d=new Long(a[1]);
ARBLE , 13 bajtów
Wypróbuj online!
źródło
"x y/z"
jest obowiązkowy dla tego konkretnego wyzwania, ale na wszelki wypadek poprosiłem OP o weryfikację.05AB1E ,
1715 bajtów-2 bajty dzięki @MagicOctopusUrn .
Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
Przy elastycznym formacie wejściowym i wyjściowym, przyjmując liczby całkowite w kolejności
x,z,y
i wysyłając nominator i mianownik w oddzielnych liniach, byłoby to 4 bajty (dlatego dodałem tag parsowania do wyzwania ..):Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
źródło
4 1/2
jest obowiązkowy dla tego konkretnego wyzwania. Inaczej bym użył mojego wersji 4-bajtowy (lub jeśli wyjście było obowiązkowe, ale wejście elastyczny Chciałbym skorzystać z tej 6-byter:*+'/²J
)a
na stos ” .. o.Ô Dokładnie to, czego potrzebowałem do tego wyzwania! I sprytny dzięki dołączeniu przez „/”. Dzięki! :)a
do stosu ” zamiast używać'`'
…Python 3 ,
7876 bajtówWypróbuj online!
źródło
return'%s/'%(int(a)*int(c)+int(b))+c
jest o 2 bajty krótszyStax , 1 bajt
Uruchom i debuguj (chociaż nie ma wiele do debugowania)
Specyfikacja wyzwania mówi: „Nie musisz upraszczać wyników”. Zakładając, że można to uprościć, istnieje wbudowana instrukcja stax, aby to zrobić. Dane wejściowe są domyślnie interpretowane jako liczba całkowita i liczba wymierna.
+
Instrukcja poszerza zarówno wymiernych, dodaje i upraszcza. Wynik zostanie domyślnie wydrukowany.źródło
Perl 5 z -la -Mfeature = powiedzmy
32 bajty25 bajtówWypróbuj online!
(-7 bajtów dzięki Dom Hastings)
$_
to całe wejściex y/z
, które ocenia wartośćx
w kontekstach numerycznych (jak*
tutaj).$'
jest regex Pomeczowe ciąg, który zawiera co przychodzi tu po/
- takz
. Aby uzyskaćy
wartość, używamy-a
flagi, która dzieli dane wejściowe na spacje i umieszcza je w@F
tablicy. A więc tutaj,@F = ("x", "y/z")
co oznacza, że$F[1]="y/z"
wartość jest obliczana wy
kontekście numerycznym (ponieważy
jest to początkowa ciągła sekwencja cyfr$F[1]
).źródło
-p
flagi w liczbie bajtów; zamiast tego liczysz język jakoPerl 5 with -p flag, 32 bytes
. Zobacz ten meta post dla aktualnego konsensusu.$'
było jedyną prawdziwą różnicą!$'
i-a
-$F[n]
aby dostać części napisu jest całkiem dobry pomysł, muszę pamiętać, że! Dzięki, zaktualizowałem wpis.Lua, 123 bajtów
źródło
Droga Mleczna 1.6.0 , 31 bajtów
Skończyło się to znacznie dłużej, niż się spodziewałem.
Wyjaśnienie
Stosowanie
źródło
Python 2.7, 88 Bytes
Wypróbuj online!
Musisz wpisać dane w cudzysłowie.
Prawdopodobnie nie najlepszy ...
źródło
C, 64
Odczytuje dane wejściowe ze STDIN. Myślę, że dość oczywiste.
źródło
Sprawdź , 120 bajtów
Wypróbuj online!
Być może uda mi się zapisać niektóre bajty, nie próbując ponownie użyć pętli analizowania (druga linia). W ten sposób mogłem sprecyzować pętlę, uniknąć ogromnego bałaganu warunkowego i mogłem wykorzystać rejestr do innych celów.
źródło
Ruby, 23 bytes
Try it online!
źródło
C#, 112 bytes
Full/Formatted Version:
źródło
APL (Dyalog Unicode), 31 bytes
Try it online!
Thanks to ngn for the
⊃⊥1∘↓
trickźródło
PHP, 65 Bytes
Try it online
Code
Explanation
źródło
Java 10, 87 bytes
A lambda from
String
toString
.Try It Online
źródło