หมายเลขนี้สามารถเขียนในรูปแบบ (3 ^ x) - 1 รูปแบบได้หรือไม่?


41

ท้าทาย:

สร้างโปรแกรมที่ยอมรับจำนวนเต็มบวกและตรวจสอบว่าสามารถเขียนในรูปแบบของ (3 ^ x) -1, โดยที่X เป็นจำนวนเต็มบวกอีกตัว

หากเป็นไปได้ให้ส่งออก X

ถ้ามันไม่สามารถเอาท์พุท -1 หรือfalsyคำสั่ง

ตัวอย่างอินพุต / เอาท์พุต

การป้อนข้อมูล:

2

มันสามารถเขียนได้เป็น (3 ^ 1) - 1 ดังนั้นเราจึงเอาท์พุท x ซึ่งก็คือ 1

เอาท์พุท:

1

การป้อนข้อมูล:

26

26 สามารถเขียนเป็น (3 ^ 3) - 1 ดังนั้นเราจึงส่งออก x (3)

เอาท์พุท:

3

การป้อนข้อมูล:

1024

1024 ไม่สามารถเขียนในรูปแบบของ (3 ^ x) - 1 ดังนั้นเราจึงเอาท์พุท -1

เอาท์พุท:

-1

นี่คือมีจำนวนไบต์น้อยที่สุดที่จะชนะ


OEIS ที่เกี่ยวข้อง: A024023


4
ฉันขอให้ส่งออก X เพราะฉันเชื่อว่ามันเป็นวิธีที่ท้าทายมากขึ้น เพียงแค่ค้นหาว่ามันอยู่ในรูปแบบ 3 ^ x - 1 หรือเปล่าฉันคิดว่ามันง่ายเกินไปสำหรับความท้าทาย
P. Ktinos

2
เว้นแต่ว่าเป็นข้อความเท็จในภาษาการเขียนโปรแกรมของคุณแล้วไม่ใช่
P. Ktinos

2
ฉันขอให้ใส่หมายเลขในแบบไตรภาคได้หรือไม่?
John Dvorak

2
ต้องจัดการ intergers ไม่ใช่เชิงลบจะทำให้ 0 3^0-1 เอาท์พุทที่ถูกต้องจึงไม่สามารถใช้ได้เป็นเท็จ
Jasen

2
ทุกคนคิดว่าการใช้log()ในคำตอบของพวกเขาควรยืนยัน giives คำตอบที่ถูกต้อง5เมื่อ242 ป้อนข้อมูล
Jasen

คำตอบ:


23

Mathematica, 21 16 ไบต์

