พลังในตัวเอง


13

กำหนดจำนวนเต็มnส่งออกเลขชี้กำลังขนาดเล็กที่สุดที่eมากกว่า 1 ซึ่งn^eประกอบด้วยnsubstring

ตัวอย่างเช่นสำหรับ25, คำตอบควร2เป็น25 ^ 2 = 625, ซึ่งมี25เป็นสตริงย่อย แต่คำตอบสำหรับ13ควรเป็น10, เช่น13 ^ 10 = 137858491849นั้น10เป็นเลขชี้กำลังต่ำสุดที่ผลลัพธ์มีอยู่13เป็นสตริงย่อย

กฎระเบียบ

  • กฎ I / O มาตรฐาน
  • ช่องโหว่มาตรฐานใช้
  • รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ
  • n จะเป็นจำนวนเต็มมากกว่าเสมอ 0

กรณีทดสอบ

1 => 2   (1 ^ 2 = 1)
2 => 5   (2 ^ 5 = 32)
3 => 5   (3 ^ 5 = 243)
4 => 3   (4 ^ 3 = 64)
5 => 2   (5 ^ 2 = 25)
6 => 2   (6 ^ 2 = 36)
7 => 5   (7 ^ 5 = 16807)
8 => 5   (8 ^ 5 = 32768)
9 => 3   (9 ^ 3 = 729)
10 => 2  (10 ^ 2 = 100)
11 => 11 (11 ^ 11 = 285311670611)
12 => 14 (12 ^ 14 = 1283918464548864)
13 => 10 (13 ^ 10 = 137858491849)
14 => 8  (14 ^ 8 = 1475789056)
15 => 26 (15 ^ 26 = 3787675244106352329254150390625)
16 => 6  (16 ^ 6 = 16777216)
17 => 17 (17 ^ 17 = 827240261886336764177)
18 => 5  (18 ^ 5 = 1889568)
19 => 11 (19 ^ 11 = 116490258898219)
20 => 5  (20 ^ 5 = 3200000)
25 => 2  (25 ^ 2 = 625)
30 => 5  (30 ^ 5 = 24300000)
35 => 10 (35 ^ 10 = 2758547353515625)
40 => 3  (40 ^ 3 = 64000)
45 => 5  (45 ^ 5 = 184528125)
50 => 2  (50 ^ 2 = 2500)
55 => 11 (55 ^ 11 = 13931233916552734375)
60 => 2  (60 ^ 2 = 3600)
65 => 17 (65 ^ 17 = 6599743590836592050933837890625)
70 => 5  (70 ^ 5 = 1680700000)
75 => 3  (75 ^ 3 = 421875)
80 => 5  (80 ^ 5 = 3276800000)
85 => 22 (85 ^ 22 = 2800376120856162211833149645328521728515625)
90 => 3  (90 ^ 3 = 729000)
95 => 13 (95 ^ 13 = 51334208327950511474609375)
100 => 2 (100 ^ 2 = 10000)

Python scriptสร้าง 1,000 คำตอบแรก



คำตอบ:



4

R , 69 44 ไบต์

function(n,i=2){while(!grepl(n,n^i))i=i+1;i}

ฟังก์ชั่นไม่ระบุชื่อ ทำงานในขนาดใหญ่iเมื่อnถูกแปลงเป็น BigZ (ดู TIO) ขอบคุณสำหรับการสอนฉันบางสิ่งบางอย่างจูเซปเป้และ digEmAll!

ลองออนไลน์!


61 ไบต์ - คุณมีพื้นที่พิเศษn, ?n^iและpasteแปลงเป็นcharacterค่าเริ่มต้น :-)
Giuseppe

56 ไบต์ - การส่งคืนiควรเพียงพอ
Giuseppe

2
44 ไบต์วางไม่จำเป็นต้องแปลง grepl กับตัวละครโดยค่าเริ่มต้น :)
digEmAll

