ไต่เต้าไปอีกขั้น


24

ชื่อของวิดีโอใหม่ล่าสุดของNumberphileคือ13532385396179เป็นจุดคงที่ของฟังก์ชันต่อไปนี้fบนจำนวนเต็มบวก:

ให้nเป็นจำนวนเต็มบวก เขียนการแยกตัวประกอบเฉพาะด้วยวิธีปกติเช่น 60 = 2 2 · 3 · 5 ซึ่งมีการเขียนเฉพาะช่วงเพื่อเพิ่มลำดับและละเว้นเลขชี้กำลัง 1 จากนั้นนำเลขยกกำลังลงมาที่บรรทัดแล้วตัดเครื่องหมายการคูณทั้งหมดเพื่อรับตัวเลขf (n) [... ] ตัวอย่างเช่นf (60) = f (2 2 · 3 · 5) = 2235

(คำจำกัดความข้างต้นถูกนำมาจากปัญหา 5 ของปัญหาห้า $ 1,000 - John H. Conway )

โปรดทราบว่าf (13532385396179) = f (13 · 53 2 · 3853 · 96179) = 13532385396179

งาน

ใช้เป็นจำนวนเต็มคอมโพสิตบวกnเป็น input และ f(n)output

ตัวอย่างอื่น

48 = 2 4 · 3 ดังนั้นf (48) = 243

Testcases

testcases เพิ่มเติมมีอยู่ที่นี่

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

11
+1 ฉันยังคงประหลาดใจที่มีคนจัดการพบ 13532385396179 ว่าเป็นการป้องกันการคาดเดา ฉันเดาว่ารางวัล $ 1,000 จะเป็นหนทางในการจ่ายค่าไฟฟ้าที่ใช้! :)
Wossname

7
หากไม่ติดตามลิงก์มันไม่ชัดเจนว่าการคาดเดาคือแอปพลิเคชั่นที่ใช้ซ้ำของf (n)จะเข้าถึงนายก (และแน่นอนf (p) = pหากpเป็นนายก) 13532385396179 หักล้างการคาดเดาเนื่องจากเป็นทั้งคอมโพสิตและ opint คงที่
Chris H

คำตอบ:


16

Python, 166 162 159 ไบต์

