Kesamaan Fraksi Campuran


15

Di sekolah dasar, anak-anak belajar tentang pecahan yang tepat, di mana pembilangnya kurang dari penyebutnya, dan dengan demikian nilai pecahannya kurang dari satu. Kemudian, mereka diajarkan tentang pecahan di mana nilai pecahan lebih besar dari satu, dan dua cara berbeda untuk mengekspresikan pecahan ini: pecahan campuran dan pecahan tidak tepat.

Diberikan fraksi campuran, tentukan apakah itu setara dengan fraksi yang tidak tepat di mana nilai integer dan pembilang digabungkan bersama. Misalnya, untuk input 1 3/4, fraksi yang tidak tepat adalah 13/4.

Uji Kasus

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

Untuk input, Anda dapat mengambil bagian integer dan bagian fraksi sebagai input terpisah, tetapi Anda tidak dapat mengambil fraksi sebagai input dalam dua bagian, dan Anda tidak dapat menganggapnya sebagai nilai desimal. Anda dapat menjatuhkan bagian integer (tidak menganggapnya sebagai input) jika Anda tidak perlu menggunakannya.


Haruskah atau bisakah pecahan itu disederhanakan? Seperti uji kasus keempat akan salah karena 54/100disederhanakan untuk27/50
Jo King

1
Haruskah output berupa dua nilai yang berbeda dan konsisten atau nilai yang mungkin tidak konsisten atau benar?
Luis Mendo

1
Ngomong-ngomong, memperbaiki test case ke-4 untuk memiliki 55 tidak akan mengubah masalah kan - 55/100juga dapat disederhanakan 11/20, sehingga pertanyaan yang sama @JoKing muncul muncul di sana.
sundar - Reinstate Monica

3
"Anda tidak boleh mengambil fraksi sebagai input dalam dua potong" - err why? Itulah yang /dilakukannya: /
Jonathan Allan

11
Ini tampaknya setara dengan "diberi input yang tidak masalah dan dua angka sebagai string yang dipisahkan oleh garis miring, tentukan apakah angka kedua sama dengan 10 dengan kekuatan panjang angka pertama".
xnor

Jawaban:


8

MATL , 7 byte

UsGXzU=

Input adalah sebuah string. Output 1untuk kebenaran, 0untuk falsey.

Cobalah online! Atau verifikasi semua kasus uji .

Penjelasan

U     % Implicit input. Convert to number(s): gives a vector of two numbers
s     % Sum of that vector
G     % Push input again
Xz    % Remove spaces
U     % Convert to number
=     % Equal? Implicit display

8

Perl 6 , 16 12 byte

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

Cobalah online!

Mengambil input sebagai string yang mewakili fraksi. Ternyata pengetikan dinamis Perl 6 dapat menangani string menjadi pecahan rasional, siapa tahu? Jadi string "1/10"ketika dipaksa ke suatu angka, kembali0.1

Blok kode anonim hanya memeriksa apakah fraksi plus satu sama dengan satu yang digabungkan dengan fraksi. Berkat jawaban Python xnor untuk menunjukkan kepada saya bahwa bagian integer tidak masalah.

Solusi lama, 27 26 byte

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

Cobalah online!

Mengambil input sebagai pecahan campuran yang rasional, dan mengembalikan benar atau salah. Mengembalikan nilai false untuk test case keempat karena dapat disederhanakan.

Penjelasan:

