Bình đẳng phân số hỗn hợp


15

Ở trường tiểu học, trẻ học về các phân số thích hợp, trong đó tử số nhỏ hơn mẫu số, và do đó giá trị của phân số nhỏ hơn một. Sau đó, họ được dạy về các phân số trong đó giá trị của phân số lớn hơn một và hai cách khác nhau để biểu thị các phân số này: phân số hỗn hợp và phân số không chính xác.

Cho một phân số hỗn hợp, xác định xem nó có tương đương với phân số không chính xác trong đó giá trị nguyên và tử số được nối với nhau không. Ví dụ, đối với đầu vào 1 3/4, phần không chính xác là 13/4.

Các trường hợp thử nghiệm

1 3/4        -> falsey
1 3/10       -> truthy
6 6/7        -> falsey
55 55/100    -> truthy
4 9/100      -> falsey
40 9/100     -> falsey
7 49/1000    -> falsey
9 1/2        -> falsey
999 999/1000 -> truthy
1 21/200     -> falsey
1 21/101     -> falsey

Đối với đầu vào, bạn có thể lấy phần nguyên và phần phân số làm đầu vào riêng biệt, nhưng bạn không thể lấy phân số làm đầu vào thành hai phần và bạn không thể lấy nó làm giá trị thập phân. Bạn có thể bỏ phần nguyên (không lấy nó làm đầu vào) nếu bạn không cần sử dụng nó.


Nên hay đơn giản hóa phân số? Giống như trường hợp thử nghiệm thứ tư sẽ là sai khi 54/100đơn giản hóa27/50
Jo King

1
Đầu ra nên là hai giá trị riêng biệt, nhất quán hoặc bất kỳ giá trị nào có thể không nhất quán, trung thực / falsey?
Luis Mendo

1
Nhân tiện, sửa trường hợp thử nghiệm thứ 4 thành 55 sẽ không thay đổi vấn đề - 55/100cũng có thể được đơn giản hóa 11/20, do đó, câu hỏi tương tự @JoKing đưa ra ở đó.
- Phục hồi Monica

3
"Bạn có thể không lấy phân số làm đầu vào thành hai phần" - tại sao? Đó chính xác là những gì /nó làm: /
Jonathan Allan

11
Điều này dường như tương đương với "đưa ra một đầu vào không quan trọng và hai số là một chuỗi được phân tách bằng dấu gạch chéo, xác định xem số thứ hai có bằng 10 với sức mạnh của độ dài của số thứ nhất không".
xnor

Câu trả lời:



8

Perl 6 , 16 12 byte

{1+$_==1~$_}

Hãy thử trực tuyến!

Lấy đầu vào dưới dạng một chuỗi đại diện cho phân số. Hóa ra kiểu gõ động của Perl 6 có thể xử lý các chuỗi thành các phân số hợp lý, ai biết? Vì vậy, chuỗi"1/10" khi bị ép buộc thành một số, trả về0.1

Khối mã ẩn danh chỉ đơn giản kiểm tra nếu phân số cộng với một bằng với một phân số được nối với phân số. Cảm ơn câu trả lời Python của xnor đã cho tôi thấy rằng phần nguyên không thành vấn đề.

Giải pháp cũ, 27 26 byte

{.nude[0]==.Int~[%] .nude}

Hãy thử trực tuyến!

Đưa đầu vào dưới dạng phân số hỗn hợp hợp lý và trả về giá trị đúng hoặc sai. Trả về false cho trường hợp thử nghiệm thứ tư vì nó có thể được đơn giản hóa.

Giải trình:

.nudetrả về một danh sách [numerator, denominator].

{                        } # Anonymous code block
 .nude[0]    # Check if the numerator of the mixed fraction
         ==  # Is equal to
           .Int  # The integer part of the fraction
               ~ # Concatenated to
                [%] .nude  # The numerator modulo the denominator
                           # And return implicitly

