Нечастий факторний номер


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 Так? Ви маєте на увазі кінцеві нулі?
Ерік Аутгольфер

@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 байти довше, ніж у мене вже.
Shaggy

5

J, 18 байт

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

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

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

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

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

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

Пояснення

Це лише пряма реалізація алгоритму, заданого ОП.

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

Пояснення, рішення @ миль

Дуже розумний.

*/@(,%+.)|.&.":
         |.&.":  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 Я люблю under trick
cole

@miles, що хтось справді витончений.
Йона

Чому б не надіслати 15-байтну версію як основне рішення?
Shaggy

@Shaggy Не впевнений. Моя схильність полягала у тому, щоб відповісти "це суттєво відрізняється від мого", але це справді лише дві оптимізації. Я перейду до його оновлення пізніше.
Коул



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

R , 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

GCD Vта U.

²

У квадраті. Неявний вихід отриманого цілого числа.


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

Просто тому, що мені подобається вміти користуватися N.

NpUsw)mxNry)×

Спробуй це


Розумний трюк з GCD. Я думаю, що алгоритм може бути фактично коротшим, ніж поточне рішення Jelly ...
ETHproductions

@ETHproductions У Jelly GCD закінчується довше ...
Erik the Outgolfer

@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 байт

Завдяки i cri everytim .

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.