Số này có thể được viết theo định dạng (3 ^ x) - 1 không?


41

Thử thách:

Tạo một chương trình chấp nhận một số nguyên dương và kiểm tra xem nó có thể được viết dưới dạng (3 ^ x) -1 không, trong đó X là một số nguyên dương khác .

Nếu có thể, hãy xuất X

Nếu nó không có thể, sản lượng -1 hoặc một falsy tuyên bố.

Ví dụ đầu vào / đầu ra

Đầu vào:

2

Nó có thể được viết là (3 ^ 1) - 1, vì vậy chúng tôi xuất ra x là 1

Đầu ra:

1

Đầu vào:

26

26 có thể được viết là (3 ^ 3) - 1, vì vậy chúng tôi xuất ra x (3)

Đầu ra:

3

Đầu vào:

1024

1024 không thể được viết dưới dạng (3 ^ x) - 1, vì vậy chúng tôi xuất -1

Đầu ra:

-1

Đây là nên số lượng byte thắng ít nhất


OEIS liên quan: A024023


4
Tôi yêu cầu đầu ra X bởi vì tôi tin rằng nó khó khăn hơn theo cách đó. Đơn giản chỉ cần tìm nếu nó có định dạng 3 ^ x - 1 sẽ là quá dễ dàng cho một thách thức, theo ý kiến ​​của tôi.
P. Ktinos

2
Trừ khi đó là một tuyên bố sai lệch trong ngôn ngữ lập trình của bạn, thì không.
P. Ktinos

2
Tôi có thể muốn số được nhập vào ternary không?
John Dvorak

2
phải xử lý các bộ giao thoa không âm sẽ làm cho 0 trở 3^0-1 thành đầu ra hợp lệ và do đó không thể sử dụng thành sai,
Jasen

2
Bất cứ ai nghĩ đến việc sử dụng log()trong câu trả lời của họ nên xác nhận nó đưa ra câu trả lời đúng 5khi 242 nhập liệu.
Jasen

Câu trả lời:


23

Toán học, 21 16 byte

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

Làm cho việc sử dụng tính toán tượng trưng của Mathicala. Nếu #+1Log[3,#+1]lũy thừa của ba thì sẽ tính kết quả số nguyên là giá trị nguyên tử. Nếu không, chúng tôi sẽ nhận được Log[#+1]/Log[3]như là. Vì đây không phải là một giá trị nguyên tử, nó là một biểu thức luôn có dạng head[val1,val2,...]. Trong trường hợp này, nó thực sự là một cái gì đó như Times[Power[Log[3], -1], Log[#+1]].

Chúng tôi phân biệt giữa hai trường hợp bằng cách áp dụng một chức năng khác cho kết quả. Những gì áp dụng thực sự là nó thay thế headmột phần của một biểu thức. Vì kết quả số nguyên là nguyên tử, nên áp dụng bất kỳ hàm nào cho chúng không làm gì cả. Đặc biệt f @@ atom == atom.

