Skip to content

tokenrove/advent-of-code-2017

Repository files navigation

My goal, like last year, is to do each day in a different language. We'll see what happens. I might go back and do multiple solutions for one day if I regret not doing something in APL or Lisp.

I should add the disclaimer that many of these solutions are not idiomatic in the languages chosen. Sometimes because I'm unaware of the conventions, and sometimes because I'm actively defying them.

Previously.

  • 1: Futhark
    • s ← "123123" ⋄ +/⍎¨"0",s/⍨s=s⌽⍨2÷⍨⍴s in APL
  • 2: Ruby
    • +/ ((#~(=>.))@(#~(1&~:))@,@(%/]))"1 is in J
  • 3: F#
    • Also in CL. Wanted a language with both generators and complex numbers for this; surprisingly hard ask.
  • 4: Guile Scheme
    • sum(1 for l in f if len({''.join(sorted(w)) for w in l.split()}) == len(l.split()))
  • 5: bootable x86 asm using BOUND instruction
    • for (size_t i = 0; i < N; ++n) i += j[i] <3 ? j[i]++ : j[i]--;
  • 6: GNU Smalltalk
  • 7: SWI Prolog
  • 8: Factor
  • 9: Icon

Some of the discussion around this lead to demoing some of these as (excessively-unPythonic) Python list comprehensions:

with open('day1.in') as f: ds = [int(c) for c in f.readline().strip()]
r = 1 # or len(ds)/2 for part 2
sum(a for (a,b) in zip(ds, ds[r:] + [ds[:r]]) if a == b)
with open('day2.in') as f: ls = [[int(i) for i in line.strip().split()] for line in f]
sum(max(row)-min(row) for row in ls)
sum([q//d for q in row for d in row if q != d and 0 == q % d][0] for row in ls)
with open('day4.in') as f: sum(1 for l in f if len(set(l.split())) == len(l.split()))
with open('day4.in') as f: sum(1 for l in f if len({''.join(sorted(w)) for w in l.split()}) == len(l.split()))
>>> with open("day5.in") as f: jumps = [int(i) for i in f]
>>> i,n = 0,0
>>> while 0 <= i < len(jumps): j = i+jumps[i]; jumps[i] = jumps[i] + (1 if jumps[i] < 3 else -1); n += 1; i = j
>>> print(n)