Змішане число до неправильної дроби


19

Змішане число до неправильної дроби

У цьому виклику ви перетворите змішане число на неправильну дріб.

Оскільки неправильні дроби використовують меншу кількість, ваш код повинен бути якомога коротшим.


Приклади

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 - довільні неотримані цілі числа. Вам не потрібно спрощувати вихід.


Це тому найкоротший код в байтах виграє.


5
Вам слід додати тег "розбір". Я впевнений, що більшість відповідей витратять більше байтів на аналіз вхідних даних та форматування результатів, ніж на виконання математики.
німі

3
Чи може висновок бути раціональним типом чисел чи це повинен бути рядок?
Мартін Ендер

2
@AlexA .: ... але велика частина виклику. Відповідно до його опису, тег слід використовувати в таких випадках.
німі

7
Може x, yі zбути негативним?
Денніс

2
Виходячи з завдання, я припускаю, що він є, але чи введений формат "xy / z" є обов'язковим, або пробіл може бути новим рядком та / або x,y,zрозділеними входами? Більшість відповідей припускають, що формат введення дійсно є обов'язковим x y/z, але деякі - ні, отже, на це питання можна отримати остаточну відповідь.
Kevin Cruijssen

Відповіді:


1

Japt, 10 байт

Woohoo, наразі б'є CJam!

U*W+V+'/+W

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

Як це працює

       // Implicit: [U,V,W] = eval(input). This automatically discards the slash.
U*W+V  // Calculate the new numerator: (whole part * denominator) + numerator.
+'/+W  // Add the slash and the denominator.
       // Implicit: output last expression

Вчора я витратив трохи часу, намагаючись зрозуміти, як заробив 15 відповідей на відповідь, поки не зрозумів: моя перша зелена галочка! \ o /
ETHproductions


7

CJam, 16 15 14 байт

l'/']er~:Xb'/X

або

l'/']er~_@b'/@

Перевірте це тут.

Пояснення

l      e# Read input.
'/']er e# Replace the "/" with a "]".
~      e# Evaluate the string as code. If the input was "i n/d", this pushes [i n] d.
:X     e# Store the denominator in X.
b      e# Treat [i n] as base-d digits. This effectively computes i*d + n.
'/     e# Push a slash.
X      e# Push the denominator.

Інша версія уникає використання змінної, використовуючи трохи більше зміщення стека.


Мені дійсно потрібно більше використовувати базову конверсію в CJam.
Esolanging Fruit

Альтернативна версія: '//~\S/1$b'/@це 13 байт. Редагувати : о, я забув вхід l.
Хром

4

Математика, 58 байт

