Równość ułamków mieszanych


15

W szkole podstawowej dzieci uczą się o właściwych ułamkach, gdzie licznik jest mniejszy niż mianownik, a zatem wartość ułamka jest mniejsza niż jeden. Później uczy się ich o frakcjach, w których wartość frakcji jest większa niż jeden, oraz o dwóch różnych sposobach wyrażania tych frakcji: ułamki mieszane i ułamki niewłaściwe.

Biorąc pod uwagę ułamek mieszany, określ, czy jest on równoważny z ułamkiem niewłaściwym, w którym wartość całkowita i licznik są łączone razem. Na przykład dla danych wejściowych 1 3/4niewłaściwy ułamek to 13/4.

Przypadki testowe

1 3/4        -> falsey
1 3/10       -> truthy
6 6/7        -> falsey
55 55/100    -> truthy
4 9/100      -> falsey
40 9/100     -> falsey
7 49/1000    -> falsey
9 1/2        -> falsey
999 999/1000 -> truthy
1 21/200     -> falsey
1 21/101     -> falsey

W przypadku danych wejściowych można traktować część całkowitą i część ułamkową jako osobne dane wejściowe, ale nie można traktować ułamka jako danych wejściowych w dwóch częściach i nie można go traktować jako wartości dziesiętnej. Możesz upuścić część całkowitą (nie przyjmować jej jako danych wejściowych), jeśli nie musisz jej używać.


Czy frakcja powinna być uproszczona? Podobnie jak czwarty przypadek testowy byłby fałszywy, ponieważ 54/100upraszcza to27/50
Jo King

1
Czy dane wyjściowe powinny być dwiema wyraźnymi, spójnymi wartościami, a może dowolnymi, niekonsekwentnymi, wartościami prawda / falsey?
Luis Mendo

1
Nawiasem mówiąc, ustalenie czwartego przypadku testowego na 55 nie zmieniłoby problemu - 55/100można to również uprościć 11/20, więc pojawia się tam to samo pytanie postawione przez @JoKing.
sundar - Przywróć Monikę

3
„nie możesz brać ułamka jako wkładu w dwóch kawałkach” - tak, dlaczego? Właśnie to /robi: /
Jonathan Allan

11
Wydaje się to równoważne z „biorąc pod uwagę, że dane wejściowe, które nie mają znaczenia, i dwie liczby jako ciąg oddzielony ukośnikiem, określają, czy druga liczba równa się 10 potędze długości pierwszej liczby”.
xnor

Odpowiedzi:



8

Perl 6 , 16 12 bajtów

{1+$_==1~$_}

Wypróbuj online!

Pobiera dane wejściowe jako ciąg reprezentujący ułamek. Okazuje się, że dynamiczne pisanie w Perlu 6 może obsłużyć ciągi do racjonalnych ułamków, kto wiedział? Tak więc ciąg "1/10"po wymuszeniu na liczbę zwraca0.1

Anonimowy blok kodu po prostu sprawdza, czy ułamek plus jeden równa się jednemu połączonemu z ułamkiem. Dzięki odpowiedzi Python na xnor za pokazanie mi, że część całkowita nie ma znaczenia.

Stare rozwiązanie, 27 26 bajtów

{.nude[0]==.Int~[%] .nude}

Wypróbuj online!

Pobiera dane wejściowe jako wymierną frakcję mieszaną i zwraca wartość prawda lub fałsz. Zwraca false dla czwartego przypadku testowego, ponieważ można go uprościć.

Wyjaśnienie:

.nudezwraca listę [numerator, denominator].

{                        } # Anonymous code block
 .nude[0]    # Check if the numerator of the mixed fraction
         ==  # Is equal to
           .Int  # The integer part of the fraction
               ~ # Concatenated to
                [%] .nude  # The numerator modulo the denominator
                           # And return implicitly

7
Zgaduję, że .nudenazwa pochodzi od nu merator + de nominator, ale ktoś prawdopodobnie czerpał wielką przyjemność z tego, jak to nazwać.
Οurous

