December 2020

My Music Listening Habits for 2020

Yeah, those monthly updates were kind of bleh, so I dumped them. But I still want to do a yearly wrap up. Though overall there isn’t a lot that’s surprising to me about the yearly stats.

The year was dominated by most of the artists I would expect it to be dominated by. Sigrid, Tessa Violet, Aurora, CHVRCHES have 14 of my top 25 albums. This grid doesn’t even include a few additional Sigrid “Albums” of live tracks that don’t properly show up so they get filtered.

Anyway, a bit better breakdown…

I am actually surprised that Sigrid still topped the chart above Aurora. I’ve been listening to a TON of Aurora, and not just “recently” or something, like all year. Plus Sigrid hasn’t had anything new since November 2019, so I felt like I had been listening to her music less. I still had around 100 more scribbles on Sigrid than Aurora. Tessa Violet, I’m less surprised about. I’ll comment a bit more later, but Tessa Violet has kind of dominated my individual song listens, she just… has less songs.

CHVRCHES has been kind of slowly building up more and more in rotation, and I expect them to continue to come in pretty high going forward as well. Another sleeper to look out for next year will be Dodie, at number 13. She only has a handful of tracks, and I’ve only recently started listening to her, but I really like her music, and next year, she has her first full album coming out.

On the “falling” list, I’ve hardly been listening to Alice Merton and Kiesza lately. Nothing wrong with either, they just sort of, have fallen off the rotation. And despite both ranking high, Dua Lipa and Carly Rae Jepsen were never really in the rotation. I’m honestly not sure how either is so high.

There are also a few of my more mainstay artists making a showing. The Who, BT, Pink Floyd, Avril Lavigne, Alanis Morrisette, Taylor Swift. I’m a little sad that Raffaella only really had one new song recently. She was the opening act for Sigrid when I saw them in 2019 and I really like her music. She has put out one track, Bardot, and a collaboration track called On the Look Out, that may as well just be a Raffaella track.

My single top track for the year, is, without question, the “2020 Anthem” of Bored.

Granted, this track is older than 2020, but it got a music video in 2020, and it kind of just sort of… fits the feel.

Half of my top ten were Tessa Violet tracks, so like I said, she kind of dominated on an individual track list. Everything else is about as expected, though I would have thought more Aurora tracks would have made the cut for that top 20.

Anyway, if you want, you can always just follow me on Last.fm.

2020 Reading List

How to Be Black

How to Be Black

Baratunde R. Thurston

Published: 2012 | Pages:254

My Rating: 4/5

Description:

Caliban's War (Expanse, #2)

Caliban’s War (Expanse, )

James S.A. Corey

Published: 2012 | Pages:583

My Rating: 4/5

Description: In the vast wilderness of space, James Holden and the crew of the Rocinante have been keeping the peace for the Outer Planets Alliance. When they agree to help a scientist search war-torn Ganymede for a missing child, the future of humanity rests on whether a single ship can prevent an alien invasion that may have already begun . . .

The Field Guide to Dumb Birds of North America

The Field Guide to Dumb Birds of North America

Matt Kracht

Published: 2019 | Pages:174

Description: Perfect book for the birder and anti-birder alikeA humorous look at 50 common North American dumb For those who have a disdain for birds or bird lovers with a sense of humor, this snarky, illustrated handbook is equal parts profane, funny, and—let’s face it—true.Featuring common North American birds, such as the White-Breasted Butt Nugget and the Goddamned Canada Goose (or White-Breasted Nuthatch and Canada Goose for the layperson), Matt Kracht identifies all the idiots in your backyard and details exactly why they suck with humorous, yet angry, ink drawings. With The Field Guide to Dumb Birds of North America , you won’t need to wonder what all that racket is anymore!• Each entry is accompanied by facts about a bird’s (annoying) call, its (dumb) migratory pattern, its (downright tacky) markings, and more.• The essential guide to all things wings with migratory maps, tips for birding, musings on the avian population, and the ethics of birdwatching.• Matt Kracht is an amateur birder, writer, and illustrator who enjoys creating books that celebrate the humor inherent in life’s absurdities. Based in Seattle, he enjoys gazing out the window at the beautiful waters of Puget Sound and making fun of birds.”There are loads of books out there for bird lovers, but until now, nothing for those that love to hate birds. The Field Guide to Dumb Birds of North America fills the void, packed with snarky illustrations that chastise the flying animals in a funny, profane way. ” – UncrateA humorous animal book with 50 common North American birds for people who love birds and also those who love to hate birds• A perfect coffee table or bar top conversation-starting book• Makes a great Mother’s Day, Father’s Day, birthday, or retirement gift

