Leyland Numbers

37

2

Given a natural number n, return the n-th Leyland number.

Leyland Number

Leyland numbers are positive integers k of the form

k = x^y + y^x

Where x,y are integers strictly greater than 1.

They are enumerated in ascending order.

EDIT: @DigitalTrauma suggested I include following "definition":

Imagine we throw x^y+y^x in a bag for all possible values of x and y, and avoid throwing in duplicates. Then we sort that bag. The sorted bag is our sequence.

Details

You may use 0 or 1 based indexing, whatever suits you best.

Your program must be able to output at least all Leyland numbers less than the maximum of signed 32-bit integers. (The last Leyland number below this limit is 1996813914, at index 82.)

Test cases

The first few terms are following:

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

A076980 in OEIS, except for the first entry. Note that because of that additional first entry, the indices on OEIS are shifted by one.

More can be found in the OEIS b-file

flawr

Posted 2016-06-15T12:33:32.600

Reputation: 40 560

They are enumerated in ascending order I'm not really sure what this means. Could you provide a list of x and y? – James – 2016-06-15T13:26:26.233

@DrGreenEggsandIronMan That means, 8 is before 17, not the other way round. – Leaky Nun – 2016-06-15T13:29:21.743

@DrGreenEggsandIronMan I think it's 2^2+2^2=8; 2^3+3^2=17; 2^4+4^2=32; 2^5+5^2=57; 2^6+6^2=100; 3^4+4^3=145 <- Note that 3^4+4^3 (=145) is lower than 2^7+7^2 (=177). So basically all possible combinations of x^y+y^x sorted from lowest to highest smaller than 1996813914. – Kevin Cruijssen – 2016-06-15T13:31:04.807

3@DrGreenEggsandIronMan Imagine we throw x^y+y^x in a bag for all possible values of x and y, and avoid thrwoing in duplicates. Then we sort that bag. The sorted bag is our sequence. – flawr – 2016-06-15T13:42:14.977

Regarding the 2^32 requirement, does that apply to time or memory considerations? Is it acceptable if the program works I'm theory with unlimited time and memory? – Luis Mendo – 2016-06-15T13:52:37.410

No, it should work on your computer and terminate within a reasonable time. – flawr – 2016-06-15T14:02:33.113

@flawr I think this comment makes it a lot clearer. Can you edit this into the question?

– Digital Trauma – 2016-06-15T16:27:15.383

10Very large bag you have there – Luis Mendo – 2016-06-15T18:35:27.563

2@LuisMendo Ask @​HenriLéonLebesgue and he is going to tell you that this bag is basically nothing. – flawr – 2016-06-15T18:58:58.280

@flawr Its contained volume is also probably in the neighborhood of -1/12. – Draco18s no longer trusts SE – 2019-01-09T04:34:35.107

Answers

11

MATL, 16 15 13 bytes

Q:Qt!^t!+uSG)

Output is 1-based.

Try it online!

Explanation

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

Luis Mendo

Posted 2016-06-15T12:33:32.600

Reputation: 87 464

In Matlab unique sorts the elements. Doesn't it in MATL, too? – pajonk – 2016-06-15T17:20:25.377

1@pajonk MATL uses the 'stable' flag for unique by default as that is the more typical usage. – Suever – 2016-06-15T18:15:54.260

@Suever Ok, thanks for clarifying. – pajonk – 2016-06-15T18:52:08.717

1I feel like we use the t!^ (where ^ can be replaced by +, -, or any number of operators) motif a lot. What if we made & mean 1 input for some of those where for a vector it has that behavior? – Suever – 2016-06-15T18:56:12.170

@Suever That's a great idea! I've done some research with your script; see the chat – Luis Mendo – 2016-06-15T20:43:47.913

5

Java 8, 225 221 219 216 206 204 193 192 bytes

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

-2 bytes (221 → 219) saved by replacing 1996813915 with (1L<<31) thanks to @LeakyNun.
-3 bytes (219 → 216) thanks to @LeakyNun and @Frozn with something I forgot myself..
-10 bytes (216 → 206) by changing Java 7 to 8.
-2 bytes (206 → 204) by replacing ArrayList with Vector thanks to @TAsk.
-11 bytes (204 → 193) by removing s<(1L<<31)&, since the question states "at least all Leyland numbers less than the maximum of signed 32-bit integers".
-1 byte (193 → 192) by changing Vector to Stack.