พวกคุณดีขึ้นมาก นี่คือสิ่งที่ฉันใช้! (อัลกอริทึมที่แก้ไขได้เรียกสิ่งนี้)

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
ทำไมบางคนถึงลงคะแนนผู้มาใหม่แทนที่จะช่วยเขาปรับปรุงคำตอบเหมือน @LeakyNun ทำ :(
Shaggy

3
ขออภัย - นั่นคือสิ่งที่ฉันใช้จริง ๆ (ฉันพบหมายเลข) ฉันแค่คิดว่ารหัส crummy จะเป็นเรื่องตลก คุณสามารถเอามันลง
jchd

9
ยินดีต้อนรับสู่เว็บไซต์ เป็นเรื่องที่ดีมากที่ได้แบ่งปันโซลูชันของคุณกับเรา (สำหรับคนที่ไม่ทราบว่า Jim Davis เป็นผู้แก้ไขปัญหานี้ตั้งแต่แรก) อย่างไรก็ตามคำตอบสำหรับความท้าทายต้องปฏิบัติตามกฎบางอย่าง หากคุณเพียงแค่ทำตามคำแนะนำจาก @LeakyNun คุณจะได้รับคำตอบที่ถูกต้อง (อาจจะได้ดูคำตอบอื่น ๆ เพื่อดูว่าพวกเขามักจะมีลักษณะอย่างไร)
Dada

4
โอ้พระเจ้าฉันไม่ได้คาดหวังว่า Jim Davis จะปรากฏตัวในเว็บไซต์นี้และตอบคำถามท้าทายของฉัน ... ตอนนี้ฉันรู้สึกเป็นเกียรติมาก ...
Leaky Nun

2
เอ๊ะไม่ใช่ทางหมุนรอบ ที่อยู่อีเมลของฉันอยู่ในgladhoboexpress.blogspot.ca/2014/10/climb-to-prime.html ... ฉันออกจากการโพสต์แล้วไม่มีใครมาแทนที่คุณด้วยอีเมลมากกว่าคณิตศาสตร์
jchd

9

Brachylogขนาด 8 ไบต์

ḋoọc;1xc

ลองออนไลน์!

คำอธิบาย

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

คุณสามารถใช้ℕ₂ˢ( เลือกจำนวนเต็มทั้งหมดที่มากกว่าหรือเท่ากับ 2 ) แทนที่จะ;1xเป็นซึ่งสามารถอ่านได้มากขึ้นและมากขึ้นในจิตวิญญาณของ Brachylog


9

เยลลี่ 6 ไบต์

ÆFFḟ1V

ลองออนไลน์!

คำอธิบาย

Æ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= "เชื่อมต่อกับสตริงเดี่ยวและ
วิวัฒนาการ

@EriktheOutgolfer ใช่ดังนั้น "มีประสิทธิภาพ"
Martin Ender

@MartinEnder เหตุผลใดที่คุณไม่ได้ใช้(แปลงจากทศนิยมเป็นจำนวนเต็ม)?
กระจาย

@Christian เพราะรายการอาจมีจำนวนเต็มหลายหลัก
Martin Ender

@MartinEnder Ah ฉลาด ฉันเคยใช้FḌในอดีต - นั่นเป็นเคล็ดลับที่ดี!
กระจาย

5

Mathematica, 43 36 Bytes

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

ลองออนไลน์!


2
DeleteCasesยาวคุณสามารถใช้/.1->""หรือ/.1->##&[](รูปแบบทางเลือกของ/.1->Nothing
user202729

3
@ user202729 ทั้งหมดของความต้องการเหล่านั้นเป็นพื้นที่ในด้านหน้าของเพื่อป้องกันไม่ให้แยกเป็น1 ... / (0.1)
Martin Ender

คุณพูดถูก! คงที่
J42161217

4

CJam , 8 ไบต์

limF:~1-

ลองออนไลน์!

คำอธิบาย

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_กับการแบนเพราะนั่นคือสิ่งที่มันมีไว้ แต่มันไม่เปลี่ยนคะแนน
Peter Taylor

1
@ PeterTaylor หืมมมฉันไม่สามารถตัดสินใจได้ว่าจะใช้อันไหน แต่มีแนวโน้มว่าจะe_แบนราบลึกเท่านั้นและใช้:~เมื่อใดก็ตามที่เป็นเพียงระดับเดียว
Martin Ender



2

Pyth, 12 ไบต์

smjk_>hddr8P

ลองมัน!

ทางเลือก 12 ไบต์

smjk<_AdGr8P

ลองดูสิ!

คำอธิบาย

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 ไบต์

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

ลองออนไลน์!

หากอินพุตถูก จำกัด ให้อยู่ด้านล่าง2147483659ทั้งสองstr(...)อาจถูกแทนที่ด้วย`...`การบันทึก 6 ไบต์ (โปรแกรมนี้จะช้ามากสำหรับตัวเลขที่ได้รับผลกระทบต่อไป!)



1

Japt , 19 ไบต์

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

ทดสอบออนไลน์!

คำอธิบาย

 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 ไบต์

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

เวอร์ชันเต็ม / ฟอร์แมต:

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 ไบต์

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

คำอธิบาย

(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 ตัวอักษร

ทางออกที่ตรงไปตรงมาสวย

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

ระดับแปดเสียง 69 ไบต์

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

ลองออนไลน์!

สิ้นสุดลงค่อนข้างนาน แต่สิ่งนี้จะสร้างผลลัพธ์ที่ต้องการ

โดยพื้นฐานแล้วเราใช้ฟังก์ชันฮิสโตแกรมเพื่อนับจำนวนการเกิดขึ้นของค่าที่ไม่ซ้ำกันในการแยกตัวประกอบที่สำคัญของค่าอินพุต

  • ผลของfactor()ฟังก์ชั่นให้ปัจจัยสำคัญในการเรียงลำดับ
  • จากนั้นเราจะหาunique()ค่าในอาร์เรย์นั้น
  • hist() ส่งคืนจำนวนการเกิดขึ้น

เมื่อเรามีสองอาร์เรย์ (หนึ่งสำหรับปัจจัยที่ไม่ซ้ำกันหนึ่งสำหรับการนับ) เราเชื่อมต่ออาร์เรย์ในแนวตั้ง (หนึ่งด้านบนของอื่น ๆ ) แล้วแบน สิ่งนี้จะแทรกล้างปัจจัยที่มีการนับ

ในที่สุดเราก็แสดงผลลัพธ์เป็นสตริงเพื่อให้แน่ใจว่าจะข้าม 1 รายการใด ๆ ในอาร์เรย์สุดท้าย เวลาเดียวที่ 1 สามารถปรากฏได้คือถ้าการนับเป็น 1 เพราะ 1 จะไม่เป็นปัจจัยสำคัญ การกำจัดนี้เสร็จสิ้นก่อนที่จะแปลงเป็นสตริงดังนั้นจะไม่มีผลกับสิ่งต่าง ๆ เช่นหมายเลข 10




โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.