The Case of the Girl Who Took Her Shampoo (But Left Her Mini)

The Case of the Girl Who Took Her Shampoo (But Left Her Mini)

Greg Rucka

Published: 2011 | Pages:156

My Rating: 4/5

Description:

Transformers: The Manga, Vol. 1

Transformers: The Manga, Vol. 1

Masumi Kaneda

Published: | Pages:288

My Rating: 4/5
I really dig the art but the plot lines are really random. Sometimes the random weirdness works, but don’t go into this expecting some sort of Deep Lore.

Description: The Autobots and Decepticons have been locked in a brutal civil war for eons, and now their battle has come to Earth! The Autobots seek peace and coexistence, while the Decepticons seek power and control. Earth and its populace are caught between the two as these mighty factions go head-to-head. Transformers took the world by storm shortly after their debut, and these previously uncollected stories were a vital part of that takeover! In this collector’s volume, the Autobots and their young friend Kenji must stand tall against the Decepticons in an interplanetary conflict! These classic stories are from the dawn of the Transformers, and this volume contains thrilling tales such as “The Great Transformer War” and “Fight! Super Robot Life-Form Transformers!”—plus an extensive art gallery!

Kill la Kill 01 (Kill la Kill, #1)

Kill la Kill 01 (Kill la Kill, )

Trigger

Published: 2013 | Pages:184

My Rating: 3/5

Description:

Advent of Code 2020 – Wrap Up

Well, my desire to complete this totally fell apart about halfway through. I managed to get around 25 out of 50 stars total for the 25 days of tasks. I two started 11 of the 25 days, and one stared 3 more.

There are a myriad of reasons for failing to finish all the tasks. For starters, I started to have a few one star days that I would “get back to”. Most of these I have a good idea of how to solve them, but there are little problems somewhere that are stopping me from solving them.

I also just got busy/bored of it. After Day 17, I just kind of got tired of it. I also started being busier with life activities like the holidays and Doctor appointments for my wife, and just didn’t have the energy to bother. I did check on what a few of the other later tasks were and have some ideas on how to go about completing them, but it just all became too tedious.

I’m not a professional programmer, so every tasks just becomes this uphill slog and int he end, they don’t run very quickly or great. Meanwhile people are posting their one line trick code work on Reddit. I know it’s not that kind of competition, but it still kind of drags my motivation down.

I may come back and finish things up, but for now, I am still pretty good with getting half the stars.

Advent of Code 2020 – Day 15

Hey look, Day 15 is another one that took a super long time to calculate, though it was one of the easiest to code. It’s a fancy memory game, for Elves who apparently have computer brains. You start with a series of numbers, then the next number you say, is the difference between when the previous number was said, the last two times.

For example if you start saying this sequence, with 0,1,2,3 , the next number is 0, because 3 has only been said once, after that it’s 4, because 0 was said as the 5th number and the first number (5-1). After that it’s 0 again, because 4 has not been said before, then it’s 2, because 0 is at 7 and 5 (7-5), following that is 5, because 2 is at position 8 and 5 (8-5), and so on.

Both parts were the same problem, just with a different number of iterations, 2020 and 30,000,000. Calculating the 2020th number was quick, calculating the 30 millionth number, not so much.

Anyway, here is my code:


values = [0,8,15,2,12,1,4]

current = 0


while current < 30000000-7:
  check = values[-1]
  last = len(values) - values[::-1].index(check)
  if check in values[:last-1]:  
    temp=values[:last-1]
    temp.reverse()
    #print len(values)
    sec_last = len(values) - temp.index(check)-1
    next = last-sec_last
  else:
    next = 0
  values.append(next)
  #print next

  #print len(values)
  current+=1

print values[:-1]
print len(values)

I had some extra prints in there for the 2020, but printing everything for 30 million just slows it down. The final length print is just to verify that it’s giving me the correct iteration value. The main this this could use for clean up is to replace the while loop “-7” subtraction with subtracting a variable equal to the length of the initial values set, so that you could potentially feed it a value set that is larger or smaller.

The trickiest part here was figuring out the positions of the last two occurrences of a number, which meant counting backwards through the array of values. For the second number, I ended up using a reverse copy of the array, because I kept getting screwball answers trying to do it directly like I had for the first number. I would have liked to make it work with the more elegant solution but I didn’t have time to keep working on it.

Advent of Code 2020 – Day 13

Today’s lesson in extremely, incredibly, stupidly, inefficient methodology, is brought to you by, the letter “i” and the number “640856202464541”. Day 13 consisted of calculating bus departure times. Part 1 was stupidly simple. You have a list of buses, each bus makes a regular round trip to wherever, and the round trip always takes the same amount of minutes. At some point in the past, the buses all left at once.

Say the buses were 4, 5, and 6, each number also being the minutes for a round trip. Every 4 minutes, bus 4 returns, every 5 minutes bus 5 returns, every 6 minutes, bus 6 returns. If you are available to leave at 9 minutes, which bus leaves first. In this example, the first bus to return would be 5 (5*2=10)

Part 1 was easy, start at your departure time, check to see if any of the numbers divide into it evenly, if not, increment by one and repeat.

with open('day13data.txt') as f:
    lines = [line.rstrip() for line in f]

time = int(lines[0])
raw = lines[1].split(',')
busses= [] 

for i in raw:
  if i != 'x':
    busses.append(int(i))

print time
print busses

for x in busses:
  bus_time=x*(round((float(time)/float(x))+.5))
  wait=bus_time-time
  print "For bus "+str(x)+": "+str(bus_time)+" and you will wait: "+str(wait)+" Ans: "+str(x*wait)

The trickiest part is that the data contained non existent buses, labeled with an “x”. These are not a factor for part 1, so they just get stripped out.

Part 2 is where the pain in the ass was. For Part 2, you have to find a starting time where each bus, will leave, one minute apart, according to their offset. This includes the “missing” buses. So for the quick example I had above of 4,5,6, this time would occur at well, 4 minutes, because I made them sequential, but the next one would occur at 64,65,66 (16*4, 13*5, 11*6). This gets even more complicated when you add in the blanks, for example, 4,x,5,x,6 occurs at 68,70,72. As you spread the numbers apart and rearrange them to be non sequential, it complicates everything more.

I actually figured out the methodology pretty quickly, and wrote a working, good bit of code pretty quickly, my problem, was picking a starting point. I am sure there is some numerology methods (I am pretty sure you can do something using remainders), to calculate even an approximate starting point. In my standard of ugly code, I was just brute forcing it.

with open('day13data.txt') as f:
    lines = [line.rstrip() for line in f]

lines_array = lines[1].split(',')
times = []
counter=0
#First for sample Data Set day13datab.txt, second for real data
#multiplier=152600
multiplier=15630639084400
offsets=[]
busses=[]

for i in lines_array:
  if i != 'x':
    busses.append(i)
    offsets.append(lines_array.index(i))

#print busses
#print offsets

while (1):
  for i in offsets:
    times.append(((int(busses[0]))*multiplier)+i)

  #print times
  counter=1
  for j in busses[1:]:
    #print j
    if (times[counter]/float(j)).is_integer():
      counter+=1
    else:
      break
        
  #print times
  #print counter
  if counter == len(busses):
    break
  counter = 0
  times =[]
  multiplier+=1
  #print multiplier

print times

The problem is, this takes a very, very, very, very, very, long time. I left this code running for hours on my server and it didn’t finish, I honestly feel like it could very likely run for days, weeks, years, and never finish. The iteration on my multiplier that gives the correct set, for my data (every person has a different data set) was 15,630,639,084,501. 15 TRILLION.

So I fudged it a bit, because I was pretty sure my code was good, but I didn’t have an eternity to wait. So I found someone else’s code, found the correct answer, then worked out my starting offset from there. Sure enough, when I start at 15,630,6390,084,400. It quickly finds the correct answer.

If I needed this code for something important, I would certainly try to clean it up. I even started working on an iteration that would sort out my bus list to start with the largest number, instead of iterating the list every (low value) it would iterate every (high value), which in my case I believe was something like 15 versus 900. This was trickier than a straight sort though because I had a second list of offsets that I needed to also re order. I got this code working for the sample data set, but it failed in my proper data set because, while the sample data set started with the lowest bus number, the actual data set did not, and I had not calculated for that.

PS, yes, I misspelled “busses” in my code