Explanation:

Try it here

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

Kevin Cruijssen

Posted 2016-06-15T12:33:32.600

Reputation: 67 575

210/10 for using java – Leaky Nun – 2016-06-15T14:17:02.240

Since you only need to support up to 2^31-1 (i.e., signed int), can't you swap out a bunch of the long casts? – AdmBorkBork – 2016-06-15T14:18:06.087

@TimmyD I don't think so, because they will overflow in the process. – Leaky Nun – 2016-06-15T14:19:24.830

@TimmyD Maybe, but then I need to know the exact range for both for-loops, and even then it probably overflows.. (Also, I was too lazy / 'busy' with work to determine that max myself and just used two times 25 and an if(s<1996813915) check. xD) – Kevin Cruijssen – 2016-06-15T14:21:11.510

1Quick golfs: 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 – 2016-06-15T14:26:49.360

@LeakyNun You've only changed if(s<1996813915& to if(s<(1L<<31)& if I see that correctly? Or you also changed something else? – Kevin Cruijssen – 2016-06-15T14:30:52.053

1The for loop variable declaration. – Leaky Nun – 2016-06-15T14:31:12.570

@LeakyNun Ah of course.. Read past that (twice.. in my own code AND in your comment.. >.> ;p) – Kevin Cruijssen – 2016-06-15T14:36:37.857

@LeakyNun According to wolframalpha 24^24+24^24 = 2667471553700568248898162945687552, so I'd say it's more than enough for the 1996813915 maximum. :)

– Kevin Cruijssen – 2016-06-15T15:03:40.543

Have you put it in practice? – Leaky Nun – 2016-06-15T15:14:15.083

@LeakyNun Yes, here is a (quick-and-dirty) ideone which outputs the entire list.

– Kevin Cruijssen – 2016-06-15T15:32:30.057

@LeakyNun Even though 25^25+25^25 surpasses the max size of long, Math.pow returns Integer.MAX_VALUE when it's above a certain limit. Luckily for me, the max of this question is the same. :) Math.pow source-code

– Kevin Cruijssen – 2016-06-15T15:41:19.803

Yes, but it works not because 24^24+24^24 is very big. It works because you removed the bigger numbers. If you keep them there, it would not work. – Leaky Nun – 2016-06-15T15:41:26.507

@TimmyD Ah oops.. Changed to 30.. – Kevin Cruijssen – 2016-06-15T17:27:37.193

1How about for (int i = 1, j; ++i < 30;) and for (j = 1; ++j < 30;) – Frozn – 2016-06-16T10:56:21.113

@Frozn Thanks, edited. I always forget about that one for basic for-loops. Mostly because for-loops that use someArray.length it requires the -1 to work without ArrayIndexOutOfBoundsException, which is +1 bytes instead of -1. – Kevin Cruijssen – 2016-06-16T11:12:59.180

5

Haskell, 52 bytes

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

Really inefficient. Tests each natural number for being a Leyland number, making an infinite list of those that are. Given an input, takes that index element of the list. Uses that only x,y up to 31 need to be checked for 32 bit integers.

Same length with filter:

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

xnor

Posted 2016-06-15T12:33:32.600

Reputation: 115 687

In hindsight such an obvious solution, I like it a lot! – flawr – 2016-06-15T18:52:47.590

4

Pyth, 17 bytes

0-indexed.

@{Sms^M_Bd^}2+2Q2

Try it online! (Please, keep it at 100.)

How it works

@{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.

Slower version

1-indexed.

e.ffqZs^M_BT^}2Z2

Try it online! (Please, keep it at 3.)

Leaky Nun

Posted 2016-06-15T12:33:32.600

Reputation: 45 011

Would it help to create an array of powers [[4,8,...][9,27,...]] and add it to its transpose? – Neil – 2016-06-15T14:05:24.350

