Полиглоты GCD / LCM!


26

Ваша задача - создать программу или функцию, которая выводит GCD своих входных данных на одном языке и LCM своих входных данных на другом. Встроенные функции для GCD или LCM (я смотрю на вас, Mathematica) разрешены, но не поощряются. Будет 2 входа, которые всегда будут положительными целыми числами, никогда не превышающими 1000.

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

Каждая строка представляет собой один тестовый пример в формате x y => GCD(x,y) LCM(x,y):

1 1 => 1 1
1 2 => 1 2
4 1 => 1 4
3 4 => 1 12
7 5 => 1 35
18 15 => 3 90
23 23 => 23 23
999 1000 => 1 999000
1000 999 => 1 999000
1000 1000 => 1000 1000

Смотрите этот pastebin для всех возможных входов с 0 < x, y < 31. Обратите внимание, что разные версии одних и тех же языков считаются разными языками.


Итак ... ifна основании версии языка, если она хранится в переменной, разрешено?
IllidanS4 хочет вернуть Монику

@ illidanS4 это хорошо.
programmer5000

Ответы:


24

Желе / На самом деле , 2 байта

00000000: 1e 67                                            .g

Это hexdump (xxd) представленной программы. Он не может быть протестирован онлайн, потому что TIO не поддерживает кодировку CP437. @Mego был достаточно любезен, чтобы убедиться, что это работает на Cygwin, который реализует CP437, как и было на самом деле.

Желе: GCD

Jelly использует кодовую страницу Jelly , поэтому видит следующие символы.

œg

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

Как это работает

œявляется неполным токеном и поэтому игнорируется. gэто встроенный в GCD.

На самом деле: LCM

На самом деле использует CP 437 , поэтому он видит следующие символы.

▲g

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

Как это работает

является входом LCM. Поскольку g(GCD) требует двух целочисленных входов, он не выполняется.


27

C / C ++, 79 78 73 байта

Спасибо @ETHproductions за сохранение байта!

int f(int a,int b){int c,d=a*b;for(;a;b=c)c=a,a=b%a;auto e=.5;c=e?d/b:b;}

C рассчитывает GCD: попробуйте онлайн!

C ++ вычисляет LCM: попробуйте онлайн!

В C auto e=.5объявляется целочисленная переменная с классом автоматического хранения (который используется по умолчанию), который затем инициализируется равным 0, тогда как в C ++ 11 он объявляет double, который инициализируется равным 0,5. Таким образом, значение переменной будет истинным в C ++ и ложным в C.

Функция вычисляет GCD с помощью алгоритма Евклида и LCM путем деления произведения a и b на GCD.

Отказ от оператора return работает как минимум на GCC. Приведенное ниже 78-байтовое решение должно работать с любым компилятором:

int f(int a,int b){int c,d=a*b;for(;a;b=c)c=a,a=b%a;auto e=.5;return e?d/b:b;}

1
объяснение было бы круто, если вы можете
кошка

@cat Объяснение добавлено.
Steadybox

1
Если я не ошибаюсь, вы можете сохранить байт с помощьюfor(;a;b=c)c=a,a=b%a;
ETHproductions

@ETHproductions Спасибо! Я знал, что есть причина использовать forвместо while;)
Steadybox

18

На самом деле / Желе , 3 байта

00000000: 11 1c 67                                         ..g

Это hexdump (xxd) представленной программы.

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

На самом деле: GCD

На самом деле использует CP 437 , поэтому он видит следующие символы.

◄∟g

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

Как это работает

     (implicit) Read a and b from STDIN and push them on the stack.
◄    Unassigned. Does nothing.
 ∟   Unassigned. Does nothing.
  g  Pop a and b and push gcd(a,b).
     (implicit) Write the result to STDOUT.

Желе: LCM

Jelly использует кодовую страницу Jelly , поэтому видит следующие символы.

×÷g    

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

Как это работает

×÷g  Main link. Left argument: a. Right argument: b

×      Multiply; yield ab.
  g    GCD; yield gcd(a,b).
 ÷     Division; yield ab/gcd(a,b) = lcm(a,b).

Примечание . Формула gcd (a, b) lcm (a, b) = ab справедлива, поскольку a и b положительны.


1 TIO фактически использует UTF-8 для Actual. Поскольку символы ASCII и символы CP437 0x11 и 0x1c не назначены, программа, тем не менее, работает.


9

Алиса и Желе , 9 байт

Алиса вычисляет LCM:

//L
oi@g

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

То, что похоже на пространство, на самом деле 0x7Fявляется DELуправляющим персонажем.

Желе вычисляет GCD. Поскольку Jelly использует свою собственную кодовую страницу, которая совместима только с печатным ASCII, символ перевода строки и DEL превращаются в ½и перевод строки соответственно:

//L½oi@
g

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

Пояснения

Желе тривиально: первая строка определяет бессмысленную вспомогательную ссылку, вторая строка - это сама программа, и она просто содержит встроенный GCD.

Алиса немного сложнее, но она также использует встроенный:

/   Reflect to SE. Switch to Ordinal.
    While in Ordinal mode, the IP bounces diagonally up and down through the grid.
i   Read all input as a single string.
L   Compute the shortest common superstring of an empty string and the input. That
    is simply the input itself, so this does nothing.
    After two more bounces, the IP hits the top right corner and turns
    around, continuing to bounce up and down while moving west.
