Wspiąć się na szczyt

24

Tytuł najnowszego wideo Numberphile , 13532385396179 , jest stałym punktem następującej funkcji f na dodatnich liczbach całkowitych:

Niech n będzie dodatnią liczbą całkowitą. Napisz rozkład na czynniki pierwsze w zwykły sposób, np. 60 = 2 2 · 3 · 5, w którym liczby pierwsze są zapisywane w kolejności rosnącej, a wykładniki 1 są pomijane. Następnie sprowadź wykładniki do linii i pomiń wszystkie znaki mnożenia, uzyskując liczbę f (n). [...] na przykład f (60) = f (2 2 · 3 · 5) = 2235.

(Powyższa definicja pochodzi z problemu 5 z pięciu problemów o wartości 1000 USD - John H. Conway )

Należy zauważyć, że f (13532385396179) = f (13 · 53 2 · 3853 · 96179) = 13532385396179.

Zadanie

Weź dodatnią liczbę całkowitą zespoloną njako dane wejściowe i wyjściowe f(n).

Inny przykład

48 = 2 4 · 3, tak, f (48) = 243.

Przypadki testowe

Więcej przypadków testowych jest dostępnych tutaj .

   4 -> 22
   6 -> 23
   8 -> 23
  48 -> 243
  52 -> 2213
  60 -> 2235
 999 -> 3337
9999 -> 3211101
Leaky Nun
źródło
11
+1 Nadal jestem zdziwiony, że komuś udało się znaleźć 13532385396179 jako oderwanie od przypuszczeń. Wydaje mi się, że nagroda w wysokości 1000 $ byłaby sposobem na opłacenie zużytej energii elektrycznej! :)
Wossname,
7
Bez podążania za linkiem nie było jasne, że hipoteza jest taka, że ​​powtarzane zastosowania f (n) zawsze osiągną liczbę pierwszą (i oczywiście f (p) = p, jeśli p jest liczbą pierwszą). 13532385396179 obala hipotezę, ponieważ jest ona zarówno złożona, jak i stała.
Chris H

Odpowiedzi:

16

Python, 166 162 159 bajtów

Jesteście znacznie lepsi. Tego właśnie użyłem! (algorytm, który go rozwiązał, nazywa to)

from primefac import*
def c(n):
 x=factorint(n)
 a=''
 for i in range(len(x)):
  l=min(x.keys())
  a+=str(l)
  if x[l]>1:a+=str(x[l])
  x.pop(l)
 return int(a)
