เศษส่วนแบบผสม


15

ในโรงเรียนประถมเด็ก ๆ เรียนรู้เกี่ยวกับเศษส่วนที่เหมาะสมโดยที่ตัวเศษนั้นน้อยกว่าตัวหารและทำให้ค่าของเศษส่วนน้อยกว่าหนึ่ง ต่อมาพวกเขาได้รับการสอนเกี่ยวกับเศษส่วนที่ค่าของเศษส่วนมากกว่าหนึ่งและสองวิธีที่แตกต่างกันในการแสดงเศษส่วนเหล่านี้: เศษส่วนผสมและเศษส่วนที่ไม่เหมาะสม

กำหนดเศษส่วนแบบผสมให้กำหนดว่ามันจะเท่ากับเศษส่วนที่ไม่เหมาะสมโดยที่ค่าจำนวนเต็มและตัวเศษต่อกันเข้าด้วยกัน ตัวอย่างเช่นสำหรับการป้อนข้อมูลที่เป็นส่วนที่ไม่เหมาะสม1 3/413/4

กรณีทดสอบ

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

สำหรับอินพุตคุณอาจใช้ส่วนจำนวนเต็มและส่วนเศษส่วนเป็นอินพุตแยกต่างหาก แต่คุณไม่สามารถใช้เศษส่วนเป็นอินพุตเป็นสองส่วนและคุณไม่สามารถใช้เป็นค่าทศนิยมได้ คุณอาจวางส่วนจำนวนเต็ม (ไม่ใช้เป็นอินพุต) หากคุณไม่จำเป็นต้องใช้


เศษส่วนควรจะง่ายขึ้นหรือไม่? เช่นเดียวกับกรณีทดสอบที่สี่จะเป็นเท็จเช่นเดียวกับ54/100ทำให้ง่ายขึ้น27/50
Jo King

1
เอาต์พุตควรมีค่าที่แตกต่างกันสองค่าที่สอดคล้องกันหรือมีค่าที่ไม่สอดคล้องกันจริงหรือเป็นเท็จหรือไม่?
Luis Mendo

1
อย่างไรก็ตามการแก้ไขกรณีทดสอบครั้งที่ 4 ที่มี 55 จะไม่เปลี่ยนแปลงปัญหาที่เกิดขึ้น - 55/100สามารถทำให้ง่าย11/20ขึ้นดังนั้นคำถามเดียวกัน @JoKing ที่เกิดขึ้นที่นั่น
sundar - Reinstate Monica

3
"คุณไม่สามารถใช้เศษส่วนเป็นอินพุตในสองส่วน" - ทำไม นั่นคือสิ่งที่/ทำ: /
Jonathan Allan

11
สิ่งนี้ดูเหมือนจะเท่ากับ "กำหนดอินพุตที่ไม่สำคัญและตัวเลขสองตัวเป็นสตริงคั่นด้วยเครื่องหมายทับระบุว่าหมายเลขที่สองเท่ากับ 10 กับกำลังของความยาวของตัวเลขแรก"
xnor

คำตอบ:


8

MATL , 7 ไบต์

UsGXzU=

อินพุตเป็นสตริง เอาท์พุท1สำหรับความจริง0สำหรับความเท็จ

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมดตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย

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 ไบต์

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

ลองออนไลน์!

รับอินพุตเป็นสตริงที่แสดงถึงเศษส่วน ปรากฎว่าการพิมพ์แบบไดนามิกของ Perl 6 สามารถจัดการสตริงเป็นเศษส่วนเหตุผลใครจะรู้? ดังนั้นสตริง"1/10"เมื่อถูกบังคับให้เป็นตัวเลข0.1

บล็อกรหัสที่ไม่ระบุชื่อจะตรวจสอบว่าเศษส่วนบวกหนึ่งเท่ากับหนึ่งตัดแบ่งกับเศษส่วนหรือไม่ ขอบคุณคำตอบ Python ของ xnor ที่แสดงให้ฉันเห็นว่าส่วนจำนวนเต็มไม่สำคัญ

โซลูชันเก่า27 26 ไบต์

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

ลองออนไลน์!

รับอินพุตเป็นเศษส่วนผสมแบบมีเหตุผลและส่งคืนค่าจริงหรือเท็จ ส่งคืนค่า false สำหรับกรณีทดสอบที่สี่เนื่องจากสามารถทำให้ง่ายขึ้น

คำอธิบาย:

