Рівність змішаного дробу


15

У початковій школі діти дізнаються про власні дроби, де чисельник менший від знаменника, і, таким чином, значення дробу менше одиниці. Пізніше їх навчають про дроби, де значення дробу перевищує один, і два різні способи вираження цих дробів: змішані дроби та неправильні дроби.

Дано змішаний дріб, визначте, чи він еквівалентний неправильному дробу, де ціле значення та чисельник з'єднані разом. Наприклад, для введення 1 3/4неправильна частка є 13/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
Джо Кінг,

1
Чи повинні виводити два чіткі, послідовні значення або будь-які, можливо, непослідовні, значення truthy / falsey?
Луїс Мендо

1
До речі, встановлення четвертого тестового випадку на 55 не вирішило б питання, чи це 55/100може бути спрощено 11/20, тому там виникає те саме запитання, яке порушено @JoKing.
sundar

3
"ви можете не брати дробу як вхід у двох частинах" - помилка чому? Це саме те, що /робить: /
Джонатан Аллан

11
Це здається еквівалентним "з урахуванням вводу, який не має значення, і двох чисел у вигляді рядка, розділеного косою рисою, визначте, чи відповідає друге число 10 силі довжини першого числа".
xnor

Відповіді:



8

Perl 6 , 16 12 байт

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

Спробуйте в Інтернеті!

Приймає введення як рядок, що представляє дріб. Виявляється, динамічне введення тексту Perl 6 може обробляти рядки раціональним дробам, хто знав? Тож рядок, "1/10"примушений до числа, повертається0.1

Блок анонімного коду просто перевіряє, чи частка плюс один дорівнює одному об'єднаному з дробом. Завдяки відповіді Pynora xnor за те, що він показав мені, що ціла частина не має значення.

Старий розчин, 27 26 байт

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

Спробуйте в Інтернеті!

Приймає дані як раціональний змішаний дріб і повертає істинне чи хибне. Повертає помилку для четвертого тестового випадку, оскільки його можна спростити.

Пояснення:

.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, але хтось, мабуть, отримав велике задоволення від того, що змогли це назвати.
Οurous

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

1
@ H.PWiz Я не думаю, що нам доводиться мати справу з входами, де чисельник більший за знаменник (оскільки це повинні бути змішані дроби з лише нецілісною десятковою частиною, вираженою дробом). Але я попрошу ОП це підтвердити.
sundar

@sundar Я повинен був би змінити це ^, щоб він не допомагав.
Ніл

Це /робить однозначним те, що ви підбираєте, тому я не думаю, що вам там потрібен якір (ідучи за звичайними правилами відповідності регулярних виразів, тут немає експертної інформації щодо сітківки). Здається, все одно працює: Спробуйте в Інтернеті! .
sundar



5

R , 78 65 байт

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

Спробуйте в Інтернеті!

-13 байт завдяки Джузеппе та JayCe!


1
Тут просто subдобре. Також ви можете використовувати t=замістьtext=
Джузеппе

1
Що я можу сказати? Блискуче! це добре спрощує 65 байт
JayCe

@JayCe Радий побачити, що я був на правій сторінці! Спасибі!
Роберт С.

Ви можете спробувати перенести відповідь Python 3 xnor, мабуть, на 20 байт ...
JayCe



4

Python 3 , 26 байт

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

Спробуйте в Інтернеті!

Наприклад, введення 3/4дає 3/4+1==13/4. Замість того, щоб взяти всю частину дробу, ми просто встановимо її 1для перевірки рівності змішаної фракції. Тестові приклади від Chas Brown.


4

Брахілог , 15 байт

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

Спробуйте в Інтернеті!

Приймає дробову частину окремо як вхідний рядок.

Побічно використовує ту саму ідею, що і моя відповідь Юлії - "знаменник 10 ^ {довжина чисельника}" можна сказати як "знаменник - це сила десяти, а довжина знаменника дорівнює довжині чисельника + довжина "/" (тобто 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 байт завдяки @Fatalize, але, на жаль, +6 байт, оскільки я виявив помилки в старшому методі.)

Та сама ідея, що і моя відповідь Юлії .


1
Ви можете скоротити його на 1 байт, замінивши змінну A вихідною змінною .(і тим самим видаліть останню, Aтому що вихідна змінна неявно є в кінці)
Fatalize

@Fatalize Спасибі, я забуваю, що вихідний сигнал майже доступний як безкоштовна змінна в цих проблемах з рішенням. На жаль, у коді я знайшов помилки: оскільки він запитував лише будь-який числовий префікс та будь-який числовий суфікс, він передавав такі речі, як61/10 (лише 6, використовуючи як чисельник / префікс) 2/110(використовуючи лише 10 знаменник / суфікс). Я намагався це виправити, не впевнений, чи це найкращий спосіб зробити це.
sundar

Я не впевнений, що можу вам допомогти, бо я взагалі не розумію специфіки цього виклику, навіть прочитавши його 3 рази. Я не знаю, як у моїй країні називають "змішані дроби та неправильні дроби", чи це навіть викладають у початкових школах.
Фаталізувати

1
@ Фаталізуйте досить ярмарок. У вас є інтерес до відродження чату? У мене є маса запитань, щоб вас замучити, якщо ви зацікавлені і маєте час.
sundar

Звичайно, просто попросіть мода відродити кімнату і позначте мене, коли ви задаєте питання
Fatalize

3

Джулія 0,6 , 29 байт

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 Python 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 Ах, у Часа Брауна є навіть те саме у відповіді Python 2, яку я пов’язав .. Не знаю, чому я вже цього не використовував .. Дякую!
Kevin Cruijssen


2

Perl 5 -p, 23 байти

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

Спробуйте в Інтернеті!

Приймає дробову частину самостійно як вхідну (як це дозволено ОП), виводить 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

Нітер, 17 байт

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

Спробуйте в Інтернеті!

Пояснення

То як це працює? Що ж, якщо ви подивитесь на тестові випадки, єдині справжні випадки - це коли знаменник має силу десять,10а, де а - довжина чисельника плюс один (а=журнал10н+1, де н - чисельник і х представляє функцію підлоги).

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 силі довжини першого числа".

Відповідь Роберта С. менш гофрована, але набагато цікавіша за мою.


2

C (gcc) , 67 56 55 байт

  • Збережено одинадцять байтів завдяки OOBalance .
  • Збережено байт завдяки плафоні .
m;x(char*_){for(m=1;*_++;m*=10)*_*=*_^47;m=m==atoi(_);}

Спробуйте в Інтернеті!


64 байти: tio.run/…
OOBalance

Власне, вам це навіть потрібно r? tio.run/…
OOBalance

@OOBalance Ні, я ні. Дякую.
Джонатан Фрех

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

C (gcc / clang), 59 49 47 байт

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

Порт Чес Браун Python 2 «s відповідь . Спробуйте його онлайн тут .

Ігнорує цілу частину вводу. Завдяки Джонатану Фреху за те, що він грає у 2 байти.

Безголівки:

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.
Джонатан Фрех


Приємно, дякую!
OOBalance

Будь ласка. Думаю, ви забули оновити заголовок, щоб відобразити нове число байтів.
Джонатан Фрех

1

ForceLang, 86 78 байт

set a io.readnum()
set b io.readnum()
set d number.parse a+b+""
io.write d=a+b
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.