パワートレインを見つけてください!


29

勝者(かなり明らか)は、10バイトでJellyを使用したDennis♦です!

この挑戦はまだここにありますが、結果はもう取られません。


数字のパワートレインは、ジョンコンウェイのコンセプトです(ジョンコンウェイは、コンウェイのゲームオブライフを作ることでも有名ですが、それはポイントではありません)。次のように定義されます。

任意の数ここに画像の説明を入力してください... について、その数のパワートレインはここに画像の説明を入力してください...です(つまり、左から右に2桁ごとにその前の桁の累乗です)。このプロセスは、結果が1桁になるまで繰り返されます。

例:

2592 => (2^5)(9^2) = 2592 <= Cannot be further decomposed 135 => (1^3)5 = 5 1234 => (1^2)(3^4) = 81 => (8^1) = 8 1100 => (1^1)(0^0) = 1 # (0^0) = 1 -42 => -42 # Negative numbers output the input

あなたの課題は、n入力内の任意の数に対して、出力としてpowertrain(n)(つまりn、パワートレインの分解が終了した後に)戻ることです。

これはコードゴルフなので、最短のバイト数が勝ちます。

免責事項:

  • 入力に奇数桁を含めることができますが、最後の桁には電力がありません。
  • 0 ^ 0は1です。なぜなら、0だった場合、多くの数値が即座に0または1に崩壊するからです。
  • 数値が計算プロセスのいずれかの部分で不滅である場合(例:で終わる場合2592)、数値を出力するだけです。
  • 入力が< 10(つまり、すべて1桁の数字と負数)の場合、入力を出力します。

おそらく数時間後に勝者を発表するでしょう。

現在のリーダーボード:

  1. ゼリー(デニス♦):10
  2. ピス(DenkerAffe):16
  3. MATL(ドンミューズリー):21
  4. Perl(トンホスペル):42
  5. ハスケル(ダミアン):64
  6. Javascript ES6(edc65):71
  7. Mathematica(マーフィー):74
  8. Mathematica(LegionMammal978)およびHaskell(Renzeee):77
  9. Python 2(mathmandan):111
  10. Python 3(エルワン):161
  11. Java 8():229
  12. Oracle SQL 11.2(Jeto):456
  13. Befunge '93(Lex):490

さらにいくつかのテストケースをいただければ幸いです。
メゴ

したがって、入力は最大4桁になりますか?
デンカー

7
サイクルに到達したが、サイクルの周期が1ではない場合、または入力番号がサイクルの一部ではない場合はどうなりますか?
-feersum

1
「実現可能性の領域内に存在するものはないと確信しています」。それは決して起こらないと仮定できますか?すなわち、周期> 1のサイクルに達した場合、ループを永久に継続させますか?
スチューウィーグリフィン

6
提案されたテストケース:1100およびがテストケースに-42表示されない場合、エッジケースに関するルールを見逃すのは簡単です。
デニス

回答:


4

ゼリー、15 14 12 10バイト

Ds2*/€Pµ³¡

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

使い方

Ds2*/€Pµ³¡  Main link. Argument: n

D           Convert n into the array of its decimal digits.
 s2         Split into pairs of digits.
   */€      Reduce each pair by exponentiation.
      P     Take the product of the resulting powers.
       µ    Push the preceding chain as a link, and start a new one.
        ³¡  Execute the link n times and return the last result.

これは単純にn時間を繰り返すことで短くすることができますが、考えられるすべての入力に対して機能するという証拠はありません。
デニス

1
合理的な数であれば大丈夫です。実際には、あなたはほぼ確実のためにOKですANY:16回の反復を使用して数oeis.org/A133503
トンHospel

@Dennis Hm、それが私の答えです
ルイスメンドー

1
@DonMuesliそして今、私はそれについて考えたので、おそらく動作します。0と奇数インデックスを得る確率は...圧倒している
デニス・

現代のゼリーでは、これは7バイトで実行できますD*2/Pµ¡
デニス

5

Haskell、67 64バイト

(>> =(==))>> = until $ p.showは、入力として整数を取り、そのパワートレインを返す名前のない関数です。

Zgarbのおかげで3バイト節約

