Project Euler, Part 2

Jason Oswald
Learning Computer Science with Swift
3 min readOct 20, 2017

Refer back to Part 1 for some general guidelines.

We now have covered:

  • types
  • initialization
  • parameters
  • objects
  • arrays

Problem 13

Below you’ll see that I’ve put the numbers for Problem 13 in an array of Strings.The rest is up to you. Of particular note are three things. First, you can loop over the characters of a string like so: for aChar in aString {}. Second, you can create Int objects out of Characters like so: let i = Int(String(aChar))!. Finally, there are such things as two dimensional arrays. You create one like so: var array2D = [[Int]](). This technically creates an Array object that contains Integer Array objects.

var intArray0 = [1,2,3,4,5]
var intArray1 = [1,8,27,64,125]
var intArray2 = [0,1,1,2,2]
array2D.append( intArray0 )
array2D.append( intArray1 )
array2D.append( intArray2 )
print( array2D[1][3] ) // prints 64
print( array2D[0][4] ) // prints 5
print( array2D[2][0] ) // prints 0

Copy and paste this into your editor:

let numbers = [
"37107287533902102798797998220837590246510135740250",
"46376937677490009712648124896970078050417018260538",
"74324986199524741059474233309513058123726617309629",
"91942213363574161572522430563301811072406154908250",
"23067588207539346171171980310421047513778063246676",
"89261670696623633820136378418383684178734361726757",
"28112879812849979408065481931592621691275889832738",
"44274228917432520321923589422876796487670272189318",
"47451445736001306439091167216856844588711603153276",
"70386486105843025439939619828917593665686757934951",
"62176457141856560629502157223196586755079324193331",
"64906352462741904929101432445813822663347944758178",
"92575867718337217661963751590579239728245598838407",
"58203565325359399008402633568948830189458628227828",
"80181199384826282014278194139940567587151170094390",
"35398664372827112653829987240784473053190104293586",
"86515506006295864861532075273371959191420517255829",
"71693888707715466499115593487603532921714970056938",
"54370070576826684624621495650076471787294438377604",
"53282654108756828443191190634694037855217779295145",
"36123272525000296071075082563815656710885258350721",
"45876576172410976447339110607218265236877223636045",
"17423706905851860660448207621209813287860733969412",
"81142660418086830619328460811191061556940512689692",
"51934325451728388641918047049293215058642563049483",
"62467221648435076201727918039944693004732956340691",
"15732444386908125794514089057706229429197107928209",
"55037687525678773091862540744969844508330393682126",
"18336384825330154686196124348767681297534375946515",
"80386287592878490201521685554828717201219257766954",
"78182833757993103614740356856449095527097864797581",
"16726320100436897842553539920931837441497806860984",
"48403098129077791799088218795327364475675590848030",
"87086987551392711854517078544161852424320693150332",
"59959406895756536782107074926966537676326235447210",
"69793950679652694742597709739166693763042633987085",
"41052684708299085211399427365734116182760315001271",
"65378607361501080857009149939512557028198746004375",
"35829035317434717326932123578154982629742552737307",
"94953759765105305946966067683156574377167401875275",
"88902802571733229619176668713819931811048770190271",
"25267680276078003013678680992525463401061632866526",
"36270218540497705585629946580636237993140746255962",
"24074486908231174977792365466257246923322810917141",
"91430288197103288597806669760892938638285025333403",
"34413065578016127815921815005561868836468420090470",
"23053081172816430487623791969842487255036638784583",
"11487696932154902810424020138335124462181441773470",
"63783299490636259666498587618221225225512486764533",
"67720186971698544312419572409913959008952310058822",
"95548255300263520781532296796249481641953868218774",
"76085327132285723110424803456124867697064507995236",
"37774242535411291684276865538926205024910326572967",
"23701913275725675285653248258265463092207058596522",
"29798860272258331913126375147341994889534765745501",
"18495701454879288984856827726077713721403798879715",
"38298203783031473527721580348144513491373226651381",
"34829543829199918180278916522431027392251122869539",
"40957953066405232632538044100059654939159879593635",
"29746152185502371307642255121183693803580388584903",
"41698116222072977186158236678424689157993532961922",
"62467957194401269043877107275048102390895523597457",
"23189706772547915061505504953922979530901129967519",
"86188088225875314529584099251203829009407770775672",
"11306739708304724483816533873502340845647058077308",
"82959174767140363198008187129011875491310547126581",
"97623331044818386269515456334926366572897563400500",
"42846280183517070527831839425882145521227251250327",
"55121603546981200581762165212827652751691296897789",
"32238195734329339946437501907836945765883352399886",
"75506164965184775180738168837861091527357929701337",
"62177842752192623401942399639168044983993173312731",
"32924185707147349566916674687634660915035914677504",
"99518671430235219628894890102423325116913619626622",
"73267460800591547471830798392868535206946944540724",
"76841822524674417161514036427982273348055556214818",
"97142617910342598647204516893989422179826088076852",
"87783646182799346313767754307809363333018982642090",
"10848802521674670883215120185883543223812876952786",
"71329612474782464538636993009049310363619763878039",
"62184073572399794223406235393808339651327408011116",
"66627891981488087797941876876144230030984490851411",
"60661826293682836764744779239180335110989069790714",
"85786944089552990653640447425576083659976645795096",
"66024396409905389607120198219976047599490197230297",
"64913982680032973156037120041377903785566085089252",
"16730939319872750275468906903707539413042652315011",
"94809377245048795150954100921645863754710598436791",
"78639167021187492431995700641917969777599028300699",
"15368713711936614952811305876380278410754449733078",
"40789923115535562561142322423255033685442488917353",
"44889911501440648020369068063960672322193204149535",
"41503128880339536053299340368006977710650566631954",
"81234880673210146739058568557934581403627822703280",
"82616570773948327592232845941706525094512325230608",
"22918802058777319719839450180888072429661980811197",
"77158542502016545090413245809786882778948721859617",
"72107838435069186155435662884062257473692284509516",
"20849603980134001723930671666823555245252804609722",
"53503534226472524250874054075591789781264330331690"
]