jchd
źródło
2
Dlaczego ktoś głosował za nowicjuszem zamiast pomagać mu w poprawianiu odpowiedzi, tak jak @LeakyNun? :(
Shaggy,
3
Przepraszam - tego właśnie użyłem (znalazłem numer). Pomyślałem, że ten kiepski kod będzie zabawny. Możesz to zdjąć.
jchd
9
Witamy na stronie. Naprawdę miło jest udostępnić nam swoje rozwiązanie. (dla ludzi, którzy nie wiedzą, Jim Davis jest tym, który rozwiązał ten problem w pierwszej kolejności). Jednak odpowiedzi na wyzwania muszą być zgodne z pewnymi zasadami. Jeśli po prostu zastosujesz się do sugestii @LeakyNun, odpowiedź będzie ważna. (może rzuć okiem na inne odpowiedzi, aby zobaczyć, jak zwykle wyglądają)
Dada
4
O mój Boże, nie spodziewałem się, że sam Jim Davis pojawi się na tej stronie i odpowiem na moje wyzwanie ... Czuję się teraz tak zaszczycony ...
Leaky Nun
2
tak przy okazji, nie troll. Mój adres e-mail znajduje się na gladhoboexpress.blogspot.ca/2014/10/climb-to-prime.html ... Zostawiłem wiadomość, nikt nie oblewa Cię emailem z matematyki.
jchd
9

Brachylog , 8 bajtów

ḋoọc;1xc

Wypróbuj online!

Wyjaśnienie

Example input: 60

ḋ          Prime decomposition: [5,3,2,2]
 o         Order: [2,2,3,5]
  ọ        Occurences: [[2,2],[3,1],[5,1]]
   c       Concatenate: [2,2,3,1,5,1]
    ;1x    Execute 1s: [2,2,3,5]
       c   Concatenate: 2235

Zamiast tego możesz użyć ℕ₂ˢ( wybierz wszystkie liczby całkowite większe lub równe 2 ) ;1x, co jest prawdopodobnie bardziej czytelne i bardziej zgodne z duchem Brachylog.

Fatalizować
źródło
9

Galaretka , 6 bajtów

ÆFFḟ1V

Wypróbuj online!

Wyjaśnienie

ÆF      Get prime factorisation of input as prime-exponent pairs.
  F     Flatten.
   ḟ1   Remove 1s.
     V  Effectively flattens the list into a single integer.
Martin Ender
źródło
V= "połączony w pojedynczy ciąg i ewaluuj jak galaretka"
Erik the Outgolfer
@EriktheOutgolfer Tak, stąd „skutecznie”.
Martin Ender,
@MartinEnder Jakiś konkretny powód, którego nie używasz (Konwertujesz z dziesiętnego na całkowity)?
rozproszenie
@Christian Ponieważ lista może zawierać wielocyfrowe liczby całkowite.
Martin Ender
@MartinEnder Ah, sprytny. Używałem FḌw przeszłości - to dobra wskazówka!
rozproszenie
5

Mathematica, 43 36 bajtów

Row@Flatten@FactorInteger@#/. 1->""&

Wypróbuj online!

J42161217
źródło
2
DeleteCasesjest długi, możesz użyć /.1->""lub /.1->##&[](alternatywna forma/.1->Nothing
user202729
3
@ user202729 Wszyscy potrzebują przestrzeni przed, 1aby zapobiec analizowaniu jako ... / (0.1).
Martin Ender,
Masz rację! naprawiono
J42161217,
4

CJam , 8 bajtów

limF:~1-

Wypróbuj online!

Wyjaśnienie

li  e# Read input and convert to integer.
mF  e# Get prime factorisation as prime-exponent pairs.
:~  e# Flatten.
1-  e# Remove 1s.
    e# Implicitly print a flattened representation of the list.
Martin Ender
źródło
Użyłbym e_spłaszczyć, gdyż to właśnie tam jest za, ale to nie zmienia wynik.
Peter Taylor,
1
@PeterTaylor Hm tak, nigdy nie mogę zdecydować, którego użyć, ale zwykle wybieram e_tylko głębokie spłaszczenie i używam, :~gdy jest to tylko jeden poziom.
Martin Ender,
4

05AB1E , 10 bajtów

Òγʒ¬?gDië?

Wypróbuj online!

Ò          # Push list of prime factors with duplicates
 γ         # Break into chunks of consecutive elements
  ʒ        # For each
   ¬?      #   Print the first element
     gD    #   Push the length of this chunk twice
       ië  #   If not 1
         ? #     Print the length
Riley
źródło
3

05AB1E , 12 11 bajtów

Òγvy¬sgD≠×J

Wypróbuj online!

Wyjaśnienie

Ò            # calculate prime factors with duplicates
 γ           # group consecutive equal elements
  vy         # for each group
    ¬        # get the head without popping
     sg      # push the length of the group
       D≠×   # repeat the length (length != 1) times
          J  # join
Emigna
źródło
Nie działa na 48.
Leaky Nun
2

Pyth, 12 bajtów

smjk_>hddr8P

Spróbuj!

alternatywnie, 12 bajtów

smjk<_AdGr8P

Spróbuj tego!

wyjaśnienie

smjk_>hddr8P
           PQ  # prime factorization (already in correct order) of the implicit input: [3, 3, 11, 101]
         r8    # length encode: [[2, 3], [1, 11], [1, 101]]
 m             # map over the length encoded list (lambda variable: d)
     >hdd      # take the d[0] last elements of d (so only the last for d[0]==1 and all else)
    _          # reverse that list
  jk           # join into a string
s              # conatenate the list of strings
KarlKastor
źródło
2

Python 2 , 99 bajtów

n=input()
r=''
p=2
while~-n:
 e=0
 while n%p<1:e+=1;n/=p
 r+=str(p)*(e>0)+str(e)*(e>1);p+=1
print r

Wypróbuj online!

Jeśli dane wejściowe są ograniczone do wartości poniżej 2147483659, oba str(...)mogą zostać zastąpione przez `...`zapisanie 6 bajtów (program i tak będzie bardzo wolny dla liczb, których to dotyczy!).

Jonathan Allan
źródło
2

Ohm , 11 bajtów

o:_]D2<?O;J

Wypróbuj online!

Wyjaśnienie

o:_]D2<?O;J
o           # Push prime factors with powers from input (Format [[prime,power],...]
 :          # For each...
  _          # Push current element
   ]         # flatten
    D        # Duplicate power
     2<? ;   # Is the power smaller than 2?
        O     # Delete top of stacks
          J  # Join
Datboi
źródło
1

Japt , 19 bajtów

k ó¥ ®¯1 pZlÃc fÉ q

Przetestuj online!

Wyjaśnienie

 k ó¥  ®   ¯  1 pZlà c fÉ  q
Uk ó== mZ{Zs0,1 pZl} c f-1 q  // Ungolfed
                              // Implicit: U = input number
Uk                            // Break U into its prime factors.
   ó==                        // Group into runs of equal items.
       mZ{         }          // Map each item Z in this to
          Zs0,1               //   Z.slice(0, 1) (the array of the first item),
                pZl           //   with Z.length added at the end.
                              // This returns an array of prime-exponent pairs (Jelly's ÆF).
                     c        // Flatten.
                       f-1    // Filter to the items X where X - 1 is truthy (removes '1's).
                           q  // Join the resulting array into a single string.
                              // Implicit: output result of last expression
