Равенство смешанной дроби


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
Должны ли выходные данные быть двумя различными, последовательными значениями или любыми, возможно, противоречивыми, истинными / ложными значениями?
Луис Мендо

1
Между прочим, исправление 4-го контрольного примера, чтобы иметь 55, не изменило бы проблему - 55/100это также может быть упрощено 11/20, таким образом, тот же самый вопрос @JoKing возникает там.
sundar - Восстановить Монику

3
«Вы не можете принимать дробь как входные данные из двух частей» - почему? Это именно то, что /делает: /
Джонатан Аллан

11
Кажется, что это эквивалентно «учитывая, что ввод, который не имеет значения, и два числа в виде строки, разделенной косой чертой, определяют, равно ли второе число 10 степени длины первого числа».
xnor

Ответы:



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, но кто-то, вероятно, получил огромное удовольствие от возможности назвать это так.
Ο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 Я должен был бы изменить это ^вместо этого, таким образом, это не помогает.
Нейл,

Это /делает однозначным то, что вы сопоставляете, поэтому я не думаю, что вам нужен там якорь (по обычным правилам сопоставления регулярных выражений, здесь нет опыта Retina). Кажется, все равно работает: попробуйте онлайн! ,
sundar - Восстановить Монику

6

Шелуха , 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 байтов благодаря Джузеппе и ДжейСе!


1
Просто subздесь хорошо. Кроме того, вы можете использовать t=вместоtext=
Джузеппе

1
Что я могу сказать? Brilliant! он упрощается до 65 байтов
JayCe

@JayCe Рад видеть, что я был на правильной странице! Благодарность!
Роберт С.

Вы можете попытаться портировать ответ xnor на Python 3, вероятно, на 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 - Восстановить Монику

Конечно, просто попросите мод оживить комнату и
отметьте

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, который я связал .. Не уверен, почему я уже не использовал это .. Спасибо!
Кевин Круйссен


2

Perl 5 -p, 23 байта

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

Попробуйте онлайн!

Принимает только дробную часть в качестве входных данных (как разрешено OP), выводит 1 для true и ничего для 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

Десятичная часть, взятая сама по себе, будет в точности равна числителю, только если знаменатель на следующую десятую степень больше нумератора, что является условием, которое мы должны проверить.


2

Нетер, 17 байт

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

Попробуйте онлайн!

объяснение

10aaaзнак равножурнал10N+1 , где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 байта

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

Игнорирует целочисленный ввод. В принципе: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 ответ . Попробуйте это онлайн здесь .

Игнорирует целочисленную часть ввода. Спасибо Джонатану Фречу за игру в гольф 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.
Джонатан Фрех


Хорошо.Спасибо!
OOBalance

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.