p(x:y:r)=p[x]^p[y]*p r;p[]=1;p x=read x
(>>=(==))>>=until$p.show

1
((==)=<<g)で2バイト節約します(\n->g n==n)
ズガルブ

うわー、私はMonadの((->)r)インスタンスに慣れていません。トリックをありがとう。
ダミアン

この句読点の集中砲火は(>>=(==))>>=本当に電車のように見えます!
アンドレイKostyrka

4

Perl、42 48バイト

+2を含める-lp(ドロップすること-lもできますが、改行が好きです)

STDINで入力して実行します。たとえば

perl -lp powertrain.pl <<< 1234

powertrain.pl

s/\B/1&pos?"**":"*"/eg until++$.>($_=eval)

(古いperlでは、正規表現とまでの間のスペースを削除することもできます)

これは固定小数点を処理できませんが24547284284866560000000000、その時までにperlが指数表記に切り替わったため、その大きな値はとにかく機能しません。

実際、上記のバージョンは2592、perlが指数表記を使用せずに表現できるすべての数値に対して(ほとんどのループで)高速に動作します。これは、259224547284284866560000000000https://oeis.org/A135385)の間に固定点がないことが証明されているためです

ただし、これはまだ証明されていないものを想定しています。原理的には以上のかかる減少がある可能性がありX=10^7(全く非固定点が16の以上の工程を要しないことが推測される手順https://oeis.org/A133503)、その値以下ディップX(ただし、上記10^7)、その後上がります再び。その場合は、次のことにフォールバックする必要があります。

s/\B/1&pos?"**":"*"/eg until$s{$_=eval}++||/-/

説明

コードは、数字の間に**andを挿入することで機能し*ます。

s/\B/1&pos?"**":"*"/eg

そう2592なった2**5*9**212345なりました1**2*3**4*5。これらは以下で評価できる有効なperl式です

$_ = eval

0**0ある1perlで)。次に、カウンターを有効期限切れにするループをその周りに配置します。固定点を除いて値が非常に急速に低下するため、カウンターが実際に開始する機会を得る前にパワートレインシリーズが収束します。


3

Pyth、25 18 11 16バイト

?<Q0Qu*F^McjGT2Q

ここで試してみてください!

7 @Jakubeの助けを借りて14バイトを保存

説明

?<Q0Qu * F ^ McjGT2Q#Q = eval(入力)

?<Q0Q#入力が負の場合Qを返す
     u Q#サイクルに達するまで次の関数を適用します               
                   #開始値はQで、現在の値はGにあります
           jGT#入力を数字のリストに分割
          c 2#2のペアに分割
        ^ M#すべてのペアのパワーを計算
      * F#すべてのべき乗の積を計算する


1
Pythは基本的に、わずかな変更を除いてPythonのゴルフバージョンにすぎませんか?
-clismique

1
@ジャクベヒントをありがとう!:)私にとってはまだ早朝
...-デンカー

@DerpfacePythonうん、ちょっと。あなたがそれについて学びたいなら、ドキュメントを見てください。
デンカー

問題ない。;-)
ジャクベ

4
@DerpfacePython Pythは単に「短縮されたPython」として始まりましたが、それを呼び出すと今では不誠実になります。PythはPythonとは大きく異なります。
メゴ

3

Python 2、111バイト

def p(n,b=0,o=''):
 if n<1:return n
 for c in str(n):o+=c+'**'[b:];b=~b
 j=eval(o+'1');return p(j)if j-n else j

アイデアは、の数字が、文字列にすることであるn間、代替操作によって分離される***、次にeval文字列のことを。(他のソリューションもこれと同じ考え方を使用しています。たとえば、Ton HospelのPerlの回答を参照してください。)

だから、操作が間を行き来するスイッチ'**'[0:]である、**'**'[-1:]だけです、*

ただし、for-loop の終わりまでに、文字列は操作(一方または他方)で終了するため、文字列が意味を持つように、最後の操作を削除するか、別の数字を追加する必要があります。

幸いなこと1に、最後にa を追加すると、最後の操作に関係なく機能します。(必要に応じて、1乗算とべき乗の両方について、右からの片側のアイデンティティーです。これを別の言い方をすれpowertrain(n) == powertrain(10*n + 1)ば、すべてのものn>0です。)