ปัญหาคือว่า "ผิดพลาด" เมื่อเลขชี้กำลังมีขนาดใหญ่เนื่องจากความแม่นยำของคะแนนลอยตัวและความจริงที่ว่าตัวเลขจำนวนมากถูกแปลงเป็นสตริงในรูปแบบทางวิทยาศาสตร์ เช่น 15 คืน 17 ในขณะที่มันควรจะเป็น 26 ดังนั้นในทางทฤษฎีงานนี้ แต่ในทางปฏิบัติเราควรใช้แพคเกจ Big Integer หรืออะไรทำนองนั้น ...
digEmAll

1
@digEmAll สำหรับ BigInt คุณสามารถบังคับให้อินพุตเป็น bigInt เช่น BigZ จาก gmp และมันควรจะทำงานได้ยกเว้นอาจแปลงiเป็น bigZ ด้วย
Giuseppe

3

Python 2 , 42 41 ไบต์

-1 ไบต์ขอบคุณØrjan Johansen (กลับมาyโดยตรง)

f=lambda x,y=2:y*(`x`in`x**y`)or f(x,y+1)

ลองออนไลน์!

คำอธิบาย / Ungolfed

ฟังก์ชันแบบเรียกซ้ำลองจาก2,3จนกว่าเราจะประสบความสำเร็จ:

# Start recursion with y=2
def f(x,y=2):
    # If we succeed, we arrived at the desired y
    if `x` in `x**y`:
        return y
    # Else we try with next y
    else:
        return f(x, y+1)

ลองออนไลน์!



@ ØrjanJohansen: แปลกฉันคิดว่าฉันลองมันไม่แน่ใจว่าสิ่งที่ฉันพลาด ขอบคุณมาก!
ბიმო

ฉันต้องสลับการคูณเพื่อหลีกเลี่ยงช่องว่างหรือเปล่า
Ørjan Johansen

@ ØrjanJohansen: อาจเป็นได้ใช่
ბიმო

3

JavaScript (ES6 / Node.js),  41  40 ไบต์

บันทึก 1 ไบต์ขอบคุณ @Shaggy

n<15

n=>(g=x=>`${x*=n}`.match(n)?2:-~g(x))(n)

ลองออนไลน์!


1
จบลงด้วยการแก้ปัญหาที่คล้ายกับของคุณสำหรับ40 bytes
Shaggy

@Shaggy คุณต้องใช้จำนวนเต็มขนาดใหญ่มิฉะนั้นจะไม่ส่งคืนคำตอบที่ถูกต้องในบางกรณีทดสอบ ในตอนท้ายก็มีจำนวนเดียวกันn=>(g=x=>$ {x * = n}.match(n)?2n:-~g(x))(n)
Luis felipe De jesus Munoz

1
@ LuisfelipeDejesusMunoz โดยทั่วไปแล้วเราไม่จำเป็นต้องกังวลเกี่ยวกับปัญหาความแม่นยำ แต่มันจะทำงานกับ BigInts ด้วย
Shaggy

สิ่งเล็ก ๆ น้อย ๆ แต่ถ้าใช้ BigInt ไม่ควรชื่อเป็น JavaScript (Node.js)? ES6 ยังไม่มี BigInt
Shieru Asakoto

@ShieruAsakoto คุณพูดถูก ความตั้งใจเริ่มต้นของฉันคือการอธิบายว่ามันใช้ได้กับทั้ง Number หรือ BigInt ชี้แจงตอนนี้
Arnauld

3

APL (Dyalog Unicode) , 25 23 17 ไบต์

-2 ไบต์ขอบคุณ @Erik the Outgolfer

-6 ไบต์ขอบคุณ @ngn

ขอบคุณ @ H.PWiz ที่ทำให้โค้ดไม่ต้องมีการกำหนดเอง⎕pp(ความแม่นยำในการพิมพ์)

⊢⍟×⍣(∨/(⍕÷)⍷0⍕⊣)⍨

ลองออนไลน์!

⊢⍟×⍣(∨/(⍕÷)⍷0⍕⊣)⍨
  ×⍣(          )⍨ generates a geometric progression by repeatedly multiplying the argument
                   by its original value
     ∨/(⍕÷)⍷0⍕⊣   the progression stops when this function, applied between the new and the
                   last old member, returns true
         ÷        the original argument (ratio between two consecutive members)
                 formatted as a string
                 occurrences within...
            0    ...the formatted (with 0 digits after the decimal point)...
                 ...new member
     ∨/           are there any?