Problem 14

Your solution to Problem 14 should probably involve some sort of recursion. You might also be interested to know that you can append the values of one array onto another.

// This is just an odd way to initialize an Array
// Read the Obscura note below
var anotherArray = [Int](repeating:0, count:500)
// Here we append the contents of anotherArray
// onto the end an anArray. This is useful.
anArray.append( contentsOf: anotherArray)

Obscura

I had originally had this bit of information listed as helpful, but in the context of this problem, it really isn’t. Apologies.

You can initialize an array to contain a given number of default values.

// create an Int array with one million values of zero
var anArray = [Int](repeating:0, count:1_000_000)

Challenge

Choose one of the following four problems to complete.

Problem 17

Sadly, there’s no getting out of having to define the relationship between the numbers 1–20 and their string counterparts. You’ll also need to do the same for 30, 40, 50, 60, 70, 80, 90, and 100.

Problem 24

Consider using the iterative version of Heap’s Algorithm for generating your permutations. The recursive version is a little trickier to get right. Or, come up with your own… Also useful information is that you can construct a string from an array of Character objects:

let chars = [Character(0), Character(1), Character(2)]
let str = String(chars)
print( str ) // prints "012"

Problem 31

Probably best solved with a clever use of recursion. You might be interested to know that there are functions to manipulate the ends of an array– dropFirst() and dropLast(). The weird part is that these functions return ArraySlice objects, which we don’t really want to deal with. Luckily, we can pass an ArraySlice into an Array constructor and be very happy.

let numbers = [1,2,5,10]
let fewerNumbers = Array(numbers.dropFirst()) // [2,5,10]
let evenFewer = Array(fewerNumbers.dropLast()) // [2,5]

Problem 21

Note that numbers are not amicable pairs if they are the same number.

--

--