@Neil I don't think so. It would be helpful in Jelly, but not in Pyth. Pyth does not automatically vectorize. – Leaky Nun – 2016-06-15T14:12:21.037

Also helps in MATL, it seems. – Neil – 2016-06-15T19:44:48.187

Why do you keep the slower version? – Erik the Outgolfer – 2016-06-16T14:18:51.450

4

MATLAB, 58 bytes

1-indexed

n=input('');[A B]=ndgrid(2:n+9);k=A.^B;x=unique(k'+k);x(n)

unique in MATLAB flattens and sorts the matrix.


Thanks for help to @FryAmTheEggman and @flawr.

pajonk

Posted 2016-06-15T12:33:32.600

Reputation: 2 480

3

05AB1E, 20 19 bytes

0-indexed

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

Explained

ÝÌ                     # 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

Try it online

Saved 1 byte thanks to @Adnan

Emigna

Posted 2016-06-15T12:33:32.600

Reputation: 50 798

Very nice! One tip, ÝÌ is short for >L>. – Adnan – 2016-06-15T15:50:17.757

@Adnan: Thanks! I can't belive I didn't think of that :P – Emigna – 2016-06-15T15:54:42.987

ê is sorted_uniquified, if that existed when this was asked. – Magic Octopus Urn – 2016-11-01T16:36:04.953

@carusocomputing: It was bugged until quite recently I'm afraid. – Emigna – 2016-11-01T18:07:36.050

3

Mathematica, 60 48 40 bytes

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

Uses one-based indexing. Union is used by applying it between each row of the 2D matrix created by the Array. There, Union will flatten the 2D matrix into a list while also removing any duplicates and placing the values in sorted order.

Saved 8 bytes thanks to @LLlAMnYP.

Usage

Example

miles

Posted 2016-06-15T12:33:32.600

Reputation: 15 654

{#+1,#+1} isn't necessary, can be left as {#,#} and {2,2} can be replaced with simply 2. – LLlAMnYP – 2016-06-17T11:20:03.463

@LLlAMnYP Thanks! Didn't know that Array would expand the third argument. – miles – 2016-06-17T11:42:16.097

Neither did I but I decided to try it anyway and it worked :) – LLlAMnYP – 2016-06-17T11:44:14.680

2

PowerShell v2+, 84 73 68 bytes

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

Saved 11 bytes thanks to @Neil ... saved additional 5 bytes by reorganizing how the iex expression is evaluated.

Naïve method, we simply double-for loop from x=2..30 and y=2..x. Each loop we put x^y + y^x on the pipeline. The 30 was chosen experimentally to ensure that we covered all cases less than 2^31-1 ;-). We pipe those to Sort-Object to order them ascending. Output is zero-indexed based on the input $args[0].

Yes, there are a lot of extraneous entries generated here -- this algorithm actually generates 435 Leyland numbers -- but things above index 81 are not guaranteed to be accurate and in order (there may be some that are skipped).

Examples

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

AdmBorkBork

Posted 2016-06-15T12:33:32.600

Reputation: 41 581

2

JavaScript (Firefox 42-57), 94 bytes

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]

Needs Firefox 42 because it uses both array comprehensions and exponentiation ([for(..of..)] and **).

Neil

Posted 2016-06-15T12:33:32.600

Reputation: 95 035

Shouldn't you just mark it as ES7? – mbomb007 – 2016-06-15T18:48:01.790

@mbomb007 I don't think [for...of] made it to ES7. – Neil – 2016-06-15T19:41:58.143

It's part of ES6 – mbomb007 – 2016-06-15T19:58:25.340

No, that's for(..of..), not [for(..of..)]. – Neil – 2016-06-15T20:09:21.557

Ah, okay. (Non-standard. Do not use.) lol

– mbomb007 – 2016-06-15T20:20:28.030

@mbomb007 Sure, but they're ideal for golfing: they combine both map and filter, they accept any iterable object, not just an array, and they support multiple loops that result in a single array. – Neil – 2016-06-15T20:58:43.020

In other words, just like any other comprehension (like Python) – mbomb007 – 2016-06-16T13:22:48.160

