예외 상쇄를 사용하여 분수를 단순화 할 수 있습니까?


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적어도 하나 개의 자리에서,) ab각 시간 (당신은 입력을받을 실 거예요 취소됩니다 43/21), 그리고 최종 결과는 없을 것 0중 하나에 대한 a또는 b. 귀하의 프로그램 사이의 모든 일반적인 숫자 밖으로 취소해야 a하고 b(예. 인을1231/1234, 1a 2및 a 3)를 취소해야합니다 . 취소 가능성이 여러 개인 경우 가장 왼쪽 숫자를 먼저 선택하십시오 (515/25는 51/2가 아닌 15/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.

이것은 이므로 바이트 단위의 가장 짧은 코드가 이깁니다!


1
관련 : codegolf.stackexchange.com/questions/37794/… 우연히 나는 당신이 인용하고있는 정확한 mathworld 항목을 방금 정리했습니다 =)
flawr

515/25가 103/5로 취소되었다는 인상을 받았습니까?
Pulga

1
@Pulga 분자의 처음 5 개는 분모에서 5 개로 취소되고 15/2는 그대로 둡니다.
Alex A.

@Pulga 11 및 55는 숫자를 공유하지 않으므로이 방법을 사용하면 더 이상 단순화 할 수 없습니다. 그러나 일반 분수 단순화를 사용하면 이런 경우가 발생하지만이 문제에서는 숫자 만 취소합니다.
GamrCorps

43/21의 답은 무엇입니까?
xnor

답변:


3

Pyth, 22 19 바이트

3 바이트 동안 @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

여기서 사용해보십시오 .


1
m.-Fd에 골프를 칠 수 있습니다 .-M. 마찬가지로 mcFsMd골프도 가능합니다 cMsMM.
isaacg

@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

나는 지금 두 달 동안 around을 보냈는데 여전히 나에게 마술처럼 보입니다. +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
}

19 바이트의 골프를 펼친 Doorknob에게 큰 감사를드립니다.



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

자바 스크립트 ES6, 73 바이트

a=>[...a.split`/`[0]].some(x=>(e=eval)(a.replace(e(`/${x}/g`),``))==e(a))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.