レイランド番号


37

自然数を指定するnと、n-番目のレイランド数を返します。

レイランド・ナンバー

レイランド数は次kの形式の正の整数です

k = x^y + y^x

どこにx,y1よりも厳密に大きい整数です。

それらは昇順で列挙されます。

編集: @DigitalTraumaは、次の「定義」を含めることを提案しました:

私たちはスロー想像x^y+y^x可能なすべての値のために袋にx及びy、かつ重複で回避投げ。次に、そのバッグをソートします。ソートされたバッグはシーケンスです。

詳細

最適なものであれば、0または1ベースのインデックスを使用できます。

プログラムは、少なくとも符号付き32ビット整数の最大値より小さいすべてのLeyland数を出力できなければなりません。(この制限を下回る最後のレイランド数は1996813914、インデックスにあります82。)

テストケース

最初のいくつかの用語は次のとおりです。

8, 17, 32, 54, 57, 100, 145, 177, 320, 368, 512, 593, 945, 1124

OEISのA076980、最初のエントリを除く。その追加の最初のエントリのために、OEISのインデックスは1シフトされることに注意してください。

OEIS b-ファイルでさらに見つけることができます


They are enumerated in ascending orderこれが何を意味するのかよくわかりません。xとyのリストを提供できますか?
DJMcMayhem

@DrGreenEg​​gsandIronManつまり、817であり、逆ではありません。
リーキー修道女

3
私たちはスロー想像@DrGreenEg​​gsandIronMan x^y+y^x可能なすべての値のために袋にxし、y重複であり、回避するthrwoing。次に、そのバッグをソートします。ソートされたバッグはシーケンスです。
フレイ

10
そこにある非常に大きなバッグ
ルイスメンドー

2
@LuisMendo @HenriLéonLebesgueに尋ねると、彼はこのバッグは基本的には何もないことをあなたに伝えるつもりです。
-flawr

回答:


11

MATL16 15 13バイト

Q:Qt!^t!+uSG)

出力は1ベースです。

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

説明

Q    % Take input n. Add 1
:Q   % Range [2 ... n+1]. This is enough to be used as x and y
t!   % Duplicate and transpose
^    % Power, element-wise with broadcast. Gives 2D, square array with x^y
     % for all pairs of x and y
t!   % Duplicate and transpose. Gives square array with y^x
+    % Add, element-wise
u    % Keep unique elements. This linearizes (flattens) the 2D array
S    % Sort
G)   % Get the n-th entry. Implicitly display

Matlab uniqueでは要素を並べ替えます。MATLでもそうではありませんか?
パジョン

1
@pajonk MATL は、より一般的な使用法である'stable'ためunique、デフォルトでフラグを使用します。
-Suever

@Suever OK、明確化してくれてありがとう。
パジョン

1
私たちが使うような気がしますt!^(どこ^に置き換えることができ+-または事業者の任意の数)が多くをモチーフ。&ベクトルの場合、その動作を行う一部の入力に対して1つの入力を意味するとしたらどうでしょうか。
-Suever

@Sueverそれは素晴らしいアイデアです!私はあなたのスクリプトでいくつかの研究をしました。チャットを見る
ルイスメンドー

5

Haskell、52バイト

r=[2..31]
([k|k<-[0..],elem k[x^y+y^x|x<-r,y<-r]]!!)

本当に非効率的です。各自然数がレイランド数であるかどうかをテストし、存在する数の無限リストを作成します。入力が与えられると、リストのそのインデックス要素を取ります。x,y32ビットの整数をチェックする必要があるのは最大31までです。

と同じ長さfilter

r=[2..31]
(filter(`elem`[x^y+y^x|x<-r,y<-r])[0..]!!)

後知恵でこのような明らかな解決策では、私はそれがとても好きです!
-flawr

5

ジャワ8、225 221 219 216 206の 204 193 192バイト

import java.util.*;n->{List<Long>t=new Stack();for(long i=1,j,s;++i<30;)for(j=1;++j<30;){s=(int)(Math.pow(i,j)+Math.pow(j,i));if(!t.contains(s))t.add(s);}Collections.sort(t);return t.get(n);}