Tuy nhiên, trong trường hợp khác, đầu được thay thế. Hàm chúng ta đang sử dụng là -1&một hàm đơn giản bỏ qua các đối số và trả về của nó -1. Vì vậy, chúng tôi nhận được một cái gì đó -1&[Power[Log[3], -1], Log[#+1]]trong các trường hợp không nguyên, mà đánh giá trực tiếp đến -1. Vỏ bọc đặc biệt thông qua phép thuật.


13

Python, 46 44 byte

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

Hãy thử trực tuyến!

Trong trường hợp này, 0sẽ là giá trị giả. Cảm ơn @ mbomb007 vì đã chỉ ra đầu ra không chính xác của tôi cũng như 2 byte không []tiết kiệm.


bạn có thể viết lại dưới dạng [n for n in range(x)if 3**n-1==x]-4 byte, danh sách trống dưới dạng giả
Rod

Đã sửa, cảm ơn bạn! @Rod sau đó nó sẽ trả về [n] thay vì n tôi nghĩ
nmjcman101

@ nmjcman101 không phải là vấn đề
Rod

@Rod Tôi muốn tuân thủ nghiêm ngặt thông số kỹ thuật ngay bây giờ
nmjcman101

@Rod Nếu xuất ra một số nguyên là bắt buộc, bạn không thể xuất nó trong danh sách trừ khi OP đặc biệt cho phép.
mbomb007


11

05AB1E , 7 byte

3IÝm<¹k

Hãy thử trực tuyến!

Giải trình

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 rõ ràng là tốt trong chuyển đổi cơ sở, đây có thực sự là cách tiếp cận tốt nhất?
Jasen

1
@Jasen: Tất cả các nỗ lực của tôi với chuyển đổi cơ sở đều bật ra lâu hơn. Nếu có một cách tốt hơn thế này thì tôi không thấy nó. Vui lòng chứng minh tôi sai mặc dù :)
Emigna

đủ công bằng, tôi chỉ đọc mô tả ngôn ngữ, và, vì vậy, dự kiến ​​sẽ thấy một giải pháp 5 byte ....
Jasen

1
@Jasen <3zm©.ïi®là gần nhất tôi đã không sử dụng phạm vi như anh ấy đã làm.
Bạch tuộc ma thuật Urn

1
3DÝms<k... Nevermind ... Tôi không thể cạo thêm một byte, tôi có thể tuyên thệ.
Bạch tuộc ma thuật Urn

9

Thạch , 5 byte

R3*’i

Đầu ra x hoặc 0 (giả).

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

R3*’i  Main link. Argument: n

R      Range; yield [1, ..., n].
 3*    Map each k to 3**k.
   ’   Decrement the results.
    i  First index of n (0 if not found).

6

Python 2, 41 byte

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

Hàm đệ quy trả về 0các đầu vào không khớp. Liên tục chia sàn cho 3 đầu vào, đếm số bước trong iđó là đầu ra cuối cùng. Nhưng, nếu bất kỳ bước nào tạo ra một giá trị nkhông phải là 2 modulo 0, thì số đó không phải là của 3^i-1, vì vậy đầu ra được nhân với 0.


6

Perl, 31 byte

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

Yêu cầu -Ecờ chạy:

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

Giải thích:
grep{3**$_-1==$i}0..($i=<>)trả về danh sách các phần tử của phạm vi 0..$_(nghĩa là từ 0 đến đầu vào) thỏa mãn bài kiểm tra 3**$_-1==$i. Chỉ có một phần tử có thể đáp ứng bài kiểm tra này, vì vậy hướng dẫn này sẽ trả về một mảng 0 hoặc 1 phần tử. Sau đó chúng tôi in danh sách này: hoặc là Xkhông có gì (đó là giả mạo).


5

Bình thường, 11 byte

?-JjQ3 2ZlJ

Chuyển đổi sang cơ sở 3 và kiểm tra sự bình đẳng thành [2, 2, ..., 2].


Bạn có thể giảm điều này xuống một byte bằng ?-2JjQ3ZlJ, vì <col> <num><num> <col>có thể hoán đổi cho nhau -trong Pyth.
notjagan

5

JavaScript (ES7), 38 36 34 byte

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

Hoặc chỉ cần 30 29 byte nếu không thoát được khi gặp lỗi:

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

Kiểm tra


5

Java 8, 37 58 67 byte

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

Lambda này phù hợp với một Function<Integer, Integer>tài liệu tham khảo và sử dụng thủ thuật cơ bản 3 đơn giản.

Lần này nó sẽ hoạt động chính xác.


3
Điều đó sẽ không chỉ đúng hay sai khi nó có thể được viết ở định dạng? Nhưng tôi đã yêu cầu số mũ khi kết quả là Đúng
P. Ktinos

2
Đó là thiên tài! +1 cho cách tiếp cận rất thông minh
DJMcMayhem

Điều này thật thông minh ... tôi tin rằng bạn có thể loại bỏ các parens và chỉ cần thực hiện nó i->. Ngoài ra, nếu bạn lấy ilàm a Long, thì bạn có thể sử dụng a.toString(...)(id sẽ đưa ra một số cảnh báo về việc sử dụng các hàm tĩnh không chính xác, nhưng nên biên dịch). Tuy nhiên, như OP đã nói, bạn cần trả về giá trị, không chỉ đúng hay sai.
FlipTack

Nếu lambda được lưu trữ trong một loại chức năng khác thì thủ thuật tĩnh hoạt động. Tôi cũng đã sửa giá trị trả lại. Tôi đã phải bỏ lỡ phần đó.

5

Đang xử lý, 60 56 byte

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

Đầu ra -1nếu giả.

Giải trình

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
}

voidngắn hơn 1 byte so với sử dụng float, vì vậy đó là lý do tại sao hàm này trực tiếp xuất ra thay vì trả về giá trị.

Giải pháp thay thế

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

cho 63 byte, nhưng tôi nghĩ rằng alt này có thể được đánh golf ngắn hơn giải pháp ban đầu. Tôi đang giải quyết nó.