.nudemengembalikan daftar [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
Saya menduga itu .nudedinamai untuk nu merator + de nominator, tetapi seseorang mungkin sangat senang bisa menyebutnya begitu.
Surous

1
Saya akan pergi dengan sesuatu yang menganggapnya sebagai string tunggal'1 3/10' {S/\s//==.words.sum}
Brad Gilbert b2gills

6

Retina 0.8.2 , 17 16 byte

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

Cobalah online! Hanya membutuhkan bagian pecahan, sehingga suite tes tertaut menghilangkan bilangan bulat dari kasus uji. Penjelasan: Rangkaian yang tidak tepat sama dengan angka campuran hanya jika penyebutnya berkekuatan 10 dan pembilang memiliki satu digit untuk setiap nol dalam penyebut. Grup penyeimbang .NET digunakan untuk memverifikasi bahwa ada cukup angka. Sunting: Disimpan 1 byte berkat @sundar.


Tidak berhasil 1 11/10. Tampaknya menjadi masalah dengan implementasi Anda, bukan metode
H.PWiz

1
Perhatikan bahwa "Anda dapat menjatuhkan bagian integer (tidak menganggapnya sebagai input) jika Anda tidak perlu menggunakannya." - jadi ruang terdepan mungkin tidak perlu jika Anda mengubah input hanya memiliki fraksi.
sundar - Pasang kembali Monica

1
@ H.PWiz Saya tidak berpikir kita harus berurusan dengan input di mana pembilang lebih besar dari penyebut (karena ini seharusnya pecahan campuran dengan hanya bagian desimal non-integral yang dinyatakan sebagai pecahan). Tapi saya akan meminta OP untuk mengkonfirmasi itu.
sundar - Pasang kembali Monica

@sundar saya harus mengubahnya ^, jadi itu tidak membantu.
Neil

Itu /membuatnya jelas apa yang Anda cocok, jadi saya tidak berpikir Anda perlu jangkar di sana (pergi dengan aturan pencocokan regex biasa, tidak ada keahlian Retina di sini). Sepertinya bekerja: Cobalah secara online! .
sundar - Pasang kembali Monica

6

Sekam , 8 byte

§·=r¤+r+

Cobalah online!

Penjelasan

§(·=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("+")

Cobalah online!

-13 byte berkat Giuseppe dan JayCe!


1
Tidak subapa-apa di sini. Selain itu, Anda dapat menggunakan t=sebagai gantinyatext=
Giuseppe

1
Apa yang bisa kukatakan? Cemerlang! itu disederhanakan dengan baik hingga 65 byte
JayCe

@JayCe Senang melihat saya ada di halaman kanan! Terima kasih!
Robert S.

Anda dapat mencoba mem-porting jawaban xnor's Python 3 untuk kemungkinan 20 byte ...
JayCe


4

Stax , 5 byte

╡ÄLσ`

Jalankan dan debug itu

Penjelasan:

+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)

Cobalah online!

Misalnya, input 3/4memberi 3/4+1==13/4. Alih-alih mengambil seluruh bagian dari fraksi, kami hanya mengaturnya 1untuk menguji kesetaraan fraksi campuran. Uji kasus dari Chas Brown.


4

Brachylog , 15 byte

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

Cobalah online!

Mengambil bagian fraksional sendiri sebagai input string.

Secara tidak langsung menggunakan ide yang sama dengan jawaban Julia saya - "penyebutnya 10 ^ {panjang pembilang}" dapat dikatakan sebagai "penyebut adalah kekuatan sepuluh, dan panjang penyebut sama dengan panjang pembilang + panjang "/" (yaitu 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

Jawaban yang lebih lama:

15 20 byte

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

Cobalah online!

(-1 byte berkat @Fatalize, tapi sayangnya +6 byte karena saya menemukan bug dalam metode yang lebih lama.)

Ide yang sama dengan jawaban Julia saya .


1
Anda dapat mempersingkatnya dengan 1 byte dengan mengganti variabel Adengan variabel output .(dan dengan demikian menghapus yang terakhir Akarena variabel output secara implisit ada di akhir)
Fatalize

@Fatalize Terima kasih, saya lupa bahwa outputnya cukup banyak tersedia sebagai variabel bebas dalam masalah keputusan ini. Sayangnya saya menemukan bug dalam kode yang saya miliki: karena hanya meminta awalan numerik dan akhiran numerik apa pun, itu melewati hal-hal seperti 61/10(menggunakan hanya 6 sebagai pembilang / awalan) 2/110(menggunakan hanya 10 sebagai penyebut / sufiks). Saya sudah mencoba memperbaikinya, tidak yakin apakah ini adalah cara terbaik untuk melakukannya.
sundar - Pasang kembali Monica

Saya tidak yakin dapat membantu Anda karena saya sama sekali tidak memahami spesifikasi tantangan ini, bahkan setelah membacanya 3 kali. Saya tidak tahu apa yang disebut "pecahan campuran dan pecahan tidak patut" di negara saya, atau apakah itu diajarkan di sekolah dasar di sini.
Fatalkan

1
@Fatalize Cukup adil. Apakah Anda berminat untuk menghidupkan kembali ruang obrolan? Saya punya banyak pertanyaan untuk mengganggu Anda, jika Anda tertarik dan punya waktu.
sundar - Reinstate Monica

Tentu, tanyakan saja mod untuk menghidupkan kembali ruangan dan
beri

3

Julia 0,6 , 29 byte

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

Cobalah online!

Berdasarkan gagasan bahwa output harus benar hanya ketika penyebutnya adalah kekuatan sepuluh dengan nol sebanyak jumlah digit dalam pembilang. Mengambil input sebagai Rationaltipe, memeriksa bahwa penyebutnya sama dengan 10 yang dinaikkan ke jumlah digit dalam pembilang.


3

Bersih , 57 byte

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

Cobalah online!

Yang ini sedikit lebih pendek tetapi istirahat untuk pembilang / penyebut besar.

Bersih , 77 61 60 58 byte

-1 berkat tip OM tip pada jawaban saya yang lain

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

Cobalah online!

Ini menggunakan metode Neil , ini sedikit lebih pendek daripada melakukannya secara langsung.
Ada beberapa tipu daya dengan konversi berlebih, di mana 1<+[48\\_<-:u]dikonversi [Int]ke [Char]dan kemudian ke {#Char} (:== String), tetapi Intlangsung ke String.

Bersih , 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

Cobalah online!

Menentukan fungsi $ :: String String -> Boolyang mengekstrak pembilang dan penyebut, merangkai string bagian integer dan pembilang, dan memeriksa kesetaraan.


3

05AB1E , 7 byte

'/¡ćg°Q

Hanya mengambil pecahan sebagai input.

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

'/¡        # 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)

Atau penjelasan yang lebih umum:

Kami harus memvalidasi dua hal:

  • Apakah penyebutnya faktor 10 ( 1, 10, 100, 1000, dll.)?
  • Apakah panjang pembilang + 1 sama dengan panjang penyebut?
    • Bagian kedua ini dilakukan dengan memeriksa apakah penyebutnya apa adanya, sama dengan 10 pangkat panjang pembilang, yang menghemat 2 byte

PS: Jika kita bisa mengambil pembilang dan penyebut sebagai masukan dipisahkan, hanya 3 byte akan cukup: g°Q.


3

JavaScript, 26 byte

Mengambil input dalam sintaks currying ( f(x)(y)) di mana xinteger dan ymerupakan fraksi sebagai string.

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

Cobalah online


3

Java 10, 107 70 67 57 byte

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

Selamat datang di dunia tanpa eval..

-40 byte dengan membuat port jawaban Python 2 dari @ChasBrown .
-10 byte terima kasih kepada @Shaggy (saya seharusnya membaca jawaban @ChasBrown lebih baik dan penggunaannya dari find( indexOf) ..)

Cobalah online.

Penjelasan:

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 bahkan memiliki jawaban yang sama dalam Python 2 yang saya tautkan .. Tidak yakin mengapa saya belum menggunakannya .. Terima kasih!
Kevin Cruijssen


2

Perl 5 -p, 23 byte

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

Cobalah online!

Mengambil bagian fraksional sendiri sebagai input (sebagaimana diizinkan oleh OP), menghasilkan 1 untuk true dan tidak ada untuk false.

$_=       # 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

Bagian desimal yang diambil dengan sendirinya akan persis sama dengan pembilang hanya ketika penyebutnya adalah kekuatan selanjutnya langsung sepuluh lebih besar dari pembilang, yang merupakan kondisi yang perlu kita periksa.


2

Noether, 17 byte

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

Cobalah online!

Penjelasan

Jadi bagaimana cara kerjanya? Nah, jika Anda melihat kasus uji, satu-satunya kasus yang benar adalah ketika penyebut adalah kekuatan sepuluh,10Sebuahdimana Sebuah adalah panjang pembilang ditambah satu (Sebuah=catatan10n+1dimana n adalah pembilang dan x mewakili fungsi lantai).

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])

Cobalah online!

Hanya mengambil bagian fraksional sebagai input. Seperti yang disebutkan oleh xnor dalam komentar:

Ini tampaknya setara dengan "diberi input yang tidak masalah dan dua angka sebagai string yang dipisahkan oleh garis miring, tentukan apakah angka kedua sama dengan 10 dengan kekuatan panjang angka pertama".

Jawaban Robert S. kurang golf, tetapi jauh lebih menarik daripada jawaban saya.



1

Excel, 52 byte

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

Abaikan input Integer. Pada dasarnya:IS Denominator = 10^LEN(Numerator)


Untuk penyebut terbatas hingga <10^9: 48 byte:

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

Sebagian besar logika terpecah /. Jika input dapat diambil secara terpisah, 16 byte:

=10^LEN(B1)-C1=0

1

Elixir , 81 byte

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

Cobalah online!

Mungkin bisa pergi ke suatu tempat dengan {n,"/"<>d}=Integer.parse b, tetapi tidak yakin bagaimana caranya.


1

2DFuck , 86 byte

..!x..!...,,,,[>,,,,,,,,],,,,,,,,,[v!],[v!],[v!],![v!],,,[,,[v!],[v!],[v!],[v!]<,,,]r.

Cobalah online!

Mengambil input tanpa bagian integer.


1

C (gcc / dentang), 59 49 47 byte

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

Port of Chas Brown menjawab Python 2 . Cobalah online di sini .

Mengabaikan bagian integer dari input. Terima kasih kepada Jonathan Frech untuk bermain golf 2 byte.

Tidak Disatukan:

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
}

'/'kemungkinan besar bisa 47.
Jonathan Frech

Kemungkinan 47 byte .
Jonathan Frech

Baik, terima kasih!
OOBalance

Sama sama. Saya pikir Anda lupa memperbarui tajuk untuk mencerminkan jumlah byte baru.
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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.