Повторна відповідь


11

Що потрібно зробити, це створити функцію / програму, яка приймає десятковий як вхідний і виводить результат багаторазового взяття зворотної дробової частини числа, поки число не стане цілим числом.

Більш конкретно, процес полягає в наступному:

  1. Нехай x - вхід

  2. Якщо x - ціле число, виведіть його.

  3. В іншому випадку: . Поверніться до 2.x1frac(x)

frac(x)x x - x x 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 Garf Hunter

4
Чи можемо ми взяти два цілі числа як вхідні дані, щоб представити раціональне число?
Leaky Nun

1
Це дорівнює кінцевому елементу простої тривалої частки введення.
isaacg

Відповіді:


5

J, 18 байт

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

У J ідіома u ^: v ^:_означає "Продовжуйте застосовувати дієслово, uколи умова vповертається як істинна.

У нашому випадку умова закінчення визначається гачком ~:<., що означає "підлогу числа <.не дорівнює ~:самому числу" - тому ми зупинимось, коли головне дієслово uповерне int.

uу цьому випадку є ще один гак -<.- число мінус його підлогу - повернене значення якого подається у @зворотне дієслово %.

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


Також 18, але мають деякі точкові неточності плавучі з - за допуски імовірно: _2{(%@-<.) ::]^:a:.
коул

%@|~&1^:(~:<.)^:_
FrownyFrog


5

Математика, 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 Без Rationalize, Mathematica вважає недостатньою точністю для генерування всіх доданків тривалої дроби. Наприклад, ContinuedFraction[0.1]просто {0}.
Anders Kaseorg

4

Perl 6 , 42 байти

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

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

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


4

Haskell , 47 байт

Це перемагає відповідь майстра пшениці, тому що GHC.Realдозволяє нам узгоджувати відповідність за раціональними, використовуючи :%, як і коротше ім'я

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

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

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


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 Добре, я трактував "пару" як пар, а не два чіткі аргументи. Я вважаю, що це занадто орієнтоване на Хаскелл тлумачення.
Ørjan Johansen



2

Желе , 8 байт

®İ$%1$©¿

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

Неточності з плаваючою комою.


Удачі для 0,7
Leaky Nun

@LeakyNun Ця удача означає або нескінченні петлі, або нескінченні петлі ...
Erik the Outgolfer

Використовуйте Mдля фіксації з плаваючою точкою неточностей: P . Це желе, але з довільною математикою точності. Не виправляється 0,7 циклу, хоча.
HyperNeutrino

@HyperNeutrino M - це застаріла версія Jelly.
Ерік Аутгольфер


2

JavaScript ES6, 25 байт

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

виклик f(a,b)дляa/b


Якщо 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бібліотеку Haskell для раціональної точності раціоналізації. Якби тільки вбудовані назви були не такі довгі.


@ H.PWiz Приємно! Я намагався співставити з ними Data.Ratio. Я ніколи не чув GHC.Real. Сміливо публікуйте це як власну відповідь.
Спеціальний мисливець на Garf Garf


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 

⍵-⌊⍵1|⍵на один байт
Уріель

@Uriel дякую ... Тож байти як рішення J
RosLuP



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

Так, він повинен працювати для будь-якого раціонального числа (ігноруючи помилку округлення).
Соломон Учко
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.