最後に、eval(length- 1cycleのように)の結果が入力と同じである場合、関数は終了します。それ以外の場合、関数は結果に対して自分自身を呼び出します。(長さの任意のサイクルで永久にハングアップします> 1が、OPのコメントによれば、そのようなサイクルはないと仮定することができます。)

(注:1桁の入力nが完了するn**11-cycle が発生するため、上記の説明は1桁の正の整数で機能します。ただし、非正の入力も受け入れる必要があるため、入力が未満の場合に短絡を開始し1ます。入力が負でないことが保証されている場合、その行を削除し、17バイトを節約できます。)


これは偏見に聞こえますが、... Python 2であることには賛成です。そして、説明があります。
clismique

@DerpfacePythonありがとう!(これはPython 3でも同様に機能すると思います...)
mathmandan

3

Javaの8、265の 244 229バイト

これが私の最初の答えですが、私はしばらくの間このサイトを読んでいて、自分が何をしているのか知っていると思います。少なくともそれはbefungeとSQLを打ち負かします...

残念ながら、他の回答と同様に、これは24547284284866560000000000では機能しません。これは、整数が取得できる大きさに関する制限がjava'aに組み込まれているためです。

@JackAmmoのおかげで36バイト節約

public int p(int n){if(n<10)return n;int i=1,t=1,s=(int)Math.log10(n)+1,r[]=new int[s];for(;i<=s;){int a=(int)Math.pow(10,i);r[s-i++]=n%a/(a/10);}for(i=0;i<s-1;i++)t*=Math.pow(r[i],r[++i]);if(s%2==1)t*=r[s-1];return n==t?n:p(t);}

ゴルフのない説明

public int powertrain(int input){
    //handles negative and 1-digit cases
    if(input<10)return input;
    //initialize output variable       
    int total=1;
    // get "length" of number. Shorter than getting length of string representation
    int size=(int)Math.log10(input)+1;
    //initialize array to store digits
    int[] array=new int[size];
    //Now, because Java doesn't have support
    // for the "**" operation, and the way of turning
    // an integer into a string takes too many bytes,
    // I decided just to put every digit into an array with
    // math and iterate from there
    for(int i=1;i<=size;){
        int place=(int)Math.pow(10,i);
        //crazy math. Saved 1 byte by incrementing i when accessed
        array[size-i++]=input%place/(place/10);
    }
    for(int i=0;i<size-1;i++)
        //This is where the train happens.
        //Saved 1 byte by incrementing while accessing 
        //again, instead of i+=2 and i+1
        total*=Math.pow(array[i],array[++i]);
    //Make sure last number isn't left out if size is odd
    if(size%2==1)
        total*=array[size-1];
    //if we end up with same number, stop.
    //otherwise, keep recurring
    return input==total?input:powertrain(total);
}

最初のif ... else if(n<10)return n;else{...}では、elseブロック内のすべてが論理的にn <10がfalseの場合にのみ実行されるため、elseは不要です。elseと2つの一致する中括弧を削除すると、6バイト節約できます。最後のif ... elseで同様の状況がありif(n==t)return n;else return p(t);、elseとその後のスペースを削除して、さらに5バイトを節約します。あなたの代わりにあれば...それ以外のようなので、の三者演算子を使用している場合、実際には、あなたはさらにそれを短縮することができますreturn n==t?n:p(t);
ジャック・弾薬

あなたはさらにいくつかのT、S、R、およびループのために一緒に私だと宣言することによって(17私は思う)バイト保存することができますint t=i=1,s=(int)Math.log10(n)+1,r[]=new int[s];for(;i<=s;){...}for(i=0;...)...
ジャック・弾薬

@JackAmmo変数がそのように宣言されることに気づかなかったので、試してみます。ご協力いただきありがとうございます!
ブルー

ええ、あなたが別のものを初期化するためにそれらを使用している場合、それらを宣言する順序に注意する必要があります(rがsを使用してその長さを定義する方法など)
ジャック弾薬

任意の大きな数値については、javaのBigIntegerクラスdocs.oracle.com/javase/8/docs/api/java/math/BigInteger.html
Jack Ammo

