Необычный номер фактора


15

На основании сообщения чата

Соревнование

Учитывая введенное число n > 9, создайте его наоборот, игнорируя ведущие нули. Затем составьте список всех простых факторов, которые не имеют общего у числа и его обратного . Умножьте эти факторы вместе, чтобы создать необычный номер фактора для ввода.

Или, если выразиться иначе: если rev(n)обозначает десятичное обращение целого числа n, рассчитать произведение на nи rev(n)разделить на квадрат gcd(n, rev(n)).

Выведите это число.

Отработанные примеры

Например, 2244обращается к 4422. Первичные факторы первого есть, [2, 2, 3, 11, 17]а главные факторы обратного [2, 3, 11, 67]. Числа, не являющиеся общими множителями, таковы [2, 17, 67], 2278как и выходные данные.

Для другого примера 1234обращаемся к 4321. Продукт есть 5332114и GCD есть 1, так что выход есть 5332114.

Дальнейшие уточнения

Очевидно, что палиндромное число будет иметь все свои общие факторы с обратным, поэтому в таком случае вывод будет 1( n*n/n^2). Очевидно, что выход также может быть умножением всех факторов (т. Е. Gcd равен 1 - вход и его обратное взаимно простое число), как в случае 1234примера.

правила

  • Можно предположить, что ввод и вывод соответствуют целочисленному типу вашего языка.
  • Вход и выход могут быть предоставлены в любом удобном формате .
  • Либо полная программа или функция приемлемы. Если функция, вы можете вернуть вывод, а не распечатать его.
  • Если возможно, укажите ссылку на среду онлайн-тестирования, чтобы другие люди могли опробовать ваш код!
  • Стандартные лазейки запрещены.
  • Это поэтому применяются все обычные правила игры в гольф, и выигрывает самый короткий код (в байтах).

Примеры

in
out

17
1207

208
41704

315
1995

23876
101222302

Можем ли мы предположить, что на входе не будет начальных нулей?
г-н Xcoder

1
@ Mr.Xcoder А? Вы имеете в виду конечные нули?
Эрик Outgolfer

@EriktheOutgolfer Нет, именно то, что я имею в виду, это начальные нули. Также
мистер Xcoder

3
Второй контрольный пример должен быть 1995(я считаю)
г-н Xcoder

1
@ LuisMendo Спасибо. Хорошее дополнение.
AdmBorkBork

Ответы:


6

05AB1E , 6 байтов

Код

‚D¿÷P

Использует кодировку 05AB1E . Попробуйте онлайн!

объяснение

‚        # Get the array [input, reversed(input)]
  D       # Duplicate that array
   ¿      # Calculate the GCD of the array
    ÷     # Divide each element in the array by the GCD
     P    # Product of that array

Хорошая, простая альтернатива формуле, представленной в задании - +1. Пробовал то же самое в Japt, но получилось на 2 байта длиннее, чем у меня уже было.
Лохматый

5

J, 18 байт

".@|.@":(*%*:@+.)]

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

В качестве альтернативы (заслуга подхода @ Аднана для второго),

".@|.@":(*%2^~+.)]
".@|.@":*/@(,%+.)]

J, 15 байт (решение @ миль)

*/@(,%+.)|.&.":

объяснение

Это просто прямая реализация алгоритма, заданного ОП.

".@|.@":(*%*:@+.)]
                 ]  n (input)
".@|.@":            n reversed
         *          Product of the two
          %         Divided by
              +.      GCD
           *:         Squared

Пояснение, решение @ miles

Очень умно.

*/@(,%+.)|.&.":
         |.&.":  Reverse digits
           &.":   Convert to string, apply next function, and undo conversion
         |.       Reverse
   (,%+.)        Divide n and reverse(n) by GCD of both
*/               Product

2
15 байтов с*/@(,%+.)|.&.":
милями

@ Miles Я люблю подвох
Коул

@ Майлз, что один действительно гладкий.
Иона

Почему бы не представить 15-байтовую версию в качестве основного решения?
Лохматый

@ Шэгги Не уверен. Я хотел ответить «это значительно отличается от моего», но на самом деле это всего лишь две оптимизации. Я обновлю это позже.
Коул



2

JavaScript (ES7), 67 64 байта

Так много байтов просто чтобы поменять число :(

Принимает ввод в виде строки.

n=>n*(x=[...n].reverse().join``)/(g=(y,z)=>z?g(z,y%z):y)(n,x)**2

Попытайся

o.innerText=(f=
n=>n*(x=[...n].reverse().join``)/(g=(y,z)=>z?g(z,y%z):y)(n,x)**2
)(i.value="10");oninput=_=>o.innerText=f(i.value)
<input id=i min=10 type=number><pre id=o>



2

р , 108 89 байт

-19 байт благодаря планнапу за его алгоритм gcd

function(n){k=1:nchar(n)-1
q=1:n
(r=sum(n%/%10^k%%10*10^rev(k)))*n/max(q[!r%%q&!n%%q])^2}

Это попытается выделить хотя бы один вектор размера 4*n байтов (а я думаю, что целых 4), поэтому это приведет к ошибке памяти для достаточно большого размера n.

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






1

Japt , 13 12 11 байт


sw
*V/yU ²

Попытайся


объяснение

Неявный ввод целого числа U. Пустая строка в начале, предотвращает перезапись следующей строкиU

sw

Преобразовать Uв строку ( s), обратить ее ( w), преобразовать обратно в целое число и присвоить переменной V.

*V

Умножить Uна V.

/

Делить.

yU

ГКД Vи U.

²

Squared. Неявный вывод результирующего целого числа.


Альтернатива, 13 байт

Просто потому, что мне нравится в использовании N.

NpUsw)mxNry)×

