Initial commit

This commit is contained in:
Aly 2018-11-24 16:14:47 -08:00
commit 21e7449350
No known key found for this signature in database
GPG Key ID: 555B7346639DDAC3
9 changed files with 1038 additions and 0 deletions

712
.gitignore vendored Normal file
View File

@ -0,0 +1,712 @@
# Created by https://www.gitignore.io/api/vim,sbt,java,scala,emacs,ensime,eclipse,netbeans,jetbrains,visualstudio,jetbrains+iml,jetbrains+all,visualstudiocode
# Edit at https://www.gitignore.io/?templates=vim,sbt,java,scala,emacs,ensime,eclipse,netbeans,jetbrains,visualstudio,jetbrains+iml,jetbrains+all,visualstudiocode
### Eclipse ###
.metadata
bin/
tmp/
*.tmp
*.bak
*.swp
*~.nib
local.properties
.settings/
.loadpath
.recommenders
# External tool builders
.externalToolBuilders/
# Locally stored "Eclipse launch configurations"
*.launch
# PyDev specific (Python IDE for Eclipse)
*.pydevproject
# CDT-specific (C/C++ Development Tooling)
.cproject
# CDT- autotools
.autotools
# Java annotation processor (APT)
.factorypath
# PDT-specific (PHP Development Tools)
.buildpath
# sbteclipse plugin
.target
# Tern plugin
.tern-project
# TeXlipse plugin
.texlipse
# STS (Spring Tool Suite)
.springBeans
# Code Recommenders
.recommenders/
# Annotation Processing
.apt_generated/
# Scala IDE specific (Scala & Java development for Eclipse)
.cache-main
.scala_dependencies
.worksheet
### Eclipse Patch ###
# Eclipse Core
.project
# JDT-specific (Eclipse Java Development Tools)
.classpath
# Annotation Processing
.apt_generated
.sts4-cache/
### Emacs ###
# -*- mode: gitignore; -*-
*~
\#*\#
/.emacs.desktop
/.emacs.desktop.lock
*.elc
auto-save-list
tramp
.\#*
# Org-mode
.org-id-locations
*_archive
# flymake-mode
*_flymake.*
# eshell files
/eshell/history
/eshell/lastdir
# elpa packages
/elpa/
# reftex files
*.rel
# AUCTeX auto folder
/auto/
# cask packages
.cask/
dist/
# Flycheck
flycheck_*.el
# server auth directory
/server/
# projectiles files
.projectile
# directory configuration
.dir-locals.el
### Ensime ###
# Ensime specific
.ensime
.ensime_cache/
.ensime_lucene/
### Java ###
# Compiled class file
*.class
# Log file
*.log
# BlueJ files
*.ctxt
# Mobile Tools for Java (J2ME)
.mtj.tmp/
# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
### JetBrains ###
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
# User-specific stuff
.idea/**/workspace.xml
.idea/**/tasks.xml
.idea/**/usage.statistics.xml
.idea/**/dictionaries
.idea/**/shelf
# Generated files
.idea/**/contentModel.xml
# Sensitive or high-churn files
.idea/**/dataSources/
.idea/**/dataSources.ids
.idea/**/dataSources.local.xml
.idea/**/sqlDataSources.xml
.idea/**/dynamic.xml
.idea/**/uiDesigner.xml
.idea/**/dbnavigator.xml
# Gradle
.idea/**/gradle.xml
.idea/**/libraries
# Gradle and Maven with auto-import
# When using Gradle or Maven with auto-import, you should exclude module files,
# since they will be recreated, and may cause churn. Uncomment if using
# auto-import.
# .idea/modules.xml
# .idea/*.iml
# .idea/modules
# CMake
cmake-build-*/
# Mongo Explorer plugin
.idea/**/mongoSettings.xml
# File-based project format
*.iws
# IntelliJ
out/
# mpeltonen/sbt-idea plugin
.idea_modules/
# JIRA plugin
atlassian-ide-plugin.xml
# Cursive Clojure plugin
.idea/replstate.xml
# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
fabric.properties
# Editor-based Rest Client
.idea/httpRequests
# Android studio 3.1+ serialized cache file
.idea/caches/build_file_checksums.ser
### JetBrains Patch ###
# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721
# *.iml
# modules.xml
# .idea/misc.xml
# *.ipr
# Sonarlint plugin
.idea/sonarlint
### JetBrains+all ###
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
# User-specific stuff
# Generated files
# Sensitive or high-churn files
# Gradle
# Gradle and Maven with auto-import
# When using Gradle or Maven with auto-import, you should exclude module files,
# since they will be recreated, and may cause churn. Uncomment if using
# auto-import.
# .idea/modules.xml
# .idea/*.iml
# .idea/modules
# CMake
# Mongo Explorer plugin
# File-based project format
# IntelliJ
# mpeltonen/sbt-idea plugin
# JIRA plugin
# Cursive Clojure plugin
# Crashlytics plugin (for Android Studio and IntelliJ)
# Editor-based Rest Client
# Android studio 3.1+ serialized cache file
### JetBrains+all Patch ###
# Ignores the whole .idea folder and all .iml files
# See https://github.com/joeblau/gitignore.io/issues/186 and https://github.com/joeblau/gitignore.io/issues/360
.idea/
# Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-249601023
*.iml
modules.xml
.idea/misc.xml
*.ipr
### JetBrains+iml ###
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
# User-specific stuff
# Generated files
# Sensitive or high-churn files
# Gradle
# Gradle and Maven with auto-import
# When using Gradle or Maven with auto-import, you should exclude module files,
# since they will be recreated, and may cause churn. Uncomment if using
# auto-import.
# .idea/modules.xml
# .idea/*.iml
# .idea/modules
# CMake
# Mongo Explorer plugin
# File-based project format
# IntelliJ
# mpeltonen/sbt-idea plugin
# JIRA plugin
# Cursive Clojure plugin
# Crashlytics plugin (for Android Studio and IntelliJ)
# Editor-based Rest Client
# Android studio 3.1+ serialized cache file
### JetBrains+iml Patch ###
# Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-249601023
### NetBeans ###
**/nbproject/private/
build/
nbbuild/
nbdist/
.nb-gradle/
### SBT ###
# Simple Build Tool
# http://www.scala-sbt.org/release/docs/Getting-Started/Directories.html#configuring-version-control
dist/*
target/
lib_managed/
src_managed/
project/boot/
project/plugins/project/
.history
.cache
.lib/
### Scala ###
### Vim ###
# Swap
[._]*.s[a-v][a-z]
[._]*.sw[a-p]
[._]s[a-rt-v][a-z]
[._]ss[a-gi-z]
[._]sw[a-p]
# Session
Session.vim
# Temporary
.netrwhist
# Auto-generated tag files
tags
# Persistent undo
[._]*.un~
### VisualStudioCode ###
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
### VisualStudioCode Patch ###
# Ignore all local history of files
### VisualStudio ###
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# Visual Studio 2017 auto generated files
Generated\ Files/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUNIT
*.VisualState.xml
TestResult.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# Benchmark Results
BenchmarkDotNet.Artifacts/
# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/
# StyleCop
StyleCopReport.xml
# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp_proj
*_wpftmp.csproj
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# Visual Studio Trace Files
*.e2e
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# JustCode is a .NET coding add-in
.JustCode
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json
# Visual Studio code coverage results
*.coverage
*.coveragexml
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!*.[Cc]ache/
# Others
ClientBin/
~$*
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs
# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak
# SQL Server files
*.mdf
*.ldf
*.ndf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# JetBrains Rider
*.sln.iml
# CodeRush personal settings
.cr/personal
# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc
# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config
# Tabs Studio
*.tss
# Telerik's JustMock configuration file
*.jmconfig
# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs
# OpenCover UI analysis results
OpenCover/
# Azure Stream Analytics local run output
ASALocalRun/
# MSBuild Binary and Structured Log
*.binlog
# NVidia Nsight GPU debugger configuration file
*.nvuser
# MFractors (Xamarin productivity tool) working folder
.mfractor/
# Local History for Visual Studio
.localhistory/
# End of https://www.gitignore.io/api/vim,sbt,java,scala,emacs,ensime,eclipse,netbeans,jetbrains,visualstudio,jetbrains+iml,jetbrains+all,visualstudiocode

63
.scalafmt.conf Normal file
View File

@ -0,0 +1,63 @@
project {
includeFilters = [
".*.\\.scala$"
".*\\..sbt$"
]
}
maxColumn = 120
align = more
align {
openParenCallSite = false
openParenDefnSite = false
tokens = ["%", ":=", "~="]
}
assumeStandardLibraryStripMargin = true
includeCurlyBraceInSelectChains = false
continuationIndent {
callSite = 2
defnSite = 2
extendSite = 4
}
danglingParentheses = true
newlines {
alwaysBeforeTopLevelStatements = true
sometimesBeforeColonInMethodReturnType = true
penalizeSingleSelectMultiArgList = false
alwaysBeforeElseAfterCurlyIf = false
neverInResultType = false
}
spaces {
afterKeywordBeforeParen = true
}
binPack {
parentConstructors = true
literalArgumentLists = true
}
optIn {
breaksInsideChains = false
breakChainOnFirstMethodDot = true
configStyleArguments = true
}
runner {
optimizer {
forceConfigStyleOnOffset = 150
forceConfigStyleMinArgCount = 2
}
}
rewrite {
rules = [
SortImports
]
}

View File

@ -0,0 +1,167 @@
package aoc
object AoC2017 extends Year {
override def days = Map(
"1" -> Day1,
"2" -> Day2,
"3" -> Day3,
"25" -> Day25
)
object Day1 extends Day {
override def part1(input: String): String = {
val reg = """(\d)(?=\1)""".r
val matches = reg.findAllIn(input).toList
val csum = matches.map(_.toInt).sum
if(input.head == input.last) {
(csum + input.head.toString.toInt).toString
} else {
csum.toString
}
}
override def part2(input: String): String = {
val (left, right) = input.splitAt(input.length / 2)
val zipped = left.zip(right)
val doubled = zipped.filter { case (l, r) => l == r}.map { case (c, _) => c.toString }
(doubled.map(_.toInt).sum * 2).toString
}
}
object Day2 extends Day {
override def part1(input: String): String = {
val lines = input.lines.toList
val rows = lines.map(_.split("""\s+""").map(_.toInt))
val minMax = rows.map(r => (r.min, r.max))
val differences = minMax.map { case (min, max) => max - min }
differences.sum.toString
}
override def part2(input: String): String = {
val lines = input.lines.toList
val rows = lines.map(_.split("""\s+""").map(_.toInt))
rows.flatMap { r =>
val q = r.zipWithIndex.flatMap { case (e, i) =>
r.drop(i + 1).map(f => {
val (min, max) = (Math.min(e, f), Math.max(e, f))
if(max % min == 0) {
Some(max / min)
} else {
None
}
})
}
q.filter(_.isDefined).map(_.get)
}.sum.toString
}
}
object Day3 extends Day {
override def part1(input: String): String = {
case class Cell(num: Int, stepSize: Int, stepFrac: Int, stepped: Int, dist: (Int, Int))
val inum = input.toInt
(inum match {
case 1 => 0
case _ =>
val layer = (Math.sqrt(inum).ceil / 2).floor.toInt
val square = ((layer + 1) * 2) - 1
val diff = (square * square) - inum
val wave = Math.abs(layer - (diff % (layer * 2)))
layer + wave
}).toString
}
override def part2(input: String): String = {
"Not Currently Implemented" // TODO Implement this
}
}
object Day25 extends Day {
import fastparse._, MultiLineWhitespace._
case class State(name: String)
case class InState(state: State, whenZero: Branch, whenOne: Branch)
case class Branch(write: Int, move: Direction, stateChange: State)
sealed trait Direction {
def change: Int
}
case object MoveLeft extends Direction {
override def change: Int = -1
}
case object MoveRight extends Direction {
override def change: Int = 1
}
case class Program(beginIn: State, diagnosticCount: Int, states: Map[State, InState], index: Int = 0, tape: Map[Int, Int] = Map()) {
def step: Program = {
val ndc = diagnosticCount - 1
val cs = states(beginIn)
val cc = tape.getOrElse(index, 0)
val br = cc match {
case 0 => cs.whenZero
case 1 => cs.whenOne
}
val wr = br.write
val mv = br.move
val ns = br.stateChange
val nm = tape + (index -> wr)
Program(ns, ndc, states, index + mv.change, nm)
}
}
def stateParser[_: P]: P[State] = P( "state" ~ CharIn("A-Z").rep.! ).map(State)
def writeParser[_: P]: P[Int] = P( "- Write the value" ~ ("0" | "1").! ~ "." ).map(_.toInt)
def directionParser[_: P]: P[Direction] = P( "- Move one slot to the" ~ ("left" | "right").! ~ "." ).map {
case "left" => MoveLeft
case "right" => MoveRight
}
def stateChangeParser[_: P]: P[State] = P("- Continue with" ~ stateParser ~ ".")
def branchParser[_: P]: P[Branch] = P( writeParser ~ directionParser ~ stateChangeParser ).map {
case (write, dir, state) => Branch(write, dir, state)
}
def inStateParser[_: P]: P[InState] = P(
"In" ~ stateParser ~ ":" ~ "If the current value is 0:" ~ branchParser ~ "If the current value is 1:" ~ branchParser
).map {
case (state, v0, v1) => InState(state, v0, v1)
}
def programParser[_: P]: P[Program] = P(
"Begin in" ~ stateParser ~ "." ~
"Perform a diagnostic checksum after" ~ CharIn("0-9").rep(1).!.map(_.toInt) ~ "steps." ~
inStateParser.rep.map(f => {
val z = f.map(_.state).zip(f)
z.toMap
})
).map {
case (begin, steps, states) => Program(begin, steps, states)
}
override def part1(input: String): String = {
val Parsed.Success(program, _) = parse(input, programParser(_))
def finalState(p: Program): Program = {
val np = p.step
print(s"\rInstructions Left: ${np.diagnosticCount}${" " * program.diagnosticCount.toString.length}")
np.diagnosticCount match {
case 0 => np
case _ => finalState(np)
}
}
println()
finalState(program).tape.values.count(_ == 1).toString
}
override def part2(input: String): String = {
"You Win!"
}
}
}

View File

@ -0,0 +1,8 @@
package aoc
trait Day {
def part1(input: String): String
def part2(input: String): String
}

View File

@ -0,0 +1,56 @@
package aoc
import scala.io.StdIn
object Main {
val years = Map(
"2017" -> AoC2017
)
def main(args: Array[String]): Unit = {
val year = askForYear()
val day = askForDay(year)
val part = askForPart(day)
println("Problem input? End input with an `End of Input` line.")
val input = Stream.continually(StdIn.readLine()).takeWhile(_ != "End of Input").toList.mkString("\n")
println(s"Output: ${part(input)}")
}
def askForYear(): Year = {
println(s"Years: ${years.keys.mkString(", ")}")
print("Year? ")
val input = StdIn.readLine()
years.get(input) match {
case Some(y) => y
case None =>
println("Not a valid year.")
askForYear()
}
}
def askForDay(y: Year): Day = {
println(s"Days: ${y.days.keys.mkString(", ")}")
print("Day? ")
val input = StdIn.readLine()
y.days.get(input) match {
case Some(d) => d
case None =>
println("Not a valid day.")
askForDay(y)
}
}
def askForPart(d: Day): String => String = {
print("Part (1/2)? ")
val input = StdIn.readLine()
input match {
case "1" => d.part1
case "2" => d.part2
case _ =>
println("Not a valid part.")
askForPart(d)
}
}
}

View File

@ -0,0 +1,7 @@
package aoc
trait Year {
def days: Map[String, Day]
}

20
build.sbt Normal file
View File

@ -0,0 +1,20 @@
import sbtcrossproject.CrossPlugin.autoImport.{crossProject, CrossType}
val sharedSettings = Seq(
name := "aoc",
organization := "tf.bug",
version := "0.1.0",
scalaVersion := "2.11.12",
libraryDependencies ++= List(
"com.lihaoyi" %%% "fastparse" % "2.0.4",
),
mainClass := Some("tf.bug.aoc.Main"),
)
lazy val aoc = crossProject(JSPlatform, JVMPlatform /* , NativePlatform */)
.crossType(CrossType.Pure)
.settings(sharedSettings)
lazy val aocJS = aoc.js
lazy val aocJVM = aoc.jvm
// lazy val aocNative = aoc.native

1
project/build.properties Normal file
View File

@ -0,0 +1 @@
sbt.version = 1.2.6

4
project/plugins.sbt Normal file
View File

@ -0,0 +1,4 @@
addSbtPlugin("org.portable-scala" % "sbt-scalajs-crossproject" % "0.6.0")
addSbtPlugin("org.portable-scala" % "sbt-scala-native-crossproject" % "0.6.0")
addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.25")
addSbtPlugin("org.scala-native" % "sbt-scala-native" % "0.3.8")