Bir başbakana bir adım tırman


24

Numberphile'nin en yeni videosu ( 13532385396179) , pozitif tamsayılarda aşağıdaki f fonksiyonunun sabit bir noktasıdır :

Let n pozitif bir tamsayı. Asal çarpanlara her zamanki gibi yazın; örneğin , asalların artan sırada yazıldığı ve 1'in üsleri ihmal edildiği 60 = 2 2 · 3 · 5. Sonra üsleri aşağıya doğru getirin ve f (n) sayısını alarak tüm çarpma işaretlerini atlayın . [...] örneğin, f (60) = f (2 2 · 3 · 5) = 2235.

(Yukarıdaki tanım, Beş Dolarlık 1000 $ 'lık Problem 5 - John H. Conway'den alınmıştır )

Not bu f (13532385396179) = f (13 · 53 2 · 3853 · 96.179) 13532385396179 =.

Görev

nGiriş ve çıkış olarak pozitif bir kompozit tamsayı alın f(n).

Başka bir örnek

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

testcases

Burada daha fazla test penceresi var .

   4 -> 22
   6 -> 23
   8 -> 23
  48 -> 243
  52 -> 2213
  60 -> 2235
 999 -> 3337
9999 -> 3211101

11
+1 Hala birisinin 13532385396179 tarihli bir haberi önemsememesi olarak bulmayı başardığına şaşırıyorum. Sanırım 1000 $ 'lık ödül, kullanılan elektrik için bir yol kat edecek! :)
Wossname

7
Bağlantıyı izlemeden fıkranın f (n) tekrarlanan uygulamalarının her zaman bir üsse ulaşacağı açık değildir (ve elbette f (p) = p , asal ise p ). 13532385396179, hem birleşik hem de sabit bir açık olan olduğundan, varsayımı yanlışlar.
Chris H,

Yanıtlar:


16

Python, 166 162 159 bayt

Siz çok daha iyisiniz. Ben de öyle kullandım! (bunu çözen algoritma bunu çağırır)

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)

2
Neden birileri @LeakyNun'un yaptığı gibi cevabını geliştirmesine yardım etmek yerine yeni gelenlere oy vermedi? :(
Shaggy

3
Üzgünüm, bu gerçekten kullandığım şeydi (sayıyı buldum). Az önce ufalama kodunun komik olacağını düşündüm. Aşağı alabilirsin.
jchd

