Почти полярная противоположность, если это вызов, и я подозреваю, что это будет немного легче.
Ваша задача - взять два целых числа в формате a/b
(формирование рационального числа), а затем вывести число точно в десятичном виде.
Например, если бы вы вводили 1/3
, он бы вывел:
0.33333333333333333
И будет продолжать печатать 3 с до конца времени с необязательным лидирующим нулем (вы также можете печатать один символ в строке, если и только если ваш язык не позволяет печатать в одной строке.)
Поведение для x/0
будет неопределенным. Для числа, которое выглядит так, как будто оно не повторяется (например, скажем 5/4
), оно действительно повторяется. Любая из следующих двух форм будет приемлемой для 5/4
:
1.25000000000000000
1.24999999999999999
(То же самое с целыми числами 1.9999999
или 2.000000
)
Фракция не может быть в своей простейшей форме, a
или b
может быть отрицательным (Примечание -a/b = -(a/b)
, -a/-b = a/b
, a/-b = -a/b
и -.6249999
является недействительным, но -0.6249999
приемлемо, но вы все еще можете использовать.
источник
bc
или это обман?a
и / илиb
быть отрицательным?a
илиb
(или оба) могут быть отрицательными)Ответы:
CJam,
3837 байтКак это устроено
источник
С 108
79Изменить, чтобы работать с отрицательными числами.
Ввод от стандартного ввода. Старый стиль K & R.
источник
Рубин,
83691029189 байтПростая реализация ручного целочисленного деления на основе целочисленного деления компьютера.
Спасибо @blutorange за помощь в игре в гольф.
Изменить: Исправлено решение, чтобы включить отрицательные числа.
источник
->s{a,b=s.split(?/).map &:to_i;$><<a/b<<?.;loop{a=a%b*10;$><<a/b}}
мне просто нравится это в ruby.?/
чтобы обозначать символы, и я не знал,$><<
чтобы напечатать илиloop
ключевое слово. Большое спасибо!!$>
это сокращение от$stdout
, и<<
является оператором. Вы можете сохранить еще один байт во второй строке, изменив его наc*d<0&&$><<?-
; несколько байтов путем объединения 3-й / 4-й строки до$><<a/b<<?.
и еще одного путем удаления пробела после<<
последней строки. И вот идея уменьшить его до 91 байта:->s{a,b=s.scan(/\d+/).map &:to_i;1==s.count(?-)&&$><<?-;$><<a/b<<?.;loop{a=a%b*10;$><<a/b}}
(ruby 2.2.0)$><<a/b
не работал правильно, поэтому я поместил там пробел. Остальное кажется хорошим, большое спасибо!Rational(2,3) == 2/3r
) начиная с ruby 2.1 (который я узнал около 10 минут назад), который можно использовать для сокращения второй строки:eval(s+?r)<0&&$><<?-
Ява,
177176170Алгоритм прост; сложная часть заставляла печать работать. В конце концов, компьютер перестал спать на секунду между каждым шагом, чтобы он мог печатать.
Расширенная, работоспособная версия
источник
R
103137109103Немного счастливее с этим сейчас. Сканирование с разделителем позволяет сэкономить много байтов. Возможно, еще есть место для улучшения. Заменено
<-
на=
. Не всегда было удача с этим, но на этот раз это сработало.Тестовые прогоны
источник
Python 3,
107115 байтДовольно просто:
-1/3
->-0.
)* (Хотя расчет
a
был перемещен внутри цикла, чтобы сохранить несколько байтов.)Редактировать: Исправлена ошибка с отрицательными дробями> -1.
источник
Python 2,7, 209 байт
редактировать:
Теперь выводит все символы в одной строке, как и просили.edit2:
Теперь читает дробь из аргумента командной строки, как требуется :)источник
map
вместо понимания списка экономит совсем немного; 2) не нужны круглые скобкиm*a
в любом из своих мест, так как*
,%
и/
все же приоритет и левоассоциативные; 3) логику 0 или точка в строке 3 можно упростить"0."[m==1]
, поскольку вы все равно просто ее печатаете; 4) вероятно, сохранит символы, чтобы просто установитьo=stdout.write
и преобразовать числовые аргументы в строку с обратными галочками по мере необходимости.1/-3
дает-1.666666666
вместо-0.333333333
.