이 숫자를 (3 ^ x)-1 형식으로 쓸 수 있습니까?


41

도전:

양의 정수를 허용하고 (3 ^ x) -1 형식으로 작성할 수 있는지 확인하는 프로그램을 작성하십시오. 여기서 X는 또 다른 양의 정수 입니다.

가능하면 X를 출력하십시오.

그렇지 않으면 -1 또는 허위 문을 출력하십시오 .

입력 / 출력 예

입력:

2

(3 ^ 1)-1로 쓸 수 있으므로 1 인 x를 출력합니다

산출:

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
3 진수로 숫자를 입력 할 수 있습니까?
John Dvorak

2
음이 아닌 interger를 처리해야 할 경우 0 3^0-1 은 유효한 출력이되어 false로 사용할 수 없습니다.
Jasen

2
log()답변 에 사용하려고 생각하는 사람 은 입력 5할 때 정답을 제공하는지 확인해야 242합니다.
Jasen

답변:


23

수학, 21 16 바이트

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

Mathematica의 기호 계산을 사용합니다. 경우 #+13 인 전력은 다음 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

파이썬, 46 44 바이트

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

온라인으로 사용해보십시오!

이 경우 0허위 값이됩니다. 내 잘못된 출력을 지적하고 2 바이트 []절약 없음을 알려주는 @ mbomb007 덕분 입니다.


[n for n in range(x)if 3**n-1==x]-4 바이트, 빈 목록을 거짓 으로 다시 작성할 수 있음
Rod

고마워요! @Rod 그러면 n 대신 [n]을 반환합니다. 생각
nmjcman101

@ nmjcman101 그것은 문제가되지 않아야한다
Rod

@로드 나는 지금 당장 사양을 엄격히 준수하고 싶습니다
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 : 기본 변환 시도가 모두 더 길어졌습니다. 이것보다 더 좋은 방법이 있다면 나는 그것을 보지 못합니다. 그래도 나를 잘못 증명해
주시기 바랍니다

공정하게도, 나는 언어에 대한 설명 만 읽었으므로 5 바이트 솔루션을 보게 될 것입니다 ...
Jasen

1
@Jasen <3zm©.ïi®은 내가했던 것처럼 범위를 사용하지 않은 가장 가까운 것입니다.
Magic Octopus Urn

1
3DÝms<k... 신경 쓰지 마 ... 한 바이트 더 면도 할 수 없다, 내가 맹세 할 수 있습니다.
Magic Octopus Urn


6

파이썬 2, 41 바이트

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

0일치하지 않는 입력 을 반환하는 재귀 함수입니다 . 의 단계 수를 세어 입력을 3으로 반복적으로 나눕니다 i. 그러나 어떤 단계에서 n2 모듈로 0이 아닌 값 을 생성 하면 숫자가 for 3^i-1가 아니므로 출력에 0이 곱해집니다.


6

펄, 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

