この番号は(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.クティノス

2
それがあなたのプログラミング言語での偽のステートメントである場合を除き、いいえ。
P.クティノス

2
数字を3進数で入力できますか?
ジョンドヴォルザーク

2
非負のintergerを処理しなければ3^0-1 ならない場合、0 は有効な出力になるため、falseとしては使用できません。
Jasen

2
log()回答で使用することを考えている人 は、入力された5ときに正しい回答が得られることを確認する必要242があります。
ジェイセン

回答:


23

Mathematica、21 16バイト

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

Mathematicaのシンボリック計算を利用します。#+1が3のべき乗の場合Log[3,#+1]、原子値である整数結果を計算します。それ以外の場合は、Log[#+1]/Log[3]そのまま取得します。これはアトミック値ではないため、常にの形式の式head[val1,val2,...]です。この場合、実際にはのようなものですTimes[Power[Log[3], -1], Log[#+1]]

結果に別の関数を適用することにより、2つのケースを区別します。実際に適用されるの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今のところ、厳密に仕様に
準拠することを望んでいます-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®は、私が彼のように範囲を使用していないのに最も近いです。
魔法のタコUr

1
3DÝms<k...気にしない...もう1バイト削ることはできません。
魔法のタコUr


6

Python 2、41バイト

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

0一致しない入力を返す再帰関数。入力を3で繰り返しフロア除算し、のステップ数をカウントしますi。これは最終的に出力されます。ただし、いずれかのステップがn0を法とする2でない値を生成する場合、その数値はfor 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

説明:testを満たす
grep{3**$_-1==$i}0..($i=<>)範囲0..$_(0から入力まで)の要素のリストを返します3**$_-1==$i。このテストを満たすことができるのは最大で1つの要素のみであるため、この命令は0または1要素の配列を返します。次に、このリストを印刷しますX。theor nothing(偽)です。


5

Pyth、11バイト

?-JjQ3 2ZlJ

基数3に変換し、等しいかどうかをチェックし[2, 2, ..., 2]ます。


あなたが1バイトで、これを減らすことができます?-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またはFalseを印刷しませんか?結果が真である場合しかし、私は、指数を求めた
P. Ktinos

2
それは天才です!非常に巧妙なアプローチのために+1
DJMcMayhem

これは賢い...私はあなたが括弧を削除し、それを作ることができると信じていますi->。また、iとして取得した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バイトですが、このaltは元のソリューションよりも短くすることができると思います。私はそれに取り組んでいます。


@FlipTackええ、私はそれがJavaではないことを知っていました。Processingがそれらのラインに沿って何かを追加していないと確信できなかったので、私はちょうど尋ねました。使用する「個別の値」は、0ではなく-1でした。それ以来変更されているので、おそらくそれについてのコメントを整理します。
ジオビット

待って、0今すぐ帰れますか?
クリチキシリトス

私はまだノーと言います。質問は、偽の場合に使用する代替整数値を0提供しますが、私が知っているJava / Processingでは決して偽ではありません。
ジオビット

処理thougt私がすることになった以下よりversbose のJava
パベル

@Pavelしかし、私はラムダを使用しません:/
Kritixi Lithos

4

Brachylog、8バイト

,3:.^-?,

オンラインでお試しください!

trueでfalse.、これが不可能な場合に値を出力します。

説明

これは、指定された関係の直接の転写です:

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

ほぼ 7バイトまでこれをゴルフすることができますが+~^r~:3、残念ながら、~:期待どおりの動作を行いません(おそらく:組み込みではなく構文であるため)、と同様に扱われるようです:

@ ais523それ:は正しい、制御記号であり~、述語でのみ機能します。
1

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の答えとは異なるアプローチで、1バイト短くなっています!

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

から3^1-1までのすべての整数を生成し3^99-1、stdinが一致するかどうかを確認します。その場合、一致するインデックスを返します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

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

すべてのコードを1行で入力して使用できますfrom math import*。またreturn n==3**x-1and x
mbomb007


@ mbomb007関数は結果をSTDOUTに出力できます。そのため、戻り値を印刷に変更できます。
FlipTack

これをPythonのソリューションではなくSageMathソリューションとして提示する場合、最初の行を完全に削除できます。
フェデリコポロニ

65バイトへの他の縮小とともに、import mathmath.ceilを1バイトで使用できます。また、あなたは変えることができます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で繰り返し除算します。1に達すると、除算の数を返します-1


a%3<1代わりに1バイトを保存します!(a%3)0偽物のためにもう一つ。
タイタス

GCCを使用してコンパイルしていると仮定すると、合計10(11)バイトを節約できます。この関数を1回だけ呼び出す場合、nをデフォルトでゼロにするため、nをゼロに初期化する必要はありませんグローバルだから)-4バイト少ない。また、return文は必要ありませんa=--a?-1:n;。書くことで5バイト節約できます。非void関数に戻りがない場合、最後の割り当てを使用します。また、@ 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に変換し、結果の文字列がすべて2であることを確認し、文字数(改行を含む)をカウントしてから、bcを使用して1を減算します。

基数3の数がすべて2でない場合、grepは何も出力せず(改行も出力しない)、文字カウントは0であり、1を引くと-1になります。


2

クラン3.8.1でコンパイルC 535254、51のバイト

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で動作しません
ウェイドタイラー

2

C、42バイト、ウェイドタイラーの最適化

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(通常の選択)に入れてそこに移動する必要があります

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

「偽」を同じにする必要がある場合、33バイト:

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

2

Pyt10 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

ジュリア、30バイト

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

これは単純な関数です- trueの対応する位置にのみを持つベクトルを作成します3^a-1。ここで、aは0〜の整数を含むベクトルnです。「最初の」位置を見つけてtrue1を引きます(すべてのfalse場合、検索結果はゼロに評価され、-1を返します)。

0:n持っている0最初の場所で、また、減算1インデックスを修正して、有効に-1偽の応答を。



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.