L   Still does nothing.
i   Try to read more input, but this simply pushes an empty string.
/   Reflect to W. Switch to Cardinal.
    The IP wraps to the last column.
L   Implicitly discard the empty string and convert the input to two integers.
    Compute their LCM.
/   Reflect to NW. Switch to Ordinal.
    The IP immediately reflects off the top boundary to move SW instead.
o   Implicitly convert the LCM to a string and print it.
    Reflect off the bottom left corner and move back NE.
/   Reflect to S. Switch to Cardinal.
i   Try to read a byte, but we're at EOF, so this pushes -1 instead. Irrelevant.
    The IP wraps back to the first line.
/   Reflect to NE. Switch to Ordinal.
    The IP immediately reflects off the top boundary to move SE instead.
@   Terminate the program.

What looks like a spaceна самом деле не похоже на пространство.
Эрик Outgolfer

Я думаю, что @EriktheOutgolfer зависит от шрифта.
Мартин Эндер

Для меня 0x7F (duh mini-markdown) никогда не выглядело пробелом ни в каком шрифте, по крайней мере, по моему опыту. Но он всегда вставляет этот дополнительный межстрочный интервал ниже линии, в которой он находится ...
Эрик Игрок в гольф

7

Октава / MATLAB, 66 61 байт

@(x,y)gcd(x,y)^(1-2*any(version==82))*(x*y)^any(version==82))

Сохранено 5 байтов благодаря Foon. (x*y)^any()был конечно короче чем 1+(x*y-1)*any().


Ну, по крайней мере, он не использует встроенный для lcm.

Объяснение:

Это использует встроенную функцию gcdдля вычисления Величайшего общего делителя.

В Октаве это возносится к власти 1-2*any(version==82). any(version==82)находится 0в октаву, так что это просто gcd(x,y)^1. Это умножается на (x*y)^any(version==82), или (x*y)^0 = 1.

Для MATLAB, gcdвозводится в силу 1-2*any(version==82). any(version==82)находится 1в MATLAB, так что это gcd(x,y)^-1. Это умножено на (x*y)^any(version==82), или (x*y)^1 = x*y. Это дает наименьшее общее кратное, поскольку lcm(x,y) == x*y/gcd(x,y)для положительных чисел.


5

Желе и MATL , 6 5 байт

ZmD
g

Это полная программа на любом из двух языков. Он вычисляет GCD в Jelly ( Попробуйте онлайн! ) И LCM в MATL ( Попробуйте онлайн! ). Программа MATL завершает работу с ошибкой (разрешенной по умолчанию) после получения правильного вывода.

Используются только символы ASCII, поэтому они соответствуют одинаковым кодированным байтам на двух языках.

Объяснение ГКД в желе

ZmD    Unused link
g      Main link (gets called automatically). Builtin GCD function (g)

Объяснение LCM в MATL

ZmD    Compute LCM (builtin function Zm) and display immediately (D)
g      Tries to implicitly take input to do something with it (depending
       on the type of the input). Since there is no input, it errors out

5

Юлия 0,4 / Юлия 0,5 18 байтов

log.(1)==0?lcm:gcd

Оценивается gcdв Julia 0,4 ( Попробуйте онлайн! ) И lcmв Julia 0,5 ( Попробуйте онлайн! ).

Как это работает

У Юлии 0,4 log.(1) это сокращение для getfield(log,1), которое возвращает ячейку памяти logвстроенной функции, например, указатель Ptr{Void} @0x00007f2846cb6660. Таким образом, результат не равен нулю, сравнение ложно, и выражение оценивается как gcd.

В Julia 0.5 был введен новый синтаксис векторизации функций. log.(1)теперь является сокращением для broadcast(log,1), которое, поскольку 1не является итеративным, просто оценивает log(1). Таким образом, результат равен нулю, сравнение истинно, а выражение оценивается какlcm .


3

Октава / MATLAB, 44 42 41 байт

eval(['@' 'lcm'-[5 0 9]*all(version-82)])

Это определяет анонимную функцию для GCD ( @gcd) в Octave и для LCM ( @lcm) в MATLAB.

Пример в Octave (или попробуйте онлайн! ):

>> eval(['@' 'lcm'-[5 0 9]*all(version-82)])
warning: implicit conversion from numeric to char
ans = @gcd
>> ans(12,16)
ans =  4

Пример в MATLAB:

>> eval(['@' 'lcm'-[5 0 9]*all(version-82)])
ans =
    @lcm
>> ans(12,16)
ans =
    48

1

JS (ES6), CGL (язык игры в гольф CGL) , 31 байт (не конкурирующий)

Функция LCM CGL была добавлена ​​после этого испытания.

 g=(a,b)=>b?g(b,a%b):a
//-LⓍ

То, что выглядит как пробел, на самом деле является неразрывным пробелом, комментарий для CGL. JS вычисляет GCD:

g=(a,b)=>b?g(b,a%b):a

И CGL вычисляет LCM:

//  does nothing
- decrements the current stack number, resulting in it pointing to input
L computes the LCM of the first and second stack items and pushes it to the stack
Ⓧ prints out the last stack item

Попробуйте это:

Snippetify( g=(a,b)=>b?g(b,a%b):a
//-LⓍ
);
<script src="https://programmer5000.com/snippetify.min.js"></script>
<input type = "number">
<input type = "number">

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.