자바 스크립트 (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

자바 8, 37 58 67 바이트

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

이 람다는 Function<Integer, Integer>참조에 적합 하며 간단한 기본 3 트릭을 사용합니다.

이번에는 제대로 작동합니다.


3
형식으로 쓸 수있을 때 True 또는 False 만 인쇄하지 않습니까? 그러나 결과가
참일

2
천재입니다! 매우 영리한 접근을 위해 +1
DJMcMayhem

이것은 영리합니다 ... 나는 당신이 parens를 제거하고 그냥 만들 수 있다고 생각합니다 i->. 당신이 가지고가는 경우 또한, iA와 Long, 당신은 사용할 수 있습니다 a.toString(...)(십오 잘못 정적 기능을 사용하는 방법에 대한 몇 가지 경고를 줄 것이다,하지만 컴파일해야한다). 그러나 OP가 말했듯이 True 또는 False뿐만 아니라 값을 반환해야합니다.
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 바이트의 경우이 대안이 원래 솔루션보다 짧게 골프화 될 수 있다고 생각합니다. 작업 중입니다.


@FlipTack 그래, 나는 그것이 Java에 없을 것이라는 것을 알았다. Processing이 해당 라인을 따라 무언가를 추가하지 않았다는 것을 확신하지 못했기 때문에 방금 물었습니다. 사용되는 "고유 값"은 -1이 아니라 0입니다. 그러나 이후로 변경되었으므로 이에 대한 의견을 정리하겠습니다.
Geobits

잠깐만, 0이제 돌아올 수 있을까?
Kritixi Lithos

나는 여전히 아니오라고 말할 것입니다. 이 질문은 거짓 인 경우 사용할 대체 정수 값을 제공하지만 0내가 아는 Java / Processing에서는 결코 거짓이 아닙니다.
Geobits

처리 과정은 Java 보다 장황한 것으로 간주되었습니다
Pavel

@Pavel 그러나 나는 람다를 사용하지 않습니다 : /
Kritixi Lithos

4

Brachylog , 8 바이트

,3:.^-?,

온라인으로 사용해보십시오!

true이고 false.불가능한 경우 값을 출력합니다 .

설명

이것은 주어진 관계의 직접적인 전사입니다.

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

거의 7 바이트로 골프를 칠 수는 +~^r~:3있지만 불행히도 ~:( :내장 구문이 아닌 구문 때문일 수 있음) 예상대로 수행하지 않으며 와 동일하게 취급되는 것으로 보입니다 :.

@ ais523 맞습니다 :. 제어 기호이며 ~술어에서만 작동합니다.
Fatalize

3

펄 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의 답변 과 다른 접근법 이며 1 바이트 더 짧습니다!

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

모든 정수를 생성 3^1-1하는 3^99-1, 및 검사 표준 입력이 일치하는 경우. 일치하면 일치하는 인덱스 인을 반환합니다 x. 그렇지 않으면 NA거짓 값으로 반환 합니다.

또한 여러 값을 입력으로 받아들이고 모든 값을 테스트하므로 깔끔한 기능입니다.


3

프롤로그, 20 바이트

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

이 언어는 지옥처럼 시원합니다.

| ?- d(1024,X).

no
| ?- d(26,X).

X = 3

yes
| ?- d(2,X).

X = 1

yes

2

05AB1E , 9 바이트

DÝ3sm<Q1k

온라인으로 사용해보십시오!

거짓 인 경우 -1을 인쇄합니다.

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 바이트

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

Japt , 11 바이트

o æ@U+1¥3pX

여기서 사용해보십시오 .

도움을 주신 ETHproductions에게 큰 감사를드립니다!


2

파이썬 3, 74 66 64 바이트

@ mbomb007, @FlipTack 및 @ nmjcman101 덕분에 -10 바이트

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 솔루션 으로 제시 하면 첫 번째 줄을 모두 삭제할 수 있습니다.
Federico Poloni

65 바이트로의 다른 축소와 함께 import mathmath.ceil단일 바이트를 사용할 수 있습니다 . 또한 당신은 회전 수 3**x-1==n and xx*(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을 더한 다음 나머지가 발견 될 때까지 3으로 반복하여 나눕니다.


a%3<1대신 1 바이트를 저장하십시오 !(a%3). 0거짓으로 하나 더 .
Titus

GCC를 사용하여 컴파일한다고 가정하면 총 10 (11) 바이트를 저장할 수 있습니다.이 함수를 한 번만 호출하면 n이 0으로 초기화되면 n은 기본적으로 0이됩니다 ( 글로벌이기 때문에)-4 바이트가 적습니다. 또한 a=--a?-1:n;5 바이트를 절약 하여 return 문이 필요하지 않습니다 . 무효가 아닌 함수가 반환하지 않으면 마지막 할당 만 사용합니다. 또한 @Titus가 말한 것.
Etaoin Shrdlu

1
a%3?0:(a/=3)대신 추천!(a%3)&&(a/=3)
천장 고양이

2

Bash / Unix 유틸리티, 37 35 바이트

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

온라인으로 사용해보십시오!

dc를 사용하여 밑을 3으로 변환하고 결과 문자열이 모두 2인지 확인하고 문자 수 (개행 포함)를 세고 bc를 사용하여 1을 뺍니다.

기수 3의 숫자가 모두 2 가 아닌 경우 grep은 아무 것도 출력하지 않으므로 (줄 바꿈도) 문자 수는 0이되고 1을 빼면 -1이됩니다.


2

Clang 3.8.1, 53 , 52 , 54 , 51 바이트로 컴파일 된 C

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

@SteadyBox는 이미 C에 솔루션을 게시했지만 다른 접근법을 사용하고 있습니다.

@ 바이트 절약에 도움을 준 Jasen에게 감사합니다.


1
예, 그러나 작동합니까? 플로트를 평등하게 비교하는 것은 종종 예기치 않은 실패 (대량 입력 시도)를위한 레시피입니다.
Jasen

@Jasen Hmm, 시도하지 않았지만 C log반환 double에서는 작동 할 수 있습니다.
웨이드 타일러

double은 부동 소수점 값의 한 유형이므로 문제가 지속됩니다.
Jasen

아마도 충분히 큰 3 ^ 19에서 제대로 작동하는 것 같습니다.
Jasen

@Jasen 3 ^ 10에서는 작동하지 않습니다
Wade Tyler

2

C, 42 바이트, Wade Tyler 's에서 최적화

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레지스터에 첫 번째 피연산자를 가질 수 있으므로 EAX(일반적인 선택)을 넣고 mov해야합니다.

자바 스크립트 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)))

"가짜"가 동일해야하는 경우 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

파이썬, 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

줄리아, 30 바이트

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

간단한 함수입니다- true의 해당 위치에만 있는 벡터를 만듭니다. 3^a-1여기서 a0과 사이의 정수를 포함하는 벡터 n입니다. "첫 번째"위치를 찾아 true1을 뺍니다 (모두 false이면 찾기는 0으로 평가되고 -1을 리턴 함).

마찬가지로 0:n갖는 0제하다고도 빼기 1 인덱싱 보정하고, 가능하게는 -1거짓 응답.



1

피 이스 8 바이트

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

여기를보십시오

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.