Hacker News new | ask | show | jobs
by melling 2386 days ago
Learning new environments can be painful so it’s good it starts off easy.

I’m trying to solve them with Swift Playgrounds on the iPad, for example. And I can’t figure out how to create a simple text file for the data.

5 comments

I started last year using Swift Playgrounds. I was lazy and just pasted the input into a multi-line string. I had to switch away from Playgrounds after a couple of days because it would crash due to memory issues. It traces every line of execution and the intermediate values of all variables. I really enjoyed doing the challenges in Swift, but I did have to switch to using my Mac to do it.

This year, I’m learning Python by using a Raspberry Pi 4 directly connected to my iPad via USB. Should be another fun month!

I solved the first part using the examples. Swift is nice.

   func calcFuel(_ mass:Int) -> Int {mass / 3 - 2}

   let z0 = massList.map(calcFuel).reduce(0, +)
or simply ...

   let z1 = massList.map({$0 / 3 - 2}).reduce(0, +)
Any idea how to read the data on the iPad?
I copy my session cookie and send a web request for the inputs. I should write some sort of caching code though..
i just copy/pasted the data into the source instead of dealing with IO.
I had to create the plain text input file in iCloud with my Mac then insert it (Big +, third option) in the iPad’s Swift Playground. Need a text app that will save to Files for a complete iPad solution. Also, a Swift Playground bug reverted my final solution to the code from my first few minutes, losing my code. That was frustrating...

Anyway, a complete Swift Playground on iPad solution:

   import UIKit

   let path = Bundle.main.url(forResource: "input01", withExtension: "txt")
   var text = try String(contentsOf: path!, encoding: .utf8)

   let massList:[Int] = text.components(separatedBy: .whitespacesAndNewlines).compactMap({Int($0)})

   let z1 = massList.map({$0 / 3 - 2}).reduce(0, +)
   print("\(z1)")
You can option+tap a link in Safari to download to Files. Hold down the command key to see available shortcuts.
I couldn't figure it out on a Mac. Then I Googled it, and decided I'm better off solving this in languages I know (whatever I feel like today: JS, Python, Java, perhaps even Erlang) or in a language that has a reasonable standard library (Rust) than in this mess: https://twitter.com/dmitriid/status/1201441652507844608
Last night I gave the complete solution in Swift below. Here are the two lines to read the file:

   let path = Bundle.main.url(forResource: "input01", withExtension: "txt")
   var text = try String(contentsOf: path!, encoding: .utf8)
There's no chance in hell anyone learning Swift can figure these two lines out.

Besides, there are immediate additional questions:

- what's a bundle, and why does a Bundle deal with urls?

- What's the difference between Bundle.main.url and FileManager.main.urls, and why one and not the other?

- where does the resource come from?

- how do I read a file from a path?

- Why is String responsible for reading (and writing!) contents of a file? In which world is this good design?

I use pastebin raw and get stuff from web requests sometimes rather than local files.
I've been creating multiline strings and then just using components(separatedBy:)