드문 요인 번호


15

채팅 메시지를 기반으로

도전

입력 숫자가 주어지면 n > 9선행 0을 무시하고 역수를 구성하십시오. 그런 다음 숫자와 그 반대의 공통점 이없는 모든 주요 요인의 목록을 구성하십시오 . 해당 요인을 곱하여 입력 의 흔하지 않은 요인 번호 를 만듭니다 .

경우 : 또는, 다른 방법을 넣어 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)입니다. 분명히, 1234예제 의 경우와 같이 출력이 모든 요소의 곱셈이 될 수도 있습니다 (즉, gcd는 1-입력과 그 역은 공동-프라임) .

규칙

  • 입력 및 출력은 언어의 기본 정수 유형에 맞는 것으로 가정 할 수 있습니다.
  • 입력 및 출력은 편리한 형식으로 제공 될 수 있습니다 .
  • 전체 프로그램 또는 기능이 허용됩니다. 함수 인 경우 출력하지 않고 출력을 반환 할 수 있습니다.
  • 가능하면 다른 사람들이 귀하의 코드를 시험해 볼 수 있도록 온라인 테스트 환경에 대한 링크를 포함하십시오!
  • 표준 허점 은 금지되어 있습니다.
  • 이것은 이므로 모든 일반적인 골프 규칙이 적용되며 가장 짧은 코드 (바이트)가 이깁니다.

in
out

17
1207

208
41704

315
1995

23876
101222302

입력에 선행 0이 없다고 가정 할 수 있습니까?
Mr. Xcoder

1
@ Mr.Xcoder 허? 후행 0을 의미합니까?
Outgolfer Erik

@EriktheOutgolfer 아니요, 0을 나타내는 것은 정확히 의미합니다. 또한
씨 Xcoder

3
두 번째 테스트 사례는 1995(믿습니다)
Mr. 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 바이트

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

온라인으로 사용해보십시오!

또는 (두 번째 방법에 대한 @Adnan의 접근 방식에 대한 신용),

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

J, 15 바이트 (@miles의 솔루션)

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

설명

이것은 OP에서 제공하는 알고리즘의 간단한 구현입니다.

".@|.@":(*%*:@+.)]
                 ]  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 바이트*/@(,%+.)|.&.":
마일

@ 마일 나는 속임수를 좋아한다
cole

@ 마일은 정말 매끄 럽습니다.
요나

15 바이트 버전을 기본 솔루션으로 제출해보십시오.
얽히고 설킨

@Shaggy 확실하지 않습니다. 내 성향은 "나와는 상당히 다르다"라는 응답을하는 것이지만 실제로는 두 가지 최적화 일뿐입니다. 나중에 업데이트하겠습니다.
cole



2

자바 스크립트 (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 바이트

gcd 알고리즘에 대한 plannapus 덕분에 -19 바이트

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변환 하고 ( ) 다시 정수로 변환 한 다음 variable에 할당하십시오 V.

*V

곱하기 UV.

/

나누기.

yU

의 GCD VU.

²

제곱. 결과 정수의 내재적 출력.


대안, 13 바이트

내가 사용할 수 있기 때문에 N.

NpUsw)mxNry)×

시도 해봐


GCD와 스마트 트릭. 알고리즘이 현재 Jelly 솔루션보다 실제로 짧을 수 있다고 생각합니다 ...
ETHproductions

@ETHproductions 젤리에서 GCD는 더 길어집니다 ...
Outgolfer Erik

@EriktheOutgolfer 8 바이트 버전을 "가지고"있지만 여기에는 두 개의 dyad 결과를 나누는 것이 포함되며 제대로 수행하는 방법을 잘 모르겠습니다 ...
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 호출 규칙과 마찬가지로 결과가 레지스터에 반환됩니다 .

온라인으로 사용해보십시오!

이렇게 컴팩트 한 형식으로 작성하는 데 끔찍한 시간이 걸렸지 만 재미있는 운동이었습니다. x86 DIV명령어의 암시 적 피연산자의 제약 조건 내에서 MUL그리고 XCHG가능한 한 짧은 인코딩 과 명령어 를 사용하려고 할 때 가장 최적의 레지스터 스케줄링을 얻기 위해 많은 왜곡이 발생 합니다. 누군가가 그것을 더 단축시키는 다른 방법을 생각할 수 있는지 궁금합니다. 내 뇌는 결국 튀겨졌습니다. 다음에 컴파일러를 보시면 감사합니다! (이 있지만 방법 이 같은 것들을 제거, 크기 제한없이 약간 불통 특히 경우 ... 컴파일러가 생성하는 것보다 더 나은 코드 XCHG.)




0

파이썬 2 , 70 바이트

나는 모든 사람을 울고 덕분에 .

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

온라인으로 사용해보십시오!

파이썬 2 , 77 바이트

파이썬 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

온라인으로 사용해보십시오!


파이썬 3은 다음 gcd과 같습니다 fractions.gcd.
완전히 인간적인

@icrieverytim 그렇기 때문에 파이썬 2
에서이

... 누구, 나는 파이썬 2를 의미했다 math.gcd.
완전히 인간적인

@icrieverytim 님이 완료했습니다.
Mr. 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>0t가 음수 수 없을 것이기 때문이다. f*r/(i*i)와 동일합니다 f/i*r/i. 당신은 놓을 수 f=t;r=i;당신의 임무를 체인 경우 it.
누가

1
while 루프는 while(t>0)t=i%(i=t);(-11 바이트) 로 쓸 수 있습니다 .
Nevay
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.