0インデックス付き

-2バイト(221→219)を@LeakyNunのおかげで置き換え1996813915て保存。 -3バイト(219→216)のおかげ@LeakyNun@Frozn何かを私は自分自身を忘れて.. -10バイト(→206 216)8へのJava 7を変更することにより、 -2バイト(→204 206)置き換えることによってでのおかげ@TAsk。 -11バイト(204→193)を削除すると、質問には「少なくともすべてのLeyland数が符号付き32ビット整数の最大値よりも小さい」と記載されているためです。 -1バイト(193→192)に変更します。(1L<<31)


ArrayListVector
s<(1L<<31)&
VectorStack

説明:

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

import java.util.*;            // Required import for Stack
n->{                           // Method with integer parameter and long return-type
  List<Long>t=new Stack();     //  Temp list
  for(long i=1,j,s;++i<30;)    //  Loop (1) from 2 to 30 (exclusive)
    for(j=1;++j<30;){          //   Inner loop (2) from 2 to 30 (exclusive)
      s=(int)(                 //    `s` is:
         Math.pow(i,j)+Math.pow(j,i)); // i^j + j^i
      if(!t.contains(s))       //     If `s` is not already part of the List
        t.add(s);              //      Add it to the List
    }                          //   End of inner loop (2)
                               //  End of loop (1) (implicit / single-line body)
  Collections.sort(t);         //  Order the List
  return t.get(n);             //  Return the item at the given index
}                              // End of method

2
Javaを使用する場合は10/10
Leaky Nun

サポートする必要があるのは2^31-1(つまり、signed int)だけなので、longキャストの束を交換することはできませんか?
AdmBorkBork

1
クイックゴルフ:import java.util.*;long c(int n){List<Long>t=new ArrayList();for(int i=2,j;i<25;i++)for(j=2;j<25;j++){long s=(long)(Math.pow(i,j)+Math.pow(j,i));if(s<(1L<<31)&!t.contains(s))t.add(s);}Collections.sort(t);return t.get(n);}
Leaky Nun

1
forループ変数宣言。
リーキー修道女

1
方法for (int i = 1, j; ++i < 30;)for (j = 1; ++j < 30;)
Frozn

4

Pyth、17バイト

0インデックス。

@{Sms^M_Bd^}2+2Q2

オンラインでお試しください!(100のままにしてください。)

使い方

@{Sms^M_Bd^}2+2Q2
@{Sms^M_Bd^}2+2Q2Q  implicit filling. Input:Q

           }2+2Q    Yield the array [2,3,4,...,Q+2]
          ^     2   Cartesian square: yield all the
                    pairs formed by the above array.
   m     d          Map the following to all of those pairs (e.g. [2,3]):
       _B               Create [[2,3],[3,2]]
     ^M                 Reduce by exponent to each array:
                        create [8,9]
    s                   Sum:   17     (Leyland number generated)
  S                 Sort the generated numbers
 {                  Remove duplicate
@                Q  Find the Q-th element.

遅いバージョン

1インデックス。

e.ffqZs^M_BT^}2Z2

オンラインでお試しください!(3のままにしてください)


パワーの配列[[4,8、...] [9,27、...]]を作成し、その転置に追加すると役立ちますか?
ニール

@Neil私はそうは思わない。Jellyでは役立ちますが、Pythでは役立ちません。Pythは自動的にベクトル化しません。
リーキー修道女

MATLにも役立つようです。
ニール

なぜ遅いバージョンを保持するのですか?
エリックアウトゴルファー


3

05AB1E、20 19バイト

0インデックス付き