⊢⍟                use logarithm to determine what power of  we reached

สิ่งนี้ล้มเหลวในวันที่ 17 เพราะพบ17ใน 17 ^ 14 = 1.6837782655940093E17 แต่ idk กับคำตอบที่แม่นยำควรสนับสนุน
user41805

@Cowsquack ฉันเพียงแค่ต้องโดยพลการปรับ⎕PPฉันเดา
Quintec

โอ้รอที่จะไม่ได้ทำงาน
Quintec

23 ไบต์
Erik the Outgolfer





2

SAS, 71 66 ไบต์

แก้ไข: นำออก;run;ในตอนท้ายเนื่องจากมีการบอกเป็นนัยในตอนท้ายของอินพุต

data a;input n;e=1;do until(find(cat(n**e),cat(n)));e+1;end;cards;

ข้อมูลอินพุตถูกป้อนหลังcards;ข้อความสั่งเช่น:

data a;input n;e=1;do until(find(cat(n**e),cat(n)));e+1;end;cards;
1
2
3
4
5
6
7
8
9
10
11
12
13
14

สร้างชุดข้อมูลaที่มีการป้อนข้อมูลและการส่งออกne

ป้อนคำอธิบายรูปภาพที่นี่


นี่ดูเหมือนจะเป็นคำจำกัดความของฟังก์ชั่นหรือเทียบเท่า (ฉันถือว่า "แมโคร" จริง ๆ ) ซึ่งหมายความว่าการเรียกใช้ด้วยอาร์กิวเมนต์ (กล่าวคือ%p(n)) นั้นดี แต่ผลลัพธ์ขึ้นอยู่กับว่าmacros ใน SAS สามารถส่งคืนค่าได้หรือไม่ หากพวกเขาสามารถกลับมาที่ "ส่งออก" ควรจะเป็นโดยการส่งกลับผลมิฉะนั้นก็ควรเอาท์พุทได้โดยวิธีใดออกมาตรฐานได้รับการสนับสนุน
Skidsdev

@Skidsdev ขอบคุณสำหรับความคิดเห็น! SAS ค่อนข้างแปลก; มาโครไม่สามารถใช้งานได้จริง ๆ แต่เป็นเพียงภาษาการแทนที่ข้อความที่สร้างรหัส SAS 'จริง' เมื่อรวบรวม ฉันได้ดูว่าคนอื่น ๆ ได้ทำ I / O สำหรับ SAS ใน codegolf และแก้ไขคำตอบของฉันโดยการกำจัดงบมหภาค
Josh Eller



1

Java (OpenJDK 8) , 84 ไบต์

รับอินพุตเป็นสตริงแสดงถึงตัวเลขและแสดงผล int

ไบต์ส่วนใหญ่มาจากความละเอียดของBigDecimalสิ่งที่จำเป็นในการประมวลผลจำนวนมาก

n->{int i=1;while(!(new java.math.BigDecimal(n).pow(++i)+"").contains(n));return i;}

ลองออนไลน์!


มันทำงานอย่างไร

มันค่อนข้างง่าย แต่ฉันจะใส่คำอธิบายสำหรับลูกหลาน

n->{                                    // Lamdba taking a String and returning an int
    int i=1;                            // Initialises the count
    while(!                             // Loops and increments until
        (new java.math.BigDecimal(n)    // Creates a new BigDecimal from the input n
            .pow(++i)+"")               // Raises it to the power of the current count
            .contains(n)                // If that contains the input, end the loop
    );
    return i;                           // Return the count
}




0

ถ่านขนาด 19 ไบต์

W∨‹Lυ²¬№IΠυθ⊞υIθILυ

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

W∨‹Lυ²¬№IΠυθ⊞

ทำซ้ำจนกว่าความยาวของรายการอย่างน้อย 2 และผลิตภัณฑ์มีอินพุต ...