ToExpression@StringReplace[#," "->"+"]~ToString~InputForm&

Це повертає спрощений результат. Якщо виведення раціонального числа замість рядка нормальне, ми можемо зберегти 19 байт:

ToExpression@StringReplace[#," "->"+"]&

4

PowerShell, 47 44 42 байт

Закреслений 44 все ще є регулярним 44; (

$l,$n,$d=$args-split'\D';"$(+$l*$d+$n)/$d"

Полювали кілька байтів, використовуючи регулярний вираз -split. Полював ще пару завдяки TessellatingHeckler , помінявши регулярний вираз.

Аргумент $args-split'\D'бере наш вхідний аргумент і розбивається на нецифрові символи. Тут він виконує два розколи, один на пробіл, інший на /персонажі. Потім результати зберігаються у трьох змінних за допомогою одночасного призначення. Потім формулюємо рядок виводу як ( eft $lчисло, що перевищує $dзнаменник плюс $nрозмір), виконаний у вигляді кодового блоку, /косою рисою, а потім $dзнову еномінатором.


Привіт, я думаю, що ви можете зробити, -split ' |/'щоб зберегти одного символу з регексом "відповідати або цьому | або іншому", або використовувати -split '\D'для розділення на все, що не є цифрою, і s (h) ave два символи. Якщо @Downgoat готовий бути дещо гнучким у вихідному форматі, '{0}*{2}+{1};{2}'-f($args-split'\D')|iexце 40 байт і має набагато крутіший вихід, оскільки цифри навіть одна над іншою!
TessellatingHeckler

1
@TessellatingHeckler Дякуємо за допомогу у регулярному вираженні. Я попросив Downgoat ввести. Але $l,$n,$d=$args-split'\D';+$l*$d+$n;$dкоротше, але на 37, і логічно слідує тій же схемі, що і тут.
AdmBorkBork

О так, просто математика! (Цього було б достатньо і для того, щоб перемогти відповідь Perl)
TessellingHeckler

3

Java з десятистопним лазерним полюсом 1,03, 79 + 25 (імпорт) = 104 байти

Вимагає import sj224.tflp.math.*;

String m(String[]a){return ""+new BigRational(a[0]).add(new BigRational(a[1]));}

Це майже напевно буде працювати і з 1,04, але поки що я протестував його лише з 1,03, тому що у мене вже траплявся проект java з 1.03 на шляху збирання.


3

JavaScript (ES6), 44 41 байт

m=>([x,y,z]=m.match(/\d+/g),+y+x*z+"/"+z)

Збережено 3 байти завдяки @ETHproductions !

Пояснення

Дуже просто.

m=>
  ([x,y,z]=m.match(/\d+/g), // x, y and z = numbers from input
    +y+x*z                  // numerator
    +"/"+z                  // denominator
  )

Тест

Тест не руйнує завдання для роботи в більшості браузерів.


Приємно! Ви можете використовувати [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)
ETHproductions

@ETHproductions Дякую за пораду! Я насправді розглядав питання про деструктування, але вони не працюють у Chrome, і я не мав Firefox під рукою, щоб перевірити його. : P
user81655

Перший мій перекреслив 44! : D
користувач81655

Можна m.split(/\W/g)замість цього зберегти байт
Kritixi Lithos,

2

Джулія, 58 50 байт

s->eval(parse((r=replace)(r(s," ","+"),"/","//")))

Це анонімна функція, яка приймає рядок і повертає об'єкт Rationalтипу. Щоб зателефонувати, дайте ім’я, наприклад f=s->....

Ми можемо скористатися тим, що введенням можна злегка маніпулювати, щоб бути виразом, який оцінюється як раціональний. Зокрема, ціле число плюс раціональне є раціональним, а раціональні позначаються подвійними косою рисою. Тож якщо ми перетворимось 4 1/2на результат 4+1//2, оцінений результат буде 9//2.

Безголівки:

function f(s::AbstractString)
    # Replace the space in the input with a plus
    r1 = replace(s, " ", "+")

    # Replace the / with //
    r2 = replace(r1, "/", "//")

    # Parse the resulting expression as a rational
    return eval(parse(r2))
end

2

Маленька розмова - 76 символів

Вхід точно відповідає роздільнику масиву та притаманному йому представленню дріб. Якби це було не так багатослівно, це могло б бути серйозним суперником!

Compiler evaluate:'|p|p:=0.#(',FileStream stdin nextLine,')do:[:q|p:=p+q].p'

Це занадто погане спрощення не було вимогою, Smalltalk робить це автоматично!


2

Bash + coreutils, 28

dc<<<${@/\// }sarla*+n47Plap

$@розширюється на всі параметри командного рядка, тому ${@/\// }розширюється на всі параметри командного рядка із /заміненим на , який ставиться на dcs стек. Решта - це проста маніпуляція стеком і арифметика.


2

Haskell , 74 67 63 байт

r=read
f x|(a,(c,s:d):_)<-lex<$>lex x!!0=show(r a*r d+r c)++s:d

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

Пояснення

Як зрозумів H.PWiz , ми можемо використовувати тут лексеми Haskell, щоб розбити рядок на його частини. (Раніше я використовував span(>'/')) І Лайконі зазначив, що <$>працює так само, як і mapSndвід Data.Tuple.

Захист шаблону розбиває наш код на три числа, які ми хочемо використовувати lex. lexвикликає лексеру haskell, щоб відірвати перший маркер. Він повертає список з кожним елементом, який представляє можливий спосіб розбору рядка. Ці елементи є кортежами, перший елемент є першим жетоном, а решта рядка - другим елементом. Оскільки формат введення дуже регулярний, ми будемо мати лише один синтаксичний аналіз, тому ми завжди можемо взяти перший. Перше, що ми робимо, - це посилання lexна вхід

lex x

Потім ми знімаємо його зі свого списку, даючи нам 2-кратні

lex x!!0

Першим жетоном буде вся частина змішаної фракції, залишаючи фракцію, попередньо пробілом для нерухомого розбору. Тоді, оскільки кортежі є, Functorsми можемо використовувати (<$>)псевдонім для fmapнанесення lexна другий елемент кортежу.

lex<$>lex x!!0

Це проїжджає через простір і відриває наступний жетон, чисельник нашої дроби. Тепер ми прив’язуємо це до відповідності шаблону за допомогою <-. Наш зразок такий

(a,(c,s:d):_)

aхапає всю частину дробу, наш перший жетон. :_розгортає список в результаті другого lex. cхапає другий жетон, який ми лексикували, тобто чисельник дробу. Все, що залишається, пов'язане з тим, s:dщо розбиває його на перший символ, гарантований форматом, який буде а, /а залишок, який буде знаменником.

Тепер, коли ми розібрали вхід, робимо фактичні обчислення:

show(r a*r d+r c)++s:d

Де rфункція читання, яку ми зв'язали раніше.

Важливо зауважити, що lexповертається список порожнім, якщо він не працює, і не порожній, якщо він успішний. Чому це не є Maybeя не знаю.



@ H.PWiz Це прекрасне використання lex.
Пшеничний майстер


2
Ви зможете зберегти ще 2, /
збігшись


1

Javascript ES6, 62 байти

p=prompt;b=p(a=+p()).split`/`;alert((+b[1]*a+ +b[0])+"/"+b[1])

1
Дуже приємно! Деякі поради: Ви можете використовувати [b,c]=замість b=, а потім використовувати bзамість b[0]і cзамість b[1]. Крім того, ви можете переставити рівняння, щоб вам зовсім не потрібні дужки: p=prompt;[b,c]=p(a=+p()).split/;alert(+b+c*a+"/"+c)
ETHproductions

1

Perl, 82 61 38 байт

#!perl -paF/\D/
$_=$F[0]*$F[2]+$F[1]."/$F[2]"

Це, ймовірно, може бути більше гольфу.

Зміни

  • Збережено 16 байт, використовуючи регулярний вираз split, а 5 - <>замість <STDIN>.
  • Збережено ще 16 байт завдяки Деннісу.

З шебангом #!perl -paF/\D/(9 байт) ви можете користуватися $_=$F[0]*$F[2]+$F[1]."/$F[2]".
Денніс

@Dennis Я додав це. Дякую!
ASCIIThenANSI

#!perlЧастина притон і перекладу рядка не враховується. Це всього 38 байт.
Денніс

@Dennis О, гаразд. Я зараз це виправлю. (Зі свого боку, я думаю, що це друга найкоротша
неезотерична

1

Математика, 51 байт

Interpreter["ComputedNumber"]@#~ToString~InputForm&

Цікаво, що Mathematica підтримує це за допомогою вбудованого. Якщо дозволено виведення числа, нам знадобиться лише 28 байт:

Interpreter@"ComputedNumber"

1

Ява, 159 148 142 120 110 байт

String m(String[]a){Long b=new Long(a[0]),d=new Long((a=a[1].split("/"))[1]);return b*d+new Long(a[0])+"/"+d;}

Збережено купу байтів завдяки FlagAsSpam.


@FlagAsSpam Готово.
SuperJedi224

@FlagAsSpam Але тоді змінні залишаться незадекларованими!
SuperJedi224

Нехтуйте всім, що я щойно сказав - короткий шлях робити те, що ви робите,Long b=new Long(a[0]),c=new Long((a=a[1].split("/"))[0]),d=new Long(a[1]);
Addison Crump


1

05AB1E , 17 15 байт

#`'/¡R`Š©*+®'/ý

-2 байти завдяки @MagicOctopusUrn .

Спробуйте в Інтернеті або перевірте всі тестові випадки .

Пояснення:

#`         # Split input by spaces and push all items to the stack
           #  i.e. "4 1/2" → "4" and "1/2"
  '/¡      # Push the second item by "/"
           #  i.e. "1/2" → [1,2]
     R`    # Revert the list, and also push all items to the stack
           #  i.e. [1,2] → [2,1] → 2 and 1
Š          # Triple-swap the stack
           #  [4,2,1] → [1,4,2]
 ©         # Store the 2 in the register
  *        # Multiple the top two items
           #  4 and 2 → 8
   +       # Add the top two items
           #  1 and 8 → 9
®          # Push the 2 from the register to the stack again
 '/ý       # Join the two items by "/"
           #  9 and 2 → "9/2"

З гнучким форматом введення x,z,yта виведення , приймаючи цілі числа у порядку та виводячи номінатор та знаменник на окремі рядки, це було б 4 байти (саме тому я додав тег до виклику ..):

*+²»

Спробуйте в Інтернеті або перевірте всі тестові випадки .

Пояснення:

*        # Multiply the first two inputs (x and z)
         #  i.e. 4 and 2 → 8
 +       # Add the third input (y)
         #  i.e. 8 and 1 → 9
  ²      # Take the second input again (z)
   »     # Join the stack by newlines and implicitly print it

@MagicOctopusUrn Дякую, але формат введення відрізняється від опису виклику. Мабуть, формат (як один рядок) 4 1/2є обов'язковим для цього конкретного завдання. В іншому випадку я б використовував свій 4-байтовий версію (або якщо вихід є обов'язковим, але вхід гнучкий Я хотів би використовувати цю 6-byter: *+'/²J)
Кевін Cruijssen


@MagicOctopusUrn О, навіть не знав про " Натисніть всі предмети aв стек " .. о.Ô саме те, що мені потрібно для цього завдання! І розумні з приєднанням "/". Спасибі! :)
Кевін Кройсейсен

Я ненавиджу, використовуючи команду "Push all items of a in the stack", тому що це "" ", і вона не може бути приручена вбудованими кодовими тегами.
Чарівний восьминога Урна

@MagicOctopusUrn Так, це також трохи дратує коментарі (саме тому я цитував " Натисніть на всі предмети aв стек " замість того, щоб використовувати '`'..
Кевін Круїйсен


1

Стакс , 1 байт

+

Запустіть і налагоджуйте його (хоча не так багато для налагодження)

Специфікація виклику говорить "Вам не потрібно спрощувати вихід". Якщо припустити , що це дозволило спростити, тобто вбудовані інструкції в StAX , щоб зробити це. Введення неявно трактується як ціле і раціональне число. +Інструкція розширюється як для раціональних чисел, додавань і спрощує. Результат неявно друкується.


1

Perl 5 з -la -Matature = скажімо, 32 байти 25 байт

m|/|;say$_*$'+$F[1],"/$'"

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

(-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. Дивіться цей мета-пост для поточного консенсусу.
Джузеппе

Гарний підхід! Я просто трохи зайнявся цим і встиг зробити 25-байтну версію: Спробуйте в Інтернеті! . Використання $'було єдиною реальною різницею насправді!
Дом Гастінгс

Комбінація використання як регулярних, так $'і -a- $F[n]для отримання частин рядка - досить гарна ідея, я мушу це пам’ятати! Дякуємо, оновив публікацію.
sundar

0

Луа, 123 байт

m=io.read()z=string x=z.find c=z.sub b=tonumber s=x(m," ")f=x(m,"/")d=c(m,f+1)print(b(c(m,1,s))*b(d)+b(c(m,s,f-1)).."/"..d)

0

Чумацький Шлях 1.6.0 , 31 байт

'" "\="/"\=>;<A;A;:>*;A+"/"+<+!

Закінчився набагато довше, ніж я думав, що це буде.


Пояснення

'" "\="/"\=>;<A;A;:>*;A+"/"+<+!

'                                # read input from the command line
 " "  "/"               "/"      # push a string to the stack
    \    \                       # split the STOS at the TOS
     =    =                      # dump the TOS to the stack
           >       >             # rotate the stack rightward
            ;  ; ;   ;           # swap the TOS and STOS
             <              <    # rotate the stack leftward
              A A     A          # push the integer representation of the TOS
                  :              # duplicate the TOS
                    *            # multiply the STOS by the TOS
                       +   + +   # add the TOS and STOS
                              !  # output the TOS

Використання

./mw <path-to-code> -i <input>



0

Перевірка , 120 байт

>]+>:>32r#v
#d@0+\)  ##:>4;:>5'=:>48-\R-?
dd)R>32-#v
#>15-#v  #?
47r@>@   #v
#dd#v #?
r@>@     #v
    #\d@\: @*@+pd"/"op

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

Я міг би зберегти деякі байти, не намагаючись повторно використовувати цикл розбору (другий рядок). Таким чином я міг би зробити цикл більш конкретним, уникнути величезного безладу умовних умов, і я міг би використовувати регістр для інших речей.



0

C #, 112 байт

s=>{string[]a=s.Split(),b=a[1].Split('/');int o=int.Parse(b[1]);return int.Parse(a[0])*o+int.Parse(b[0])+"/"+o;}

Повна / відформатована версія:

namespace System.Linq
{
    class P
    {
        static void Main()
        {
            Func<string, string> f = s =>
            {
                string[] a = s.Split(), b = a[1].Split('/');
                int o = int.Parse(b[1]);
                return int.Parse(a[0]) * o + int.Parse(b[0]) + "/" + o;
            };

            Console.WriteLine(f("4 1/2"));
            Console.WriteLine(f("12 2/4"));
            Console.WriteLine(f("0 0/2"));
            Console.WriteLine(f("11 23/44"));

            Console.ReadLine();
        }
    }
}



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