Niezbyt często liczba czynników


15

Na podstawie wiadomości czatu

Wyzwanie

Biorąc pod uwagę liczbę wejściową n > 9, konstruuj jej odwrotność, ignorując początkowe zera. Następnie zbuduj listę wszystkich czynników pierwszych, których liczba i jej odwrotność nie mają ze sobą wspólnego. Pomnóż te czynniki razem, aby utworzyć niepospolity numer czynnika wejściowego.

Innymi słowy: jeśli rev(n)oznacza dziesiętne odwrócenie liczby całkowitej n, obliczyć iloczyn ni rev(n)podzielony przez kwadrat liczby gcd(n, rev(n)).

Podaj tę liczbę.

Sprawdzone przykłady

Na przykład 2244odwraca do 4422. Pierwszymi czynnikami pierwszego są, [2, 2, 3, 11, 17]a pierwszymi czynnikami odwrotnymi są [2, 3, 11, 67]. Liczby, które nie są wspólne [2, 17, 67], 2278to również wynik.

W innym przykładzie 1234odwraca się do 4321. Produkt jest, 5332114a GCD jest 1, więc wyjście jest 5332114.

Dalsze wyjaśnienia

Oczywiście liczba palindromowa będzie miała wszystkie swoje czynniki wspólne z jej odwrotnością, więc w takim przypadku wynikiem jest 1( n*n/n^2). Oczywiście, możliwe jest również, że wyjście będzie zwielokrotnieniem wszystkich czynników (tj. Gcd wynosi 1 - wejście i jego odwrotność są równe-pierwsze), tak jak w 1234przykładzie.

Zasady

  • Można założyć, że dane wejściowe i wyjściowe pasują do natywnego typu liczb całkowitych twojego języka.
  • Dane wejściowe i wyjściowe można podawać w dowolnym dogodnym formacie .
  • Dopuszczalny jest pełny program lub funkcja. Jeśli funkcja, możesz zwrócić dane wyjściowe zamiast je drukować.
  • Jeśli to możliwe, dołącz link do internetowego środowiska testowego, aby inne osoby mogły wypróbować Twój kod!
  • Standardowe luki są zabronione.
  • To jest więc obowiązują wszystkie zwykłe zasady gry w golfa, a wygrywa najkrótszy kod (w bajtach).

Przykłady

in
out

17
1207

208
41704

315
1995

23876
101222302

Czy możemy założyć, że dane wejściowe nie będą miały zer wiodących?
Pan Xcoder,

1
@ Mr.Xcoder Huh? Masz na myśli końcowe zera?
Erik the Outgolfer,

@EriktheOutgolfer Nie, wiodące zera to dokładnie to, co mam na myśli. Również
Mr. Xcoder,

3
Drugim przypadkiem testowym powinien być 1995(jak sądzę)
pan Xcoder,

1
@LuisMendo Thanks. Dobry dodatek
AdmBorkBork,

Odpowiedzi:


6

05AB1E , 6 bajtów

Kod

‚D¿÷P

Wykorzystuje kodowanie 05AB1E . Wypróbuj online!

Wyjaśnienie

‚        # 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

Ładna, prosta alternatywa dla formuły podanej w wyzwaniu - +1. Próbowałem tego samego w Japt, ale wyszło 2 bajty dłużej niż to, co już miałem.
Shaggy

5

J, 18 bajtów

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

Wypróbuj online!

Alternatywnie (zasługa na podejście @ Adnana dla drugiego),

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

J, 15 bajtów (rozwiązanie @ mil)

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

Wyjaśnienie

To tylko prosta implementacja algorytmu podanego przez PO.

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

Wyjaśnienie, rozwiązanie @ mil

Bardzo mądry.

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

2
15 bajtów z*/@(,%+.)|.&.":
milami

@miles Uwielbiam podstęp
cole

@miles, że ten jest naprawdę sprytny.
Jonah

Dlaczego nie przesłać 15-bajtowej wersji jako głównego rozwiązania?
Shaggy

@Shaggy Nie jestem pewien. Miałem ochotę odpowiedzieć słowem „to znacznie różni się od mojego”, ale tak naprawdę to tylko dwie optymalizacje. Później go zaktualizuję.
cole



2

JavaScript (ES7), 67 64 bajtów

Tyle bajtów tylko po to, by odwrócić liczbę :(

Pobiera dane wejściowe jako ciąg.

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

Spróbuj

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 bajtów

-19 bajtów dzięki plannapusowi za jego algorytm 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}