@FlipTack Vâng, tôi biết nó sẽ không có trong Java. Tôi chỉ hỏi vì tôi không chắc chắn rằng Chế biến đã không thêm một cái gì đó dọc theo những dòng đó. "Giá trị riêng biệt" được sử dụng là -1 mặc dù không phải 0. Nó đã được thay đổi kể từ đó, vì vậy có lẽ tôi sẽ xóa sạch nhận xét của mình về nó.
Geobits

Đợi đã, vậy tôi có thể quay lại 0bây giờ không?
Kritixi Lithos

Tôi vẫn sẽ nói không. Câu hỏi đưa ra một giá trị số nguyên thay thế để sử dụng nếu giả mạo, nhưng 0không bao giờ là giả trong Java / Xử lý mà tôi biết.
Geobits

Tôi xử lý khó khăn được cho là ít linh hoạt hơn Java
Pavel

@Pavel Nhưng tôi không sử dụng lambdas: /
Kritixi Lithos

4

Brachylog , 8 byte

,3:.^-?,

Hãy thử trực tuyến!

Xuất giá trị nếu đúng và false.nếu điều này là không thể.

Giải trình

Đây là phiên âm trực tiếp của mối quan hệ đã cho:

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

Bạn gần như có thể chơi golf xuống tới 7 byte như +~^r~:3, nhưng thật không may ~:, không làm những gì bạn có thể mong đợi (có thể :là do cú pháp chứ không phải là nội dung) và dường như được xử lý giống hệt :.

@ ais523 Điều đó đúng, :là một biểu tượng điều khiển và ~chỉ hoạt động trên các vị ngữ.
Gây tử vong vào

3

Perl 6 ,  25  24 byte

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

Thử nó

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

Loại bỏ không gian sau khi **hoạt động vì nó dài hơn toán tử infix khác có thể khớp *.
Vì vậy, …***…được phân tích cú pháp như … ** * …là hơn … * ** ….

Thử nó

Mở rộng:

{  # 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 byte

Một cách tiếp cận khác với câu trả lời của plannapus và ngắn hơn một byte!

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

Tạo tất cả các số nguyên từ 3^1-1đến 3^99-1và kiểm tra xem stdin có khớp không. Nếu vậy, nó trả về chỉ mục mà nó phù hợp, đó là x. Nếu không, trả về NAlà giá trị giả.

Ngẫu nhiên, nó sẽ chấp nhận nhiều giá trị làm đầu vào và kiểm tra tất cả chúng, đây là một tính năng gọn gàng.


3

Prolog, 20 byte

d(A,X):-A#=(3**X)-1.

Ngôn ngữ này mát mẻ như địa ngục.

| ?- d(1024,X).

no
| ?- d(26,X).

X = 3

yes
| ?- d(2,X).

X = 1

yes

2

05AB1E , 9 byte

DÝ3sm<Q1k

Hãy thử trực tuyến!

In -1 cho giả.

D         # Duplicate the input
 Ý3sm     # Push [0 .. input]^3 (e.g. [0^3, 1^3, 2^3, 4^3 ...])
     <    # subtract 1
      Q   # push a 1 everywhere that equals the input, and 0 everywhere else
       1k # push the index of the 1, or -1 if not found
          # implicit output

2

MATL , 8 byte

3i:^qG=f

Điều này xuất ra số xnếu nó tồn tại, hoặc nếu không đầu ra không có gì, đó là giả.

Hãy thử trực tuyến!

Giải trình

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 byte

-10 byte nhờ @ mbomb007, @FlipTack và @ nmjcman101

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

Bạn có thể đặt tất cả mã của bạn trên một dòng và sử dụng from math import*. Ngoài ra return n==3**x-1and x.
mbomb007


@ mbomb007 Các chức năng được phép in kết quả STDOUT, vì vậy bạn có thể thay đổi kết quả đó thành bản in.
FlipTack

Nếu bạn trình bày đây là một giải pháp SageMath chứ không phải là Python, bạn có thể bỏ dòng đầu tiên hoàn toàn.
Federico Poloni

Cùng với việc giảm xuống còn 65 byte, bạn có thể sử dụng import mathmath.ceilcho một byte đơn. Ngoài ra, bạn có thể chuyển 3**x-1==n and xsangx*(3**x-1==n)
nmjcman101


2

C, 56 byte

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

thêm một vào đầu vào và sau đó liên tục chia cho ba cho đến khi tìm thấy phần còn lại, nếu đạt được một, hãy trả về số lần chia khác -1


Lưu một byte với a%3<1thay vì !(a%3). Thêm một lần nữa 0cho giả.
Tít

Giả sử bạn đang sử dụng GCC để biên dịch, bạn có thể lưu tổng cộng 10 (11) byte: bạn không cần phải khởi tạo n thành 0 nếu bạn biết rằng bạn sẽ chỉ gọi hàm này một lần vì sau đó n sẽ bằng 0 ( bởi vì nó là toàn cầu) - đó là 4 byte ít hơn; ngoài ra, bạn không cần câu lệnh return, bằng cách viết, a=--a?-1:n;bạn sẽ tiết kiệm được 5 byte. nếu một hàm không trống không có trả về, nó sẽ chỉ sử dụng phép gán cuối cùng. Cũng những gì @Titus nói.
Etaoin Shrdlu

1
Đề xuất a%3?0:(a/=3)thay vì!(a%3)&&(a/=3)
trần mèo

2

Tiện ích Bash / Unix, 37 35 byte

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

Hãy thử trực tuyến!

Sử dụng dc để chuyển đổi sang cơ sở 3, kiểm tra xem chuỗi kết quả có phải là tất cả 2 giây không, đếm số lượng ký tự (bao gồm cả một dòng mới), sau đó sử dụng bc để trừ đi 1.

Nếu số trong cơ sở 3 không phải là tất cả 2 giây, thì grep sẽ không tạo ra gì (thậm chí không phải là một dòng mới), do đó, số ký tự là 0 và trừ đi 1 sẽ mang lại -1.


2

C được biên dịch với Clang 3.8.1, 53 , 52 , 54 , 51 Byte

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

@SteadyBox đã đăng một giải pháp trong C, nhưng tôi đang sử dụng một cách tiếp cận khác.

@ Cảm ơn Jasen vì đã giúp lưu byte.


1
Vâng, nhưng nó hoạt động? so sánh phao cho sự bình đẳng thường là một công thức cho sự thất bại bất ngờ (thử đầu vào lớn)
Jasen

@Jasen Hmm, chưa thử điều đó, nhưng trong C logtrở lại doublenên có thể nó sẽ hoạt động.
Wade Tyler

double là một loại giá trị dấu phẩy động nên vấn đề vẫn tồn tại.
Jasen

có vẻ hoạt động tốt trong 3 ^ 19, có lẽ đủ lớn.
Jasen

@Jasen Nó không hoạt động trong 3 ^ 10
Wade Tyler

2

C, 42 byte, được tối ưu hóa từ Wade Tyler's

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

Thử

C, 37 byte, không có return

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

Thử

nlà toàn cầu nhưng (I)MULchỉ có thể có toán hạng mệnh của nó trong một thanh ghi, vì vậy phải đưa vào EAX(sự lựa chọn thông thường) và di chuyển đến đó

JavaScript 6, 32 byte

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

Nếu "giả" cần phải giống nhau, 33 Byte:

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

2

Pyt , 10 9 byte

←⁺3ĽĐĐƖ=*

Giải trình:

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


Đã lưu một byte bằng cách sử dụng hàm tăng thay vì thêm rõ ràng 1


9 byte trong trang mã nào? (trong UTF-8 là 17 byte)
Jasen

1

Python, 64 byte

Đầu ra Falsenếu số không thể được viết theo định dạng đó.

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

Điều này cũng hoạt động trong 64 byte và in chuỗi rỗng dưới dạng đầu ra giả:

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

Một giải pháp sáng tạo cho 65 byte, xuất ra 0cho giả mạo:

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

Không đầu ra xcũng không -1.
dfer Nam

Chương trình nên xuất ra xthay vì ntrong trường hợp khớp.
dfer Nam

Không, nó sẽ xuất ra số nguyên dương mà khi được thay thế bằng X, bạn sẽ nhận được đầu vào. Câu hỏi đề cập đến X như một biến, không phải là một chuỗi
P. Ktinos

@ P.Ktinos Đã sửa nó.
mbomb007


1

Julia, 30 byte

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

Đây là một hàm đơn giản - nó tạo ra một vectơ truechỉ có ở vị trí tương ứng 3^a-1, trong đó amột vectơ chứa các số nguyên nằm trong khoảng từ 0 đến n. Nó tìm vị trí "đầu tiên" truevà trừ đi 1 (nếu là tất cả false, kết quả tìm được ước tính bằng 0 và trả về -1).

Như 0:nđã có 0ở vị trí đầu tiên, phép trừ 1 sửa lỗi để lập chỉ mục và cũng cho phép -1phản hồi sai.



1

Pyth 8 byte

xm^3dUQh

     UQ  # generate all values 1..Q (Q is the input)
 m^3d    # map 3^d over this ^ list
x      h # find the input+1 (hQ) in the result of the last command

Thử ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.