ÝÌ2ãvyÂ`ms`m+}){Ù¹è

説明した

ÝÌ                     # range(2,N+2)
  2ã                   # get all pairs of numbers in the range
    v                  # for each pair
     yÂ`ms`m+          # push x^y+y^x
             }         # end loop
              ){Ù      # wrap to list, sort and remove duplicates
                 ¹è    # get Nth element of list

オンラインで試す

@Adnanのおかげで1バイト節約


非常に素晴らしい!1つのヒントは、のÝÌ略です>L>
アドナン

@アドナン:ありがとう!私はそれを考えていなかった
信じ

êこれが要求されたときに存在した場合、sorted_uniquifiedです。
魔法のタコUr

@carusocomputing:ごく最近まで私は恐れていましたが、バグがありました。
エミグナ

3

Mathematica、60 48 40バイト

(Union@@Array[#^#2+#2^#&,{#,#},2])[[#]]&

1ベースのインデックスを使用します。Unionは、によって作成された2Dマトリックスの各行の間に適用して使用されArrayます。そこで、Union2Dマトリックスをリストにフラット化すると同時に、重複を削除し、値をソート順に配置します。

@ LLlAMnYPのおかげで8バイト節約されました

使用法

Example


{#+1,#+1} 必要ではなく、そのままにしておくことができます {#,#}{2,2}単にに置き換えることができます2
-LLlAMnYP

@LLlAMnYPありがとう!知らなかったArrayが3番目の議論を展開する。
マイル

私もしませんでしたが、とにかく試してみることにしました。:)
LLlAMnYP

2

ゼリー、14バイト

Dennisのおかげで2バイト。

R‘*€¹$+Z$FṢQị@

オンラインでお試しください!(私にとっては82で1秒かかります)(O(n ^ 2)時間)

元の16バイトの回答

2r30*€¹$+Z$FṢQị@

オンラインでお試しください!(私にとっては1秒未満)(一定時間)


R‘*€¹$+Z$FṢQị@より速く、より短く、人為的な上限はありません。
デニス

@デニスと私の答えを打ちます:-P
ルイスメンドー

@Dennisわかりません。どうして2番目のものよりも速いのでしょうか。
リーキー修道女

2番目のものよりも高速ではありません。実行時間が短すぎて正確な測定値を取得できません。
デニス

今13 :-Pバイト
ルイスMendo

2

Bash + GNUユーティリティ、63

printf %s\\n x={2..32}\;y={2..32}\;x^y+y^x|bc|sort -nu|sed $1!d

1ベースのインデックス。これは@TimmyDの回答とほぼ同じアプローチのようです。ネストされたループの代わりに、bashブレース展開を使用してbc、評価のためにパイプされる算術式を生成します。

イデオン。


2

Perl 6の 60の58  56バイト

{sort(keys bag [X[&({$^a**$^b+$b**$a})]] (2..$_+2)xx 2)[$_]}
{sort(keys set [X[&({$^a**$^b+$b**$a})]] (2..$_+2)xx 2)[$_]}
{sort(unique [X[&({$^a**$^b+$b**$a})]] (2..$_+2)xx 2)[$_]}
{squish(sort [X[&({$^a**$^b+$b**$a})]] (2..$_+2)xx 2)[$_]}
{squish(sort [X[&({$^a**$^b+$b**$a})]] (2..31)xx 2)[$_]}
{squish(sort [X[&({$^a**$^b+$b**$a})]] 2..31,2..31)[$_]}

テスト:

#! /usr/bin/env perl6
use v6.c;

my &Leyland = {squish(sort [X[&({$^a**$^b+$b**$a})]] 2..31,2..31)[$_]}

say ^14 .map: &Leyland;
time-this {Leyland 81};

sub time-this (&code) {
  my $start = now;
  my $value = code();
  printf "takes %.3f seconds to come up with $value\n", now - $start;
}
(8 17 32 54 57 100 145 177 320 368 512 593 945 1124)
takes 0.107 seconds to come up with 1996813914

説明:

{
  squish( # remove repeated values
    sort
      [X[&( # cross reduce with:
        { $^a ** $^b + $b ** $a }
      )]]
        ( 2 .. $_+2 ) # 「Range.new(2,$_+2)」 (inclusive range)
        xx 2          # repeat list
  )[$_]
}

sort [との間のスペースを削除できません] 2..31か?
エリックアウトゴルファー

@EʀɪᴋᴛʜᴇGᴏʟғᴇʀこれは、サブルーチン呼び出しsort([...からtermの配列アクセスに変わりますsort[...。他のスペースでも同様のことが起こります。
ブラッドギルバートb2gills

2

F#、117、104

Welp、少なくとも私のC#の答えよりも短い。

F#チャットルームのReed Copseyのおかげで13バイト節約されました。

let f n=[for x in 2I..32I do for y in 2I..32I->x**(int y)+y**(int x)]|>Seq.sort|>Seq.distinct|>Seq.nth n

2

PowerShell v2 +、84 73 68バイト

(2..30|%{2..($x=$_)|%{"$x*"*$_+'1+'+"$_*"*$x+1|iex}}|sort)[$args[0]]

@Neilのおかげで11バイトを節約しました... iex式の評価方法を再編成することでさらに5バイトを節約しました。

ナイーブな方法で、単にx=2..30and からforループを二重にしますy=2..xx^y + y^xパイプラインに配置する各ループ。の30は、2^31-1;-) 未満のすべてのケースをカバーするために実験的に選択されました。それらをパイプして、Sort-Object昇順に並べます。出力は、入力に基づいてゼロインデックスが付けられます$args[0]

はい、あります 多くの無関係なエントリが生成されます-このアルゴリズムは実際に435のレイランド数を生成します-しかし、インデックスより上のもの81は正確で正しいことが保証されていません(スキップされるものがあるかもしれません)。

PS C:\Tools\Scripts\golfing> .\leyland-numbers.ps1 54
14352282

PS C:\Tools\Scripts\golfing> .\leyland-numbers.ps1 33
178478

PS C:\Tools\Scripts\golfing> .\leyland-numbers.ps1 77
1073792449

2

R、58 54バイト

1インデックス。のpryr::r代わりにを使用して4バイトを削除しましたfunction

unique(sort(outer(2:99,2:9,pryr::f(x^y+y^x))))[scan()]

説明

2から99、および2から9のすべての数値について

                  2:99,2:9

関数を適用しますx^y+y^x。これにより、98x8マトリックスが生成されます。

            outer(2:99,2:9,pryr::f(x^y+y^x))

この行列を並べ替えます(ベクトルに強制します):

       sort(outer(2:99,2:9,pryr::f(x^y+y^x)))

一意でない値をすべて削除します。

unique(sort(outer(2:99,2:9,pryr::f(x^y+y^x))))

nstdinから読み取りn、リストからth番目の番号を取得します。

unique(sort(outer(2:99,2:9,pryr::f(x^y+y^x))))[scan()]

2

JavaScript(Firefox 42-57)、94バイト

n=>[for(x of Array(32).keys())for(y of Array(x+1).keys())if(y>1)x**y+y**x].sort((x,y)=>x-y)[n]

配列内包表記とべき乗([for(..of..)]および**)の両方を使用するため、Firefox 42が必要です。


ES7としてマークしてはいけませんか?
mbomb007

@ mbomb007 [for...of]ES7に到達したとは思わない。
ニール


いいえ、そうではありませfor(..of..)[for(..of..)]
ニール


1

Haskell、99 98 96 95 94バイト

それはおそらく簡単にアウトゴルフされますが、それはが思い付くことができた最高でした。

import Data.List
f n|n<2=[]|n>1=sort.nub$f(n-1)++[x^n+n^x|x<-[2..n]]
g n=(f.toInteger$n+3)!!n

import Data.List fn | w <-[2..toEnum $ n + 3] =(sort $ nub [x ^ y + y ^ x | x <-w、y <-w])!! n知っていますかtoInteger / toEnumが必要な理由
ダミアン

うわー、これはクレイジーです=)それは私のものとはまったく異なるので、あなた自身の答えとして自由に追加してください!toInteger私のソリューションで省略した場合、リストを操作するときにint(のn+3代わりにn)ずっと高く反復するため、を使用してオーバーフローが発生します。それ以外の場合は、最初の4つの用語をハードコードする必要があります。toEnumソリューションで正確に何をしますか?
フレイ

OK、nをIntにバインドする(!!)演算子が原因です。nは82未満であるため、wは[2..99]などで置き換えられf=(sort(nub[x^y+y^x|x<-[2..99],y<-[2..x]])!!)ます。 toEnumIntをEnumに変換し、IntegerはEnumクラスのインスタンスなので、ここでtoEnumはn + 3をIntegerに変換します。
ダミアン


1

C#、141バイト。

ああ、C#、あなたはとても長い言語です。

n=>(from x in Enumerable.Range(2,32)from y in Enumerable.Range(2,32)select Math.Pow(x,y)+Math.Pow(y,x)).Distinct().ToList()[n];

これは、delegate double del(int n);実行するために割り当てる必要があるラムダです。

delegate double del(int n);
del f=n=>(from x in Enumerable.Range(2,32)from y in Enumerable.Range(2,32)select Math.Pow(x,y)+Math.Pow(y,x)).OrderBy(q=>q).Distinct().ToList()[n];

1
Javaよりもまだ短い。
フレイ

@flawr Wooooooo?
モーガンスラップ

私はC#について何も知りませんがEnumerable.Range(、reuisngの短い名前で変数/関数/イテレータ/その他に保存できませんでしたか?
フレイ

私はできましたが、クラスと型のdefを含める必要があり、結局1トンの費用がかかります。
モーガンスラップ

1

SQL(PostgreSQL 9.4)、171バイト

準備されたステートメントとして行われます。一連の2〜99のシリーズを生成し、それらを相互結合して方程式を作成します。結果を密にランク付けしてインデックスを付け、整数入力のランクを持つ最初の結果を選択します。

prepare l(int)as select s from(select dense_rank()over(order by s)r,s from(select x^y+y^x from generate_series(2,99)x(x),generate_series(2,99)y(y))c(s))d where r=$1limit 1

次のように実行されます

execute l(82)
s
-----------------
1996813914

これは予想よりずっと速く実行されました


1

J、29バイト

<:{[:/:~@~.@,[:(^+^~)"0/~2+i.

1ベースのインデックスを使用します。Mathematica ソリューションからの変換。

ここでの本当の秘密は、私が:(^+^~)味方していることです。

使用法

   f =: <:{[:/:~@~.@,[:(^+^~)"0/~2+i.
   f 7
145
   (,.f"0) >: i. 10  NB. Extra commands for formatting
 1   8
 2  17
 3  32
 4  54
 5  57
 6 100
 7 145
 8 177
 9 320
10 368

説明

<:{[:/:~@~.@,[:(^+^~)"0/~2+i.  Input: n
                         2+i.  Step one
                     "0/~      Step two
              :(^+^~)          ???
<:{[:/:~@~.@,[                 Profit

もっと真剣に、

<:{[:/:~@~.@,[:(^+^~)"0/~2+i.  Input: n
                           i.  Create the range [0, 1, ..., n-1]
                         2+    Add 2 to each
               (^+^~)"0        Create a dyad (2 argument function) with inputs x, y
                               and returns x^y + y^x
             [:        /~      Use that function to create a table using the previous range
   [:       ,                  Flatten the table into a list
         ~.@                   Take its distinct values only
     /:~@                      Sort it in ascending order
<:                             Decrement n (since J is zero-indexed)
  {                            Select the value at index n-1 from the list and return

...利益 :D
フレイ

1

Swift 3、138バイト

import Glibc;func l(n:Int)->Int{let r=stride(from:2.0,to:50,by:1);return Int(Set(r.flatMap{x in r.map{pow(x,$0)+pow($0,x)}}).sorted()[n])}

未ゴルフコード

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

import Glibc
func l(n: Int) -> Int {
    // Create a Double sequence from 2 to 50 (because pow requires Double)
    let r = stride(from: 2.0, to: 50.0, by: 1.0)

    return Int(Set(r.flatMap {
        x in r.map {
            pow(x, $0) + pow($0, x)
        }
    }).sorted()[n])

1
プログラミングパズルとコードゴルフへようこそ!最初の答えはいいですが、何が起こっているのか説明できればもっといいでしょう。
clismique

1

公理148バイト

w(n)==(v:List INT:=[];for i in 2..31 repeat for j in i..31 repeat(a:=i^j+j^i;if a>1996813914 then break;v:=cons(a,v));v:=sort v;~index?(n,v)=>0;v.n)

いくつかの例

w(n)==
 v:List INT:=[];for i in 2..31 repeat for j in i..31 repeat
        (a:=i^j+j^i;if a>1996813914 then break;v:=cons(a,v));v:=sort v;~index?(n,v)=>0
 v.n
 (2) -> [w(i)  for i in 0..85]
    Compiling function w with type NonNegativeInteger -> Integer

    (2)
    [0, 8, 17, 32, 54, 57, 100, 145, 177, 320, 368, 512, 593, 945, 1124, 1649,
     2169, 2530, 4240, 5392, 6250, 7073, 8361, 16580, 18785, 20412, 23401,
     32993, 60049, 65792, 69632, 93312, 94932, 131361, 178478, 262468, 268705,
     397585, 423393, 524649, 533169, 1048976, 1058576, 1596520, 1647086,
     1941760, 2012174, 2097593, 4194788, 4208945, 4785713, 7861953, 8389137,
     9865625, 10609137, 14352282, 16777792, 16797952, 33554432, 33555057,
     43050817, 45136576, 48989176, 61466176, 67109540, 67137425, 129145076,
     134218457, 177264449, 244389457, 268436240, 268473872, 292475249,
     364568617, 387426321, 536871753, 774840978, 1073742724, 1073792449,
     1162268326, 1173741824, 1221074418, 1996813914, 0, 0, 0]

タイプ:リスト整数




0

J、38 31バイト

0インデックス。

[{[:(#~~:)@ /:〜@、/ [:(+ |:)[:^ /〜2 + i。@>:@]
((#~~:)/:〜、/(+ |:)^ /〜2 + i.29x){〜[

使用法

>> f =: ((#~~:)/:~,/(+|:)^/~2+i.29x){~[
>> f 81
<< 1996813914

0

Java、200 197バイト

0インデックス付き

n->{long[]t=new long[999];for(int i=1,j;++i<31;)for(j=1;j++<i;)t[i*31+j]=(long)(Math.pow(i,j)+Math.pow(j,i));return java.util.Arrays.stream(t).sorted().distinct().skip(n+1).findAny().getAsLong();};

Javaのストリームは実際にバイトを節約できるようです!誰が考えたでしょうか?!

ゴルフをしていない:

package pcg;

import java.util.function.IntToLongFunction;

public class Pcg82981 {

  public static void main(String[] args) {
    IntToLongFunction f = (n) -> {
      long[] t = new long[999];
      for (int i = 1; ++i < 31; ) {
        for (int j = 1; j++ < i; ) {
          t[i * 31 + j] = (long) (Math.pow(i, j) + Math.pow(j, i));
        }
      }
      return java.util.Arrays.stream(t)
          .sorted()
          .distinct()
          .skip(n + 1) // We don't care about 0.
          .findAny()   // equivalent to `findFirst`
          .getAsLong();
    };

    for (int i = 0; i < 82; i++) {
      System.out.println(f.applyAsLong(i));
    }

  }
}

編集:

  1. 200-> 197:後にスペースlong[]を削除し、括弧を削除しましたn

0

Python 3、129-> 116バイト

短いPython 3の回答があることは知っていますが、それでもソリューションに貢献したいと考えました。

t=[]
for k in range(100):a,b,q=k//10,k%10,a**b+b**a;f=lambda q:0if q in t else t.append(q);f(q)
print(sorted(t)[7:])

これは、xのすべての値とyのすべての値を処理するために考えることができる最良の方法でした。誰かが私のアプローチをゴルフできるなら、それはありがたいです


作るリストの代わりに、そして最後に置き換えるプレーンとの声明を。tsetfort.add(q)
クリスチャン・シウピトゥ


0

Japt -g, 15 bytes

g2ôU ïÈ**Y+pXÃü

Try it

g2ôU ïÈ**Y+pXÃü
                    :Implicit input of integer U
g                   :Index into the following array
 2ôU                :  Range [2,U+2]
     ï              :  Cartesian product with itself
      È             :  Reduce each pair [X,Y]
       **Y          :    Raise X to the power of Y
          +pX       :    Add Y raised to the power of X
             Ã      :  End reduce
              ü     :  Sort & partition by value
                    :Implicit output of first element
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.