2

JavaScript(ES6)71

繰り返しが見つかったときに停止する再帰関数。これは、長いループ(2つ以上の値の繰り返し)では機能しませんでしたが、少なくともJavaScriptの数値精度の制限された範囲(17桁)では発生しないようです。

f=n=>[...n+'1'].map((c,i)=>i&1?r*=Math.pow(d,c):d=c,r=1)&&n-r?f(r):n

テスト

f=n=>[...n+'1'].map((c,i)=>i&1?r*=Math.pow(d,c):d=c,r=1)&&n-r?f(r):n

function go()
{
  v=+I.value
  R.textContent=f(v)
}  

go()
<input id=I value="1234"><button onclick="go()">Go</button>
<span id=R></span>


+'1'1石で2羽の鳥を殺すのは素晴らしいことです。
ニール

私はあなたがすでにそれを調べたのだかどうか知らないが、私が行うことができる最高はreplace1バイト長かった:f=n=>`${n}1`.replace(/../g,([x,y])=>r*=Math.pow(x,y),r=1)&&n-r?f(r):n
ニール

@ニール私も頑張ったが、そのテンプレート文字列は新しいアイデアです
...-edc65

1

Mathematica、77バイト

Times@@(If[#2<1,1,#^#2]&)@@@Partition[IntegerDigits@#,2,2,1,1]&~FixedPoint~#&

匿名関数。複雑すぎません。


それでも、説明がありますか?
-clismique

1

Befunge 720 490バイト

「オッズのことを絶対に言わない」の後にもう一回やることに抵抗できませんでした。それで、前のものの「ASCII-fier」を最適化しました。この場合、命令ポインタを数字の上で実行してそれらを読み取る必要はないため、人間が読めるようにする努力はしていません。それで、今はもっとデジタイザーです。

繰り返しになりますが、説明が必要な場合は、コメントでお知らせください。役立つ説明を作成してみます。コードをコピーしてインタープリターに貼り付けることができます。例24547284284866560000000000は0を出力することがわかりましたが、最終ステップで保存されている正しい値を明確に見ることができるため、グリッド上のポイントからこのような大きな値を取得することは問題のようです。

v                                                    //top row is used for "variables"
>&:0`#v_.@                                           //initialize the counter                          
v     <                           g01_v#-p01:  <     //on our way back to the digitifier, check if we're done
>::>210p>55+%:10g0p-55+/:v            >10g.@         //digitifier, creates a series of ASCII characters at the top line, one for each digit in the source
        ^p01+1g01    _v#:<
v1$$                  <                              //forget some remainders of the digitifier, put 1 on the stack as a base of calculation
                      v p0-1g01-1g0-1g01*g0g01<      //taking powers of each pair of digit
>10g2-!#v_10g1-!#v_  1>                10g1-0g|
^                                  p01-2g01  *<
        >10g0g*  >                             ^     //extra multiplication with last digit if the number of digits was odd

このバージョンは負の入力もサポートしています。私がそう言うなら、それは前のバージョンに対する大きな改善です。少なくとも1つのバグが修正され、サイズが大幅に縮小されました。


負の数を入力するには、さらに何バイトかかりますか?
clismique

正直に言うとわかりません。負の数に問題があり、グリッドのどこかに書き込みました。もう一度試してみます。
-rael_kid

私も別のバグを見つけました。負の数のサポートを追加することができました。すぐに更新を投稿します!私はグリッド全体を数えるので、おそらく同じバイト量になるでしょう。
rael_kid

1

Haskell、100 79 77バイト

g x|x==h x=x|1<2=g$h x;h=i.map(read.(:[])).show;i[]=1;i[a]=a;i(a:b:c)=a^b*i c

ゴルフされていない:

g x|x==h x=x|1<2=g$h x
h=i.map(read.(:[])).show
i[]=1
i[a]=a
i(a:b:c)=a^b*i c

この関数は入力を数字に分割し、経由でトリックを行います iます。

編集:いくつかのヒントをnimiに感謝します。


いくつかのヒント:)i(a:[])=aであるi[a]=aこと、b)の必要がないmax 1ので、0^0 = 1Haskellでは、C)を交換(:[])してpure、d)の移動let中にg別の関数へと置き換えるif ... then ... elseガードで:h=i.map(read.pure).show ; g x|x==h x=x|1<2=h x
nimi

purePreludeにはありませんが、残りのヒントは機能します、ありがとう。私はガードでそれをしようとしていましたが;、ガードの前に使用することになり、それは機能しませんでしたが、今ではそれがどのように機能するかを知っています。
-Renzeee

purebase-4.8.2.0に付属するPreludeにあります。いつ導入されたのかわかりません。あなたはを必要と( )しませんi([a])=a
nimi

1

Mathematica、74バイト

0~f~0=f[]=1
f@n_=n
f[a_,b_,c___]:=f[c]a^b
#//.i_/;i>0:>f@@IntegerDigits@i&

説明

このソリューションfでは、数値の桁を引数として受け取り、パワートレイン操作の1回の反復を適用するヘルパー関数を使用します。最後の行は、ReplaceRepeated関数(または//.略して)を活用するように作られた純粋な関数であり、式(この場合#は純粋な関数の引数)が変更されなくなるまでルールを適用します。この規則i_/;i>0:>f@@IntegerDigits@iは、負でないものfを、その10進数に適用される関数に置き換えます。


2行目は、仕事(使用しない:=
CalculatorFeline

説明してください?
clismique

@CatsAreFluffy 2行目の問題は見当たりません。
マーフィー

SetDelayed::write: Tag Times in n f[a_,b_,c___] is Protected. >>、vsをSet::write: Tag Times in 1 f[n_] is Protected. >>使用すると2番目のエラーが消えます。:==
電卓

申し訳ありませんが、そのエラーは再現できません。しかし、出力は、改行が問題の一部であることを示しています。;改行の代わりにsを使用してバージョンを試してください0~f~0=f[]=1;f@n_=n;f[a_,b_,c___]:=f[c]a^b;#//.i_/;i>0:>f@@IntegerDigits@i&
。–マーフィー

1

MATL、21バイト

tt0>*:"V!UtQgv9L2#)^p

出力の生成には数秒かかる場合があります。

編集(2016年7月30日):言語の最近の変更に適応するために、リンクされたコードが置き換え9Lられ1Lます。

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

これは、次の2つのトリックを使用して、コードの効率を犠牲にしてバイト数を減らします。

  • 反復n回数の代わりに、サイクルが発見されるまで待ちます。これは、OPのコメントに従って受け入れられます。
  • 奇数の桁の場合、最終1的な電源操作を完了するには、最後に数字を追加する必要があります。その代わりに、追加されるの1は桁数です。これにより偶数が保証されるため、すべての電源操作を実行できます(最後の1^1操作が不要な操作であっても)。

コード:

t         % implicitly take input x. Duplicate
t0>*      % duplicate. Is it greater than 0? Multiply. This gives 0 if input is negative,
          % or leaves the input unchanged otherwise
:         % Generate array [1,2,...,x]
"         % for each (repeat x times)
  V       %   convert x to string
  !       %   transpose into column char array
  U       %   convert each char into number
  tQg     %   duplicate. Add 1 so that no entry is zero. Convert to logical: gives ones
  v       %   concatenate vertically
  9L2#)   %   separate odd-indexed and even-indexed entries
  ^       %   element-wise power
  p       %   product of all entries
          % implicitly end for each
          % implicitly display

えっと...ふふふ...「数字のループ」と言ったとき、私はこのようになった数字を意味しました- a, b, a, b無限(広告用語)。1つの用語が繰り返される場合、その数を出力する必要があります。それがはっきりしていなかったら申し訳ありません。
clismique

1つの用語が繰り返される場合、その数値を出力しています。何度も繰り返した後、結果を出力しました
ルイスメンドー

ああ、私は今理解しています...ただ尋ねると、それは何回の反復でしょうか?私が入力したときので2592、入力に、それは非常にしばらくの間、出力は何もしていないようです。
clismique

反復回数は入力数なので、その場合は2592です。はい、しばらく時間がかかります
ルイスメンドー

0

Python 3、169 161バイト

def f(s):
 o=[['1',s]['-'in s]]
 while s not in o:
  o+=[s];s+='1'*(len(s)%2==1);r=1;
  for i,j in zip(s[::2],s[1::2]):r*=int(i)**int(j);s=str(r);
 return o[-1]

ゴールドフィードなし

def f(s):
 o=[['1',s]['-'in s]]
 while s not in o:
  o+=[s]
  s+='1'*(len(s)%2==1)
  r=1
  for i,j in zip(s[::2],s[1::2]):
   r*=int(i)**int(j)
  s=str(r)
 return o[-1]

結果

>>> [f(i) for i in ['135', '1234', '642', '2592', '-15']]
['5', '8', '2592', '2592', '-15']

@PeterTaylor修正!
エルワン

;この方法で意図的な空白を節約する場合、複数のステートメントを1行に配置できます。また、その同じ行にforループの本体を配置できます。
デンカー

推奨されるゴルフ:def f(s,o=[['1',s]["-"in s]],n=int): while s not in o: o+=[s];s+=1*(len(s)%2<1);r=1 for i,j in zip(s[::2],s[1::2]):r*=n(i)**n(j) s=str(r) return o[-1]
CalculatorFeline

o=[['1',s]["-"in s]]デフォルト引数の@CatsAreFluffyが機能しないため、エラーが発生します `s not defined`
Erwan

おっと、次の行にoを移動します。
電卓

0

Oracle SQL 11.2、456バイト

WITH v(n,c,i,f,t)AS(SELECT:1+0,CEIL(LENGTH(:1)/2),1,'1',0 FROM DUAL UNION ALL SELECT DECODE(SIGN(c-i+1),-1,t,n),DECODE(SIGN(c-i+1),-1,CEIL(LENGTH(t)/2),c),DECODE(SIGN(c-i+1),-1,1,i+1),DECODE(SIGN(c-i+1),-1,'1',RTRIM(f||'*'||NVL(POWER(SUBSTR(n,i*2-1,1),SUBSTR(n,i*2,1)),SUBSTR(n,i*2-1,1)),'*')),DECODE(SIGN(c-i+1),-1,0,TO_NUMBER(column_value))FROM v,XMLTABLE(f)WHERE i<=c+2 AND:1>9)CYCLE n,c,i,f,t SET s TO 1 DEFAULT 0SELECT NVL(SUM(n),:1) FROM v WHERE s=1;

ゴルフをしていない

WITH v(n,c,i,f,t) AS
(
  SELECT :1+0,CEIL(LENGTH(:1)/2),1,'1',0 FROM DUAL
  UNION ALL
  SELECT DECODE(SIGN(c-i+1),-1,t,n),
         DECODE(SIGN(c-i+1),-1,CEIL(LENGTH(t)/2),c),
         DECODE(SIGN(c-i+1),-1,1,i+1),
         DECODE(SIGN(c-i+1),-1,'1',RTRIM(f||'*'||NVL(POWER(SUBSTR(n,i*2-1,1),SUBSTR(n,i*2,1)),SUBSTR(n,i*2-1,1)),'*')),
         DECODE(SIGN(c-i+1),-1,0,TO_NUMBER(column_value))
  FROM v,XMLTABLE(f) WHERE i<=c+2 AND :1>9 
)  
CYCLE n,c,i,f,t SET s TO 1 DEFAULT 0
SELECT NVL(SUM(n),:1) FROM v WHERE s=1;

vは再帰的ビューであり、パラメーターは

n:2桁の部分に分割する数

c:2桁の部分の数

i:計算する現在の2桁の部分

f:セパレータとして*で累乗を連結する文字列

t:fの評価

DECODEは次の番号に切り替わり、現在の番号のすべての部分が完了すると、分割して計算します。

XMLTABLE(f)は式を取得して評価し、結果を疑似列「column_value」に入れます。http://tkyte.blogspot.fr/2010/04/evaluating-expression-like-calculator.htmlのゴルフ版です

CYCLEは、サイクル検出のOracleビルドであり、終了条件として使用されます。

:1 <10の結果は:1であり、vはこれらの場合に行を返さないため、SUMは値がNULLの行を強制します。行がnullの場合、NVLは結果として:1を返します。


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