Czy ułamek można uprościć za pomocą Anomalous Cancellation?

11

Anomalne anulowanie (od Wolfram Alpha):

Anomalne anulowanie to „anulowanie” cyfr aib w liczniku i mianowniku ułamka a / b, co skutkuje ułamkiem równym oryginałowi. Zauważ, że jeśli w liczniku i mianowniku jest wiele różnych, ale różniących się liczb, występuje niejasność co do tego, które cyfry należy anulować, więc najprościej jest wykluczyć takie przypadki z rozpatrzenia. Połączyć

Mówiąc prosto, powiedz, że masz ułamek a / b. Jeśli możesz skasować cyfry ułamka, aby utworzyć kolejną ułamek, c / dktóry jest równy oryginalnej ( a / b = c / d), można użyć anomalnego anulowania, aby uprościć ułamek.

Wyzwanie polega na stworzeniu programu lub funkcji, która wprowadzi ciąg ułamkowy w formie a/bi wyświetli lub zwróci prawdziwą wartość, jeśli ułamek można uprościć za pomocą anomalnego anulowania, a w przeciwnym razie wartość fałsz. ai bzawsze będą niezerowymi dodatnimi liczbami całkowitymi. ai bzawsze będzie zawierać dwie lub więcej cyfr. Ponadto, wszystkie cyfry z obu alub bnie zostanie odwołany (przyzwyczajenie dostać wejście 12/21), co najmniej jedną cyfrę od ai bzostanie anulowana za każdym razem (przyzwyczajenie dostać wejście 43/21), a końcowy wynik nie będzie 0ani dla alub b. Twój program musi skasować wszystkie typowe cyfry pomiędzy ai b(tj. W1231/1234, musisz anulować a 1, a 2i a 3). Jeśli istnieje wiele możliwości anulowania, najpierw wybierz lewą cyfrę (515/25 zmienia się na 15/2, a nie 51/2).

Przykłady:

Input      Output    Why

1019/5095  true      Remove the 0 and the 9 from both sides of the fraction to get 11/55, which is equivalent.
16/64      true      Remove the 6 from both sides, and get 1/4.
14/456     false     Remove the 4s. 14/456 is not equal to 1/56.
1234/4329  false     Remove the 2s, 3s, and 4s. 1234/4329 is not equal to 1/9.
515/25     false     Remove the first 5 from each side. 15/2 is not equal to 515/25.

To jest , więc wygrywa najkrótszy kod w bajtach!

GamrCorps
źródło
1
Relaticate: codegolf.stackexchange.com/questions/37794/... Przypadkowo właśnie przedstawiłem dokładny wpis w świecie matematyki, który cytujesz =)
błąd
Miałem wrażenie, że 515/25 anuluje do 103/5?
Pulga
1
@Pulga Pierwsze 5 w liczniku skasuje się z 5 w mianowniku, pozostawiając 15/2.
Alex A.,
@Pulga 11 i 55 nie dzielą żadnych cyfr, więc nie można tego bardziej uprościć za pomocą tej metody. Tak jednak byłoby w przypadku zwykłego uproszczenia ułamka zwykłego, ale w tym wyzwaniu anulujemy tylko cyfry.
GamrCorps
Jaka jest odpowiedź na 43/21?
xnor

Odpowiedzi:

3

Pyth, 22 19 bajtów

Dzięki @isaacg za trzy bajty!

qFcMsMM,Jcz\/.-M_BJ

Wyjaśnienie:

qFcMsMM,Jcz\/.-M_BJ      Implicit: z=input().
       ,                 two-element list
        Jcz\/              J = split z on ','
                _BJ      Bifurcate reverse: [J,reversed(J)]
             .-M         map multiset difference of elements in both lists
                             this gives the multiset difference both ways
       ,Jcz\/.-M_BJ      On input 1019/5095: [['1019','5095'], ['11','55']]
    sMM                  convert all strings to numbers
  cM                     map by float division