Попытайся


Умный трюк с GCD. Я думаю, что алгоритм на самом деле может быть короче, чем текущее решение Jelly ...
ETHproductions

@ETHproductions In Jelly GCD заканчивается тем, что он длиннее ...
Эрик Игрок в гольф

@EriktheOutgolfer У меня "есть" 8-байтовая версия, но это включает в себя разделение результатов двух диад, и я не уверен, как это правильно сделать ...
ETHproductions


1

Машинный код x86, 39 байт

;;; Obtain a "reversed" version of the input value.
;;; 
;;; To do this, each iteration of a loop, we take the input value modulo 10,
;;; add that to our accumulator (EDI), multiply the accumulator by 10, and
;;; divide the input value by 10. x86's DIV instruction does both modulo and
;;; division as a single operation, with the cost of clobbering two output
;;; registers (EAX and EDX). We clobber the input value throughout the loop
;;; (the way we know we're done is when it becomes 0---that means that we have
;;; pulled all of the digits off of it), so we need to save a copy of it first.
89 C8           mov    eax, ecx     ; make copy of input
31 FF           xor    edi, edi     ; clear accumulator
6A 0A           push   10
5E              pop    esi          ; set ESI to 10
             Reverse:
0F AF FE        imul   edi, esi     ; accumulator *= 10
99              cdq                 ; zero EDX in preparation for division
F7 F6           div    esi          ; EDX:EAX / 10 (EAX is quot, EDX is rem)
01 D7           add    edi, edx     ; accumulator += remainder
85 C0           test   eax, eax     ; was quotient 0?
75 F4           jnz    Reverse      ; if not, keep looping and extracting digits

;;; At this point, EAX is 0 (clobbered throughout the loop),
;;; ECX still contains a copy of our original input, and
;;; EDI contains the 'reversed' input.
89 C8           mov    eax, ecx     ; make another copy of the input
F7 E7           mul    edi          ; multiply input (implicit EAX operand)
                                    ;  by 'reversed', with result in EDX:EAX
                                    ;  (note: EDX will be 0)

;;; Compute the greatest common denominator (GCD) of the input and
;;; the 'reversed' values, using a subtraction-based algorithm.
             GCD_0:
39 CF           cmp    edi, ecx     ; compare the two values
72 02           jb     GCD_1        ; go to GCD_1 if less than
87 F9           xchg   ecx, edi     ; swap values
             GCD_1:
29 F9           sub    ecx, edi     ; subtract
75 F6           jnz    GCD_0        ; if sum != 0, go back to the top

;;; Square the GCD.
0F AF FF        imul   edi, edi

;;; Divide the product of input and 'reversed' by the square of the GCD.
;;; Remember from above that the product of input and 'reversed' is in
;;; the EAX register, and we can assume EDX is 0, so we don't need to do
;;; a CDQ here in preparation for the division. Using EAX as the implicit
;;; source operand saves us a byte when encoding DIV.
F7 F7           div    edi

;;; The DIV instruction placed the quotient in EAX,
;;; which is what we want to return to the caller.
C3              ret

Вышеприведенная функция вычисляет «необычное число факторов» указанного входного параметра. В соответствии с соглашением о вызовах __fastcall на основе регистров параметр передается в ECXрегистр. Результат возвращается в EAXрегистр, как и во всех соглашениях о вызовах x86.

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

Это заняло очень много времени, чтобы написать в такой компактной форме, но это было забавное упражнение. Множество искажений для получения наиболее оптимального возможного планирования регистров в рамках ограничений DIVнеявных операндов инструкции x86 и попытки использовать короткие кодировки MULи XCHGинструкции, когда это возможно. Мне было бы очень любопытно посмотреть, может ли кто-нибудь придумать другой способ сократить его дальше. Мой мозг был довольно жарен к концу. Спасибо компилятору в следующий раз, когда вы его увидите! (Хотя это намного лучший код, чем тот, который генерирует компилятор ... Особенно, если вы немного подправили его без ограничений по размеру, удалив такие вещи, как XCHG.)




0

Python 2 , 70 байт

Спасибо мне всем .

def f(n):g=int(`n`[::-1]);print n*g/gcd(n,g)**2
from fractions import*

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

Python 2 , 77 байт

Обратите внимание, что в Python 2 вы не можете использовать math.gcd()метод, и вы должны сделать это «вручную».

y=lambda a,b:b and y(b,a%b)or a
def f(n):g=int(`n`[::-1]);print n*g/y(n,g)**2

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


Python 3 имеет gcdкак fractions.gcd.
полностью человек

@icrieverytim Вот почему я решил решить эту проблему в Python 2.
Г-н Xcoder

... Упс, я имел в виду Python 2. Python 3 имеет math.gcd.
полностью человек

@icrieverytim сделано.
г-н Xcoder


0

Ява 8, 158 150 148 138 125 123 116 107 + 19 байт

i->{int o,r,f,t=f=i;i=r=i.valueOf(""+new StringBuffer(t+"").reverse());while(t>0)t=i%(i=t);return f/i*r/i;}

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


1
В цикле while вы можете заменить t!=0на t>0, так как t никогда не будет отрицательным. f*r/(i*i)так же, как f/i*r/i. Вы можете отказаться, f=t;и r=i;если вы цепочки назначения iи t.
Люк

1
Цикл while может быть записан как while(t>0)t=i%(i=t);(-11 байт).
Неваи,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.