1
Zamierzałem iść z czymś, co potraktowało to jako pojedynczy ciąg'1 3/10' {S/\s//==.words.sum}
Brad Gilbert b2gills

6

Retina 0.8.2 , 17 16 bajtów

(.)+/1(?<-1>0)*$

Wypróbuj online! Wymaga tylko części ułamkowej, więc połączony zestaw testów usuwa liczbę całkowitą z przypadków testowych. Objaśnienie: Nieprawidłowa konkatenacja jest równa liczbie mieszanej tylko wtedy, gdy mianownik ma potęgę 10, a licznik ma jedną cyfrę na każde zero w mianowniku. Grupy równoważące .NET są używane do sprawdzenia, czy istnieje wystarczająca liczba cyfr. Edycja: Zapisano 1 bajt dzięki @sundar.


Nie działa dla 1 11/10. Wydaje się, że jest to problem z twoją implementacją, a nie metodą
H.PWiz

1
Uwaga: „Możesz upuścić część całkowitą (nie przyjmować jej jako danych wejściowych), jeśli nie musisz jej używać”. - więc początkowe miejsce może być niepotrzebne, jeśli zmienisz wejście tak, aby zawierało tylko ułamek.
Sundar - Przywróć Monikę

1
@ H.PWiz Nie sądzę, abyśmy mieli do czynienia z danymi wejściowymi, w których licznik jest większy niż mianownik (ponieważ mają to być ułamki mieszane z tylko niecałkowitą częścią dziesiętną wyrażoną jako ułamek). Ale poproszę PO o potwierdzenie.
Sundar - Przywróć Monikę

@sundar Musiałbym to zmienić na ^, więc to nie pomaga.
Neil

To /sprawia, że ​​jednoznaczne jest to, co pasujesz, więc nie sądzę, że potrzebujesz tam kotwicy (przestrzegając zwykłych reguł dopasowywania wyrażeń regularnych, tutaj nie ma specjalistycznej wiedzy Retina). Wygląda na to, że i tak działa: Wypróbuj online! .
sundar - Przywróć Monikę

6

Łuska , 8 bajtów

§·=r¤+r+

Wypróbuj online!

Wyjaśnienie

§(·=r)(¤+r)(+)  -- example arguments: "1" "3/10"
§               -- fork both arguments
      (¤ r)     -- | read both: 1 3/10
      ( + )     -- | and add them: 13/10
           (+)  -- | concatenate: "13/10"
                -- and do
 (· r)          -- | read the second argument: 13/10
 ( = )          -- | and compare: 13/10 == 13/10
                -- : 1


5

R , 78 65 bajtów

function(n,e=function(a)eval(parse(t=sub(" ",a,n))))e("")==e("+")

Wypróbuj online!

-13 bajtów dzięki Giuseppe i JayCe!


1
Po prostu subjest w porządku tutaj. Możesz także użyć t=zamiasttext=
Giuseppe,

1
Co mogę powiedzieć? Znakomity! ładnie upraszcza do 65 bajtów
JayCe

@JayCe Cieszę się, że znalazłem się na właściwej stronie! Dzięki!
Robert S.

Możesz spróbować przenieść odpowiedź Xnor na Python 3 na prawdopodobnie 20 bajtów ...
JayCe


4

Stax , 5 bajtów

╡ÄLσ`

Uruchom i debuguj

Wyjaśnienie:

+yj$e= Full program, implicit input
+      Add integer and fraction part
 y     Push unparsed input
  j$   Split on spaces and flatten, i.e. Remove spaces
    e  Evaluate
     = Check for equality

4

Python 3 , 26 bajtów

lambda k:eval(k+'+1==1'+k)

Wypróbuj online!

Na przykład dane wejściowe 3/4dają 3/4+1==13/4. Zamiast brać całą część ułamka, po prostu ustawiliśmy go 1do testowania równości ułamków mieszanych. Walizki testowe od Chas Brown.


4

Brachylog , 15 bajtów

ḍ{lᵛ&ht¬ị&t↔ị1}

Wypróbuj online!

Traktuje część ułamkową jako ciąg znaków.

Pośrednio używa tego samego pomysłu, co moja odpowiedź Julii - „mianownik to 10 ^ {długość licznika}” można powiedzieć jako „mianownik jest potęgą dziesięciu, a długość mianownika jest równa długości licznika + długość „/” (tj. 1).

ḍ                   % split the input in half
 {            }     % and verify that
  lᵛ                % each half has the same length (i.e. the string had even length)
    &ht¬ị           % and the last character of the first half is 
                    %  not a number (it should be "/")
         &t↔ị1      % and the second half when reversed is the number 1
                    %  i.e. the denominator should be a power of 10

Starsza odpowiedź:

15 20 bajtów

a₀ᶠịˢtl;10↺^.&a₁ᶠịˢh

Wypróbuj online!

(-1 bajt dzięki @Fatalize, ale niestety +6 bajtów, odkąd odkryłem błędy w starszej metodzie).

Ten sam pomysł, co moja odpowiedź Julii .


1
Możesz go skrócić o 1 bajt, zastępując zmienną zmienną Awyjściową .(a tym samym usunąć ostatnią, Aponieważ zmienna wyjściowa jest niejawnie na końcu)
Fatalize

@Fatalize Dzięki, zapomniałem, że dane wyjściowe są prawie dostępne jako wolna zmienna w tych problemach decyzyjnych. Niestety znalazłem błędy w kodzie, który miałem: ponieważ pytał tylko o dowolny prefiks numeryczny i dowolny sufiks numeryczny, przekazywał takie rzeczy 61/10(używając tylko 6 jako licznika / prefiksu) 2/110(używając tylko 10 jako mianownika / sufiksu). Próbowałem to naprawić, ale nie jestem pewien, czy to najlepszy sposób, aby to zrobić.
sundar - Przywróć Monikę

Nie jestem pewien, czy mogę ci pomóc, ponieważ w ogóle nie rozumiem specyfikacji tego wyzwania, nawet po przeczytaniu go 3 razy. Nie wiem, jak nazywane są „ułamki mieszane i ułamki niewłaściwe” w moim kraju, ani czy uczy się ich tutaj w szkołach podstawowych.
Fatalize

1
@Fatalize Fair dosyć. Czy chcesz ożywić czat? Mam mnóstwo pytań, które mogą cię dręczyć, jeśli jesteś zainteresowany i masz czas.
Sundar - Przywróć Monikę

Jasne, po prostu poproś o modyfikację, aby ożywić pokój i
otaguj

3

Julia 0.6 , 29 bajtów

r->10^ndigits(num(r))==den(r)

Wypróbuj online!

Oparty na założeniu, że wyjście powinno być prawdziwe tylko wtedy, gdy mianownik jest potęgą dziesięciu z tyloma zerami, ile cyfr w liczniku. Pobiera dane wejściowe jako Rationaltyp, sprawdza, czy mianownik jest równy 10 podniesiony do liczby cyfr w liczniku.


3

Czysty , 57 bajtów

import StdEnv,Text
$b#[u,v:_]=split"/"b
=v==""<+10^size u

Wypróbuj online!

Ten jest nieco krótszy, ale łamie się w przypadku dużych liczników / mianowników.

Czysty , 77 61 60 58 bajtów

-1 dzięki wskazówkom OMᗺ na moją drugą odpowiedź

import StdEnv,Text
$b#[u,v:_]=split"/"b
=1<+[48\\_<-:u]==v

Wypróbuj online!

Wykorzystuje metodę Neila , jest nieco krótsza niż robienie tego bezpośrednio.
Jest pewne oszustwo z przeciążeniem konwersji, gdzie 1<+[48\\_<-:u]konwertuje się [Int]na, [Char]a następnie na {#Char} (:== String), ale Intbezpośrednio na String.

Czysty , 91 89 bajtów

import StdEnv,Text
t=toInt
$a b#[b,c:_]=map t(split"/"b)
#d=t(a<+b)
=d/c==t a&&d-d/c*c==b

Wypróbuj online!

Definiuje funkcję, $ :: String String -> Boolktóra wyodrębnia licznik i mianownik, łańcuch-konkatenuje część całkowitą i licznik oraz sprawdza równoważność.


3

05AB1E , 7 bajtów

'/¡ćg°Q

Pobiera tylko ułamki jako dane wejściowe.

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie:

'/¡        # Split the input by '/'
           #  i.e. '3/10' → ['3', '10']
   ć       # Head extracted:
           #  i.e. ['3', '10'] → 10 and 3
    g      # Take the length of the numerator
           #  i.e. '3' → 1
     °     # Take 10 to the power of this length
           #  1 → 10**1 → 10
      Q    # Check if that value equals the denominator
           #  10 and 10 → 1 (truthy)

Lub bardziej ogólne wyjaśnienie:

Musimy zweryfikować dwie rzeczy:

  • Czy mianownik ma współczynnik 10 (1, 10, 100, 1000 itp.)?
  • Czy długość licznika + 1 jest równa długości mianownika?
    • Druga część polega na sprawdzeniu, czy mianownik jest równy 10 potęgi długości licznika, co pozwala zaoszczędzić 2 bajty

PS: Jeśli moglibyśmy wziąć licznik i mianownik jako oddzielne wejścia, zaledwie 3 bajty byłby wystarczająco: g°Q.


3

JavaScript, 26 bajtów

Pobiera dane wejściowe w składni curry ( f(x)(y)), gdzie xjest liczbą całkowitą i yułamkiem jako ciągiem znaków.

x=>y=>x==eval(x+y)-eval(y)

Wypróbuj online


3

Java 10, 107 70 67 57 bajtów

f->new Long(f.split("/")[1])==Math.pow(10,f.indexOf("/"))

Witamy w świecie bez eval

-40 bajtów, tworząc port odpowiedzi @ChasBrown w Python 2 .
-10 bajtów dzięki @Shaggy (powinienem był lepiej przeczytać odpowiedź @ChasBrown i jego użyciefind ( indexOf) ..)

Wypróbuj online.

Wyjaśnienie:

f->                         // Method with String parameter and boolean return-type
  new Long(f.split("/")[1]) //  Take the denominator as integer
  ==Math.pow(10,            //  And check whether it is equal to 10 to the power of:
                f.indexOf("/"))
                            //   the length of the numerator-String


@ Shaggy Ah, Chas Brown ma nawet to samo w odpowiedzi w Pythonie 2, którą połączyłem .. Nie jestem pewien, dlaczego jeszcze tego nie użyłem .. Dzięki!
Kevin Cruijssen


2

Perl 5- p, 23 bajty

$_=eval=~s/..//r eq$_+0

Wypróbuj online!

Bierze część ułamkową sam jako dane wejściowe (na co pozwala OP), zwraca 1 dla wartości true i nic dla wartości false.

$_=       # assign to be printed by -p
eval      # evaluate fraction to get 0.something, for eg. 0.54
=~s/..//r # remove the 0. part, giving 54
 eq       # string equality check
$_+0      # after first coercing input to number to remove / and denominator

Część dziesiętna sama w sobie byłaby dokładnie równa licznikowi tylko wtedy, gdy mianownik jest bezpośrednią następną potęgą dziesięciu większą niż licznik, co jest warunkiem, który musimy sprawdzić.


2

Noether, 17 bajtów

I#I"/"^WL1-%WL_=P

Wypróbuj online!

Wyjaśnienie

Jak to działa? Cóż, jeśli spojrzysz na przypadki testowe, jedynymi prawdziwymi przypadkami są przypadki, gdy mianownik ma potęgę dziesięciu,10za, gdzie za to długość licznika plus jeden (za=log10n+1, gdzie n jest licznikiem i x reprezentuje funkcję podłogi).

I#                - Push the first input then pop it off the stack
  I"/"^           - Push the second input and split the string at "/"
       W          - Convert the top (the denominator) of the stack from a string to a number
        L1-       - Take the log 10 of the top of the stack and subtract 1 (a)
           %      - Rotate the stack
            WL_   - Convert the top of the stack (the numerator) to a number, take the log10 and floor the result (b)
               =  - Check if a and b are equal
                P - Print the top of the stack


2

R , 53 bajty

function(n,x=el(strsplit(n,"/")))x[2]==10^nchar(x[1])

Wypróbuj online!

Bierze tylko część ułamkową jako dane wejściowe. Jak wspomniano w komentarzu xnor:

Wydaje się to równoważne z „biorąc pod uwagę, że dane wejściowe, które nie mają znaczenia, i dwie liczby jako ciąg oddzielony ukośnikiem, określają, czy druga liczba równa się 10 potędze długości pierwszej liczby”.

Odpowiedź Roberta S. jest mniej golfowa, ale o wiele bardziej interesująca niż moja.



1

Excel, 52 bajty

=10^FIND("/",B1)/10-MID(B1,FIND("/",B1)+1,LEN(B1))=0

Ignoruje wejście Integer. Gruntownie:IS Denominator = 10^LEN(Numerator)


Dla mianowników ograniczonych do <10^9: 48 bajtów:

=10^FIND("/",B1)/10-MID(B1,FIND("/",B1)+1,1E9)=0

Część logiki się rozdziela /. Jeśli dane wejściowe można pobrać osobno, 16 bajtów:

=10^LEN(B1)-C1=0

1

Eliksir , 81 bajtów

fn b->[n,d]=String.split b,"/";String.to_integer(d)==:math.pow 10,byte_size n end

Wypróbuj online!

Może uda ci się gdzieś dostać {n,"/"<>d}=Integer.parse b, ale nie jestem pewien, jak to zrobić .



1

C (gcc / clang), 59 49 47 bajtów

f(a,b){a=atoi(b=strchr(a,47)+1)==pow(10,b+~a);}

Odpowiedź Pythona 2 Port of Chas Brown . Wypróbuj online tutaj .

Ignoruje całkowitą część wejścia. Dzięki Jonathana Frecha za grę w golfa 2 bajty.

Nie golfowany:

f(a, b) { // function returning an int and taking a string as input; also declaring another string variable
          // this abuses the parameters as much as possible, omitting the type int and implicitly converting it to char *
    a =                             // return a truthy or falsey value based on
        atoi(b = strchr(a, 47) + 1) // the denominator (as integer; 47 is the ASCII code for '/')
        == pow(10, b + ~a);         // is equal to 10 to the power of the length of the numerator-string
}

'/'najprawdopodobniej może być 47.
Jonathan Frech,


Fajnie, dziękuję!
OOBalance,

Zapraszamy. Myślę, że zapomniałeś zaktualizować nagłówek, aby odzwierciedlić nową liczbę bajtów.
Jonathan Frech,

1

ForceLang, 86 78 bajtów

set a io.readnum()
set b io.readnum()
set d number.parse a+b+""
io.write d=a+b
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.