Một phần có thể được đơn giản hóa bằng cách sử dụng Hủy bỏ bất thường?


11

Hủy bỏ bất thường (từ Wolfram Alpha):

Hủy bỏ bất thường là "hủy" các chữ số của a và b trong tử số và mẫu số của một phân số a / b dẫn đến một phân số bằng với bản gốc. Lưu ý rằng nếu có nhiều nhưng số lượng khác nhau của một hoặc nhiều chữ số trong tử số và mẫu số thì có sự mơ hồ về việc hủy các chữ số nào, do đó, đơn giản nhất là loại trừ các trường hợp đó khỏi xem xét. Liên kết

Nói một cách đơn giản, hãy nói rằng bạn có một phần nhỏ a / b. Nếu bạn có thể hủy bỏ các chữ số trong phân số để tạo một phân số khác c / dbằng với gốc ( a / b = c / d), hủy bỏ bất thường có thể được sử dụng để đơn giản hóa phân số.

Thách thức của bạn là tạo ra một chương trình hoặc hàm nhập chuỗi phân số ở dạng a/bvà xuất hoặc trả về giá trị trung thực nếu phân số có thể được đơn giản hóa bằng cách sử dụng hủy bỏ dị thường và ngược lại là giá trị giả. absẽ luôn là số nguyên dương khác không. absẽ luôn có hai hoặc nhiều chữ số. Ngoài ra, tất cả các chữ số từ một trong hai ahoặc bsẽ không bị hủy (Bạn sẽ không nhận được đầu vào 12/21), ít nhất một chữ số từ absẽ bị hủy mỗi lần (Bạn sẽ không nhận được đầu vào 43/21) và kết quả cuối cùng sẽ không bao giờ 0cho ahoặc b. Chương trình của bạn phải hủy bỏ tất cả các chữ số phổ biến giữa ab(ví dụ: trong1231/1234, bạn phải hủy bỏ a 1, a 2và a 3). Nếu có nhiều khả năng hủy, trước tiên hãy chọn chữ số ngoài cùng bên trái (515/25 trở thành 15/2 chứ không phải 51/2).

Ví dụ:

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.

Đây là , vì vậy mã ngắn nhất tính bằng byte sẽ thắng!


1
Relaticate: codegolf.stackexchange.com/questions/37794/, Thật trùng hợp, tôi vừa đọc được mục nhập chính xác về toán học mà bạn đang trích dẫn =)
flawr

Tôi đã bị ấn tượng 515/25 hủy bỏ đến 103/5?
Pulga

1
@Pulga 5 đầu tiên trong tử số sẽ hủy với 5 trong mẫu số, để lại 15/2.
Alex A.

@Pulga 11 và 55 không chia sẻ bất kỳ chữ số nào, vì vậy không thể đơn giản hóa hơn nữa bằng phương pháp này. Tuy nhiên, sử dụng đơn giản hóa phân số bình thường, đây sẽ là trường hợp, nhưng trong thử thách này, chúng tôi chỉ hủy các chữ số.
GamrCorps

Câu trả lời cho 43/21 là gì?
xnor

Câu trả lời:


3

Pyth, 22 19 byte

Cảm ơn @isaacg cho ba byte!

qFcMsMM,Jcz\/.-M_BJ

Giải trình:

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

Hãy thử nó ở đây .


1
m.-Fdcó thể được golfed tới .-M. Tương tự như vậy, mcFsMdcó thể được chơi golf cMsMM.
isaacg

@isaacg Thú vị; Tôi đã tự hỏi tại sao .-FMkhông làm việc. Vì vậy, Mtự động splat trên các chức năng không đơn điệu?
lirtosiast

2

, 17 ký tự / 34 byte

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

Try it here (Firefox only).

Giải trình

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

Tôi đã ở đây được khoảng hai tháng rồi và nó vẫn giống như phép màu đối với tôi. +1
Sản phẩm điện tử

2

Ruby, 95 76 byte

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

Giải trình

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

Rất cảm ơn Doorknob đã chơi golf 19 byte.



1

MATL , 35 byte

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

Ví dụ

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

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

Giải trình

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 byte

a=>[...a.split`/`[0]].some(x=>(e=eval)(a.replace(e(`/${x}/g`),``))==e(a))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.