Смешанное число до неправильной дроби
В этом задании вы будете конвертировать смешанное число в неправильную дробь.
Поскольку в неправильных дробях используется меньшее число, ваш код должен быть максимально коротким.
Примеры
4 1/2
9/2
12 2/4
50/4
0 0/2
0/2
11 23/44
507/44
Спецификация
Вы можете предположить, что знаменатель входных данных никогда не будет равен 0. Входные данные всегда будут иметь формат, x y/z
где x, y, z - произвольные неотрицательные целые числа. Вам не нужно упрощать вывод.
Это код-гольф, поэтому выигрывает самый короткий код в байтах.
code-golf
number
parsing
rational-numbers
Downgoat
источник
источник
x
,y
иz
быть отрицательным?x,y,z
разделенными входами? Большинство ответов предполагают, что входной формат действительно обязателенx y/z
, но некоторые нет, поэтому на этот вопрос можно дать однозначный ответ.Ответы:
Japt, 10 байт
Woohoo, в настоящее время побеждает CJam!
Попробуйте онлайн!
Как это устроено
источник
LabVIEW, 29 примитивов LabVIEW
источник
CJam,
161514 байтовили
Проверьте это здесь.
объяснение
Другая версия избегает использования переменной, используя немного большее смещение стека.
источник
'//~\S/1$b'/@
это 13 байтов. Редактировать : о, я забыл вводl
.Mathematica, 58 байт
Это возвращает упрощенный результат. Если вывести рациональное число вместо строки нормально, мы можем сохранить 19 байтов:
источник
PowerShell,
474442 байтВычеркнуто 44 все еще регулярно 44; (
Гольф пару байтов с помощью регулярных выражений
-split
. Гольф еще пару благодаря TessellatingHeckler путем замены регулярного выражения.Он
$args-split'\D'
принимает наш входной аргумент и разделяется на нецифровые символы. Здесь он выполняет два разбиения, одно на пробел, другое на/
символ. Затем результаты сохраняются в трех переменных с использованием одновременного назначения. Затем мы формулируем вывод строки как (число$l
eft, умноженное на$d
знаменатель плюс$n
умератор), выполненный как блок кода,/
косая черта, а затем$d
снова знаменатель.источник
-split ' |/'
чтобы сохранить один символ с регулярным выражением «соответствует либо |, либо», или использовать-split '\D'
для разделения на что-либо, что не является цифрой и s (h) имеет два символа. Если @Downgoat желает быть немного гибким в выходном формате, он'{0}*{2}+{1};{2}'-f($args-split'\D')|iex
составляет 40 байтов и имеет намного более холодный вывод, потому что числа даже одно над другим!$l,$n,$d=$args-split'\D';+$l*$d+$n;$d
еще короче на 37 и логически следует той же схеме, что и здесь.Ява с десятифутовым лазерным полюсом 1,03, 79 + 25 (импорт) = 104 байта
требует
import sj224.tflp.math.*;
Это почти наверняка будет работать и с 1.04, но до сих пор я тестировал его только с 1.03, потому что мне уже довелось установить java-проект с 1.03 в пути сборки.
источник
JavaScript (ES6),
4441 байтСохранено 3 байта благодаря @ETHproductions !
объяснение
Очень просто.
Тестовое задание
Тест без деструктурирующего задания для работы в большинстве браузеров.
Показать фрагмент кода
источник
[p,q,r]=
вместоp=
, а затем заменитьp[0]
,p[1]
иp[2]
сp
,q
иr
, соответственно. После этого изменения я получаю 41:m=>([p,q,r]=m.match(/\d+/g),+q+p*r+"/"+r)
m.split(/\W/g)
вместо этого, чтобы сохранить байтЮлия,
5850 байтЭто анонимная функция, которая принимает строку и возвращает
Rational
объект типа. Чтобы назвать его, дайте ему имя, напримерf=s->...
.Мы можем воспользоваться тем фактом, что вводом можно слегка манипулировать, чтобы он стал выражением, которое оценивается как рациональное. В частности, целое число плюс рациональное является рациональным, а рациональные обозначаются двойными косыми чертами. Поэтому, если мы перейдем
4 1/2
к4+1//2
, оцененный результат будет9//2
.Ungolfed:
источник
Smalltalk - 76 символов
Входные данные точно соответствуют разделителю массива и представлению дробной части Smalltalk. Если бы это не было так многословно, это могло бы стать серьезным соперником!
Это слишком плохое упрощение не было требованием, Smalltalk делает это автоматически!
источник
Bash + coreutils, 28
$@
расширяется до всех параметров командной строки, поэтому${@/\// }
расширяется до всех параметров командной строки с/
заменой на, которая помещается в
dc
стек. Остальное - простое манипулирование стеком и арифметика.источник
Haskell ,
746763 байтаПопробуйте онлайн!
объяснение
Как выяснил H.PWiz , мы можем использовать лексер Haskell, чтобы разбить строку на части. (Ранее я использовал
span(>'/')
) И Лайкони указал, что<$>
работает так же, как иmapSnd
изData.Tuple
.Паттерн-охранник разбивает наш код на три числа, которые мы хотим использовать
lex
.lex
вызывает лексера haskell, чтобы разорвать первый токен. Возвращает список с каждым элементом, представляющим возможный способ разбора строки. Эти элементы являются кортежами, причем первый элемент является первым токеном, а остальная часть строки - вторым элементом. Теперь, поскольку формат ввода очень регулярный, у нас будет только один разбор, поэтому мы всегда можем взять первый. Первое, что мы делаем, это вызываемlex
на входеЗатем мы разворачиваем его из списка, давая нам 2-кортеж
Первым маркером будет вся часть смешанной фракции, оставляющая фракцию с добавленным пробелом для анализа. Тогда, поскольку кортежи есть,
Functors
мы можем использовать(<$>)
псевдоним дляfmap
примененияlex
ко второму элементу кортежа.Это проглатывает пространство и обрывает следующий токен, числитель нашей дроби. Теперь мы привязываем это к сопоставлению с образцом, используя
<-
. Наш образецa
захватывает всю часть дроби, наш первый жетон.:_
разворачивает список, полученный в результате нашего второгоlex
.c
берет второй лексем, который мы лексировали, это числитель дроби. Все, что остается, связано с тем,s:d
что разделяет его на первый символ, гарантированный форматом/
а остальная часть будет знаменателем.Теперь, когда мы проанализировали вход, мы делаем фактические вычисления:
Где
r
функция чтения, которую мы связали ранее.Важно отметить, что
lex
возвращает список пустым, если он терпит неудачу, и непустым, если он успешен. Почему это неMaybe
я не знаю.источник
/
Javascript ES6, 62 байта
источник
[b,c]=
вместоb=
, а затем использоватьb
вместоb[0]
иc
вместоb[1]
. Кроме того, вы можете переставить уравнение так, чтобы вам вообще не нужны круглые скобки:p=prompt;[b,c]=p(a=+p()).split
/;alert(+b+c*a+"/"+c)
Perl,
826138 байтЭто, вероятно, может быть в гольф больше.
изменения
split
, и 5 с использованием<>
вместо<STDIN>
.источник
#!perl -paF/\D/
(9 байт), вы можете использовать$_=$F[0]*$F[2]+$F[1]."/$F[2]"
.#!perl
Часть притон и перевода строки не учитывается. Это всего 38 байтов.Mathematica, 51 байт
Интересно, что Mathematica поддерживает это с помощью встроенного. Если разрешен вывод числа, то нам нужно только 28 байтов:
источник
Ява,
159148142120110 байтБлагодаря FlagAsSpam сохранено несколько байтов.
источник
Long b=new Long(a[0]),c=new Long((a=a[1].split("/"))[0]),d=new Long(a[1]);
ARBLE , 13 байт
Попробуйте онлайн!
источник
"x y/z"
является обязательным для этой конкретной задачи, но на всякий случай я попросил OP подтвердить.05AB1E ,
1715 байт-2 байта благодаря @MagicOctopusUrn .
Попробуйте онлайн или проверьте все контрольные примеры .
Объяснение:
С гибким форматом ввода и вывода, принимая целые числа в порядке
x,z,y
и выводя знаменатель и знаменатель в разделенных строках, это будет 4 байта (именно поэтому я добавил в задачу синтаксический анализ -tag ...):Попробуйте онлайн или проверьте все тесты .
Объяснение:
источник
4 1/2
является обязательным для этой конкретной задачи. В противном случае я бы использовал свой 4-байтовый версию (или если выход является обязательным, но вход гибкий Я хотел бы использовать эту 6-byter:*+'/²J
)a
в стек » ... o.Ô Именно то, что мне было нужно для этого испытания! И умный с присоединением "/". Благодарность! :)a
в стек » вместо использования'`'
..Python 3 ,
7876 байтПопробуйте онлайн!
источник
return'%s/'%(int(a)*int(c)+int(b))+c
на 2 байта корочеStax , 1 байт
Запустите и отладьте его (хотя отладки не так много)
В спецификации задачи сказано: «Вам не нужно упрощать вывод». Если предположить , что это позволило упростить, то есть встроенные инструкции в StAX , чтобы сделать это. Входные данные неявно интерпретируются как целое и рациональное число.
+
Инструкция расширяется как для рациональных чисел, добавлений и упрощает. Результат неявно печатается.источник
Perl 5 с -la -Mfeature = скажем,
32 байта25 байтовПопробуйте онлайн!
(-7 байт благодаря Дому Гастингсу)
$_
является целым входомx y/z
, который оценивает значениеx
в числовом контексте (как*
здесь).$'
строка регулярного выражения после совпадения, которая здесь содержит все, что следует после/
- такz
,. Чтобы получитьy
значение, мы используем-a
флаг, который разделяет входные данные на пробелы и помещает их в@F
массив. Итак, здесь,@F = ("x", "y/z")
что означает,$F[1]="y/z"
что вычисляется вy
числовом контексте (посколькуy
это начальная непрерывная последовательность цифр с$F[1]
).источник
-p
флаг в вашем количестве байтов; вместо этого вы считаете языкPerl 5 with -p flag, 32 bytes
. Смотрите этот мета-пост для текущего консенсуса.$'
было единственной реальной разницей там на самом деле!$'
и-a
-$F[n]
для получения частей строки - довольно хорошая идея, я должен помнить это! Спасибо, обновил пост.Луа, 123 байта
источник
Млечный Путь 1.6.0 , 31 байт
Закончилось гораздо дольше, чем я думал.
объяснение
использование
источник
Python 2.7, 88 байт
Попробуйте онлайн !
Вы должны ввести ввод в кавычках.
Наверное, не самый лучший ...
источник
С, 64
Читает ввод из STDIN. Я думаю, что это довольно очевидно.
источник
Чек , 120 байт
Попробуйте онлайн!
Я мог бы сохранить некоторые байты, не пытаясь повторно использовать цикл синтаксического анализа (вторая строка). Таким образом я мог бы сделать цикл более конкретным, избежать огромного беспорядка условий и использовать регистр для других целей.
источник
Рубин , 23 байта
Попробуйте онлайн!
источник
C #, 112 байт
Полная / Отформатированная версия:
источник
APL (Dyalog Unicode) , 31 байт
Попробуйте онлайн!
Спасибо ngn за
⊃⊥1∘↓
трюкисточник
PHP, 65 байт
Попробуйте онлайн
Код
объяснение
источник
Java 10, 87 байт
Лямбда из
String
вString
.Попробуйте онлайн
источник