¿Se puede simplificar una fracción con la cancelación anómala?

11

Cancelación anómala (de Wolfram Alpha):

La cancelación anómala es una "cancelación" de dígitos de a y b en el numerador y denominador de una fracción a / b que da como resultado una fracción igual al original. Tenga en cuenta que si hay recuentos múltiples pero diferentes de uno o más dígitos en el numerador y el denominador, existe ambigüedad sobre qué dígitos cancelar, por lo que es más sencillo excluir tales casos de la consideración. Enlace

En términos simples, digamos que tienes una fracción a / b. Si puede cancelar los dígitos de la fracción para crear otra fracción c / dque sea igual al original ( a / b = c / d), se puede utilizar la cancelación anómala para simplificar la fracción.

Su desafío es crear un programa o función que ingrese una cadena de fracción en el formulario a/by genere o devuelva un valor verdadero si la fracción se puede simplificar utilizando una cancelación anómala y un valor falso de lo contrario. ay bsiempre serán enteros positivos distintos de cero. ay bsiempre tendrá dos o más dígitos. Además, todos los dígitos de cualquiera ao bno se cancelarán (no obtendrá la entrada 12/21), al menos un dígito de ay bse cancelarán cada vez (no obtendrá la entrada 43/21), y el resultado final nunca será 0para ninguno ao b. Su programa debe cancelar todos los dígitos comunes entre ay b(es decir, en1231/1234, debe cancelar a 1, a 2y a 3). Si hay múltiples posibilidades de cancelación, elija primero el dígito más a la izquierda (515/25 se convierte en 15/2, no en 51/2).

Ejemplos:

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.

Este es el , por lo que gana el código más corto en bytes.

GamrCorps
fuente
1
Relaticate: codegolf.stackexchange.com/questions/37794/… Casualmente acabo de brosar la entrada exacta del mundo matemático que estás citando =)
error
Estaba bajo impresión 515/25 cancela a 103/5?
Pulga
1
@Pulga Los primeros 5 en el numerador se cancelarán con el 5 en el denominador, dejando 15/2.
Alex A.
@Pulga 11 y 55 no comparten ningún dígito, por lo que no se puede simplificar más con este método. Sin embargo, utilizando la simplificación de la fracción normal, este sería el caso, pero en este desafío solo estamos cancelando dígitos.
GamrCorps
¿Cuál es la respuesta para 43/21?
xnor

Respuestas:

3

Pyth, 22 19 bytes

¡Gracias a @isaacg por tres bytes!

qFcMsMM,Jcz\/.-M_BJ

Explicación:

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

Pruébalo aquí .

lirtosiast
fuente
1
m.-Fdse puede jugar al golf .-M. Del mismo modo, mcFsMdse puede jugar al golf cMsMM.
isaacg
@isaacg Interesante; Me preguntaba por qué .-FMno funcionó. Entonces M, ¿ los símbolos automáticamente en funciones no monádicas?
lirtosiast
2

𝔼𝕊𝕄𝕚𝕟, 17 caracteres / 34 bytes

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

Try it here (Firefox only).

Explicación

ïČ⍘/⎖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
fuente
He estado alrededor de 𝔼𝕊𝕄𝕚𝕟 durante dos meses y todavía me parece magia. +1
ETHproductions
2

Ruby, 95 76 bytes

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

Explicación

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

Muchas gracias a Doorknob por jugar al golf con 19 bytes de descuento.

un espagueti
fuente
2

TeaScript, 22 bytes

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

Ahora que todos los errores están solucionados en TeaScript 3, esto funciona muy bien

Pruébalo en línea

Banco de pruebas

Downgoat
fuente
Consigo E is not defined.
Mama Fun Roll
@ ן nɟuɐɯɹɐ ן oɯ eh, raro, funcionó desde Github ... Actualizando ...
Downgoat
¡Genial, funciona bien ahora!
Mama Fun Roll
1

MATL , 35 bytes

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

Ejemplos

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

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

Explicación

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
fuente
1

Javascript ES6, 73 bytes

a=>[...a.split`/`[0]].some(x=>(e=eval)(a.replace(e(`/${x}/g`),``))==e(a))
Mama Fun Roll
fuente