ETHprodukcje
źródło
1

PHP , 88 bajtów

for($i=2;1<$a=&$argn;)$a%$i?$i++:$a/=$i+!++$r[$i];foreach($r as$k=>$v)echo$k,$v<2?"":$v;

Wypróbuj online!

Jörg Hülsermann
źródło
0

C #, 206 100 bajtów

n=>{var r="";for(int d=1,c;++d<=n;){c=0;while(n%d<1){c++;n/=d;}r+=c>0?d+(c>1?c+"":""):"";}return r;}

Wersja pełna / sformatowana:

using System;

class P
{
    static void Main()
    {
        Func<int, string> func = n =>
        {
            var r = "";
            for (int d = 1, c; ++d <= n;)
            {
                c = 0;
                while (n % d < 1)
                {
                    c++;
                    n /= d;
                }

                r += c > 0 ? d + (c > 1 ? c + "" : "") : "";
            }

            return r;
        };

        Console.WriteLine(func(4));
        Console.WriteLine(func(6));
        Console.WriteLine(func(8));
        Console.WriteLine(func(48));
        Console.WriteLine(func(52));
        Console.WriteLine(func(60));
        Console.WriteLine(func(999));
        Console.WriteLine(func(9999));

        Console.ReadLine();
    }
}
TheLethalCoder
źródło
0

JavaScript - 91 bajtów

(x,r='',i=1,n)=>{while(x>i++){for(n=0;x%i<1;n++)x/=i;r+=(n>0?i+'':'')+(n>1?n:'')}return r}

Wyjaśnienie

(x,r='',i=1,n)=>(          // input x is the number to process, r, i, n are default values only
    while(x>i++){          // iterate over i until x
        for(n=0;x%i<1;n++) // iterate over n until i is not a factor of x
            x/=i;          // factor i out of x
        r+=(n>0?i+'':'')   // append i to r if n > 0
            +(n>1?n:'')    // append n to r if n > 1
                           // i+'' prevents adding i and n before appending to r
    }
    return r               // return r by comma-operator and arrow function syntax
)
asgalant
źródło
0

Java 8, 103 znaki

Całkiem proste rozwiązanie.

n->{String r="";int d=2,c;while(n>1){c=0;while(n%d<1){c++;n/=d;}if(c>0)r+=d;if(c>1)r+=c;d++;}return r;}

Nie golfowany:

private static Function<Integer, String> f = n->{
    String result = "";
    int divisor = 2, count;
    while (n>1) {
        count = 0;
        while (n % divisor < 1) {
            count++;
            n /= divisor;
        }
        if (count > 0) result += divisor;
        if (count > 1) result += count;
        divisor++;
    }
    return result;
};
Computronium
źródło
91 bajtów
pułapkap
0

Oktawa , 69 bajtów

@(a)printf('%d',(f=[[~,c]=hist(b=factor(a),d=unique(b));d](:))(f~=1))

Wypróbuj online!

Skończyło się to dość długim czasem, ale to wygeneruje pożądaną wydajność.

Zasadniczo używamy funkcji histogramu do zliczania liczby wystąpień unikalnych wartości w pierwotnym rozkładzie wartości wejściowej.

  • Wynik factor() funkcji podaje czynniki pierwsze w kolejności rosnącej
  • następnie znajdujemy unique()wartości w tej tablicy
  • hist() zwraca liczbę wystąpień

Kiedy mamy już dwie tablice (jedną dla unikalnych czynników, drugą dla zliczeń), konkatenujemy tablice pionowo (jedną na drugiej), a następnie spłaszczamy. To przeplata czynniki z zliczeniami.

Na koniec wyświetlamy wynik jako ciąg znaków zapewniający pominięcie jednego z nich w końcowej tablicy. Jedyne czasy, w których 1 mogą się pojawić, to jeśli liczba wynosiła 1, ponieważ 1 nigdy nie będzie czynnikiem podstawowym. Ta eliminacja jest wykonywana przed konwersją na ciąg, więc nie wpłynie na rzeczy takie jak liczba 10.

Tom Carpenter
źródło
0

Rubin , 45 + 7 bajtów

Wymaga flagi -rprime.

->n{(n.prime_division.flatten-[1]).join.to_i}

Wypróbuj online!

canhascodez
źródło
0

Pyth - 16 bajtów

V{PQpNK/PQNItKpK

Spróbuj

Inne rozwiązanie:

sm`d-.nm(d/PQd){PQ1
Maria
źródło
1
Można zastąpić FNprzez V.
Leaky Nun
1
r8Przydatne wydaje się także (kodowanie w czasie wykonywania).
Leaky Nun
0

R , 72 bajty

x=rle(pracma::factors(scan()));x$l[x$l<2]='';paste0(x$v,x$l,collapse='')

Wymaga pracmapakietu, który nie jest zainstalowany w TIO.

Giuseppe
źródło