9
Siteye Hoşgeldiniz. Çözümünüzü bizimle paylaşmanız gerçekten çok güzel. (Bilmeyenler için, bu sorunu en başta çözen Jim Davis'tir). Ancak, zorluklara cevap vermek için bazı kurallara uymanız gerekir. @LeakyNun’dan gelen önerileri izlerseniz, cevap geçerli olur. (genellikle nasıl göründüklerini görmek için diğer cevaplara bakabilirsiniz)
Dada

4
Aman Tanrım, ben Jim Davis kendini bu sitede görünmesini ve benim sorguya yanıt beklemiyordum ... Öyle ... şimdi beni onurlandırıyor
Çatlak Nun'ı

2
hah, bu arada bir trol değil. E-posta adresim gladhoboexpress.blogspot.ca/2014/10/climb-to-prime.html adresinde ... Gönderimden çıktım , kimse sizi e-posta ile matematikten geçirmedi .
jchd

9

Brachylog , 8 bayt

ḋoọc;1xc

Çevrimiçi deneyin!

açıklama

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

Sen kullanabilirsiniz ℕ₂ˢ( her şeyden üstündür veya 2'ye eşit tamsayılar seçmek yerine) ;1xmuhtemelen daha okunabilir ve daha Brachylog ruhunu taşıdığını,.


9

Jöle , 6 bayt

ÆFFḟ1V

Çevrimiçi deneyin!

açıklama

ÆF      Get prime factorisation of input as prime-exponent pairs.
  F     Flatten.
   ḟ1   Remove 1s.
     V  Effectively flattens the list into a single integer.

V= "tek bir
sicimle

@EriktheOutgolfer Evet, bu nedenle "etkili".
Martin Ender

@MartinEnder Kullanmadığınız herhangi bir sebep (Ondalıktan tam sayıya dönüştürme)?
scatter

@Hristiyan Çünkü listede çok basamaklı tamsayılar olabilir.
Martin Ender,

@MartinEnder Ah, zeki. FḌGeçmişte kullandım - bu iyi bir ipucu!
scatter

5

Mathematica, 43 36 Bayt

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

Çevrimiçi deneyin!


2
DeleteCasesuzun, kullanabilirsiniz /.1->""veya /.1->##&[](alternatif bir şekilde/.1->Nothing
user202729

3
@ user202729 Tüm 1bunların, ayrıştırılmasını önlemek için önünde bir boşluğa ihtiyacı var ... / (0.1).
Martin Ender

Haklısın! sabit
J42161217

4

CJam , 8 bayt

limF:~1-

Çevrimiçi deneyin!

açıklama

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.

e_Düzleşmek isterdim , çünkü bunun için oradaydı, ama skoru değiştirmiyor.
Peter Taylor,

1
@ PeterTaylor Hm evet, hangisinin kullanılacağına asla karar veremem, ama e_sadece derin düzleşmek için gidip :~sadece bir seviye olduğunda kullanın .
Martin Ender

4

05AB1E , 10 bayt

Òγʒ¬?gDië?

Çevrimiçi deneyin!

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

3

05AB1E , 12 11 bayt

Òγvy¬sgD≠×J

Çevrimiçi deneyin!

açıklama

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

İçin başarısız 48.
Leaky Nun

2

Pyth, 12 bayt

smjk_>hddr8P

Dene!

alternatif, 12 bayt

smjk<_AdGr8P

Bunu dene!

açıklama

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


2

Python 2,99 bayt

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

Çevrimiçi deneyin!

Girdilerin altında olması sınırlandırılmışsa 2147483659, her ikisi de 6 bayt kaydedilerek str(...)değiştirilebilir `...`(bu program yine de etkilenen numaralar için çok yavaştır!).


2

Ohm , 11 bayt

o:_]D2<?O;J

Çevrimiçi deneyin!

açıklama

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

1

Japt , 19 bayt

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

Çevrimiçi test edin!

açıklama

 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


0

C #, 206 100 bayt

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

Tam / Biçimli sürüm:

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

0

Javascript - 91 bayt

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

açıklama

(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
)

0

Java 8, 103 karakter

Oldukça basit bir çözüm.

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

Ungolfed:

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


0

Octave , 69 bayt

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

Çevrimiçi deneyin!

Uzun sürdü, ancak bu istenen çıktıyı üretecek.

Temel olarak, giriş değerinin asal çarpanlara ayrılmasında benzersiz değerlerin oluşum sayısını saymak için histogram işlevini kullanırız.

  • factor()İşlevin sonucu , asal çarpanları artan düzende verir
  • o zaman unique()bu dizideki değerleri buluruz
  • hist() olay sayısını döndürür

İki diziyi elde ettikten sonra (biri benzersiz faktörler için, biri sayım için), dizileri dikey olarak birleştiririz (biri diğerinin üstünde olur) ve sonra düzleşiriz. Bu sayede faktörleri araya sokar.

Sonunda sonucu, son dizideki 1leri atlamayı sağlayan bir dize olarak görüntüleriz. 1'in ortaya çıkabileceği tek zaman, sayının 1 olması, çünkü 1 asla bir ana faktör olmayacak. Bu eleme, bir dizgeye dönüştürülmeden önce yapılır, böylece 10 sayısı gibi şeyleri etkilemez.




0

R , 72 bayt

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

pracmaTIO'da kurulu olmayan paketi gerektirir .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.