Повторный ответ

11

Что вам нужно сделать, это создать функцию / программу, которая принимает десятичное число в качестве входных данных и выводит результат многократного взятия обратной дробной части числа, пока число не станет целым числом.

Более конкретно, процесс выглядит следующим образом:

  1. Пусть х будет входным

  2. Если x является целым числом, выведите его.

  3. В противном случае: . Вернитесь к 2.x1frac(x)

frac(x) является дробной компонентой и равен . \ left \ lfloor x \ right \ rfloor - это пол x, который является наибольшим целым числом меньше x .xxxxx

Тестовые случаи:

0 = 0
0.1 = 1/10 -> 10
0.2 = 1/5 -> 5
0.3 = 3/10 -> 10/3 -> 1/3 -> 3
0.4 = 2/5 -> 5/2 -> 1/2 -> 2
0.5 = 1/2 -> 2
0.6 = 3/5 -> 5/3 -> 2/3 -> 3/2 -> 1/2 -> 2
0.7 = 7/10 -> 10/7 -> 3/7 -> 7/3 -> 1/3 -> 3
0.8 = 4/5 -> 5/4 -> 1/4 -> 4
0.9 = 9/10 -> 10/9 -> 1/9 -> 9
1 = 1
3.14 = 157/50 -> 7/50 -> 50/7 -> 1/7 -> 7
6.28 = 157/25 -> 7/25 -> 25/7 -> 4/7 -> 7/4 -> 3/4 -> 4/3 -> 1/3 -> 3

Сводка для 0 к 1 с шагом 0,1: 0, 10, 5, 3, 2, 2, 2, 3, 4, 9, 1

Это , поэтому побеждает меньше байтов.

Разъяснения:

  • «Бонусные баллы» за отсутствие ошибок округления
  • Должен работать для любого неотрицательного рационального числа (игнорируя ошибку округления)
  • Вы можете, но не обязаны выводить предпринятые шаги
  • Вы можете принять ввод в виде десятичного числа, дроби или пары чисел, которые могут быть в строке.

Извините за все вопросы, это мой первый вопрос на этом сайте.

Соломон Уцко
источник
Тот факт, что это заканчивается, тесно связан с возможностью выражения десятичной дроби в непрерывной дроби.
Утренняя монахиня
4
Ожидаем ли мы выпускать поплавки? Они вызывают некоторые проблемы с точностью.
Утренняя монахиня
7
Не могли бы вы подробнее рассказать о процессе? Я не уверен относительно того, что влечет за собой «взаимная дробная часть числа», и контрольные примеры тоже не сильно помогают
Ad Hoc
4
Можем ли мы взять два целых числа в качестве входных данных для представления рационального числа?
Утренняя монахиня
1
Это равно последнему элементу простой непрерывной дроби ввода.
Исаак

Ответы:

5

J, 18 байт

%@(-<.)^:(~:<.)^:_

В J идиома u ^: v ^:_означает «Продолжайте применять глагол, uпока условие vвозвращает истину.

В нашем случае условие завершения определяется ловушкой ~:<., что означает «пол числа <.не равен ~:самому числу» - поэтому мы остановимся, когда основной глагол uвернет int.

uв этом случае другой хук -<.- число минус его пол - возвращаемое значение подается в @ответный глагол %.

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

Ион
источник
Также 18, но имеют некоторые точечные неточности плавучие из - за допуски предположительно: _2{(%@-<.) ::]^:a:.
Коул
%@|~&1^:(~:<.)^:_
FrownyFrog
5

Python 3 , 101 байт