-1&@@Log[3,#+1]&

ใช้การคำนวณเชิงสัญลักษณ์ของ Mathematica ถ้า#+1เป็นค่าพลังสามLog[3,#+1]ค่าจะคำนวณผลลัพธ์จำนวนเต็มซึ่งเป็นค่าอะตอมมิก มิฉะนั้นเราจะได้รับLog[#+1]/Log[3]ตามที่เป็น เนื่องจากนี่ไม่ใช่ค่าอะตอมจึงเป็นนิพจน์ที่อยู่ในฟอร์มhead[val1,val2,...]เสมอ Times[Power[Log[3], -1], Log[#+1]]ในกรณีนี้มันเป็นจริงอย่างเช่น

เราแยกความแตกต่างระหว่างสองกรณีโดยใช้ฟังก์ชันอื่นกับผลลัพธ์ สิ่งที่ใช้จริง ๆ ก็คือมันแทนที่headส่วนหนึ่งของนิพจน์ เนื่องจากผลลัพธ์จำนวนเต็มเป็นอะตอมมิกการใช้ฟังก์ชันใด ๆ กับสิ่งเหล่านั้นจึงไม่ทำสิ่งใดเลย f @@ atom == atomโดยเฉพาะอย่างยิ่ง

อย่างไรก็ตามในอีกกรณีหนึ่งหัวจะได้รับการแทนที่ ฟังก์ชั่นที่เรากำลังใช้อยู่ซึ่งเป็นฟังก์ชั่นที่เรียบง่ายที่จะไม่สนใจข้อโต้แย้งและผลตอบแทนของ-1& -1ดังนั้นเราจึงได้รับบางสิ่งบางอย่างในกรณีที่ไม่ใช่จำนวนเต็มซึ่งประเมินโดยตรงไปยัง-1&[Power[Log[3], -1], Log[#+1]] -1ปลอกพิเศษผ่านเวทย์มนตร์


13

Python ขนาด46 44 ไบต์

lambda x:max(n*(3**n-1==x)for n in range(x))

ลองออนไลน์!

ในกรณีนี้0จะเป็นค่าที่ผิดพลาด ขอบคุณ @ mbomb007 สำหรับชี้ให้เห็นผลลัพธ์ที่ไม่ถูกต้องของฉันเช่นเดียวกับ 2 ไบต์ไม่[]ประหยัด


คุณสามารถเขียนใหม่[n for n in range(x)if 3**n-1==x]สำหรับ -4 ไบต์รายการว่างเปล่าเป็นเท็จ
Rod

แก้ไขขอบคุณ! @ เร็วแล้วมันจะกลับ [n] แทน n ฉันคิดว่า
nmjcman101

@ nmjcman101 ที่ไม่น่าจะมีปัญหา
Rod

@Rod ฉันต้องการยึดมั่นอย่างเคร่งครัดเพื่อ spec ตอนนี้
nmjcman101

@Rod หากต้องการเอาท์พุทเป็นจำนวนเต็มคุณไม่สามารถส่งออกได้ในรายการยกเว้น OP จะอนุญาตเฉพาะ
mbomb007


11

05AB1E , 7 ไบต์

3IÝm<¹k

ลองออนไลน์!

คำอธิบาย

3        # push 3 
 I       # push input
  Ý      # range [0 ... input]
   m     # 3^[0 ... input]
    <    # -1
     ¹k  # find index of input, return -1 if not found

เห็นได้ชัดว่า 05AB1E ดีต่อการแปลงฐานนี่เป็นวิธีที่ดีที่สุดใช่หรือไม่
Jasen

1
@Jasen: ความพยายามของฉันกับการแปลงฐานทั้งหมดเปิดออกอีกต่อไป หากมีวิธีที่ดีกว่านี้ฉันไม่เห็นมัน อย่าลังเลที่จะพิสูจน์ว่าฉันผิด :)
Emigna

พอธรรมผมได้มีเพียงอ่านคำอธิบายของภาษาและคาดว่าจะเห็นการแก้ปัญหา 5 ไบต์ ....
Jasen

1
@Jasen <3zm©.ïi®นั้นใกล้เคียงที่สุดที่ฉันไม่ได้ใช้ช่วงเหมือนที่เขาทำ
Magic Octopus Urn

1
3DÝms<k... ไม่เป็นไร ... ไม่สามารถสลัดอีกหนึ่งไบต์ได้ฉันสาบานได้เลย
Magic Octopus Urn


6

Python 2, 41 ไบต์

f=lambda n,i=0:i*0**n or n%3/2*f(n/3,i+1)

ฟังก์ชันเรียกซ้ำที่ส่งคืน0สำหรับอินพุตที่ไม่ตรงกัน แบ่งชั้นของอินพุตอย่างต่อเนื่องซ้ำ ๆ กัน 3 ครั้งโดยนับจำนวนของขั้นตอนiซึ่งเป็นผลลัพธ์ในท้ายที่สุด แต่ถ้าขั้นตอนใด ๆ สร้างค่าnที่ไม่ใช่ 2 โมดูโล 0 ตัวเลขนั้นไม่ได้เป็นค่า3^i-1ดังนั้นผลลัพธ์จะถูกคูณด้วย 0


6

Perl, 31 ไบต์

say grep{3**$_-1==$i}0..($i=<>)

ต้องมีการ-Eตั้งค่าสถานะให้ทำงาน:

perl -E 'say grep{3**$_-1==$i}0..($i=<>)' <<< 26

คำอธิบาย:
grep{3**$_-1==$i}0..($i=<>)ผลตอบแทนรายชื่อขององค์ประกอบของช่วงที่ที่ตอบสนองการทดสอบ0..$_ (เช่นจาก 0 ถึงการป้อนข้อมูล.) 3**$_-1==$iองค์ประกอบเดียวเท่านั้นที่สามารถตอบสนองการทดสอบนี้ได้มากที่สุดดังนั้นคำสั่งนี้จะส่งคืนอาร์เรย์เป็น 0 หรือ 1 องค์ประกอบ จากนั้นเราจะพิมพ์รายการนี้: อย่างใดอย่างหนึ่งXหรือไม่ (ซึ่งเป็นเท็จ)


5

Pyth, 11 ไบต์

?-JjQ3 2ZlJ

แปลงไปยังฐานที่ 3 [2, 2, ..., 2]และการตรวจสอบความเท่าเทียมกันในการ


คุณสามารถลดสิ่งนี้ลงทีละไบต์ด้วย?-2JjQ3ZlJเนื่องจาก<col> <num>และ<num> <col>สามารถใช้แทนกันได้-ใน Pyth
notjagan

5

JavaScript (ES7), 38 36 34 ไบต์

f=(n,k=33)=>3**k-n-1&&--k?f(n,k):k

หรือเพียง30 29 ไบต์ถ้าตกลงเพื่อออกโดยมีข้อผิดพลาดเมื่อล้มเหลว

f=(n,k)=>~(n-3**k)?f(n,-~k):k

ทดสอบ


5

Java 8, 37 58 67 ไบต์

i->{String s=i.toString(i,3);return s.matches("2*")?s.length():-1;}

แลมบ์ดานี้เหมาะกับการFunction<Integer, Integer>อ้างอิงและใช้เคล็ดลับพื้นฐาน 3 อย่างง่ายๆ

เวลานี้มันควรจะทำงานอย่างถูกต้อง


3
จะไม่พิมพ์เฉพาะจริงหรือเท็จเมื่อมันสามารถเขียนในรูปแบบหรือไม่ แต่ฉันขอเลขยกกำลังเมื่อผลลัพธ์เป็น True
P. Ktinos เมื่อ

2
อัจฉริยะนั่น! +1 สำหรับวิธีการที่ฉลาดมาก
DJMcMayhem

มันฉลาด ... ฉันเชื่อว่าคุณสามารถลบ parens และทำมันi->ได้ นอกจากนี้หากคุณใช้iเป็นLongคุณสามารถใช้a.toString(...)(ides จะให้คำเตือนบางอย่างเกี่ยวกับการใช้ฟังก์ชั่นคงที่ไม่ถูกต้อง แต่ควรรวบรวม) อย่างไรก็ตามอย่างที่ OP บอกไว้คุณต้องคืนค่าไม่ใช่แค่จริงหรือเท็จ
FlipTack

หากแลมบ์ดาถูกเก็บไว้ในประเภทฟังก์ชั่นที่แตกต่างกันแล้วเคล็ดลับคงที่ทำงาน ฉันยังแก้ไขค่าส่งคืน ฉันต้องพลาดส่วนนั้นไป

5

กำลังประมวลผล60 56 ไบต์

void q(float n){n=log(n+1)/log(3);print(n>(int)n?-1:n);}

ส่งออก-1ถ้าเท็จ

คำอธิบาย

void q(float n){              // n is input
  n=log(n+1)/log(3);          // finds X in 3^X+1=n as a float (here we'll storing that in n)
  print(n>(int)n?-1:n);       // checks if the float is greater than
                              // the number rounded down (by int casting)
                              // if it is greater, output -1
                              // otherwise output X
}

voidสั้นกว่าการใช้ 1 ไบต์floatนั่นคือสาเหตุที่ฟังก์ชั่นนี้ส่งออกโดยตรงแทนที่จะส่งคืนค่า

ทางเลือกทางแก้ไข

void z(float n){int c=0;for(++n;n>1;c++)n/=3;print(n==1?c:-1);}

63 ไบต์ แต่ฉันคิดว่า alt นี้สามารถเล่นกอล์ฟให้สั้นกว่าโซลูชันเดิมได้ ฉันกำลังทำงานกับมัน


@FlipTack ใช่ฉันรู้ว่ามันจะไม่อยู่ใน Java ฉันเพิ่งถามเพราะฉันไม่แน่ใจว่าการประมวลผลไม่ได้เพิ่มบางอย่างในบรรทัดเหล่านั้น "ค่าที่แตกต่าง" ที่จะใช้คือ -1 ถึงแม้ว่าไม่ใช่ 0 มันถูกเปลี่ยนตั้งแต่อย่างไรก็ตามดังนั้นฉันอาจจะล้างความคิดเห็นของฉันเกี่ยวกับมัน
Geobits

เดี๋ยวก่อนฉันจะกลับมาได้0ไหม
Kritixi Lithos

ฉันยังคงปฏิเสธ คำถามให้ค่าจำนวนเต็มสำรองที่ใช้หากเป็นเท็จ แต่0ไม่เคยเท็จใน Java / Processing ที่ฉันรู้
Geobits

ฉันคิดว่าการประมวลผลควรจะน้อยกว่าJava
Pavel

@Pavel แต่ฉันไม่ได้ใช้ lambdas: /
Kritixi Lithos

4

Brachylogขนาด 8 ไบต์

,3:.^-?,

ลองออนไลน์!

ส่งออกค่าถ้าเป็นจริงและfalse.หากเป็นไปไม่ได้

คำอธิบาย

นี่คือการถอดความโดยตรงของความสัมพันธ์ที่กำหนด:

,     ,      (Disable implicit unification)
 3:.^        3^Output…
     -?              … - 1 = Input

คุณสามารถเกือบกอล์ฟลงนี้ถึง 7 ไบต์+~^r~:3แต่น่าเสียดายที่~:ไม่ได้ทำในสิ่งที่คุณอาจคาดหวัง (อาจเป็นเพราะ:เป็นไวยากรณ์มากกว่า builtin) :และดูเหมือนว่าจะได้รับการปฏิบัติเหมือนกันกับ

@ ais523 ถูกต้อง:เป็นสัญลักษณ์ควบคุมและ~ใช้งานได้กับภาคแสดงเท่านั้น
ลดขนาด

3

Perl 6 ,  25  24 ไบต์

{first $_==3** *-1,0..$_}

ลองมัน

{first $_==3***-1,0..$_}

การลบช่องว่างหลังเลิก**งานเพราะยาวกว่าตัวดำเนินการมัดอื่นที่สามารถจับคู่*ได้
ดังนั้น…***…จะแยกเป็นมากกว่า… ** * …… * ** …

ลองมัน

ขยาย:

{  # bare block lambda with implicit parameter 「$_」

  first
    $_ == 3 ** * - 1,   # WhateverCode lambda
    #          ^- current value

    0 .. $_             # a Range up-to (and including) the input

}

3

R, 24 ไบต์

แนวทางที่แตกต่างจากคำตอบของ plannapusและสั้นลงหนึ่งไบต์!

match(scan(),3^(1:99)-1)

สร้างจำนวนเต็มทั้งหมดจาก3^1-1ถึง3^99-1และตรวจสอบว่า stdin ตรงกันหรือไม่ xถ้าเป็นเช่นนั้นก็จะส่งกลับดัชนีที่มันตรงซึ่งเป็น หากไม่ใช่ให้ส่งคืนค่าที่NAเป็นเท็จ

อนึ่งมันจะยอมรับค่าหลายค่าเป็นอินพุตและทดสอบทั้งหมดซึ่งเป็นคุณลักษณะที่เรียบร้อย




2

MATL , 8 ไบต์

3i:^qG=f

สิ่งนี้จะส่งออกจำนวนxถ้ามันมีอยู่หรือมิฉะนั้นจะไม่มีอะไรออกซึ่งเป็นเท็จ

ลองออนไลน์!

คำอธิบาย

3    % Push 3
i    % Input n
:    % Range: gives `[1 2 ... n]
^    % Power, element-wise. Gives [3^1 3^2 ... 3^n]
q    % Subtract 1, element-wise. Gives [3^1-1 3^2-1 ... 3^n-1]
=    % Test for equality. Contains 'true' at the position x, if any,
     % where 3^x-1 equals n
f    % Find. Gives index of the 'true' position, which ix x; or gives
     % an empty array if no such position exists. Implicitly display


2

Python 3, 74 66 64 ไบต์

-10 ไบต์ขอบคุณ @ mbomb007, @FlipTack และ @ nmjcman101

from math import*
def f(n):x=ceil(log(n,3));print((3**x-1==n)*x)

from math import*คุณสามารถใส่โค้ดทั้งหมดในหนึ่งบรรทัดและการใช้งาน return n==3**x-1and xด้วย
mbomb007


@ mbomb007 ฟังก์ชั่นได้รับอนุญาตให้พิมพ์ผลลัพธ์เป็นSTDOUTดังนั้นคุณสามารถเปลี่ยนกลับไปที่การพิมพ์
FlipTack

หากคุณแสดงสิ่งนี้เป็นโซลูชันSageMathแทนที่จะเป็น Python คุณสามารถวางบรรทัดแรกได้เลย
Federico Poloni

นอกจากการลดลงเหลือ 65 ไบต์แล้วคุณยังสามารถใช้import mathและmath.ceilไบต์เดียวได้อีกด้วย นอกจากนี้คุณสามารถหัน3**x-1==n and xไปx*(3**x-1==n)
nmjcman101


2

C, 56 ไบต์

 n;f(a){n=0;for(a++;!(a%3)&&(a/=3);++n);return --a?-1:n;}

เพิ่มหนึ่งลงในอินพุตจากนั้นหารด้วยสามซ้ำ ๆ จนกว่าจะพบส่วนที่เหลือหากถึงค่าแล้วให้ส่งกลับจำนวนการหารอีก -1


บันทึกหนึ่งไบต์กับแทนa%3<1 !(a%3)อีกหนึ่ง0สำหรับการเป็นเท็จ
ติตัส

สมมติว่าคุณกำลังใช้ GCC เพื่อรวบรวมคุณสามารถบันทึกจำนวน 10 (11) ไบต์: คุณไม่จำเป็นต้องเริ่มต้น n เป็นศูนย์ถ้าคุณรู้ว่าคุณจะเรียกใช้ฟังก์ชันนี้เพียงครั้งเดียวตั้งแต่นั้น n จะเป็นศูนย์โดยค่าเริ่มต้น ( เพราะมันเป็นโลก) - น้อยกว่า 4 ไบต์ คุณไม่จำเป็นต้องมีคำสั่ง return โดยเขียนa=--a?-1:n;ว่าคุณจะประหยัดได้ 5 ไบต์ หากฟังก์ชั่นที่ไม่ใช่โมฆะไม่มีผลตอบแทนมันก็จะใช้การมอบหมายสุดท้าย นอกจากนี้สิ่งที่ @Titus พูด
Etaoin Shrdlu

1
แนะนำa%3?0:(a/=3)แทน!(a%3)&&(a/=3)
ceilingcat

2

ยูทิลิตีBash / Unix, 37 35 ไบต์

bc<<<`dc<<<3o$1p|grep ^2*$|wc -c`-1

ลองออนไลน์!

ใช้ dc เพื่อแปลงเป็นฐาน 3 ตรวจสอบว่าสตริงผลลัพธ์เป็น 2s ทั้งหมดนับจำนวนอักขระ (รวมถึงบรรทัดใหม่) จากนั้นใช้ bc เพื่อลบ 1

หากตัวเลขในฐาน 3 ไม่ใช่ 2 ทั้งหมดดังนั้น grep จึงไม่แสดงผลอะไรเลย (ไม่ใช่แม้แต่บรรทัดใหม่) ดังนั้นจำนวนอักขระคือ 0 และการลบ 1 ให้ผลเป็น -1


2

C ที่คอมไพล์ด้วย Clang 3.8.1, 53 , 52 , 54 , 51 Bytes

n;f(y){y++;for(n=0;y%3==0;y/=3)n++;return y^1?0:n;}

@SteadyBox ติดประกาศโซลูชันใน C แล้ว แต่ฉันใช้วิธีการอื่น

@ ขอบคุณ Jasen ที่ช่วยประหยัดไบต์


1
ใช่ แต่มันใช้งานได้? เปรียบเทียบลอยเพื่อความเท่าเทียมกันมักจะเป็นสูตรสำหรับความล้มเหลวที่ไม่คาดคิด (ลองปัจจัยการผลิตขนาดใหญ่)
Jasen

@ Jasen อืมไม่ได้ลอง แต่ใน C logกลับมาdoubleบางทีมันอาจใช้งานได้
ลุยไทเลอร์

double เป็นประเภทของค่าอิงดัชนีดังนั้นเขายังคงมีปัญหาอยู่
Jasen

ดูเหมือนว่าจะทำงานได้ดีสำหรับ 3 ^ 19 ซึ่งอาจมีขนาดใหญ่พอ
Jasen

@ Jasen มันใช้งานไม่ได้สำหรับ 3 ^ 10
Wade Tyler

2

C, 42 ไบต์ได้รับการปรับให้เหมาะสมจาก Wade Tyler

n;f(y){for(n=0;y%3>1;y/=3)n++;return!y*n;}

ลอง

C, 37 ไบต์โดยไม่ต้อง return

n;f(y){for(n=0;y%3>1;y/=3)n++;n*=!y;}

ลอง

nเป็นสากล แต่(I)MULสามารถมีตัวถูกดำเนินการ dest ในการลงทะเบียนดังนั้นต้องใส่EAX(ตัวเลือกปกติ) และ mov ที่นั่น

JavaScript 6, 32 ไบต์

f=(y,n)=>y%3>1?f(y/3|0,-~n):!y*n
;[1,2,3,8,12,43046720].forEach(x=>console.log(f(x)))

หาก "falsy" จำเป็นต้องเหมือนกัน 33 ไบต์:

f=(y,n)=>y%3>1?f(y/3|0,-~n):!y&&n

2

Pyt , 10 9 ไบต์

←⁺3ĽĐĐƖ=*

คำอธิบาย:

←                Get input
 ⁺               Add one
  3Ľ             Log base 3
    ĐĐ           Triplicate top of stack
      Ɩ          Convert top of stack to integer
       =         Check for equality between top two on stack
        *        Multiply by log_3(input+1)


บันทึกไบต์โดยใช้ฟังก์ชันการเพิ่มแทนที่จะเพิ่ม 1 อย่างชัดเจน


ในหน้ารหัสอะไรคือ 9 ไบต์? (ใน UTF-8 คือ 17 ไบต์)
Jasen

1

Python ขนาด 64 ไบต์

เอาต์พุตFalseหากไม่สามารถเขียนตัวเลขในรูปแบบนั้น

def f(n):L=[3**x-1for x in range(n)];print n in L and L.index(n)

สิ่งนี้ยังทำงานใน 64 ไบต์และพิมพ์สตริงว่างเปล่าเป็นผลลัพธ์ที่ผิดพลาด:

def f(n):
 try:print[3**x-1for x in range(n)].index(n)
 except:0

โซลูชันที่สร้างสรรค์สำหรับ 65 ไบต์ให้ผลลัพธ์ที่0ผิดพลาด:

lambda n:-~",".join(`3**x-1`for x in range(n+1)).find(',%s,'%n)/2

ไม่ออกหรือx -1
dfernan

โปรแกรมควรส่งออกxแทนที่จะเป็นnในกรณีของการแข่งขัน
dfernan

ไม่มันควรส่งออกจำนวนเต็มบวกที่เมื่อแทนที่ด้วย X คุณจะได้รับอินพุต คำถามหมายถึง X เป็นตัวแปรไม่ใช่เป็นสตริง
P. Ktinos

@ P.Ktinos แก้ไข
mbomb007


1

Julia 30 ไบต์

n->findfirst(n.==3.^(0:n)-1)-1

มันเป็นฟังก์ชั่นที่เรียบง่าย - มันจะสร้างเวกเตอร์ที่มีtrueเฉพาะในตำแหน่งที่สอดคล้องกันในการ3^a-1ที่aเป็นเวกเตอร์ที่มีจำนวนเต็มระหว่าง 0 nและ พบตำแหน่ง "อันดับแรก" ที่เป็นtrueและลบ 1 (ถ้าเป็นทั้งหมดfalseการค้นหาจะประเมินค่าเป็นศูนย์และส่งคืน -1)

ตามที่0:nมี0อยู่ในจุดแรกการลบ 1 จะแก้ไขสำหรับการจัดทำดัชนีและเปิดใช้งานการ-1ตอบกลับที่ผิด



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