Можно ли упростить дробь, используя аномальное аннулирование?

11

Аномальное аннулирование (от Wolfram Alpha):

Аномальное аннулирование - это «аннулирование» цифр a и b в числителе и знаменателе дроби a / b, в результате чего получается дробь, равная оригиналу. Обратите внимание, что если в числителе и знаменателе есть несколько, но различающихся количеств одной или нескольких цифр, существует неопределенность в отношении того, какие цифры нужно отменить, поэтому проще всего исключить такие случаи из рассмотрения. Ссылка на сайт

Проще говоря, скажем, у вас есть доля a / b. Если вы можете отменить цифры в дроби, чтобы создать другую дробь, c / dравную оригинальной ( a / b = c / d), аномальное аннулирование можно использовать для упрощения дроби.

Ваша задача состоит в том, чтобы создать программу или функцию, которая вводит строку дроби в форму a/bи выводит или возвращает истинное значение, если дробь может быть упрощена с использованием аномального аннулирования, а в противном случае - ложное значение. aи bвсегда будет ненулевым положительным целым числом. aи bвсегда будет иметь две или более цифры. Кроме того , все цифры от либо aили bне будет отменены из (вы не получите вход 12/21), по крайней мере , одна цифры от aи bбудет отменен каждый раз , когда (вы не получите вход 43/21), и конечный результат никогда не будет 0для любых aили b. Ваша программа должна отменить все общие цифры между aи b(т. Е. В1231/1234, вы должны отменить a 1, a 2и a 3). Если есть несколько возможностей для отмены, сначала выберите крайнюю левую цифру (515/25 становится 15/2, а не 51/2).

Примеры:

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.

Это , поэтому выигрывает самый короткий код в байтах!

GamrCorps
источник
1
Relaticate: codegolf.stackexchange.com/questions/37794/… По совпадению, я только что нашел точную запись в mathworld, на которую вы ссылаетесь =)
flawr
Я был под впечатлением 515/25 отменяет до 103/5?
Пульга
1
@Pulga Первые 5 в числителе будут отменены с 5 в знаменателе, оставляя 15/2.
Алекс А.
@Pulga 11 и 55 не разделяют никаких цифр, поэтому этот метод нельзя упростить. Тем не менее, с использованием обычного упрощения дроби, это было бы так, но в этой задаче мы только отменили цифры.
GamrCorps
Какой ответ для 43/21?
xnor

Ответы:

3

Pyth, 22 19 байт

Спасибо @isaacg за три байта!

qFcMsMM,Jcz\/.-M_BJ

Объяснение:

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

Попробуй это здесь .

lirtosiast
источник
1
m.-Fdможно в гольф .-M. Точно так же mcFsMdможно играть в гольф cMsMM.
Исаак
@isaacg Интересно; Мне было интересно, почему .-FMне работает. Так Mавтоматически всплывает на немонадных функциях?
lirtosiast
2

𝔼𝕊𝕄𝕚𝕟, 17 символов / 34 байта

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

Try it here (Firefox only).

объяснение

ïČ⍘/⎖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
источник
Я был около 𝔼𝕊𝕄𝕚𝕟 в течение двух месяцев, и это все еще выглядит как волшебство для меня. +1
ETHproductions
2

Рубин, 95 76 байт

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

объяснение

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

Огромное спасибо Doorknob за игру в гольф на 19 байтов.

спагетто
источник
2

TeaScript, 22 байта

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

Теперь, когда все ошибки исправлены в TeaScript 3, это прекрасно работает

Попробуйте онлайн

Тестирование

Downgoat
источник
Я получаю E is not defined.
Mama Fun Roll
@ ן nɟuɐɯɹɐ ן oɯ да, странно, он работал с Github ... Обновление ...
Downgoat
Отлично, теперь работает нормально!
Mama Fun Roll
1

MATL , 35 байт

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

Примеры

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

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

объяснение

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 байта

a=>[...a.split`/`[0]].some(x=>(e=eval)(a.replace(e(`/${x}/g`),``))==e(a))
Mama Fun Roll
источник