Uma fração pode ser simplificada usando o Cancelamento Anômalo?


11

Cancelamento anômalo (de Wolfram Alpha):

O cancelamento anômalo é um "cancelamento" dos dígitos de aeb no numerador e denominador de uma fração a / b que resulta em uma fração igual ao original. Observe que, se houver várias contagens, mas diferentes, de um ou mais dígitos no numerador e no denominador, haverá ambiguidade sobre quais dígitos serão cancelados; portanto, é mais fácil excluir esses casos da consideração. Ligação

Em termos simples, digamos que você tenha uma fração a / b. Se você pode cancelar os dígitos da fração para criar outra fração c / digual ao original ( a / b = c / d), o cancelamento anômalo pode ser usado para simplificar a fração.

Seu desafio é criar um programa ou função que insira uma string de fração no formato a/be produza ou retorne um valor verdadeiro se a fração puder ser simplificada usando cancelamento anômalo e, caso contrário, um valor falso. ae bsempre serão números inteiros positivos diferentes de zero. ae bsempre terá dois ou mais dígitos. Além disso, todos os dígitos a partir de qualquer aou bnão será cancelado (você não vai conseguir a entrada 12/21), pelo menos um dígito a partir ae bserão canceladas a cada vez (você não vai conseguir a entrada 43/21), e o resultado final nunca será 0para qualquer um aou b. Seu programa deve cancelar todos os dígitos comuns entre ae b(ou seja, em1231/1234, você deve cancelar a 1, a 2e a 3). Se houver várias possibilidades de cancelamento, escolha primeiro o dígito mais à esquerda (515/25 passa a 15/2 e não 51/2).

Exemplos:

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.

Isso é , então o código mais curto em bytes vence!


1
Relaticate: codegolf.stackexchange.com/questions/37794/... Coincidentemente acabo brosed a entrada MathWorld exato que você está citando =)
flawr

Eu estava com a impressão 515/25 cancela para 103/5?
Pulga

1
@Pulga Os primeiros 5 no numerador serão cancelados com os 5 no denominador, deixando 15/2.
31515 Alex A.

@Pulga 11 e 55 não compartilham dígitos, portanto, não pode ser mais simplificado usando esse método. No entanto, usando a fração normal simplificada, esse seria o caso, mas neste desafio estamos apenas cancelando dígitos.
GamrCorps

Qual é a resposta para 43/21?
Xnor

Respostas:


3

Pitão, 22 19 bytes

Obrigado a @isaacg por três bytes!

qFcMsMM,Jcz\/.-M_BJ

Explicação:

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

Experimente aqui .


1
m.-Fdpode ser jogado golfe para .-M. Da mesma forma, mcFsMdpode ser jogado para cMsMM.
Isaacg

@isaacg Interessante; Fiquei me perguntando por .-FMque não funcionou. Então se Mespalha automaticamente em funções não-monádicas?
lirtosiast

2

, 17 caracteres / 34 bytes

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

Try it here (Firefox only).

Explicação

ïČ⍘/⎖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

Estou aqui há dois meses e ainda me parece mágica. +1
ETHproductions 01/01

2

Ruby, 95 76 bytes

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

Explicação

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

Agradecimentos maciços à maçaneta da porta para jogar 19 bytes de folga.



1

MATL , 35 bytes

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

Exemplos

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

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

Explicação

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

1

Javascript ES6, 73 bytes

a=>[...a.split`/`[0]].some(x=>(e=eval)(a.replace(e(`/${x}/g`),``))==e(a))
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.