2

Jelly, 14 bytes

2 bytes thanks to Dennis.

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

Try it online! (Takes ~ 1s for 82 for me) (O(n^2) time)

Original 16-byte answer

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

Try it online! (Takes < 1s for me) (Constant time)

Leaky Nun

Posted 2016-06-15T12:33:32.600

Reputation: 45 011

R‘*€¹$+Z$FṢQị@ is faster, shorter and has no artificial upper bound. – Dennis – 2016-06-15T15:31:08.377

@Dennis and beats my answer :-P – Luis Mendo – 2016-06-15T15:31:44.090

@Dennis I don't get it. How come it is faster than the second one. – Leaky Nun – 2016-06-15T15:32:10.370

It isn't faster than the second one. The execution time is too short to get an accurate measurement. – Dennis – 2016-06-15T15:34:51.657

Now 13 bytes :-P – Luis Mendo – 2016-06-15T15:51:17.340

2

Bash + GNU utilities, 63

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

1-based indexing. It looks like this is pretty much the same approach as @TimmyD's answer. Instead of nested loops, bash brace expansion is used to generate arithmetic expressions that are piped to bc for evaluation.

Ideone.

Digital Trauma

Posted 2016-06-15T12:33:32.600

Reputation: 64 644

2

Perl 6,  60 58  56 bytes

{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)[$_]}

Test:

#! /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

Explanation:

{
  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
  )[$_]
}

Brad Gilbert b2gills

Posted 2016-06-15T12:33:32.600

Reputation: 12 713

Can't you remove the spaces between sort [ and ] 2..31? – Erik the Outgolfer – 2016-06-16T14:10:25.933

@EʀɪᴋᴛʜᴇGᴏʟғᴇʀ That would turn it from a subroutine call sort([... to an array access of a term sort[.... A similar thing happens with the other space. – Brad Gilbert b2gills – 2016-06-16T16:41:39.747

2

F#, 117, 104

Welp, it's shorter than my C# answer at least.

Saved 13 bytes thanks to Reed Copsey in the F# chatroom.

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

Morgan Thrapp

Posted 2016-06-15T12:33:32.600

Reputation: 3 574

2

R, 58 54 bytes

1-indexed. Eliminated 4 bytes by using pryr::r instead of function.

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

Explanation

For all numbers from 2 to 99, and 2 to 9,

                  2:99,2:9

apply the function x^y+y^x. This generates a 98x8 matrix.

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

Sort this matrix (coercing it to a vector):

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

Remove all non-unique values:

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

Read n from stdin, and fetch the nth number from the list:

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

rturnbull

Posted 2016-06-15T12:33:32.600

Reputation: 3 689

1

Axiom 148 bytes

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)

some example

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]

Type: List Integer

RosLuP

Posted 2016-06-15T12:33:32.600

Reputation: 3 036

1

Ruby, 62 58 bytes

->n{a,*b=c=2;c+=1while(b<<a**c+c**a;c<32||32>c=a+=1);b[n]}

Try it online!

G B

Posted 2016-06-15T12:33:32.600

Reputation: 11 099

1

Perl 5, 70 + 1 (-p) = 71 bytes

for$x(2..32){$r{$x**$_+$_**$x}++for$x..32}$_=(sort{$a<=>$b}keys%r)[$_]

Try it online!

Xcali

Posted 2016-06-15T12:33:32.600

Reputation: 7 671

1

Haskell, 99 98 96 95 94 bytes

It is probably easily outgolfed, but that was the best I was able to come up with.

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

flawr

Posted 2016-06-15T12:33:32.600

Reputation: 40 560

import Data.List f n|w<-[2..toEnum$n+3]=(sort$nub[x^y+y^x|x<-w,y<-w])!!n Do you know why toInteger/toEnum is needed? – Damien – 2016-06-15T16:20:59.163

Wow, this is crazy=) Feel free to add it as your own answer, as it is qutie different from mine! If we omit toInteger in my solution we'll have an overflow using int, because we iterate way higher (to n+3 instead of n) when working with the list. Otherwise we'd need to hardcode the first four terms or so. What exactly does toEnum do in your solution? – flawr – 2016-06-15T16:38:05.240