7
Tôi đoán rằng nó .nudeđược đặt tên theo nu merator + de nomator , nhưng ai đó có lẽ rất vui khi có thể gọi nó như vậy.
Οurous

1
Tôi sẽ đi với một cái gì đó lấy nó thành một chuỗi duy nhất'1 3/10' {S/\s//==.words.sum}
Brad Gilbert b2gills

6

Võng mạc 0.8.2 , 17 16 byte

(.)+/1(?<-1>0)*$

Hãy thử trực tuyến! Chỉ yêu cầu phần phân số, vì vậy bộ kiểm tra được liên kết sẽ loại bỏ số nguyên khỏi các trường hợp kiểm tra. Giải thích: Ghép không đúng chỉ bằng số hỗn hợp chỉ khi mẫu số là lũy thừa 10 và tử số có một chữ số cho mỗi số 0 trong mẫu số. Các nhóm cân bằng của .NET được sử dụng để xác minh rằng có đủ chữ số tồn tại. Chỉnh sửa: Đã lưu 1 byte nhờ @sundar.


Không làm việc cho 1 11/10. Nó dường như là một vấn đề với việc triển khai của bạn, không phải là phương pháp
H.PWiz

1
Lưu ý rằng "Bạn có thể bỏ phần nguyên (không lấy nó làm đầu vào) nếu bạn không cần sử dụng nó." - vì vậy, không gian hàng đầu có thể không cần thiết nếu bạn thay đổi đầu vào chỉ có phân số.
- Phục hồi Monica

1
@ H.PWiz Tôi không nghĩ chúng ta phải xử lý các đầu vào trong đó tử số lớn hơn mẫu số (vì chúng được coi là các phân số hỗn hợp chỉ có phần thập phân không tách rời được biểu thị dưới dạng phân số). Nhưng tôi sẽ yêu cầu OP xác nhận điều đó.
- Phục hồi Monica

@sundar Tôi phải thay đổi nó để ^thay thế, vì vậy nó không có ích.
Neil

Điều này /làm cho nó rõ ràng những gì bạn phù hợp, vì vậy tôi không nghĩ rằng bạn cần mỏ neo ở đó (theo quy tắc khớp regex thông thường, không có chuyên môn về Retina ở đây). Dường như để làm việc: Hãy thử trực tuyến! .
- Phục hồi lại

6

Husk , 8 byte

§·=r¤+r+

Hãy thử trực tuyến!

Giải trình

§(·=r)(¤+r)(+)  -- example arguments: "1" "3/10"
§               -- fork both arguments
      (¤ r)     -- | read both: 1 3/10
      ( + )     -- | and add them: 13/10
           (+)  -- | concatenate: "13/10"
                -- and do
 (· r)          -- | read the second argument: 13/10
 ( = )          -- | and compare: 13/10 == 13/10
                -- : 1


5

R , 78 65 byte

function(n,e=function(a)eval(parse(t=sub(" ",a,n))))e("")==e("+")

Hãy thử trực tuyến!

-13 byte nhờ cả Giuseppe và JayCe!


1
Chỉ sublà tốt ở đây. Ngoài ra, bạn có thể sử dụng t=thay vìtext=
Giuseppe

1
Tôi có thể nói gì? Xuất sắc! nó đơn giản hóa thành 65 byte
JayCe

@JayCe Vui mừng khi thấy tôi ở đúng trang! Cảm ơn!
Robert S.

Bạn có thể thử chuyển câu trả lời Python 3 của xnor cho khoảng 20 byte ...
JayCe


4

Stax , 5 byte

╡ÄLσ`

Chạy và gỡ lỗi nó

Giải trình:

+yj$e= Full program, implicit input
+      Add integer and fraction part
 y     Push unparsed input
  j$   Split on spaces and flatten, i.e. Remove spaces
    e  Evaluate
     = Check for equality

4

Python 3 , 26 byte

lambda k:eval(k+'+1==1'+k)

Hãy thử trực tuyến!

Ví dụ, đầu vào 3/4cho 3/4+1==13/4. Thay vì lấy toàn bộ phần của phân số, chúng tôi chỉ đặt nó 1để kiểm tra đẳng thức phân số hỗn hợp. Các trường hợp thử nghiệm từ Chas Brown.


4

Brachylog , 15 byte

ḍ{lᵛ&ht¬ị&t↔ị1}

Hãy thử trực tuyến!

Lấy phần phân đoạn một mình làm đầu vào chuỗi.

Sử dụng gián tiếp ý tưởng tương tự như câu trả lời Julia của tôi - "mẫu số là 10 ^ {chiều dài của tử số}" có thể nói là "mẫu số là lũy thừa mười và độ dài của mẫu số bằng độ dài của tử số + độ dài của "/" (tức là 1).

ḍ                   % split the input in half
 {            }     % and verify that
  lᵛ                % each half has the same length (i.e. the string had even length)
    &ht¬ị           % and the last character of the first half is 
                    %  not a number (it should be "/")
         &t↔ị1      % and the second half when reversed is the number 1
                    %  i.e. the denominator should be a power of 10

Câu trả lời cũ hơn:

15 20 byte

a₀ᶠịˢtl;10↺^.&a₁ᶠịˢh

Hãy thử trực tuyến!

(-1 byte nhờ vào @Firthize, nhưng không may là +6 byte kể từ khi tôi phát hiện ra các lỗi trong phương thức cũ hơn.)

Ý tưởng tương tự như câu trả lời Julia của tôi .


1
Bạn có thể rút ngắn nó bằng 1 byte bằng cách thay thế biến Avới các biến đầu ra .(và do đó loại bỏ các ngoái Avì các biến đầu ra là implicitely có ở cuối)
Fatalize

@Firthize Cảm ơn, tôi quên rằng đầu ra có sẵn khá nhiều dưới dạng biến miễn phí trong các vấn đề quyết định này. Thật không may, tôi đã tìm thấy các lỗi trong mã mà tôi có: vì nó chỉ yêu cầu bất kỳ tiền tố số và bất kỳ hậu tố số nào, nên nó đã chuyển những thứ như 61/10(chỉ sử dụng 6 làm tử số / tiền tố) 2/110(chỉ sử dụng 10 làm mẫu số / hậu tố). Tôi đã cố gắng sửa nó, không chắc đây có phải là cách tốt nhất để làm hay không.
- Phục hồi lại

Tôi không chắc mình có thể giúp bạn vì tôi hoàn toàn không hiểu thông số kỹ thuật của thử thách này, thậm chí sau khi đọc nó 3 lần. Tôi không biết "phân số hỗn hợp và phân số không đúng" được gọi ở nước tôi là gì, hoặc thậm chí nếu nó được dạy ở các trường tiểu học ở đây.
Gây tử vong vào

1
@Firthize Đủ công bằng. Bạn có quan tâm đến việc phục hồi phòng chat? Tôi có một loạt các câu hỏi để làm phiền bạn, nếu bạn quan tâm và có thời gian.
- Phục hồi Monica

Chắc chắn, chỉ cần yêu cầu một mod để hồi sinh căn phòng và gắn thẻ cho tôi khi bạn đặt câu hỏi
Fatalize

3

Julia 0,6 , 29 byte

r->10^ndigits(num(r))==den(r)

Hãy thử trực tuyến!

Dựa trên ý tưởng rằng đầu ra chỉ đúng khi mẫu số là lũy thừa mười với số không bằng số có các chữ số trong tử số. Lấy đầu vào dưới dạng một Rationalloại, kiểm tra mẫu số bằng 10 được nâng lên số chữ số trong tử số.


3

Sạch , 57 byte

import StdEnv,Text
$b#[u,v:_]=split"/"b
=v==""<+10^size u

Hãy thử trực tuyến!

Cái này ngắn hơn một chút nhưng ngắt cho tử số / mẫu số lớn.

Sạch , 77 61 60 58 byte

-1 cảm ơn lời khuyên của OM on về câu trả lời khác của tôi

import StdEnv,Text
$b#[u,v:_]=split"/"b
=1<+[48\\_<-:u]==v

Hãy thử trực tuyến!

Điều này sử dụng phương pháp của Neil , nó ngắn hơn một chút so với thực hiện trực tiếp.
Có một số mánh khóe với quá tải chuyển đổi, nơi 1<+[48\\_<-:u]chuyển đổi [Int]sang [Char]rồi chuyển sang {#Char} (:== String), nhưng Inttrực tiếp thành String.

Sạch , 91 89 byte

import StdEnv,Text
t=toInt
$a b#[b,c:_]=map t(split"/"b)
#d=t(a<+b)
=d/c==t a&&d-d/c*c==b

Hãy thử trực tuyến!

Xác định hàm $ :: String String -> Booltrích xuất tử số và mẫu số, nối chuỗi phần nguyên và tử số và kiểm tra tính tương đương.


3

05AB1E , 7 byte

'/¡ćg°Q

Chỉ lấy các phân số làm đầu vào.

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

'/¡        # Split the input by '/'
           #  i.e. '3/10' → ['3', '10']
   ć       # Head extracted:
           #  i.e. ['3', '10'] → 10 and 3
    g      # Take the length of the numerator
           #  i.e. '3' → 1
     °     # Take 10 to the power of this length
           #  1 → 10**1 → 10
      Q    # Check if that value equals the denominator
           #  10 and 10 → 1 (truthy)

Hoặc một lời giải thích tổng quát hơn:

Chúng ta phải xác nhận hai điều:

  • Mẫu số là một yếu tố 10 ( 1, 10, 100, 1000, v.v.)?
  • Độ dài của tử số + 1 có bằng độ dài của mẫu số không?
    • Phần thứ hai này được thực hiện bằng cách kiểm tra xem mẫu số có bằng 10 với công suất của độ dài của tử số hay không, giúp tiết kiệm 2 byte

PS: Nếu chúng ta có thể lấy tử số và mẫu số làm đầu vào riêng biệt, chỉ cần 3 byte là đủ : g°Q.


3

JavaScript, 26 byte

Lấy đầu vào theo cú pháp currying ( f(x)(y)) trong đó xlà số nguyên và ylà phân số dưới dạng chuỗi.

x=>y=>x==eval(x+y)-eval(y)

Dùng thử trực tuyến


3

Java 10, 107 70 67 57 byte

f->new Long(f.split("/")[1])==Math.pow(10,f.indexOf("/"))

Chào mừng đến với thế giới mà không có eval..

-40 byte bằng cách tạo một cổng của câu trả lời Python 2 của @ChasBrown .
-10 byte nhờ @Shaggy (Tôi nên đọc câu trả lời của @ChasBrown tốt hơn và việc anh ấy sử dụng find( indexOf) ..)

Hãy thử trực tuyến.

Giải trình:

f->                         // Method with String parameter and boolean return-type
  new Long(f.split("/")[1]) //  Take the denominator as integer
  ==Math.pow(10,            //  And check whether it is equal to 10 to the power of:
                f.indexOf("/"))
                            //   the length of the numerator-String


@Shaggy Ah, Chas Brown thậm chí có cùng một câu trả lời trong Python 2 mà tôi đã liên kết .. Không chắc tại sao tôi chưa sử dụng nó .. Cảm ơn!
Kevin Cruijssen


2

Perl 5 -p, 23 byte

$_=eval=~s/..//r eq$_+0

Hãy thử trực tuyến!

Lấy phần phân đoạn một mình làm đầu vào (như được OP cho phép), đầu ra 1 là true và không có gì sai.

$_=       # assign to be printed by -p
eval      # evaluate fraction to get 0.something, for eg. 0.54
=~s/..//r # remove the 0. part, giving 54
 eq       # string equality check
$_+0      # after first coercing input to number to remove / and denominator

Phần thập phân được lấy bởi chính nó sẽ chỉ chính xác bằng tử số khi mẫu số là công suất tiếp theo tức thời lớn hơn mười so với tử số, đây là điều kiện chúng ta cần kiểm tra.


2

Noether, 17 byte

I#I"/"^WL1-%WL_=P

Hãy thử trực tuyến!

Giải trình

Vậy làm thế nào để làm việc này? Chà, nếu bạn nhìn vào các trường hợp thử nghiệm, trường hợp đúng duy nhất là khi mẫu số là lũy thừa mười,10một, Ở đâu một là độ dài của tử số cộng với một (một= =đăng nhập10n+1, Ở đâu n là tử số và x đại diện cho chức năng sàn).

I#                - Push the first input then pop it off the stack
  I"/"^           - Push the second input and split the string at "/"
       W          - Convert the top (the denominator) of the stack from a string to a number
        L1-       - Take the log 10 of the top of the stack and subtract 1 (a)
           %      - Rotate the stack
            WL_   - Convert the top of the stack (the numerator) to a number, take the log10 and floor the result (b)
               =  - Check if a and b are equal
                P - Print the top of the stack


2

R , 53 byte

function(n,x=el(strsplit(n,"/")))x[2]==10^nchar(x[1])

Hãy thử trực tuyến!

Chỉ lấy phần phân đoạn làm đầu vào. Như được đề cập bởi xnor trong một bình luận:

Điều này dường như tương đương với "đưa ra một đầu vào không quan trọng và hai số là một chuỗi được phân tách bằng dấu gạch chéo, xác định xem số thứ hai có bằng 10 với sức mạnh của độ dài của số thứ nhất không".

Câu trả lời của Robert S. ít chơi gôn hơn nhưng thú vị hơn tôi nhiều.



1

Excel, 52 byte

=10^FIND("/",B1)/10-MID(B1,FIND("/",B1)+1,LEN(B1))=0

Bỏ qua đầu vào Integer. Về cơ bản:IS Denominator = 10^LEN(Numerator)


Đối với mẫu số giới hạn ở <10^9: 48 byte:

=10^FIND("/",B1)/10-MID(B1,FIND("/",B1)+1,1E9)=0

Hàng loạt logic đang tách ra /. Nếu đầu vào có thể được lấy riêng, 16 byte:

=10^LEN(B1)-C1=0

1

Thuốc tiên , 81 byte

fn b->[n,d]=String.split b,"/";String.to_integer(d)==:math.pow 10,byte_size n end

Hãy thử trực tuyến!

Có thể có được một nơi nào đó với {n,"/"<>d}=Integer.parse b, nhưng không biết làm thế nào.



1

C (gcc / clang), 59 49 47 byte

f(a,b){a=atoi(b=strchr(a,47)+1)==pow(10,b+~a);}

Câu trả lời Python 2 của Port of Chas Brown . Dùng thử trực tuyến tại đây .

Bỏ qua phần nguyên của đầu vào. Cảm ơn Jonathan Frech chơi golf 2 byte.

Ung dung:

f(a, b) { // function returning an int and taking a string as input; also declaring another string variable
          // this abuses the parameters as much as possible, omitting the type int and implicitly converting it to char *
    a =                             // return a truthy or falsey value based on
        atoi(b = strchr(a, 47) + 1) // the denominator (as integer; 47 is the ASCII code for '/')
        == pow(10, b + ~a);         // is equal to 10 to the power of the length of the numerator-string
}

'/'có khả năng nhất có thể 47.
Jonathan Frech

Có thể 47 byte .
Jonathan Frech

Rất vui, cảm ơn bạn!
OOBalance

Không có gì. Tôi nghĩ bạn đã quên cập nhật tiêu đề của mình để phản ánh số byte mới.
Jonathan Frech

1

ForceLang, 86 78 byte

set a io.readnum()
set b io.readnum()
set d number.parse a+b+""
io.write d=a+b
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.