Название говорит обо всем. Два входных 32-разрядных натуральных числа m, n >= 2
, вывод gcd(m,n)
в простой форме факторизации.
вход
Аргументы командной строки или 1 строка в порядке, что лучше для гольфа.
Выход
Одиночное пространство, разделенное показателями (без дополнительных пробелов). Ничего не выводить, если входы относительно простые.
Примеры:
$ ./factorize 96 162
2^1 3^1
$ ./factorize 14 15
$ ./factorize 196 294
2^1 7^2
правила
- Вы не можете использовать внешние ресурсы, математические библиотеки или встроенные функции для факторизации или GCD. Примеры: Java, нет
java.lang.Math
. рубин, нетprime_division
, перл, нетfactor
и т. д.
gcd(n,m) == 1
?q:a+.b
или__ q:a+.b
в J нетexternal resources or math libraries
, но я не буду публиковать его, так как это слишком далеко от духа вопроса. Я просто думал, что поделюсь этим здесь.Ответы:
Питон 3,
255250237226188180150142137136 символовУдивительно, насколько я мог сократить это, просто пропустив что-то (например, вы нашли gcd)! Также я мог бы уменьшить еще 10 символов, сделав эту функцию ожидающей 2 дюйма, как и некоторые другие ответы, вместо чтения из стандартного ввода.
источник
while g<a and g<b:
наwhile(g<a)*(g<b):
a%g+b%g
немногоelse:g+=1
может бытьg+=1
, если я что-то упустил.Рубин -
16811711410110097Изменить: подумав об этом, понял, что мне не нужно сито, так как в цикле факторизации учитывается первостепенное значение фактора. Кроме того, как сообщается в ответах других ( я видел это в laindir и Tal , хотя, похоже, что другие тоже это делали), был удален отдельный расчет gcd, поскольку это также происходит при факторизации.
Редактировать 2: не нужно
do
.Редактировать 3: Сжимая его больше.
Изменить 4: Вытащил еще один пробел.
Изменить 5:
upto
вместоeach
;?^ == "^"
!Вывод (то же самое после редактирования):
Конечно, можно сделать лучше, но не плохо для моего первого.
источник
map{|i|i.to_i}
наmap &:to_i
. Вы можете удалить 5-й байт, не считая символ новой строки в конце файла; Руби работает без него.$*
вместоARGV
.Python 2 -
254252196185156151134126121переводчик
repl.it
Пример ввода - stdin
Пример вывода - stdout
источник
…`a`+'^'+`f.count(a)`…
?f.append(i)
дляf+=[i]
сохранения 5 символов.f=''
все еще там?)Ява -
184175Это вдохновлено ответом @Geobits (и небольшим количеством ответа @Tal), но этого достаточно, и я решил создать свой собственный ответ.
Ungolfed (своего рода) с (человеческой проверкой) испытательной оснасткой:
источник
постоянный ток, 96 байт
Он читает одну строку стандартного ввода. Его вывод не заканчивается новой строкой. (РЕДАКТИРОВАТЬ: он также выводит дополнительный пробел после каждой факторизации. Некоторые другие ответы обрезают пробел, но этот не делает.)
Пример:
Код с комментариями:
источник
PowerShell - 82
источник
2..$a
в цикл Foreach-Object%{...}
. Цикл собирает значенияif($p){"$_^$p"}
.JavaScript (ECMAScript 6 Draft) - 89 символов
Преобразует исходный (итеративный) ответ ниже в рекурсивный.
объяснение
Повторный ответ: JavaScript (ECMASCript 6) -
108 (или 121)98 символовВерсия 2:
Версия 1:
Отвечая на вопрос, как первоначально было задано:
Или соблюдать правила изменения после факта:
объяснение
Выход
источник
f(158,237)
пожалуйста" 79^1"
filter()
позвонить?Perl 6: 90 символов, 94 байта
Несколько де-гольф и прокомментировал:
Использование как:
источник
Perl,
1441331181149793Безголовая версия:
Я буквально только начал изучать Perl только для того, чтобы ответить на этот вопрос (это мой первый код на Perl), поэтому я подозреваю, что это может быть продолжено.
источник
foreach
он всегда синонимиченfor
в Perl 5, так что это должно отрезать 4Ява:
247241Отслеживает факторы в массиве и просто выводит их в цикле.
Приличный размер для Java, кажется.
источник
int
, вы теряете 4 к,int
но вы получаете их обратно с помощьюnew int[
->,new Integer[
так что это стирка.n%i<1&&m%i<1
наn%i+m%i<1
.()
. Еслиn==m
это будет по умолчанию вm+1
любом случае.m/=i;i=1;
наm/=i--;
Это будет работать быстрее тоже :)for
цикла?JavaScript (ECMAScript 5)
170164163113Я почти не смог устоять перед лидерством МТ0. Раньше я думал о рекурсии, но, казалось, слишком легко все испортить. И это действительно так. Малейшее изменение разрушает все.
Есть скрипка для тех, кто любит скрипки.
Ungolfed:
Старая версия
Ungolfed:
Вот несколько тестов:
источник
f(301343045, 421880263);
завершилась ошибкой, вероятно, потому что мой браузер не позволит мне использовать эту глубину. Тупой сломанный Firefox!GolfScript, 68 байт
Обратите внимание, что этот подход требует O (b 2 ) времени и пространства для целых чисел «a» и «b».
За счет одного дополнительного байта «только» O (b) время и пространство необходимы:
Как это устроено
источник
Питон 3 (123)
Это использует в основном ту же структуру, что и ответ Тала .
Достаточно выполнить цикл до p = a-1, поскольку мы немедленно увеличиваем, чтобы получить p = a и a> = min (a, b). Если b> a, нет ничего плохого в том, чтобы использовать бесполезные значения p выше a.
В 2.X, я думаю , мы могли бы сохранить символы, печатая каждый кусок , как мы получаем его , а не накапливать строку:
if c:print'%d^%d'%(p,c),
. К сожалению, в Python 3 нет компактного способа печатать без завершающей строки.источник
PHP, 96
источник
p=0;g+=1
в одну строку, начинаяg
с 1 вместо этого, что позволяет вам тогда делать,g<a
а неg<=a
. Я надеюсь, что вы полюбите питона.awk -
1151119685Новая версия может обрабатывать только одну строку ввода. Спасибо durron597 за указание, что мне нужно только убедиться
i <= $1
.Ungolfed:
Ранее мог принимать пары чисел неоднократно
Ungolfed:
источник
&&i<=b
?i > b
, тогдаb % i != 0
... спасибо :)NF=0;
не может удалить $ 1 и $ 2. Вывод из-за тогоecho 301343045 421880263 | awk -f factorize.awk | sed 's/ */ /g'
,5 7 1021^1 59029^1
что $ 1 равен 5, а $ 2 равен 7. Sed сжимает дополнительные пробелы, которые появляются при печати $ 1022, $ 1023, $ 1024, ..., $ 59028 как пустые строки, соединенные пробелами.$0=z;
$0=z;
такое же количество символов, какNF=0;
. Если бы$0=z;
было дольше, я бы сказал вам, чтобы сохранитьNF=0;
.зернышко , 41 байт
Не конкурирующий ответ, так как язык новее, чем вопрос. Но этот показатель GolfScript 68 должен был снизиться.
Вывод заканчивается в пробел; если это проблема, следующая версия также 41 байт (включая
-s
флаг):Отформатированный, с объяснениями:
Пип, в отличие от GolfScript, CJam и соавт. является императивным языком с инфиксными операторами; это также берет вдохновение от языков программирования массива. Эта задача хорошо отображает обе парадигмы на работе.
(Обратите внимание, что для выполнения этого необходим коммит 2015-4-20, так как я только что исправил пару ошибок.)
источник
Python 2 - 262 байта
Строка 6 нуждается в работе.
источник
…`a`+'^'+`f.count(a)`…
?Groovy: 174 символа
Это порт решения Geobits для Groovy 2.2.1:
Вот негольфированная версия:
источник
R: 139
С отступами:
Использование:
источник