OK, that's because of (!!) operator which binds n to an Int. Since n is supposed to be under 82, w can be replaced by [2..99] for example and f=(sort(nub[x^y+y^x|x<-[2..99],y<-[2..x]])!!) . toEnum converts an Int to an Enum, and Integer is an instance of Enum class so toEnum here converts n+3 to an Integer. – Damien – 2016-06-15T16:42:11.417

1

Python 3, 76 69 bytes

r=range(2,32);f=lambda n:sorted({x**y+y**x for x in r for y in r})[n]

0-indexed.

https://repl.it/C2SA

atlasologist

Posted 2016-06-15T12:33:32.600

Reputation: 2 945

2It’s okay to just write your answer as r=range(2,32) lambda n:sorted(…)[n] – Lynn – 2016-06-15T16:19:52.170

1

C#, 141, 127 bytes.

Oh c#, you are such a long language.

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];

This is a lambda that needs to be assigned to delegate double del(int n); to be run, as such:

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];

Morgan Thrapp

Posted 2016-06-15T12:33:32.600

Reputation: 3 574

1

Still shorter than Java.

– flawr – 2016-06-15T19:06:28.720

@flawr Wooooooo? – Morgan Thrapp – 2016-06-15T19:07:20.497

I know nothing about C#, but couldn't you save Enumerable.Range( to a variable/function/iterator/whatever with a shorter name for reuisng? – flawr – 2016-06-15T19:10:02.050

I could, but then I would need to include a class and type defs, which ends up costing me a ton. – Morgan Thrapp – 2016-06-15T19:10:40.543

1

SQL (PostgreSQL 9.4), 171 bytes

Done as a prepared statement. Generate a couple of series 2 - 99, cross join them and do the equation. Densely rank the results to index them and select the first result that has the rank of the integer input.

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

Executed as follows

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

This ended up running a lot quicker than I expected

MickyT

Posted 2016-06-15T12:33:32.600

Reputation: 11 735

1

Swift 3, 138 bytes

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

Ungolfed code

Try it here

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

Valentin

Posted 2016-06-15T12:33:32.600

Reputation: 111

1Welcome to Programming Puzzles and Code Golf! Nice first answer, but it'd be better if you could explain what's going on. – clismique – 2016-06-16T09:08:02.653

1

J, 29 bytes

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

Uses one-based indexing. Conversion from my Mathematica solution.

The true secret here is that I have :(^+^~) on my side.

Usage

   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

Explanation

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

More seriously,

<:{[:/:~@~.@,[:(^+^~)"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

miles

Posted 2016-06-15T12:33:32.600

Reputation: 15 654

... Profit :D – flawr – 2016-06-17T19:19:30.733

0

APL (Dyalog), 27 bytes

{d⊃⍨⍵⊃⍋d←∪,∘.(*⍨+*)⍨1↓⍳1+⍵}

Try it online!

Uriel

Posted 2016-06-15T12:33:32.600

Reputation: 11 708

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

Shaggy

Posted 2016-06-15T12:33:32.600

Reputation: 24 623

0

J, 38 31 bytes

0-indexed.

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

Usage

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

Leaky Nun

Posted 2016-06-15T12:33:32.600

Reputation: 45 011

0

Python 3, 129->116 bytes

I know there is a shorter python 3 answer, but I still wanted to contribute my solution.

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

This was the best way that I could to think of to handle going through all values for x and all values for y. If anyone can golf my approach it would be appreciated

george

Posted 2016-06-15T12:33:32.600

Reputation: 1 495

Make t a set instead of a list, and replace the last for statements with a plain t.add(q).

– Cristian Ciupitu – 2016-06-17T00:37:11.130

0

Java, 200 197 bytes

0-indexed

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();};

Looks like java's streams can actually save bytes! Who would've thought?!

Ungolfed:

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

  }
}

Edits:

  1. 200 -> 197 : removed space after long[] and removed parenthesis around n.

Olivier Grégoire

Posted 2016-06-15T12:33:32.600

Reputation: 10 647