.nude[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
ฉันคาดเดาว่า.nudeชื่อนี้สำหรับnu merator + de nominator แต่ใครบางคนอาจมีความยินดีอย่างยิ่งที่ได้เรียกมันว่า
Julurous

1
ฉันจะไปกับบางสิ่งบางอย่างที่เอามันมาเป็นสายเดี่ยว'1 3/10' {S/\s//==.words.sum}
แบรดกิลเบิร์ต b2gills

6

เรติน่า 0.8.2 , 17 16 ไบต์

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

ลองออนไลน์! ต้องการเพียงแค่ส่วนที่เป็นเศษส่วนดังนั้นชุดทดสอบที่เชื่อมโยงจะลบจำนวนเต็มออกจากกรณีทดสอบ คำอธิบาย: การต่อข้อมูลที่ไม่เหมาะสมเท่ากับจำนวนที่ผสมกันเฉพาะในกรณีที่ตัวหารเป็นกำลัง 10 และตัวเศษมีตัวเลขหนึ่งหลักสำหรับทุกศูนย์ในตัวส่วน กลุ่มดุลของ. NET จะใช้เพื่อตรวจสอบว่ามีตัวเลขเพียงพอ แก้ไข: บันทึก 1 ไบต์ขอบคุณ @sundar


1 11/10ไม่ทำงานสำหรับ ดูเหมือนว่าจะมีปัญหากับการใช้งานของคุณไม่ใช่วิธีการ
H.PWiz

1
โปรดทราบว่า "คุณอาจวางส่วนจำนวนเต็ม (ไม่ใช้เป็นอินพุต) หากคุณไม่ต้องการใช้" - ดังนั้นพื้นที่นำอาจไม่จำเป็นถ้าคุณเปลี่ยนอินพุตให้มีเพียงเศษส่วน
sundar - Reinstate Monica

1
@ H.PWiz ฉันไม่คิดว่าเราจะต้องจัดการกับปัจจัยที่ตัวเศษมีค่ามากกว่าตัวส่วน (เนื่องจากสิ่งเหล่านี้ควรจะเป็นเศษส่วนผสมกับส่วนทศนิยมแบบไม่รวมที่แสดงเป็นเศษส่วน) แต่ฉันจะขอให้ OP ยืนยันว่า
sundar - Reinstate Monica

@Sundar ฉันต้องเปลี่ยนเป็น^แทนดังนั้นจึงไม่ช่วย
Neil

/ทำให้มันชัดเจนว่าสิ่งที่คุณกำลังจับคู่, ดังนั้นผมจึงไม่คิดว่าคุณต้องมีสมอ (ไปตามกฎ regex จับคู่ตามปกติไม่มีความเชี่ยวชาญ Retina ที่นี่) ดูเหมือนว่าจะทำงานอยู่แล้ว: ลองออนไลน์! .
sundar - Reinstate Monica

6

Husk , 8 ไบต์

§·=r¤+r+

ลองออนไลน์!

คำอธิบาย

§(·=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 ไบต์

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

ลองออนไลน์!

-13 ไบต์ขอบคุณทั้ง Giuseppe และ JayCe!


1
แค่subนี้ก็โอเค นอกจากนี้คุณสามารถใช้t=แทนtext=
Giuseppe

1
ฉันจะว่าอย่างไรได้? ยอดเยี่ยม! ง่ายขึ้นอย่างมากถึง65 ไบต์
JayCe

@ JayCe ดีใจที่ได้เห็นฉันอยู่ในหน้าขวา! ขอบคุณ!
Robert S.

คุณสามารถลองย้ายคำตอบของ Python 3 ของ xnorอาจจะเป็น 20 bytes ...
JayCe



4

Python 3 , 26 ไบต์

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

ลองออนไลน์!

ยกตัวอย่างเช่นการป้อนข้อมูลให้3/4 3/4+1==13/4แทนที่จะเอาส่วนทั้งหมดของเศษส่วนเราแค่ตั้งค่าเป็น1ทดสอบความเท่าเทียมเศษส่วนแบบผสม กรณีทดสอบจาก Chas Brown


4

Brachylogขนาด 15 ไบต์

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

ลองออนไลน์!

นำส่วนที่เป็นเศษส่วนเพียงอย่างเดียวไปเป็นอินพุตสตริง

ใช้แนวคิดเดียวกันกับ Julia ของฉันทางอ้อม - "ตัวหารคือ 10 ^ {length of numerator}" สามารถพูดได้ว่า "ตัวหารคือกำลังสิบและความยาวของตัวหารเท่ากับความยาวของตัวเศษ + ความยาวของ "/" (เช่น 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

คำตอบที่เก่ากว่า:

15 20 ไบต์

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

ลองออนไลน์!

(-1 ไบต์ต้องขอบคุณ @Falize แต่น่าเสียดายที่ +6 ไบต์เนื่องจากฉันค้นพบข้อบกพร่องในวิธีที่เก่ากว่า)

ความคิดเช่นเดียวกับฉันคำตอบที่จูเลีย


1
คุณสามารถย่อให้สั้นลงได้ 1 ไบต์โดยการแทนที่ตัวแปรAด้วยตัวแปรเอาต์พุต.(และลบสิ่งสุดท้ายAเพราะตัวแปรเอาท์พุทจะอยู่ที่นั่นโดยปริยาย)
Fatalize

@ ขอบคุณขอบคุณฉันลืมว่าผลลัพธ์ค่อนข้างพร้อมใช้งานเป็นตัวแปรอิสระในปัญหาการตัดสินใจเหล่านี้ น่าเสียดายที่ฉันพบข้อบกพร่องในรหัสที่ฉันมี: เพราะมันจะถามเฉพาะคำนำหน้าเป็นตัวเลขและคำต่อท้ายที่เป็นตัวเลขใด ๆ มันก็ผ่านสิ่งต่าง ๆ เช่น61/10(ใช้เพียง 6 เป็นตัวเศษ / คำนำหน้า) 2/110(ใช้เพียง 10 เป็นตัวหาร / คำต่อท้าย) ฉันพยายามที่จะแก้ไขมันไม่แน่ใจว่านี่เป็นวิธีที่ดีที่สุดที่จะทำ
sundar - Reinstate Monica

ฉันไม่แน่ใจว่าฉันสามารถช่วยคุณได้เพราะฉันไม่เข้าใจรายละเอียดของความท้าทายนี้เลยแม้แต่น้อยหลังจากอ่าน 3 ครั้ง ฉันไม่ทราบว่ามีการเรียก "เศษส่วนผสมและเศษส่วนที่ไม่เหมาะสม" ในประเทศของฉันหรือว่าแม้จะสอนในโรงเรียนประถมที่นี่
ทำให้เสียชีวิต

1
@ ทำให้พอใช้พอสมควร คุณมีความสนใจในการฟื้นฟูห้องสนทนาหรือไม่? ฉันมีคำถามมากมายที่จะรบกวนคุณหากคุณสนใจและมีเวลา
sundar - Reinstate Monica

แน่นอนว่าขอให้ mod ช่วยฟื้นฟูห้องและแท็กฉันเมื่อคุณถามคำถาม
Fatalize

3

Julia 0.6 , 29 bytes

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

ลองออนไลน์!

ตามแนวคิดที่ว่าเอาต์พุตควรเป็นจริงเฉพาะเมื่อตัวส่วนเป็นพลังของสิบด้วยค่าศูนย์มากเท่าที่มีตัวเลขในตัวเศษ รับอินพุตเป็นRationalชนิดตรวจสอบว่าตัวหารเท่ากับ 10 เพิ่มเป็นจำนวนหลักในตัวเศษ


3

ทำความสะอาด , 57 ไบต์

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

ลองออนไลน์!

อันนี้สั้นกว่าเล็กน้อย แต่ตัวแบ่งสำหรับตัวเศษ / ส่วนใหญ่

ทำความสะอาด , 77 61 60 58 ไบต์

-1 ขอบคุณปลายOMᗺที่คำตอบอื่นของฉัน

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

ลองออนไลน์!

วิธีนี้ใช้วิธีของนีลมันสั้นกว่าการทำโดยตรง
มีเล่ห์เหลี่ยมบางอย่างกับการแปลงเกินพิกัดซึ่ง1<+[48\\_<-:u]แปลง[Int]เป็น[Char]แล้วไปยัง{#Char} (:== String)แต่เปลี่ยนเป็นIntโดยตรงStringโดยตรงกับ

ทำความสะอาด , 91 89 ไบต์

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

ลองออนไลน์!

นิยามฟังก์ชัน$ :: String String -> Boolที่แยกตัวเศษและตัวส่วนสตริงเชื่อมต่อส่วนจำนวนเต็มและตัวเศษและตรวจสอบความเท่าเทียมกัน


3

05AB1E , 7 ไบต์

'/¡ćg°Q

ใช้เศษส่วนเป็นอินพุตเท่านั้น

ลองออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมดตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย:

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

หรือคำอธิบายทั่วไปเพิ่มเติม:

เราต้องตรวจสอบสองสิ่ง:

  • ตัวหารเป็นปัจจัยที่ 10 ( 1, 10, 100, 1000เป็นต้น) หรือไม่
  • ความยาวของตัวเศษ + 1 เท่ากับความยาวของตัวส่วนหรือไม่
    • ส่วนที่สองนี้ทำโดยการตรวจสอบว่าตัวส่วนตามเดิมเท่ากับ 10 กับกำลังของความยาวของตัวเศษซึ่งจะช่วยประหยัด 2 ไบต์

PS: ถ้าเราสามารถใช้ตัวเศษและส่วนเป็นอินพุตแยก, แค่ 3 ไบต์ก็พอ: g°Q.



3

Java 10, 107 70 67 57 ไบต์

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

ยินดีต้อนรับสู่โลกที่ปราศจากeval..

-40 ไบต์โดยการสร้างพอร์ตของ@ChasBrown 's งูหลาม 2 คำตอบ
-10 ไบต์ขอบคุณ@Shaggy (ฉันควรอ่านคำตอบของ@ChasBrown ให้ดีขึ้นและใช้find( indexOf) ของเขา.. )

ลองออนไลน์

คำอธิบาย:

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ยังมีคำตอบเดียวกับ Python 2 ที่ฉันเชื่อมโยง .. ไม่แน่ใจว่าทำไมฉันถึงไม่ใช้มัน .. ขอบคุณ!
Kevin Cruijssen


2

Perl 5 -p, 23 ไบต์

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

ลองออนไลน์!

รับส่วนเศษส่วนเพียงอย่างเดียวเป็นอินพุต (ตามที่อนุญาตโดย OP) เอาต์พุต 1 สำหรับจริงและไม่มีอะไรเป็นเท็จ

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

ส่วนทศนิยมที่ถ่ายด้วยตัวเองจะเท่ากับตัวเศษเฉพาะเมื่อตัวส่วนเป็นกำลังต่อไปของสิบมากกว่าตัวเศษซึ่งเป็นเงื่อนไขที่เราต้องตรวจสอบ


2

Noether, 17 ไบต์

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

ลองออนไลน์!

คำอธิบาย

แล้วมันทำงานอย่างไร ถ้าคุณดูกรณีทดสอบกรณีจริงเพียงอย่างเดียวคือเมื่อตัวส่วนคือพลังของสิบ10aที่ไหน a คือความยาวของตัวเศษบวกหนึ่งตัว (a=เข้าสู่ระบบ10n+1ที่ไหน n เป็นตัวเศษและ x แสดงถึงฟังก์ชั่นการปูพื้น)

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 ไบต์

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

ลองออนไลน์!

รับเฉพาะส่วนที่เป็นเศษส่วนเท่านั้น ตามที่กล่าวไว้โดย xnor ในความคิดเห็น:

สิ่งนี้ดูเหมือนจะเท่ากับ "กำหนดอินพุตที่ไม่สำคัญและตัวเลขสองตัวเป็นสตริงที่คั่นด้วยเครื่องหมายสแลชกำหนดว่าตัวเลขที่สองเท่ากับ 10 เท่ากับกำลังของความยาวของตัวเลขแรกหรือไม่"

คำตอบของ Robert S.น้อยกว่ากอล์ฟ แต่น่าสนใจกว่าของฉันมาก


2

C (gcc) , 67 56 55 ไบต์

  • ไบต์สิบเอ็ดที่บันทึกไว้ต้องขอบคุณ OOBalance
  • บันทึกขอบคุณไบต์ceilingcat
m;x(char*_){for(m=1;*_++;m*=10)*_*=*_^47;m=m==atoi(_);}

ลองออนไลน์!


64 bytes: tio.run/…
OOBalance

จริงๆแล้วคุณต้องการแม้แต่rไหม? tio.run/…
OOBalance

@OOBalance ไม่มีฉันทำไม่ได้ ขอขอบคุณ.
Jonathan Frech

1

Excel, 52 ไบต์

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

ละเว้นอินพุต Integer โดยทั่วไป:IS Denominator = 10^LEN(Numerator)


สำหรับตัวส่วน จำกัด<10^9: 48 ไบต์:

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

ตรรกะจำนวนมากกำลังแยก/กัน หากอินพุตสามารถแยกกันได้ 16 ไบต์:

=10^LEN(B1)-C1=0

1

Elixir , 81 ไบต์

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

ลองออนไลน์!

อาจสามารถเดินทางไปที่ไหนสักแห่งด้วย{n,"/"<>d}=Integer.parse bแต่ไม่แน่ใจว่าจะทำอย่างไร



1

C (gcc / clang), 59 49 47 ไบต์

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

ท่าเรือChas บราวน์ 's งูหลาม 2 คำตอบ ลองออนไลน์ได้ที่นี่

ละเว้นส่วนจำนวนเต็มของอินพุต ขอบคุณJonathan Frechสำหรับการเล่นกอล์ฟ 2 ไบท์

Ungolfed:

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
}

'/'47ส่วนใหญ่มีแนวโน้มสามารถ
Jonathan Frech

เป็นไปได้47 ไบต์
Jonathan Frech

ดีมากขอบคุณ!
OOBalance

ยินดี. ฉันคิดว่าคุณลืมที่จะอัปเดตส่วนหัวของคุณเพื่อสะท้อนจำนวนไบต์ใหม่
Jonathan Frech

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.