Spróbuje to przydzielić co najmniej jeden wektor wielkości 4*nbajtów (i myślę, że aż 4), więc spowoduje to błąd pamięci dla wystarczająco dużego n.

Wypróbuj online!



1

MATL , 13 12 11 bajtów

tVPU*1MZdU/

Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie

t      % Imoplicit input: number. Duplicate
VPU    % String representation, flip, evaluate. This reverses digits
*      % Multiply input and reversed-digit version
1M     % Push the input and reversed-digit version again
Zd     % Greatest common divisor
U      % Square
/      % Divide. Implicit display



1

Japt , 13 12 11 bajtów


sw
*V/yU ²

Spróbuj


Wyjaśnienie

Domniemane wprowadzenie liczby całkowitej U. Pusty wiersz na początku zapobiega zastąpieniu następującego wierszaU

sw

Konwertuj Una string ( s), odwróć go ( w), przekonwertuj z powrotem na liczbę całkowitą i przypisz do zmiennej V.

*V

Pomnóż Uprzez V.

/

Podzielić.

yU

GCD z Vi U.

²

Do kwadratu Wyjściowa wartość wynikowa liczby całkowitej.


Alternatywnie, 13 bajtów

Tylko dlatego, że lubię móc używać N.

NpUsw)mxNry)×

Spróbuj


Sprytna sztuczka z GCD. Myślę, że ten algorytm może być krótszy niż obecne rozwiązanie Jelly ...
ETHproductions

@ETHproductions W galaretce GCD kończy się dłużej ...
Erik the Outgolfer

@EriktheOutgolfer „Mam” 8-bajtową wersję, ale wiąże się to z podzieleniem wyników dwóch diad i nie jestem pewien, jak to właściwie zrobić…
ETHprodukcje


1

Kod maszynowy x86, 39 bajtów

;;; 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

Powyższa funkcja oblicza „nietypowy numer współczynnika” określonego parametru wejściowego. Zgodnie z konwencją wywoływania __fastcall opartą na rejestrze parametr jest przekazywany do ECXrejestru. Wynik jest zwracany do EAXrejestru, podobnie jak we wszystkich konwencjach wywoływania x86.

Wypróbuj online!

Pisanie w tak zwartej formie zajęło strasznie dużo czasu, ale było to zabawne ćwiczenie. Wiele zniekształceń, aby uzyskać najbardziej optymalne harmonogramowanie rejestrów, w ramach ograniczeń x86DIV ukrytych argumentów dyspozycję i starają się używać krótkich kodowania z MULoraz XCHGinstrukcje w miarę możliwości. Byłbym bardzo ciekawy, czy ktoś może wymyślić inny sposób dalszego skrócenia. Do końca mój mózg był dość smażony. Dzięki kompilatorowi następnym razem go zobaczysz! (Chociaż jest to sposób lepszy kod niż co kompilator wygeneruje ... Zwłaszcza jeśli manipulowane go lekko bez ograniczeń rozmiaru, usuwanie takich rzeczy XCHG).



0

Pyke , 8 bajtów

_]FbP).^B

Wypróbuj tutaj!

Pobiera dane wejściowe jako ciąg.

_         -    reversed(input)
 ]        -   [^, input]
  FbP)    -  for i in ^:
   b      -     int(^)
    P     -    factors(^)
      .^  -  xor_seq(^)
        B - product(^)

0

Python 2 , 70 bajtów

Dzięki i cri everytim .

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

Wypróbuj online!

Python 2 , 77 bajtów

Zauważ, że w Pythonie 2 nie możesz użyć tej math.gcd()metody i musisz to zrobić „ręcznie”.

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

Wypróbuj online!


Python 3 ma gcdjako fractions.gcd.
całkowicie ludzki,

@icrieverytim Właśnie dlatego zdecydowałem się rozwiązać go w Pythonie 2.
Pan Xcoder,

... Ups, miałem na myśli Python 2. Python 3 ma math.gcd.
całkowicieludzki

@icrieverytim gotowe.
Pan Xcoder,


0

Java 8, 158 150 148 138 125 123 116 107 + 19 bajtów

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;}

Wypróbuj online!


1
W pętli while, można zastąpić t!=0przez t>0, ponieważ t nigdy nie będzie ujemny. f*r/(i*i)jest taki sam jak f/i*r/i. Możesz upuścić, f=t;a r=i;jeśli połączysz zadanie ii t.
Łukasza

1
Pętlę while można zapisać jako while(t>0)t=i%(i=t);(-11 bajtów).
Nevay
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.