⊞υIθ

... cast อินพุตให้เป็นจำนวนเต็มและส่งไปยังรายการ

ILυ

ทอดความยาวของรายการเพื่อสตริงและพิมพ์โดยนัย


0

Python 3 , 63 58 ไบต์

def f(n,e=2):
	while str(n)not in str(n**e):e+=1
	return e

ลองออนไลน์!

Python2 อาจสั้นกว่านี้ แต่ฉันชอบใช้ 3 การขึ้นมาด้วยแลมบ์ดานั้นยาก แต่ฉันก็ลองบางอย่าง


ฉันไม่รู้ว่างูหลาม แต่ใช้แลมบ์ดาสั้นลงหรือไม่
Luis felipe De jesus Munoz

@LuisfelipeDejesusMunoz ฉันเริ่มพยายามทำเช่นนั้น แต่ IDLE บ่นเกี่ยวกับการมีเปลือยwhileในแลมบ์ดา บางทีฉันสามารถลองวิธีอื่นได้ ..
4329

บางทีฟังก์ชั่นวนซ้ำ?
Luis felipe De jesus Munoz

2
การกำหนดeในอาร์กิวเมนต์-list (เช่น. def f(n,e=2)) และn**eควรบันทึกบางไบต์ Python 2 จะบันทึกได้ค่อนข้างไบต์
ბიმო

@LuisfelipeDejesusMunoz Lambdas ไม่เหมือนฟังก์ชั่น ทางด้านขวาของแลมบ์ดาจะต้องเป็นนิพจน์เดียวและคำสั่งการควบคุมการไหลเหมือนforหรือwhileไม่ทำงาน
James

0

MathGolf 10 ไบต์

ôkï⌠#k╧▼ï⌠

ลองออนไลน์!

คำอธิบาย

สิ่งนี้รู้สึกสิ้นเปลืองอย่างยิ่งโดยต้องอ่านอินพุตสองครั้งอย่างชัดเจนโดยต้องเพิ่มตัวนับลูปสองครั้ง

ô            start block of length 6
 k           read integer from input
  ï          index of current loop, or length of last loop
   ⌠         increment twice
    #        pop a, b : push(a**b)
     k       read integer from input
      ╧      pop a, b, a.contains(b)
       ▼     do while false with pop
        ï    index of current loop, or length of last loop
         ⌠   increment twice


0

C # (.NET แกน) , 104 89 ไบต์

a=>{int i=2;while(!(System.Numerics.BigInteger.Pow(a,i)+"").Contains(a+""))i++;return i;}

ลองออนไลน์!

-1 ไบต์: เปลี่ยนเป็นวนซ้ำไปมาในขณะที่ (ขอบคุณSkidsdev )
-14 ไบต์: การจัดการสตริงแปลก ๆ ของ C # เพื่อใช้ลบการ ToString() โทร

จำเป็นต้องใช้ไลบรารีBigIntegerของ C # เนื่องจากประเภทตัวเลข C # มาตรฐาน (int, double, long, ulong และอื่น ๆ ) ล้มเหลวสำหรับตัวเลขขนาดใหญ่ (รวมถึง 12, 15 และ 17)

Ungolfed:

a => {
    int i = 2;                                          // initialize i

    while( !(System.Numerics.BigInteger.Pow(a,i) + "")  // n = a^i, convert to string
                                .Contains(a + ""))      // if n doesn't contain a
        i++;                                                // increment i

    return i;
}

คุณสามารถบันทึก 1 ไบต์โดยสลับไปเป็นwhile loop
Skidsdev






0

Oracle SQL, 68 ไบต์

select max(level)+1 from dual,t connect by instr(power(x,level),x)=0

มีข้อสันนิษฐานว่าหมายเลขแหล่งข้อมูลจะถูกเก็บไว้ในตารางt(x)เช่น

with t as (select 95 x from dual)

ทดสอบใน SQL * Plus

SQL> with t as (select 95 x from dual)
  2  select max(level)+1 from dual,t connect by instr(power(x,level),x)=0
  3  /

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