qF                       fold equality

Wypróbuj tutaj .

lirtosiast
źródło
1
m.-Fdmożna grać w golfa .-M. Podobnie mcFsMdmożna grać w golfa cMsMM.
isaacg
@isaacg Ciekawe; Zastanawiałem się, dlaczego .-FMnie działa. Więc Mautomatycznie włącza funkcje niemonadyczne?
lirtosiast
2

𝔼𝕊𝕄𝕚𝕟, 17 znaków / 34 bajty

ïČ⍘/⎖0ⓢⓈë(ïę$)≔ëï

Try it here (Firefox only).

Wyjaśnienie

ïČ⍘/⎖0ⓢⓈë(ïę$)≔ëï // implicit: ï = input fraction
ïČ⍘/⎖0              // get the numerator...
      ⓢ            // split it...
        Ⓢ          // and check if any of its items satisfy the condition:
          ë(ïę$)    // When the item is removed from ï,
                ≔ëï // does its fractional value still equal the original fractional value?
                    // implicit output
Mama Fun Roll
źródło
Byłem w okolicy 𝔼𝕊𝕄𝕚𝕟 od dwóch miesięcy i nadal wygląda mi to na magię. +1
ETHprodukcje
2

Rubin, 95 76 bajtów

->a{x,y=a.split(?/).map &:chars;eval a+".0=="+(x-y).join+?/+(y-x).join+".0"}

Wyjaśnienie

->a{                                                    # start of lambda
      a.split(?/)                                       # splits input fraction into numerator and denominator
                 .map &:chars;                          # converts them both into arrays of digits
  x,y=                                                  # assigns the numerator to x and the denominator to y

  eval                                                  # Evaluate...
       a+".0                                            # Original fraction with a .0 attached -- this forces floating-point division
            =="                                         # Equals...
               +(x-y).join                              # Numerator: Takes the relative complement of y in x (all elements in x that are not in y) and joins the resulting array into a string
                          +?/+(y-x).join                # Denominator: Takes the relative complement of x in y and joins the resulting array
                                        +".0"           # Add a .0 to force floating-point division
}

Ogromne podziękowania dla Doorknob za grę w golfa o 19 bajtów.

spaghetto
źródło
2

TeaScript, 22 bajty

xs`/`[0]M#E(xg(l))⌐E(x

Teraz, gdy wszystkie błędy zostały usunięte w TeaScript 3, działa to dobrze

Wypróbuj online

Zestaw testowy

Downgoat
źródło
I dostać E is not defined.
Mama Fun Roll
@ ן nɟuɐɯɹɐ ן oɯ huh, dziwne, zadziałało z Github ... Aktualizowanie ...
Downgoat
Świetnie, teraz działa dobrze!
Mama Fun Roll
1

MATL , 35 bajtów

jtXUw'\d+'XXZ)2$XKtbm~)Kwtbm~)UwU/=

Przykłady

>> matl
 > jtXUw'\d+'XXZ)2$XKtbm~)Kwtbm~)UwU/=
 > 
> 1019/5095
1

>> matl
 > jtXUw'\d+'XXZ)2$XKtbm~)Kwtbm~)UwU/=
 >
> 14/456
0

Wyjaśnienie

j              % input string
tXUw           % duplicate, convert to number, swap
'\d+'XX        % apply regexp to split at '/'
Z)             % separate cell array of strings into two strings
2$XK           % copy those two strings to clipboard K
tbm~)          % remove from denominator all chars present in the numerator
Kw             % paste both strings and swap      
tbm~)          % remove from numerator all chars present in the denoninator
UwU/=          % obtain value of "simplified" fraction and compare with original
Luis Mendo
źródło
1

JavaScript ES6, 73 bajty

a=>[...a.split`/`[0]].some(x=>(e=eval)(a.replace(e(`/${x}/g`),``))==e(a))
Mama Fun Roll
źródło