lambda s:g(int(s.replace(".","")),10**s[::-1].index("."))
g=lambda a,b:a and(b%a and g(b%a,a)or b//a)

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

Формат: строка должна содержать десятичную точку.

Дрянная Монахиня
источник
.replace(".","")-> .replace(*"._")сохранить 1 байт
tsh
5

Mathematica, 36 байт

Last@*ContinuedFraction@*Rationalize

демонстрация

In[1]:= f = Last@*ContinuedFraction@*Rationalize

Out[1]= Last @* ContinuedFraction @* Rationalize

In[2]:= f[0]

Out[2]= 0

In[3]:= f[0.1]

Out[3]= 10

In[4]:= f[0.2]

Out[4]= 5

In[5]:= f[0.3]

Out[5]= 3

In[6]:= f[0.4]

Out[6]= 2

In[7]:= f[0.5]

Out[7]= 2

In[8]:= f[0.6]

Out[8]= 2

In[9]:= f[0.7]

Out[9]= 3

In[10]:= f[0.8]

Out[10]= 4

In[11]:= f[0.9]

Out[11]= 9

In[12]:= f[1]

Out[12]= 1
Андерс Касеорг
источник
Что происходит без Rationalize?
Грег Мартин
1
@GregMartin Без RationalizeMathematica считает, что нет достаточной точности для генерации всех членов непрерывной дроби. Например, ContinuedFraction[0.1]это просто {0}.
Андерс Касеорг
4

Perl 6 , 42 байта

{($_,{1/($_-.floor)}...*.nude[1]==1)[*-1]}

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

nudeМетод возвращает ню merator и де числителя рационального числа в виде списка из двух элементов. Короче получить знаменатель таким образом, чем denominatorнапрямую вызывать метод.

Шон
источник
4

Haskell , 47 байтов

Это лучше, чем ответ Wheat Wizard, потому что GHC.Realпозволяет нам использовать шаблон для рационального использования :%, а также иметь более короткое имя.

import GHC.Real
f(x:%1)=x
f x=f$1/(x-floor x%1)

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

fпринимает Rationalчисло в качестве входных данных, хотя ghc позволяет записывать их в десятичном формате с определенной точностью.

H.PWiz
источник
4

Haskell , 40 34 байта

Редактировать:

  • -6 байт: @WheatWizard указал, что дробь, вероятно, может быть задана как два отдельных аргумента.

(Не удержался от публикации этого после просмотра ответов на Haskell с подробным импортом - теперь я вижу, что некоторые другие языковые ответы также по существу используют этот метод.)

!принимает два целочисленных аргумента (числитель и знаменатель дроби; они не обязательно должны быть в наименьших терминах, но знаменатель должен быть положительным) и возвращает целое число. Звоните как 314!100.

n!d|m<-mod n d,m>0=d!m|0<1=div n d

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

  • Не обращая внимания на несоответствие типов, то дробная часть n/d(при условии dположительного) является mod n d/d, таким образом , если mod n d==0, !рекурсивно с представлением d/mod n d.
Орджан Йохансен
источник
@WheatWizard Хм, я понял, что пара должна быть парой, а не двумя разными аргументами. Я полагаю, это чересчур хаскелл-ориентированная интерпретация.
Орьян Йохансен
3

Python 3 + sympy , 67 байт

from sympy import*
k=Rational(input())
while k%1:k=1/(k%1)
print(k)

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

Sympy - это символический математический пакет для Python. Поскольку он является символическим, а не двоичным, нет ошибок с плавающей запятой.

HyperNeutrino
источник
2

Желе , 8 байт

®İ$%1$©¿

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

Неточности с плавающей точкой.

Эрик Outgolfer
источник
Удачи в 0,7
Leaky Nun
@LeakyNun Эта удача означает либо бесконечные петли, либо бесконечные петли ...
Эрик Аутгольфер,
Используйте Mдля фиксации с плавающей точкой неточностей: P . Это желе, но с произвольной точностью математики. Не исправляет цикл 0,7.
HyperNeutrino
@HyperNeutrino M - это устаревшая версия Jelly.
Эрик Outgolfer
5 байт
Кэрд coinheringaahing
2

JavaScript ES6, 25 байт

f=(a,b)=>a%b?f(b,a%b):a/b

Позвоните f(a,b)дляa/b

l4m2
источник
Если gcd(a,b)=1можно удалить/b
l4m2
2

Haskell , 62 61 байт

import Data.Ratio
f x|denominator x==1=x|u<-x-floor x%1=f$1/u

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

Использует Data.Ratioбиблиотеку Хаскелла для рациональных рациональных рациональностей. Если бы только встроенные имена были не такими длинными.

Специальный охотник за гарфами
источник
@ H.PWiz Хорошо! Я пытался соответствовать шаблону Data.Ratio. Я никогда не слышал о GHC.Real. Не стесняйтесь размещать это как свой собственный ответ.
Ad Hoc Garf Hunter
1

APL (Dyalog Classic) , 18 байт

{1e¯9>t1|⍵:⍵⋄∇÷t}

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

APL NARS, 18 символов

-1 байт благодаря тесту Уриэля

f←{1e¯9>t1|⍵:⍵⋄∇÷t}
v0 .1 .2 .3 .4 .5 .6 .7 .8 .9 1 3.14
⎕←vf¨v
  0 0  0.1 10  0.2 5  0.3 3  0.4 2  0.5 2  0.6 2  0.7 3  0.8 4  0.9 9  1 1  3.14 7 
RosLuP
источник
⍵-⌊⍵1|⍵за один байт
Уриэль
@ Uriel спасибо ... Так что байты как решение J
RosLuP
1

Smalltalk, 33 байта

[(y:=x\\1)>0]whileTrue:[x:=1/y].x
Леандро Канилья
источник
1

Stax , 8 байт

ç▄é⌠á◙àù

Запустите и отладьте его

«Бонусные баллы» для точности ошибок. Арифметика с плавающей запятой не используется. Это (наконец) использует встроенный рациональный тип Stax.

рекурсивный
источник
0

JavaScript, 70 байт

x=>(y=(x+'').slice(2),p=(a,b)=>b?a%b?p(b,a%b):a/b:0,p(10**y.length,y))

Если мы можем изменить тип ввода на строку, то он может сохранить 5 байтов.

ТТГ
источник
Это не будет работать для чисел> = 10.
Shaggy
@ Shaggy Нужны ли вспомогательные номера> 1?
TSH
Да, он должен работать для любого рационального числа (игнорируя ошибку округления).
Соломон Уко