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.

Stephen
sumber
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
Luis Mendo
sumber
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
Jo King
sumber
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.

Neil
sumber
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
ბიმო
sumber
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!

Robert S.
sumber
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
wastl
sumber
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.

Tidak
sumber
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 .

sundar - Pasang kembali Monica
sumber
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.

sundar - Pasang kembali Monica
sumber
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.

Suram
sumber
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.

Kevin Cruijssen
sumber
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

Shaggy
sumber
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
Kevin Cruijssen
sumber
1
57 byte
Shaggy
@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

Haskell , 47 40 byte

-7 Terima kasih kepada OMᗺ

f b|(u,v)<-span('/'<)b="/1"++('0'<$u)==v

Cobalah online!

Port jawaban Bersih saya menggunakan metode Neil.

Suram
sumber
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.

sundar - Pasang kembali Monica
sumber
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
Peluruhan Beta
sumber
2

TeaScript , 25 byte

Input pertama adalah fraksi, kedua adalah integer.

Saya baru saja mulai di TeaScript sehingga mungkin banyak bermain golf

s"/")▒⌐ep(xs"/")░.n

Cobalah online!

Luis felipe De jesus Munoz
sumber
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.

JayCe
sumber
2

C (gcc) , 67 56 55 byte

m;x(char*_){for(m=1;*_++;m*=10)*_*=*_^47;m=m==atoi(_);}

Cobalah online!

Jonathan Frech
sumber
64 bytes: tio.run/…
OOBalance
Sebenarnya, apakah Anda perlu r? tio.run/…
OOBalance
@ Ketidaksesuaian Tidak, saya tidak. Terima kasih.
Jonathan Frech
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
Wernisch
sumber
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.

Okx
sumber
1

2DFuck , 86 byte

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

Cobalah online!

Mengambil input tanpa bagian integer.

wastl
sumber
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
}
Ketidakseimbangan
sumber
'/'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
SuperJedi224
sumber