Initial commit.
This commit is contained in:
commit
dfddbea84b
|
@ -0,0 +1,883 @@
|
|||
|
||||
# Created by https://www.gitignore.io/api/jetbrains,intellij+iml,eclipse,visualstudio,sublimetext,windows,macos,emacs,vim,linux,c,c++,cmake,python,csharp,java
|
||||
|
||||
### Vim ###
|
||||
# swap
|
||||
[._]*.s[a-w][a-z]
|
||||
[._]s[a-w][a-z]
|
||||
# session
|
||||
Session.vim
|
||||
# temporary
|
||||
.netrwhist
|
||||
*~
|
||||
# auto-generated tag files
|
||||
tags
|
||||
|
||||
|
||||
### 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
|
||||
|
||||
# Sensitive or high-churn files:
|
||||
.idea/dataSources/
|
||||
.idea/dataSources.ids
|
||||
.idea/dataSources.xml
|
||||
.idea/dataSources.local.xml
|
||||
.idea/sqlDataSources.xml
|
||||
.idea/dynamic.xml
|
||||
.idea/uiDesigner.xml
|
||||
|
||||
# Gradle:
|
||||
.idea/gradle.xml
|
||||
.idea/libraries
|
||||
|
||||
# Mongo Explorer plugin:
|
||||
.idea/mongoSettings.xml
|
||||
|
||||
## File-based project format:
|
||||
*.iws
|
||||
|
||||
## Plugin-specific files:
|
||||
|
||||
# IntelliJ
|
||||
/out/
|
||||
|
||||
# mpeltonen/sbt-idea plugin
|
||||
.idea_modules/
|
||||
|
||||
# JIRA plugin
|
||||
atlassian-ide-plugin.xml
|
||||
|
||||
# Crashlytics plugin (for Android Studio and IntelliJ)
|
||||
com_crashlytics_export_strings.xml
|
||||
crashlytics.properties
|
||||
crashlytics-build.properties
|
||||
fabric.properties
|
||||
|
||||
### JetBrains Patch ###
|
||||
# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721
|
||||
|
||||
# *.iml
|
||||
# modules.xml
|
||||
# .idea/misc.xml
|
||||
# *.ipr
|
||||
|
||||
|
||||
### Eclipse ###
|
||||
|
||||
.metadata
|
||||
bin/
|
||||
tmp/
|
||||
*.tmp
|
||||
*.bak
|
||||
*.swp
|
||||
*~.nib
|
||||
local.properties
|
||||
.settings/
|
||||
.loadpath
|
||||
.recommenders
|
||||
|
||||
# Eclipse Core
|
||||
.project
|
||||
|
||||
# External tool builders
|
||||
.externalToolBuilders/
|
||||
|
||||
# Locally stored "Eclipse launch configurations"
|
||||
*.launch
|
||||
|
||||
# PyDev specific (Python IDE for Eclipse)
|
||||
*.pydevproject
|
||||
|
||||
# CDT-specific (C/C++ Development Tooling)
|
||||
.cproject
|
||||
|
||||
# JDT-specific (Eclipse Java Development Tools)
|
||||
.classpath
|
||||
|
||||
# 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/
|
||||
|
||||
|
||||
### Csharp ###
|
||||
## 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
|
||||
*.suo
|
||||
*.user
|
||||
*.userosscache
|
||||
*.sln.docstates
|
||||
*.vcxproj.filters
|
||||
|
||||
# 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 cache/options directory
|
||||
.vs/
|
||||
# Uncomment if you have tasks that create the project's static files in wwwroot
|
||||
#wwwroot/
|
||||
|
||||
# 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
|
||||
|
||||
# .NET Core
|
||||
project.lock.json
|
||||
project.fragment.lock.json
|
||||
artifacts/
|
||||
**/Properties/launchSettings.json
|
||||
|
||||
*_i.c
|
||||
*_p.c
|
||||
*_i.h
|
||||
*.ilk
|
||||
*.meta
|
||||
*.obj
|
||||
*.pch
|
||||
*.pdb
|
||||
*.pgc
|
||||
*.pgd
|
||||
*.rsp
|
||||
*.sbr
|
||||
*.tlb
|
||||
*.tli
|
||||
*.tlh
|
||||
*.tmp_proj
|
||||
*.log
|
||||
*.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
|
||||
|
||||
# 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
|
||||
|
||||
# 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
|
||||
# TODO: 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
|
||||
**/packages/*
|
||||
# except build/, which is used as an MSBuild target.
|
||||
!**/packages/build/
|
||||
# Uncomment if necessary however generally it will be regenerated when needed
|
||||
#!**/packages/repositories.config
|
||||
# NuGet v3's project.json files produces more ignoreable 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
|
||||
|
||||
# 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
|
||||
node_modules/
|
||||
orleans.codegen.cs
|
||||
|
||||
# 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
|
||||
|
||||
# SQL Server files
|
||||
*.mdf
|
||||
*.ldf
|
||||
|
||||
# Business Intelligence projects
|
||||
*.rdl.data
|
||||
*.bim.layout
|
||||
*.bim_*.settings
|
||||
|
||||
# Microsoft Fakes
|
||||
FakesAssemblies/
|
||||
|
||||
# GhostDoc plugin setting file
|
||||
*.GhostDoc.xml
|
||||
|
||||
# Node.js Tools for Visual Studio
|
||||
.ntvs_analysis.dat
|
||||
|
||||
# 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
|
||||
.idea/
|
||||
*.sln.iml
|
||||
|
||||
# CodeRush
|
||||
.cr/
|
||||
|
||||
# Python Tools for Visual Studio (PTVS)
|
||||
__pycache__/
|
||||
*.pyc
|
||||
|
||||
# Cake - Uncomment if you are using it
|
||||
# tools/
|
||||
|
||||
|
||||
### SublimeText ###
|
||||
# cache files for sublime text
|
||||
*.tmlanguage.cache
|
||||
*.tmPreferences.cache
|
||||
*.stTheme.cache
|
||||
|
||||
# workspace files are user-specific
|
||||
*.sublime-workspace
|
||||
|
||||
# project files should be checked into the repository, unless a significant
|
||||
# proportion of contributors will probably not be using SublimeText
|
||||
# *.sublime-project
|
||||
|
||||
# sftp configuration file
|
||||
sftp-config.json
|
||||
|
||||
# Package control specific files
|
||||
Package Control.last-run
|
||||
Package Control.ca-list
|
||||
Package Control.ca-bundle
|
||||
Package Control.system-ca-bundle
|
||||
Package Control.cache/
|
||||
Package Control.ca-certs/
|
||||
bh_unicode_properties.cache
|
||||
|
||||
# Sublime-github package stores a github token in this file
|
||||
# https://packagecontrol.io/packages/sublime-github
|
||||
GitHub.sublime-settings
|
||||
|
||||
|
||||
### Windows ###
|
||||
# Windows image file caches
|
||||
Thumbs.db
|
||||
ehthumbs.db
|
||||
|
||||
# Folder config file
|
||||
Desktop.ini
|
||||
|
||||
# Recycle Bin used on file shares
|
||||
$RECYCLE.BIN/
|
||||
|
||||
# Windows Installer files
|
||||
*.cab
|
||||
*.msi
|
||||
*.msm
|
||||
*.msp
|
||||
|
||||
# Windows shortcuts
|
||||
*.lnk
|
||||
|
||||
|
||||
### macOS ###
|
||||
*.DS_Store
|
||||
.AppleDouble
|
||||
.LSOverride
|
||||
|
||||
# Icon must end with two \r
|
||||
Icon
|
||||
# Thumbnails
|
||||
._*
|
||||
# Files that might appear in the root of a volume
|
||||
.DocumentRevisions-V100
|
||||
.fseventsd
|
||||
.Spotlight-V100
|
||||
.TemporaryItems
|
||||
.Trashes
|
||||
.VolumeIcon.icns
|
||||
.com.apple.timemachine.donotpresent
|
||||
# Directories potentially created on remote AFP share
|
||||
.AppleDB
|
||||
.AppleDesktop
|
||||
Network Trash Folder
|
||||
Temporary Items
|
||||
.apdisk
|
||||
|
||||
|
||||
### 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
|
||||
|
||||
|
||||
### Intellij+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:
|
||||
|
||||
# Sensitive or high-churn files:
|
||||
|
||||
# Gradle:
|
||||
|
||||
# Mongo Explorer plugin:
|
||||
|
||||
## File-based project format:
|
||||
|
||||
## Plugin-specific files:
|
||||
|
||||
# IntelliJ
|
||||
|
||||
# mpeltonen/sbt-idea plugin
|
||||
|
||||
# JIRA plugin
|
||||
|
||||
# Crashlytics plugin (for Android Studio and IntelliJ)
|
||||
|
||||
### Intellij+iml Patch ###
|
||||
# Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-249601023
|
||||
|
||||
*.iml
|
||||
modules.xml
|
||||
.idea/misc.xml
|
||||
*.ipr
|
||||
|
||||
|
||||
### Linux ###
|
||||
|
||||
# temporary files which can be created if a process still has a handle open of a deleted file
|
||||
.fuse_hidden*
|
||||
|
||||
# KDE directory preferences
|
||||
.directory
|
||||
|
||||
# Linux trash folder which might appear on any partition or disk
|
||||
.Trash-*
|
||||
|
||||
# .nfs files are created when an open file is removed but is still being accessed
|
||||
.nfs*
|
||||
|
||||
|
||||
### C ###
|
||||
# Prerequisites
|
||||
*.d
|
||||
|
||||
# Object files
|
||||
*.o
|
||||
*.ko
|
||||
*.elf
|
||||
|
||||
# Linker output
|
||||
*.map
|
||||
*.exp
|
||||
|
||||
# Precompiled Headers
|
||||
*.gch
|
||||
|
||||
# Libraries
|
||||
*.lib
|
||||
*.a
|
||||
*.la
|
||||
*.lo
|
||||
|
||||
# Shared objects (inc. Windows DLLs)
|
||||
*.dll
|
||||
*.so
|
||||
*.so.*
|
||||
*.dylib
|
||||
|
||||
# Executables
|
||||
*.exe
|
||||
*.out
|
||||
*.app
|
||||
*.i*86
|
||||
*.x86_64
|
||||
*.hex
|
||||
|
||||
# Debug files
|
||||
*.dSYM/
|
||||
*.su
|
||||
*.idb
|
||||
|
||||
# Kernel Module Compile Results
|
||||
*.mod*
|
||||
*.cmd
|
||||
modules.order
|
||||
Module.symvers
|
||||
Mkfile.old
|
||||
dkms.conf
|
||||
|
||||
|
||||
### C++ ###
|
||||
# Prerequisites
|
||||
|
||||
# Compiled Object files
|
||||
*.slo
|
||||
|
||||
# Precompiled Headers
|
||||
|
||||
# Compiled Dynamic libraries
|
||||
|
||||
# Fortran module files
|
||||
*.mod
|
||||
*.smod
|
||||
|
||||
# Compiled Static libraries
|
||||
*.lai
|
||||
|
||||
# Executables
|
||||
|
||||
|
||||
### CMake ###
|
||||
CMakeCache.txt
|
||||
CMakeFiles
|
||||
CMakeScripts
|
||||
Makefile
|
||||
cmake_install.cmake
|
||||
install_manifest.txt
|
||||
CTestTestfile.cmake
|
||||
|
||||
|
||||
### Python ###
|
||||
# Byte-compiled / optimized / DLL files
|
||||
*.py[cod]
|
||||
*$py.class
|
||||
|
||||
# C extensions
|
||||
|
||||
# Distribution / packaging
|
||||
.Python
|
||||
env/
|
||||
build/
|
||||
develop-eggs/
|
||||
downloads/
|
||||
eggs/
|
||||
.eggs/
|
||||
lib/
|
||||
lib64/
|
||||
parts/
|
||||
sdist/
|
||||
var/
|
||||
*.egg-info/
|
||||
.installed.cfg
|
||||
*.egg
|
||||
|
||||
# PyInstaller
|
||||
# Usually these files are written by a python script from a template
|
||||
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
||||
*.manifest
|
||||
*.spec
|
||||
|
||||
# Installer logs
|
||||
pip-log.txt
|
||||
pip-delete-this-directory.txt
|
||||
|
||||
# Unit test / coverage reports
|
||||
htmlcov/
|
||||
.tox/
|
||||
.coverage
|
||||
.coverage.*
|
||||
.cache
|
||||
nosetests.xml
|
||||
coverage.xml
|
||||
*,cover
|
||||
.hypothesis/
|
||||
|
||||
# Translations
|
||||
*.mo
|
||||
*.pot
|
||||
|
||||
# Django stuff:
|
||||
local_settings.py
|
||||
|
||||
# Flask stuff:
|
||||
instance/
|
||||
.webassets-cache
|
||||
|
||||
# Scrapy stuff:
|
||||
.scrapy
|
||||
|
||||
# Sphinx documentation
|
||||
docs/_build/
|
||||
|
||||
# PyBuilder
|
||||
target/
|
||||
|
||||
# Jupyter Notebook
|
||||
.ipynb_checkpoints
|
||||
|
||||
# pyenv
|
||||
.python-version
|
||||
|
||||
# celery beat schedule file
|
||||
celerybeat-schedule
|
||||
|
||||
# dotenv
|
||||
.env
|
||||
|
||||
# virtualenv
|
||||
.venv/
|
||||
venv/
|
||||
ENV/
|
||||
|
||||
# Spyder project settings
|
||||
.spyderproject
|
||||
|
||||
# Rope project settings
|
||||
.ropeproject
|
||||
|
||||
|
||||
### Java ###
|
||||
*.class
|
||||
|
||||
# BlueJ files
|
||||
*.ctxt
|
||||
|
||||
# Mobile Tools for Java (J2ME)
|
||||
.mtj.tmp/
|
||||
|
||||
# Package Files #
|
||||
*.jar
|
||||
*.war
|
||||
*.ear
|
||||
|
||||
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
|
||||
hs_err_pid*
|
||||
|
||||
|
||||
### 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
|
||||
|
||||
# User-specific files (MonoDevelop/Xamarin Studio)
|
||||
|
||||
# Build results
|
||||
|
||||
# Visual Studio 2015 cache/options directory
|
||||
# Uncomment if you have tasks that create the project's static files in wwwroot
|
||||
#wwwroot/
|
||||
|
||||
# MSTest test Results
|
||||
|
||||
# NUNIT
|
||||
|
||||
# Build Results of an ATL Project
|
||||
|
||||
# .NET Core
|
||||
|
||||
|
||||
# Chutzpah Test files
|
||||
|
||||
# Visual C++ cache files
|
||||
|
||||
# Visual Studio profiler
|
||||
|
||||
# TFS 2012 Local Workspace
|
||||
|
||||
# Guidance Automation Toolkit
|
||||
|
||||
# ReSharper is a .NET coding add-in
|
||||
|
||||
# JustCode is a .NET coding add-in
|
||||
|
||||
# TeamCity is a build add-in
|
||||
|
||||
# DotCover is a Code Coverage Tool
|
||||
|
||||
# Visual Studio code coverage results
|
||||
|
||||
# NCrunch
|
||||
|
||||
# MightyMoose
|
||||
|
||||
# Web workbench (sass)
|
||||
|
||||
# Installshield output folder
|
||||
|
||||
# DocProject is a documentation generator add-in
|
||||
|
||||
# Click-Once directory
|
||||
|
||||
# Publish Web Output
|
||||
# TODO: Comment the next line if you want to checkin your web deploy settings
|
||||
# but database connection strings (with potential passwords) will be unencrypted
|
||||
|
||||
# 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
|
||||
|
||||
# NuGet Packages
|
||||
# The packages folder can be ignored because of Package Restore
|
||||
# except build/, which is used as an MSBuild target.
|
||||
# Uncomment if necessary however generally it will be regenerated when needed
|
||||
#!**/packages/repositories.config
|
||||
# NuGet v3's project.json files produces more ignoreable files
|
||||
|
||||
# Microsoft Azure Build Output
|
||||
|
||||
# Microsoft Azure Emulator
|
||||
|
||||
# Windows Store app package directories and files
|
||||
|
||||
# Visual Studio cache files
|
||||
# files ending in .cache can be ignored
|
||||
# but keep track of directories ending in .cache
|
||||
|
||||
# Others
|
||||
|
||||
# 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
|
||||
|
||||
# Backup & report files from converting an old project file
|
||||
# to a newer Visual Studio version. Backup files are not needed,
|
||||
# because we have git ;-)
|
||||
|
||||
# SQL Server files
|
||||
|
||||
# Business Intelligence projects
|
||||
|
||||
# Microsoft Fakes
|
||||
|
||||
# GhostDoc plugin setting file
|
||||
|
||||
# Node.js Tools for Visual Studio
|
||||
|
||||
# Visual Studio 6 build log
|
||||
|
||||
# Visual Studio 6 workspace options file
|
||||
|
||||
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
|
||||
|
||||
# Visual Studio LightSwitch build output
|
||||
|
||||
# Paket dependency manager
|
||||
|
||||
# FAKE - F# Make
|
||||
|
||||
# JetBrains Rider
|
||||
|
||||
# CodeRush
|
||||
|
||||
# Python Tools for Visual Studio (PTVS)
|
||||
|
||||
# Cake - Uncomment if you are using it
|
||||
# tools/
|
||||
|
||||
### VisualStudio Patch ###
|
|
@ -0,0 +1,23 @@
|
|||
Individual files may be licensed differently, as noted in those files.
|
||||
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2016 individual contributors
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
|
@ -0,0 +1,12 @@
|
|||
# Advent of Code 2016
|
||||
|
||||
## About
|
||||
|
||||
These are my solutions to the Advent of Code 2016.
|
||||
|
||||
## License
|
||||
|
||||
By default, all code in this project is licensed under the MIT license,
|
||||
copyright the individual contributor(s). Comments in individual files
|
||||
may specify an alternate license as chosen by a particular individual
|
||||
for their code. If not specified, the file is MIT.
|
|
@ -0,0 +1,187 @@
|
|||
/*
|
||||
* Advent of Code 2016
|
||||
* Day 1 (part 1)
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace adventofcode
|
||||
{
|
||||
enum Direction
|
||||
{
|
||||
North,
|
||||
East,
|
||||
South,
|
||||
West
|
||||
}
|
||||
enum Side
|
||||
{
|
||||
Left = 'L',
|
||||
Right = 'R'
|
||||
}
|
||||
class Instruction
|
||||
{
|
||||
public Side Side { get; set; }
|
||||
public int StepCount { get; set; }
|
||||
public Instruction(Side side, int stepCount)
|
||||
{
|
||||
this.Side = side;
|
||||
this.StepCount = stepCount;
|
||||
}
|
||||
}
|
||||
class Point
|
||||
{
|
||||
public int X { get; set; }
|
||||
public int Y { get; set; }
|
||||
public Point(int x, int y)
|
||||
{
|
||||
this.X = x;
|
||||
this.Y = y;
|
||||
}
|
||||
}
|
||||
class bscott01
|
||||
{
|
||||
List<Instruction> instructions = new List<Instruction>();
|
||||
|
||||
public void ClearInstructions()
|
||||
{
|
||||
instructions.Clear();
|
||||
}
|
||||
public bool LoadInstructions(string input)
|
||||
{
|
||||
if (input.Length == 0)
|
||||
return false;
|
||||
|
||||
foreach (string s in input.Split(new char[] { ',' }))
|
||||
{
|
||||
string instruction = s.Trim().ToUpper();
|
||||
|
||||
// Not a valid instruction length
|
||||
if (instruction.Length < 2)
|
||||
continue;
|
||||
|
||||
// Not a valid side
|
||||
if (instruction[0] != 'L' && instruction[0] != 'R')
|
||||
continue;
|
||||
|
||||
Side side = (Side)instruction[0];
|
||||
|
||||
int stepCount = 0;
|
||||
if(!int.TryParse(instruction.Substring(1), out stepCount))
|
||||
continue;
|
||||
|
||||
instructions.Add(new Instruction(side, stepCount));
|
||||
}
|
||||
|
||||
return instructions.Count > 0;
|
||||
}
|
||||
|
||||
public int GetDistanceA()
|
||||
{
|
||||
int currentX = 0, currentY = 0;
|
||||
Direction currentDirection = Direction.North;
|
||||
|
||||
foreach (Instruction instruction in instructions)
|
||||
{
|
||||
if (instruction.Side == Side.Left)
|
||||
currentDirection = (int)currentDirection - 1 < 0 ? Direction.West : currentDirection - 1;
|
||||
else
|
||||
currentDirection = (int)currentDirection + 1 > 3 ? Direction.North : currentDirection + 1;
|
||||
|
||||
switch(currentDirection)
|
||||
{
|
||||
case Direction.North:
|
||||
currentY += instruction.StepCount;
|
||||
break;
|
||||
case Direction.East:
|
||||
currentX += instruction.StepCount;
|
||||
break;
|
||||
case Direction.South:
|
||||
currentY -= instruction.StepCount;
|
||||
break;
|
||||
case Direction.West:
|
||||
currentX -= instruction.StepCount;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return Math.Abs(currentX) + Math.Abs(currentY);
|
||||
}
|
||||
public int GetDistanceB()
|
||||
{
|
||||
int currentX = 0, currentY = 0;
|
||||
Direction currentDirection = Direction.North;
|
||||
List<Point> history = new List<Point>();
|
||||
|
||||
foreach (Instruction instruction in instructions)
|
||||
{
|
||||
if (instruction.Side == Side.Left)
|
||||
currentDirection = (int)currentDirection - 1 < 0 ? Direction.West : currentDirection - 1;
|
||||
else
|
||||
currentDirection = (int)currentDirection + 1 > 3 ? Direction.North : currentDirection + 1;
|
||||
|
||||
for (int i = 0; i < instruction.StepCount; i++)
|
||||
{
|
||||
switch (currentDirection)
|
||||
{
|
||||
case Direction.North:
|
||||
currentY += 1;
|
||||
break;
|
||||
case Direction.East:
|
||||
currentX += 1;
|
||||
break;
|
||||
case Direction.South:
|
||||
currentY -= 1;
|
||||
break;
|
||||
case Direction.West:
|
||||
currentX -= 1;
|
||||
break;
|
||||
}
|
||||
|
||||
Point point = new Point(currentX, currentY);
|
||||
if (history.Find(value => value.X == currentX && value.Y == currentY) != null)
|
||||
return Math.Abs(currentX) + Math.Abs(currentY);
|
||||
history.Add(point);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
class Program
|
||||
{
|
||||
static void Main(string[] args)
|
||||
{
|
||||
bscott01 test = new bscott01();
|
||||
|
||||
// PART 1
|
||||
test.ClearInstructions();
|
||||
test.LoadInstructions("R2, L3");
|
||||
Console.WriteLine("Distance: {0}", test.GetDistanceA());
|
||||
|
||||
test.ClearInstructions();
|
||||
test.LoadInstructions("R2, R2, R2");
|
||||
Console.WriteLine("Distance: {0}", test.GetDistanceA());
|
||||
|
||||
test.ClearInstructions();
|
||||
test.LoadInstructions("R5, L5, R5, R3");
|
||||
Console.WriteLine("Distance: {0}", test.GetDistanceA());
|
||||
|
||||
test.ClearInstructions();
|
||||
test.LoadInstructions("R3, L2, L2, R4, L1, R2, R3, R4, L2, R4, L2, L5, L1, R5, R2, R2, L1, R4, R1, L5, L3, R4, R3, R1, L1, L5, L4, L2, R5, L3, L4, R3, R1, L3, R1, L3, R3, L4, R2, R5, L190, R2, L3, R47, R4, L3, R78, L1, R3, R190, R4, L3, R4, R2, R5, R3, R4, R3, L1, L4, R3, L4, R1, L4, L5, R3, L3, L4, R1, R2, L4, L3, R3, R3, L2, L5, R1, L4, L1, R5, L5, R1, R5, L4, R2, L2, R1, L5, L4, R4, R4, R3, R2, R3, L1, R4, R5, L2, L5, L4, L1, R4, L4, R4, L4, R1, R5, L1, R1, L5, R5, R1, R1, L3, L1, R4, L1, L4, L4, L3, R1, R4, R1, R1, R2, L5, L2, R4, L1, R3, L5, L2, R5, L4, R5, L5, R3, R4, L3, L3, L2, R2, L5, L5, R3, R4, R3, R4, R3, R1");
|
||||
Console.WriteLine("Distance: {0}", test.GetDistanceA());
|
||||
|
||||
// PART 2
|
||||
test.ClearInstructions();
|
||||
test.LoadInstructions("R8, R4, R4, R8");
|
||||
Console.WriteLine("Distance: {0}", test.GetDistanceB());
|
||||
|
||||
test.ClearInstructions();
|
||||
test.LoadInstructions("R3, L2, L2, R4, L1, R2, R3, R4, L2, R4, L2, L5, L1, R5, R2, R2, L1, R4, R1, L5, L3, R4, R3, R1, L1, L5, L4, L2, R5, L3, L4, R3, R1, L3, R1, L3, R3, L4, R2, R5, L190, R2, L3, R47, R4, L3, R78, L1, R3, R190, R4, L3, R4, R2, R5, R3, R4, R3, L1, L4, R3, L4, R1, L4, L5, R3, L3, L4, R1, R2, L4, L3, R3, R3, L2, L5, R1, L4, L1, R5, L5, R1, R5, L4, R2, L2, R1, L5, L4, R4, R4, R3, R2, R3, L1, R4, R5, L2, L5, L4, L1, R4, L4, R4, L4, R1, R5, L1, R1, L5, R5, R1, R1, L3, L1, R4, L1, L4, L4, L3, R1, R4, R1, R1, R2, L5, L2, R4, L1, R3, L5, L2, R5, L4, R5, L5, R3, R4, L3, L3, L2, R2, L5, L5, R3, R4, R3, R4, R3, R1");
|
||||
Console.WriteLine("Distance: {0}", test.GetDistanceB());
|
||||
|
||||
Console.ReadLine();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,127 @@
|
|||
/*
|
||||
* Advent of Code 2016
|
||||
* Day 2 (part 1 and 2)
|
||||
*/
|
||||
using System;
|
||||
using System.Text;
|
||||
|
||||
namespace adventofcode
|
||||
{
|
||||
enum KeypadType
|
||||
{
|
||||
Exercise01,
|
||||
Exercise02
|
||||
}
|
||||
|
||||
class bscott02
|
||||
{
|
||||
private int x = 1, y = 1;
|
||||
protected void ResetA()
|
||||
{
|
||||
this.x = 1;
|
||||
this.y = 1;
|
||||
}
|
||||
|
||||
protected void ResetB()
|
||||
{
|
||||
this.x = 0;
|
||||
this.y = 2;
|
||||
}
|
||||
|
||||
public string GetCode(string[] input, KeypadType keypadType)
|
||||
{
|
||||
StringBuilder outputBuffer = new StringBuilder();
|
||||
|
||||
if (keypadType == KeypadType.Exercise01)
|
||||
ResetA();
|
||||
else
|
||||
ResetB();
|
||||
|
||||
for (int i = 0; i < input.Length; i++)
|
||||
{
|
||||
if (keypadType == KeypadType.Exercise01)
|
||||
outputBuffer.Append(GetDigitA(input[i]));
|
||||
else
|
||||
outputBuffer.Append(GetDigitB(input[i]));
|
||||
}
|
||||
|
||||
return outputBuffer.ToString();
|
||||
}
|
||||
|
||||
protected string GetDigitA(string input)
|
||||
{
|
||||
for (int i = 0; i < input.Length; i++)
|
||||
{
|
||||
switch(input[i])
|
||||
{
|
||||
case 'U':
|
||||
if (y - 1 > -1) y--;
|
||||
break;
|
||||
case 'D':
|
||||
if (y + 1 < 3) y++;
|
||||
break;
|
||||
case 'L':
|
||||
if (x - 1 > -1) x--;
|
||||
break;
|
||||
case 'R':
|
||||
if (x + 1 < 3) x++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return (((y * 3) + x) + 1).ToString();
|
||||
}
|
||||
|
||||
protected string GetDigitB(string input)
|
||||
{
|
||||
int[][] map = new int[][]
|
||||
{
|
||||
new int[] { 0, 0, 1, 0, 0 },
|
||||
new int[] { 0, 2, 3, 4, 0 },
|
||||
new int[] { 5, 6, 7, 8, 9 },
|
||||
new int[] { 0, 10, 11, 12, 0 },
|
||||
new int[] { 0, 0, 13, 0, 0 }
|
||||
};
|
||||
|
||||
for (int i = 0; i < input.Length; i++)
|
||||
{
|
||||
switch (input[i])
|
||||
{
|
||||
case 'U':
|
||||
if (y - 1 > -1 && map[y - 1][x] != 0) y--;
|
||||
break;
|
||||
case 'D':
|
||||
if (y + 1 < 5 && map[y + 1][x] != 0) y++;
|
||||
break;
|
||||
case 'L':
|
||||
if (x - 1 > -1 && map[y][x - 1] != 0) x--;
|
||||
break;
|
||||
case 'R':
|
||||
if (x + 1 < 5 && map[y][x + 1] != 0) x++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return String.Format("{0:X}", map[y][x]);
|
||||
}
|
||||
}
|
||||
|
||||
class Program
|
||||
{
|
||||
static void Main(string[] args)
|
||||
{
|
||||
bscott02 exercise2 = new bscott02();
|
||||
|
||||
string[] data = new string[]
|
||||
{
|
||||
"UUURRRRULRDLRDRRDURDDDLLDLLLULDUDDLDLULUURULRLDLRRLLLRRDRRLDDLLULUDUDDLRDRDUURDLURUURLRULLDDURULRRURDUURLULUUUURDDDDUUDLULRULLLRLLRRRURDLLRLLRRRUURULRDRUUDDDDDLLLRURRURRUURDUURDDRDLULRRLLLDRRRLURRLLURLDRRDDLDLRRLLRDRLLLLDLULDLRRDRRLDDURLULLUDLUDRRDRRLRLULURDRLRLUUUDLRLDLLLURDUDULULDDRUUURLLLDLLDDUDDRURURUDDLUULRDRRRRLDRDDURLUDURDULLDLUDLULDRLRLLRLLLLRURDURLLDRRDRLRUUUUULLLRUDURUDLLLUDLLLLRDLDRDUDRURLUDDUDDURLUUUUDDLLUDLULLLLLDUDLLRLRRDDDULULRLDRLLULDLUDLLURULRDDUURULRDLDLDLRL",
|
||||
"URUUURDULUDLUUUUDDRRRDRRRLDUDLRDRRDRDDLRUULDLLDUDULLLRLDRDRRLDLDLUUDRUULDUDULDUDURURDDURULDLURULRLULDUDDUULDLLLDDURDDRDDURUULUUDRLDDULDRRRRDURRUDLLLURDDDLRULLRDDRDDDDLUUDRDUULRRRRURULDDDLDDRDRRUDRRURUDRDDLDRRRLLURURUULUUDRDULLDRLRDRRDDURDUDLDRLUDRURDURURULDUUURDUULRRRRRUDLLULDDDRLULDDULUDRRRDDRUDRRDLDLRUULLLLRRDRRLUDRUULRDUDRDRRRDDRLLRUUDRLLLUDUDLULUUDULDRRRRDDRURULDULLURDLLLDUUDLLUDRLDURRRLDDDURUDUDURRULDD",
|
||||
"LRUDDULLLULRLUDUDUDRLLUUUULLUDLUUUUDULLUURDLLRDUDLRUDRUDDURURRURUDLLLRLDLUDRRRRRRDLUURLRDDDULRRUDRULRDRDDUULRDDLDULDRRRDDLURRURLLLRURDULLRUUUDDUDUURLRLDDUURLRDRRLURLDRLLUUURDRUUDUUUDRLURUUUDLDRRLRLLRRUURULLLRLLDLLLDULDDLDULDLDDRUDURDDURDUDURDLLLRRDDLULLLUDURLUDDLDLUUDRDRUDUUDLLDDLLLLDRDULRDLDULLRUDDUULDUDLDDDRUURLDRRLURRDDRUUDRUDLLDLULLULUDUDURDDRLRDLRLDRLDDRULLLRUDULDRLRLRULLRLLRRRLLRRRDDRULRUURRLLLRULDLUDRRDDLLLUDDUDDDLURLUDRDLURUUDLLDLULURRLLDURUDDDDRLULRDDLRLDDLRLLDDRRLRDUDUUULRRLRULUDURDUDRLRLRUDUDLLRRRRLRRUDUL",
|
||||
"RULLLLUUUDLLDLLRULLRURRULDDRDLUULDRLLRUDLLRRLRDURLLDUUUUURUUURDLUURRLDDDLRRRRLRULDUDDLURDRRUUDLRRRDLDDUDUDDRUDURURLDULLDLULDLLUDLULRDRLLURRLLDURLDLRDLULUDDULDLDDDDDUURRDRURLDLDULLURDLLDDLLUDLDLDRLRLDLRDRLDLRRUUDRURLUUUDLURUULDUDRDULLDURUDLUUURRRLLDUDUDDUUULLLRUULDLURUDDRLUDRDDLDLLUDUDRRRDDUUULUULLLRLLUURDUUDRUUULULLDLDRUUDURLLUULRLDLUURLLUUDRURDDRLURULDUDUUDRRUUURDULRLDUUDDRURURDRRULDDDRLUDLLUUDURRRLDLRLRDRURLURLLLRLDDLRRLDLDDURDUUDRDRRLDRLULDRLURUUUDDRLLLDDLDURLLLLDRDLDRRUDULURRLULRDRLLUULLRLRDRLLULUURRUDRUDDDLLDURURLURRRDLLDRDLUDRULULULRLDLRRRUUDLULDURLRDRLULRUUURRDDLRUURUDRURUDURURDD",
|
||||
"DURRDLLLDDLLDLLRLULULLRDLDRRDDRDLRULURRDUUDDRLLDDLDRRLRDUDRULDLRURDUUDRDDLLDRRDRUDUDULLDDDDLDRRRLRLRDRDLURRDDLDDDUUDRDRLLLDLUDDDLUULRDRLLLRLLUULUDDDRLDUUUURULRDDURRDRLUURLUDRLRLLLDDLRDDUULRRRRURDLDDDRLDLDRRLLDRDDUDDUURDLDUUDRDLDLDDULULUDDLRDDRLRLDDLUDLLDRLUDUDDRULLRLDLLRULRUURDDRDRDRURDRRLRDLLUDDRRDRRLDDULLLDLUDRRUDLDULDRURRDURLURRLDLRDLRUDLULUDDRULRLLDUURULURULURRLURRUULRULRRRLRDLULRLRLUDURDDRUUURDRLLRRRDDLDRRRULLDLRDRULDRRLRRDLUDDRDDDUUURRLULLDRRUULULLRRRRLDDRDDLUURLLUDLLDUDLULUULUDLLUUURRRUDDDRLLLRDRUUDUUURDRULURRLRDLLUURLRDURULDRRUDURRDDLDRLDRUUDRLLUDLRRU"
|
||||
};
|
||||
|
||||
Console.WriteLine("Exercise 02 - Part 1: {0}", exercise2.GetCode(data, KeypadType.Exercise01));
|
||||
Console.WriteLine("Exercise 02 - Part 2: {0}", exercise2.GetCode(data, KeypadType.Exercise02));
|
||||
Console.ReadLine();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,114 @@
|
|||
/*
|
||||
* Advent of Code 2016
|
||||
* Day 7 (Part 1 and 2)
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
|
||||
namespace adventofcode
|
||||
{
|
||||
class bscott07
|
||||
{
|
||||
public static int GetTLSIPCount(string[] input)
|
||||
{
|
||||
int ipCount = 0;
|
||||
|
||||
for (int i = 0; i < input.Length; i++)
|
||||
{
|
||||
bool insideBracket = false;
|
||||
bool hasMirrorSequence = false;
|
||||
|
||||
for (int j = 0; j < input[i].Length - 3; j++)
|
||||
{
|
||||
if (input[i][j] == '[')
|
||||
{
|
||||
insideBracket = true;
|
||||
continue;
|
||||
|
||||
}
|
||||
else if (input[i][j] == ']')
|
||||
{
|
||||
insideBracket = false;
|
||||
continue;
|
||||
}
|
||||
|
||||
if ((input[i][j] == input[i][j + 3] && input[i][j + 1] == input[i][j + 2])
|
||||
&& (input[i][j] != input[i][j + 1] && input[i][j + 2] != input[i][j + 3]))
|
||||
if (insideBracket)
|
||||
break;
|
||||
else
|
||||
hasMirrorSequence = true;
|
||||
|
||||
}
|
||||
|
||||
if (!insideBracket && hasMirrorSequence)
|
||||
ipCount++;
|
||||
}
|
||||
|
||||
return ipCount;
|
||||
}
|
||||
|
||||
public static int GetSSLIPCount(string[] input)
|
||||
{
|
||||
int ipCount = 0;
|
||||
for (int i = 0; i < input.Length; i++)
|
||||
{
|
||||
bool insideBracket = false;
|
||||
List<String> babSequences = new List<string>();
|
||||
List<String> abaSequences = new List<string>();
|
||||
for (int j = 0; j < input[i].Length - 2; j++)
|
||||
{
|
||||
if (input[i][j] == '[')
|
||||
{
|
||||
insideBracket = true;
|
||||
continue;
|
||||
|
||||
}
|
||||
else if (input[i][j] == ']')
|
||||
{
|
||||
insideBracket = false;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (insideBracket)
|
||||
{
|
||||
if (input[i][j] == input[i][j + 2] && input[i][j] != input[i][j + 1])
|
||||
babSequences.Add(input[i].Substring(j + 1, 1) + input[i].Substring(j, 1) + input[i].Substring(j + 1, 1)); // pre flip it
|
||||
}
|
||||
else
|
||||
{
|
||||
if (input[i][j] == input[i][j + 2] && input[i][j] != input[i][j + 1])
|
||||
abaSequences.Add(input[i].Substring(j, 3));
|
||||
}
|
||||
}
|
||||
if (babSequences.Count > 0 && abaSequences.Count > 0)
|
||||
{
|
||||
for (int j = 0; j < abaSequences.Count; j++)
|
||||
{
|
||||
if (babSequences.Contains(abaSequences[j]))
|
||||
{
|
||||
ipCount++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return ipCount;
|
||||
}
|
||||
}
|
||||
|
||||
class Program
|
||||
{
|
||||
static void Main(string[] args)
|
||||
{
|
||||
string[] input = File.ReadAllLines("input_day07.txt");
|
||||
|
||||
Console.WriteLine("Part 1 - TLS IP Count: {0}", bscott07.GetTLSIPCount(input));
|
||||
Console.WriteLine("Part 2 - SSL IP Count: {0}", bscott07.GetSSLIPCount(input));
|
||||
|
||||
Console.ReadLine();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,144 @@
|
|||
/*
|
||||
* Advent of Code 2016
|
||||
* Day 8 (part 1 and 2)
|
||||
*/
|
||||
using System;
|
||||
using System.IO;
|
||||
|
||||
namespace adventofcode
|
||||
{
|
||||
class bscott08
|
||||
{
|
||||
private int _width, _height;
|
||||
private byte[] _screenData;
|
||||
|
||||
public bscott08(int width, int height)
|
||||
{
|
||||
_width = width;
|
||||
_height = height;
|
||||
_screenData = new byte[width * height];
|
||||
Clear();
|
||||
}
|
||||
|
||||
public void Clear()
|
||||
{
|
||||
// clear the screen
|
||||
for (int i = 0; i < _screenData.Length; i++)
|
||||
_screenData[i] = (byte)'.';
|
||||
}
|
||||
|
||||
public void ProcessInstruction(string instruction)
|
||||
{
|
||||
string[] args = instruction.Split(new char[] { ' ' });
|
||||
int width = 0, height = 0, x = 0, y = 0, count = 0;
|
||||
switch (args[0])
|
||||
{
|
||||
case "rect":
|
||||
string[] dimensions = args[1].Split(new char[] { 'x' });
|
||||
int.TryParse(dimensions[0], out width);
|
||||
int.TryParse(dimensions[1], out height);
|
||||
Rect(width, height);
|
||||
break;
|
||||
|
||||
case "rotate":
|
||||
if (args[1] == "column")
|
||||
{
|
||||
int.TryParse(args[2].Substring(2), out x);
|
||||
int.TryParse(args[4], out count);
|
||||
RotateColumn(x, count);
|
||||
}
|
||||
else
|
||||
{
|
||||
int.TryParse(args[2].Substring(2), out y);
|
||||
int.TryParse(args[4], out count);
|
||||
RotateRow(y, count);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private byte GetPixel(int y, int x)
|
||||
{
|
||||
return _screenData[(y * _width) + x];
|
||||
}
|
||||
|
||||
private void SetPixel(int y, int x, byte value)
|
||||
{
|
||||
_screenData[(y * _width) + x] = value;
|
||||
}
|
||||
|
||||
private void Rect(int width, int height)
|
||||
{
|
||||
for (int y = 0; y < height; y++)
|
||||
for (int x = 0; x < width; x++)
|
||||
SetPixel(y, x, (byte)'#');
|
||||
}
|
||||
|
||||
private void RotateColumn(int x, int count)
|
||||
{
|
||||
byte[] tempColumn = new byte[_height];
|
||||
// minipulate temp column
|
||||
for (int y = 0; y < _height; y++)
|
||||
tempColumn[(y + count) % _height] = GetPixel(y, x);
|
||||
|
||||
for (int y = 0; y < _height; y++)
|
||||
SetPixel(y, x, tempColumn[y]);
|
||||
}
|
||||
|
||||
private void RotateRow(int y, int count)
|
||||
{
|
||||
byte[] tempRow = new byte[_width];
|
||||
|
||||
// minipulate temp row
|
||||
for (int x = 0; x < _width; x++)
|
||||
tempRow[(x + count) % _width] = GetPixel(y, x);
|
||||
|
||||
for (int x = 0; x < _width; x++)
|
||||
SetPixel(y, x, tempRow[x]);
|
||||
}
|
||||
|
||||
public int GetLitPixels()
|
||||
{
|
||||
int result = 0;
|
||||
for (int i = 0; i < _screenData.Length; i++)
|
||||
if (_screenData[i] != (byte)'.')
|
||||
result++;
|
||||
return result;
|
||||
}
|
||||
|
||||
public void DumpScreen()
|
||||
{
|
||||
for (int y = 0; y < _height; y++)
|
||||
{
|
||||
for (int x = 0; x < _width; x++)
|
||||
{
|
||||
Console.Write((char)GetPixel(y, x));
|
||||
}
|
||||
Console.Write("\n");
|
||||
}
|
||||
Console.Write("\n");
|
||||
}
|
||||
}
|
||||
|
||||
class Program
|
||||
{
|
||||
static void Main(string[] args)
|
||||
{
|
||||
bscott08 day08 = new bscott08(50, 6);
|
||||
|
||||
string[] input = File.ReadAllLines("input_day08.txt");
|
||||
|
||||
for (int i = 0; i < input.Length; i++)
|
||||
day08.ProcessInstruction(input[i]);
|
||||
|
||||
// Part 1 ( don't skim over the instructions >_< )
|
||||
Console.WriteLine("Pixels Lit: {0}\n", day08.GetLitPixels());
|
||||
|
||||
// Part 2
|
||||
Console.WriteLine("Screen Dump: ");
|
||||
day08.DumpScreen();
|
||||
|
||||
Console.ReadLine();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,141 @@
|
|||
/*
|
||||
* Advent of Code 2016
|
||||
* Day 9 (part 1 and 2)
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace adventofcode
|
||||
{
|
||||
class bscott09
|
||||
{
|
||||
public static long CalcDecompressedLength(string input, bool recursive = false, int level = 0)
|
||||
{
|
||||
long decompressedLength = 0;
|
||||
MatchCollection matchCollection = Regex.Matches(input, @"\((\d+)x(\d+)\)");
|
||||
int lastMatchIndex = 0, nextCmdPosition = 0;
|
||||
int length = 0, repeatCount = 0;
|
||||
|
||||
// nothing to process
|
||||
if (matchCollection.Count == 0 || level > 25)
|
||||
return input.Length;
|
||||
|
||||
// pre-inline data
|
||||
if (matchCollection[0].Index > 0)
|
||||
{
|
||||
nextCmdPosition = matchCollection[0].Index;
|
||||
decompressedLength += matchCollection[0].Index;
|
||||
}
|
||||
|
||||
// cycle through detected commands, ignore non-commands, include inline data
|
||||
foreach (Match m in matchCollection)
|
||||
{
|
||||
int.TryParse(m.Groups[1].Value, out length);
|
||||
int.TryParse(m.Groups[2].Value, out repeatCount);
|
||||
|
||||
if (m.Index >= nextCmdPosition)
|
||||
{
|
||||
// inline data
|
||||
if (m.Index > nextCmdPosition)
|
||||
decompressedLength += (m.Index - nextCmdPosition);
|
||||
|
||||
string payload = input.Substring(m.Index + m.Length, length);
|
||||
long payloadLength = recursive ? CalcDecompressedLength(payload, true, level++) : payload.Length;
|
||||
|
||||
decompressedLength += (payloadLength * repeatCount);
|
||||
lastMatchIndex = m.Index;
|
||||
nextCmdPosition = (m.Index + m.Length) + length;
|
||||
}
|
||||
}
|
||||
|
||||
// trailing inline data
|
||||
if (lastMatchIndex != nextCmdPosition)
|
||||
decompressedLength += (input.Length - nextCmdPosition);
|
||||
|
||||
return decompressedLength;
|
||||
}
|
||||
|
||||
public static string Decompress(string input, bool recursiveDecompress = false, int level = 0, int maxLevel = 25)
|
||||
{
|
||||
StringBuilder output = new StringBuilder();
|
||||
MatchCollection matchCollection = Regex.Matches(input, @"\((\d+)x(\d+)\)");
|
||||
int lastMatchIndex = 0, nextCmdPosition = 0;
|
||||
int length = 0, repeatCount = 0;
|
||||
|
||||
// nothing to process or the recursion level is too high
|
||||
if (matchCollection.Count == 0 || level > maxLevel)
|
||||
return input;
|
||||
|
||||
// pre-inline data
|
||||
if (matchCollection[0].Index > 0)
|
||||
{
|
||||
nextCmdPosition = matchCollection[0].Index;
|
||||
output.Append(input.Substring(0, matchCollection[0].Index));
|
||||
}
|
||||
|
||||
// cycle through detected commands, ignore non-commands, include inline data
|
||||
foreach (Match m in matchCollection)
|
||||
{
|
||||
int.TryParse(m.Groups[1].Value, out length);
|
||||
int.TryParse(m.Groups[2].Value, out repeatCount);
|
||||
|
||||
if (m.Index >= nextCmdPosition)
|
||||
{
|
||||
// inline data
|
||||
if (m.Index > nextCmdPosition)
|
||||
output.Append(input.Substring(nextCmdPosition, m.Index - nextCmdPosition));
|
||||
|
||||
string payload = input.Substring(m.Index + m.Length, length);
|
||||
if (recursiveDecompress)
|
||||
payload = Decompress(payload, true, level++);
|
||||
|
||||
for (int i = 0; i < repeatCount; i++)
|
||||
output.Append(payload);
|
||||
|
||||
lastMatchIndex = m.Index;
|
||||
nextCmdPosition = (m.Index + m.Length) + length;
|
||||
}
|
||||
}
|
||||
|
||||
// trailing inline data
|
||||
if (lastMatchIndex != nextCmdPosition)
|
||||
{
|
||||
output.Append(input.Substring(nextCmdPosition, input.Length - nextCmdPosition));
|
||||
}
|
||||
|
||||
return output.ToString();
|
||||
}
|
||||
}
|
||||
|
||||
class Program
|
||||
{
|
||||
static void Main(string[] args)
|
||||
{
|
||||
Console.WriteLine("Part 1 Example Length: {0}", bscott09.CalcDecompressedLength("ADVENT"));
|
||||
Console.WriteLine("Part 1 Example Length: {0}", bscott09.CalcDecompressedLength("A(1x5)BC"));
|
||||
Console.WriteLine("Part 1 Example Length: {0}", bscott09.CalcDecompressedLength("(3x3)XYZ"));
|
||||
Console.WriteLine("Part 1 Example Length: {0}", bscott09.CalcDecompressedLength("A(2x2)BCD(2x2)EFG"));
|
||||
Console.WriteLine("Part 1 Example Length: {0}", bscott09.CalcDecompressedLength("(6x1)(1x3)A"));
|
||||
Console.WriteLine("Part 1 Example Length: {0}", bscott09.CalcDecompressedLength("X(8x2)(3x3)ABCY"));
|
||||
|
||||
Console.WriteLine("Part 1 Example: {0}", bscott09.Decompress("ADVENT"));
|
||||
Console.WriteLine("Part 1 Example: {0}", bscott09.Decompress("A(1x5)BC"));
|
||||
Console.WriteLine("Part 1 Example: {0}", bscott09.Decompress("(3x3)XYZ"));
|
||||
Console.WriteLine("Part 1 Example: {0}", bscott09.Decompress("A(2x2)BCD(2x2)EFG"));
|
||||
Console.WriteLine("Part 1 Example: {0}", bscott09.Decompress("(6x1)(1x3)A"));
|
||||
Console.WriteLine("Part 1 Example: {0}", bscott09.Decompress("X(8x2)(3x3)ABCY"));
|
||||
|
||||
// Part 2
|
||||
string input = File.ReadAllText("input_day09.txt").Trim();
|
||||
Console.WriteLine("Part 1 Length: {0}\n", bscott09.CalcDecompressedLength(input));
|
||||
Console.WriteLine("Part 2 Example Length: {0}", bscott09.CalcDecompressedLength("(25x3)(3x3)ABC(2x3)XY(5x2)PQRSTX(18x9)(3x2)TWO(5x7)SEVEN", true));
|
||||
|
||||
Console.WriteLine("Part 2 Length: {0}\n", bscott09.CalcDecompressedLength(input, true));
|
||||
|
||||
Console.ReadLine();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,219 @@
|
|||
/*
|
||||
* Advent of Code 2016
|
||||
* Day 10 (part 1 and 2)
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
|
||||
namespace adventofcode
|
||||
{
|
||||
class Bot
|
||||
{
|
||||
public int Index { get; }
|
||||
public int[] Values { get; set; }
|
||||
public string LowDestination { get; set; }
|
||||
public int LowDestinationId { get; set; }
|
||||
public string HighDestination { get; set; }
|
||||
public int HighDestinationId { get; set; }
|
||||
public Bot(int index)
|
||||
{
|
||||
Index = index;
|
||||
Values = new int[2] { -1, -1 };
|
||||
LowDestination = "";
|
||||
LowDestinationId = -1;
|
||||
HighDestination = "";
|
||||
HighDestinationId = -1;
|
||||
}
|
||||
|
||||
public bool SetValue(int value)
|
||||
{
|
||||
if (this.Values[0] == -1)
|
||||
this.Values[0] = value;
|
||||
else if (this.Values[1] == -1)
|
||||
this.Values[1] = value;
|
||||
else
|
||||
return false; // both values already set?
|
||||
|
||||
return true;
|
||||
}
|
||||
public bool HasBothValues()
|
||||
{
|
||||
return this.Values[0] > -1 && this.Values[1] > -1;
|
||||
}
|
||||
|
||||
public int GetAndClearLowValue()
|
||||
{
|
||||
int lowValueIndex = this.Values[0] > this.Values[1] ? 1 : 0;
|
||||
int lowValue = this.Values[lowValueIndex];
|
||||
this.Values[lowValueIndex] = -1;
|
||||
return lowValue;
|
||||
}
|
||||
|
||||
public int GetAndClearHighValue()
|
||||
{
|
||||
int highValueIndex = this.Values[0] < this.Values[1] ? 1 : 0;
|
||||
int highValue = this.Values[highValueIndex];
|
||||
this.Values[highValueIndex] = -1;
|
||||
return highValue;
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return String.Format("Bot HasBothValues={0}, LowDestination={1}, LowDestinationId={2}, HighDestination={3}, HighDestinationId={4}",
|
||||
this.HasBothValues(), this.LowDestination, this.LowDestinationId, this.HighDestination, this.HighDestinationId);
|
||||
}
|
||||
}
|
||||
|
||||
class ComparisonLogEntry
|
||||
{
|
||||
public int Index { get; set; }
|
||||
public int ValueA { get; set; }
|
||||
public int ValueB { get; set; }
|
||||
|
||||
public ComparisonLogEntry(int index, int valueA, int valueB)
|
||||
{
|
||||
this.Index = index;
|
||||
this.ValueA = valueA;
|
||||
this.ValueB = valueB;
|
||||
}
|
||||
}
|
||||
|
||||
class bscott10
|
||||
{
|
||||
private Dictionary<int, Bot> bots = new Dictionary<int, Bot>();
|
||||
private Dictionary<int, int> outputs = new Dictionary<int, int>();
|
||||
private List<ComparisonLogEntry> comparisonLog = new List<ComparisonLogEntry>();
|
||||
|
||||
public bscott10()
|
||||
{
|
||||
// precreate all the bots and outputs (pointless robots and outputs shouldn't hurt anything right?)
|
||||
for (int i = 0; i < 1000; i++)
|
||||
{
|
||||
bots.Add(i, new Bot(i));
|
||||
outputs.Add(i, -1);
|
||||
}
|
||||
}
|
||||
|
||||
public Dictionary<int, int> Outputs
|
||||
{
|
||||
get { return outputs; }
|
||||
}
|
||||
|
||||
public List<ComparisonLogEntry> ComparisonLog
|
||||
{
|
||||
get { return comparisonLog; }
|
||||
}
|
||||
|
||||
public void DumpOutputs()
|
||||
{
|
||||
for (int i = 0; i < 1000; i++)
|
||||
if (outputs[i] != -1)
|
||||
Console.WriteLine($"Output {i} = {outputs[i]}");
|
||||
}
|
||||
public int PerformActions()
|
||||
{
|
||||
int actionsPerformed = 0;
|
||||
foreach (KeyValuePair<int, Bot> bot in bots)
|
||||
{
|
||||
Bot pBot = bot.Value;
|
||||
// we can do something I think....
|
||||
if (pBot.HasBothValues())
|
||||
{
|
||||
// this is overkill, but i can't think of a better way to have a public interface to fetch a specific bot by
|
||||
// what comparisons it did.
|
||||
comparisonLog.Add(new ComparisonLogEntry(bot.Key, pBot.Values[0], pBot.Values[1]));
|
||||
|
||||
// perform low action
|
||||
if (pBot.LowDestination == "output")
|
||||
outputs[pBot.LowDestinationId] = pBot.GetAndClearLowValue();
|
||||
else if (pBot.LowDestination == "bot")
|
||||
bots[pBot.LowDestinationId].SetValue(pBot.GetAndClearLowValue());
|
||||
|
||||
// perform high action
|
||||
if (pBot.HighDestination == "output")
|
||||
outputs[pBot.HighDestinationId] = pBot.GetAndClearHighValue();
|
||||
else if (pBot.HighDestination == "bot")
|
||||
bots[pBot.HighDestinationId].SetValue(pBot.GetAndClearHighValue());
|
||||
|
||||
actionsPerformed++;
|
||||
}
|
||||
}
|
||||
return actionsPerformed;
|
||||
}
|
||||
public void ProcessInstruction(string instruction)
|
||||
{
|
||||
string[] args = instruction.Split(new char[] { ' ' });
|
||||
|
||||
int botId = -1;
|
||||
int value = -1;
|
||||
string lowDest = "";
|
||||
int lowDestId = -1;
|
||||
string highDest = "";
|
||||
int highDestId = -1;
|
||||
|
||||
if (args[0] == "value")
|
||||
{
|
||||
int.TryParse(args[1], out value);
|
||||
int.TryParse(args[5], out botId);
|
||||
|
||||
// set a value.
|
||||
bots[botId].SetValue(value);
|
||||
}
|
||||
else if (args[0] == "bot")
|
||||
{
|
||||
int.TryParse(args[1], out botId);
|
||||
|
||||
lowDest = args[5];
|
||||
int.TryParse(args[6], out lowDestId);
|
||||
|
||||
highDest = args[10];
|
||||
int.TryParse(args[11], out highDestId);
|
||||
|
||||
bots[botId].LowDestination = lowDest;
|
||||
bots[botId].LowDestinationId = lowDestId;
|
||||
bots[botId].HighDestination = highDest;
|
||||
bots[botId].HighDestinationId = highDestId;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class Program
|
||||
{
|
||||
static void Main(string[] args)
|
||||
{
|
||||
bscott10 day10 = new bscott10();
|
||||
|
||||
string[] input = File.ReadAllLines("input_day10.txt");
|
||||
|
||||
// first you process everything
|
||||
for (int i = 0; i < input.Length; i++)
|
||||
day10.ProcessInstruction(input[i]);
|
||||
|
||||
// then set everything in motion
|
||||
int actions = day10.PerformActions();
|
||||
while (actions > 0)
|
||||
{
|
||||
Console.WriteLine($"Performed {actions} actions.");
|
||||
actions = day10.PerformActions();
|
||||
}
|
||||
|
||||
// Part 1
|
||||
foreach (ComparisonLogEntry cle in day10.ComparisonLog)
|
||||
{
|
||||
if ((cle.ValueA == 61 && cle.ValueB == 17) ||
|
||||
(cle.ValueA == 17 && cle.ValueB == 61))
|
||||
{
|
||||
Console.WriteLine($"Part 1 Answer: Bot {cle.Index}");
|
||||
}
|
||||
}
|
||||
|
||||
// Part 2
|
||||
int value = day10.Outputs[0] * day10.Outputs[1] * day10.Outputs[2];
|
||||
Console.WriteLine($"Part 2 Answer: {value}");
|
||||
|
||||
Console.ReadLine();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,111 @@
|
|||
/*
|
||||
* Advent of Code 2016
|
||||
* Day 12 (part 1 and 2)
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
|
||||
namespace adventofcode
|
||||
{
|
||||
class bscott12
|
||||
{
|
||||
private Dictionary<string, int> registers = new Dictionary<string, int>();
|
||||
private int pc = 0;
|
||||
|
||||
public Dictionary<string, int> Registers
|
||||
{
|
||||
get { return registers; }
|
||||
}
|
||||
|
||||
|
||||
public bscott12()
|
||||
{
|
||||
for (char i = 'a'; i <= 'd'; i++)
|
||||
registers.Add(i.ToString(), 0);
|
||||
}
|
||||
|
||||
public void Reset()
|
||||
{
|
||||
for (char i = 'a'; i <= 'd'; i++)
|
||||
registers[i.ToString()] = 0;
|
||||
pc = 0;
|
||||
}
|
||||
|
||||
public void Process(string[] instructions)
|
||||
{
|
||||
while(pc < instructions.Length)
|
||||
ProcessInstruction(instructions[pc]);
|
||||
}
|
||||
|
||||
public void ProcessInstruction(string instruction)
|
||||
{
|
||||
string[] arguments = instruction.Split(new char[] { ' ' });
|
||||
int value = 0;
|
||||
bool branch = false;
|
||||
|
||||
switch (arguments[0])
|
||||
{
|
||||
case "cpy":
|
||||
if (arguments[1][0] >= '0' && arguments[1][0] <= '9')
|
||||
int.TryParse(arguments[1], out value);
|
||||
else
|
||||
value = registers[arguments[1]];
|
||||
|
||||
registers[arguments[2]] = value;
|
||||
break;
|
||||
case "inc":
|
||||
registers[arguments[1]]++;
|
||||
break;
|
||||
case "dec":
|
||||
registers[arguments[1]]--;
|
||||
break;
|
||||
case "jnz":
|
||||
if (arguments[1][0] >= '0' && arguments[1][0] <= '9')
|
||||
int.TryParse(arguments[1], out value);
|
||||
else
|
||||
value = registers[arguments[1]];
|
||||
|
||||
int jumpOffset = int.Parse(arguments[2]);
|
||||
if (value != 0)
|
||||
{
|
||||
pc = pc + jumpOffset;
|
||||
branch = true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if(!branch) pc++;
|
||||
}
|
||||
}
|
||||
|
||||
class Program
|
||||
{
|
||||
static void Main(string[] args)
|
||||
{
|
||||
bscott12 day12 = new bscott12();
|
||||
|
||||
string[] input = File.ReadAllLines("input_day12.txt");
|
||||
|
||||
// part 1
|
||||
day12.Process(input);
|
||||
Console.Write("Part 1: ");
|
||||
for (char i = 'a'; i <= 'd'; i++)
|
||||
Console.Write(i.ToString() + " = " + day12.Registers[i.ToString()] + ", ");
|
||||
Console.Write("\n");
|
||||
|
||||
// part 2
|
||||
day12.Reset();
|
||||
day12.Registers["c"] = 1;
|
||||
day12.Process(input);
|
||||
|
||||
Console.Write("Part 2: ");
|
||||
for (char i = 'a'; i <= 'd'; i++)
|
||||
Console.Write(i.ToString() + " = " + day12.Registers[i.ToString()] + ", ");
|
||||
Console.Write("\n");
|
||||
|
||||
Console.ReadLine();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,117 @@
|
|||
{****************************************************************************
|
||||
Advent of Code 2016
|
||||
Day 6 (part 1 and 2)
|
||||
****************************************************************************}
|
||||
|
||||
program bscott06;
|
||||
|
||||
{$mode objfpc}{$H+}
|
||||
|
||||
uses
|
||||
{$IFDEF UNIX}{$IFDEF UseCThreads}
|
||||
cthreads,
|
||||
{$ENDIF}{$ENDIF}
|
||||
Classes, SysUtils, CustApp
|
||||
{ you can add units after this };
|
||||
|
||||
type
|
||||
|
||||
{ TAdventOfCodeDay06 }
|
||||
|
||||
TAdventOfCodeDay06 = class(TCustomApplication)
|
||||
protected
|
||||
procedure DoRun; override;
|
||||
public
|
||||
constructor Create(TheOwner: TComponent); override;
|
||||
destructor Destroy; override;
|
||||
end;
|
||||
|
||||
{ TAdventOfCodeDay06 }
|
||||
|
||||
procedure TAdventOfCodeDay06.DoRun;
|
||||
var
|
||||
CharCountArrArray: array [0..7, 'a'..'z'] of Integer;
|
||||
Password: array [0..7] of Char;
|
||||
CharCount, I : Integer;
|
||||
J: Char;
|
||||
CurrentLine: String;
|
||||
InputDataFile: text;
|
||||
begin
|
||||
|
||||
FillChar (CharCountArrArray,SizeOf(CharCountArrArray),0);
|
||||
FillChar (Password,SizeOf(Password),0);
|
||||
|
||||
AssignFile(InputDataFile, 'day6_input.txt');
|
||||
Reset(InputDataFile);
|
||||
while not eof(InputDataFile) do
|
||||
begin
|
||||
readln(InputDataFile, CurrentLine);
|
||||
|
||||
Inc(CharCountArrArray[0, CurrentLine[1]],1);
|
||||
Inc(CharCountArrArray[1, CurrentLine[2]],1);
|
||||
Inc(CharCountArrArray[2, CurrentLine[3]],1);
|
||||
Inc(CharCountArrArray[3, CurrentLine[4]],1);
|
||||
Inc(CharCountArrArray[4, CurrentLine[5]],1);
|
||||
Inc(CharCountArrArray[5, CurrentLine[6]],1);
|
||||
Inc(CharCountArrArray[6, CurrentLine[7]],1);
|
||||
Inc(CharCountArrArray[7, CurrentLine[8]],1);
|
||||
end;
|
||||
CloseFile(InputDataFile);
|
||||
|
||||
for I := 0 to 7 do
|
||||
begin
|
||||
CharCount := 0;
|
||||
for J := 'a' to 'z' do
|
||||
begin
|
||||
if CharCount < CharCountArrArray[I, J] then
|
||||
begin
|
||||
Password[I] := J;
|
||||
CharCount := CharCountArrArray[I, J];
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
writeln('Part A Password: ' + Password);
|
||||
|
||||
FillChar (Password,SizeOf(Password),0) ;
|
||||
for I := 0 to 7 do
|
||||
begin
|
||||
CharCount := 0;
|
||||
for J := 'a' to 'z' do
|
||||
begin
|
||||
if (CharCountArrArray[I, J] > 0) and ((CharCount > CharCountArrArray[I, J]) or (CharCount = 0)) then
|
||||
begin
|
||||
Password[I] := J;
|
||||
CharCount := CharCountArrArray[I, J];
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
writeln('Part B Password: ' + Password);
|
||||
|
||||
{ add your program here }
|
||||
ReadLn;
|
||||
|
||||
// stop program loop
|
||||
Terminate;
|
||||
end;
|
||||
|
||||
constructor TAdventOfCodeDay06.Create(TheOwner: TComponent);
|
||||
begin
|
||||
inherited Create(TheOwner);
|
||||
StopOnException:=True;
|
||||
end;
|
||||
|
||||
destructor TAdventOfCodeDay06.Destroy;
|
||||
begin
|
||||
inherited Destroy;
|
||||
end;
|
||||
|
||||
var
|
||||
Application: TAdventOfCodeDay06;
|
||||
begin
|
||||
Application:=TAdventOfCodeDay06.Create(nil);
|
||||
Application.Title:='Advent of Code - Day 6';
|
||||
Application.Run;
|
||||
Application.Free;
|
||||
end.
|
||||
|
|
@ -0,0 +1,39 @@
|
|||
<?php
|
||||
|
||||
/*
|
||||
* Advent of Code 2016
|
||||
* Day 3 (part 1 and 2)
|
||||
*/
|
||||
|
||||
function isValidTriangle($a, $b, $c) {
|
||||
return ($a + $b > $c && $a + $c > $b && $b + $c > $a);
|
||||
}
|
||||
|
||||
$input = file('day3_input.txt');
|
||||
|
||||
$valid_triangle_count = 0;
|
||||
foreach($input as $line) {
|
||||
$args = array_values(array_filter(explode(' ', $line)));
|
||||
if(isValidTriangle((int)$args[0], (int)$args[1], (int)$args[2]))
|
||||
$valid_triangle_count++;
|
||||
}
|
||||
|
||||
echo "Part 1 Count: $valid_triangle_count\n";
|
||||
|
||||
$valid_triangle_count = 0;
|
||||
for($i = 0; $i < count($input); $i += 3) {
|
||||
$args1 = array_values(array_filter(explode(' ', $input[$i+0])));
|
||||
$args2 = array_values(array_filter(explode(' ', $input[$i+1])));
|
||||
$args3 = array_values(array_filter(explode(' ', $input[$i+2])));
|
||||
|
||||
if(isValidTriangle((int)$args1[0], (int)$args2[0], (int)$args3[0]))
|
||||
$valid_triangle_count++;
|
||||
|
||||
if(isValidTriangle((int)$args1[1], (int)$args2[1], (int)$args3[1]))
|
||||
$valid_triangle_count++;
|
||||
|
||||
if(isValidTriangle((int)$args1[2], (int)$args2[2], (int)$args3[2]))
|
||||
$valid_triangle_count++;
|
||||
}
|
||||
|
||||
echo "Part 2 Count: $valid_triangle_count\n";
|
|
@ -0,0 +1,81 @@
|
|||
<?php
|
||||
|
||||
/*
|
||||
* Advent of Code 2016
|
||||
* Day 4 (part 1 and 2)
|
||||
*/
|
||||
|
||||
function extractRoomInfo($input_line) {
|
||||
if(preg_match("/(\S+)-(\d+)\[([^\]]*)\]/", $input_line, $output_array)) {
|
||||
return array(
|
||||
'room_name' => $output_array[1],
|
||||
'sector_id' => $output_array[2],
|
||||
'checksum' => $output_array[3]
|
||||
);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function generateChecksum($room_name) {
|
||||
// calculate char occurrences
|
||||
$char_count_array = count_chars(str_replace('-', '', $room_name), 1);
|
||||
|
||||
// sort by occurrence count
|
||||
arsort($char_count_array);
|
||||
|
||||
// group chars into occurrence count
|
||||
$dedupe = array();
|
||||
foreach($char_count_array as $char => $occurrence) {
|
||||
$dedupe[$occurrence][] = $char;
|
||||
}
|
||||
|
||||
// cross my fingers and hope this actually works
|
||||
$checksum = '';
|
||||
foreach($dedupe as $occurrence => $chars) {
|
||||
sort($chars);
|
||||
for($i = 0; $i < count($chars); $i++) {
|
||||
$checksum .= chr($chars[$i]);
|
||||
}
|
||||
}
|
||||
|
||||
// cut off the excess and return
|
||||
return substr($checksum, 0, 5);
|
||||
}
|
||||
|
||||
function decryptRoomName($name, $sector_id) {
|
||||
$key = $sector_id % 26; // this should work right?
|
||||
$a_start = ord('a');
|
||||
$output = '';
|
||||
|
||||
for($i = 0; $i < strlen($name); $i++) {
|
||||
$a = ord(substr($name, $i, 1));
|
||||
if($a == ord('-'))
|
||||
$output .= ' ';
|
||||
else
|
||||
$output .= chr($a_start + ((($a - $a_start) + $key) % 26));
|
||||
}
|
||||
|
||||
return $output;
|
||||
}
|
||||
|
||||
$input = file('day4_input.txt');
|
||||
//$input = array("aaaaa-bbb-z-y-x-123[abxyz]", "a-b-c-d-e-f-g-h-987[abcde]", "not-a-real-room-404[oarel]");
|
||||
|
||||
// Part 1
|
||||
$valid_room_sum = 0;
|
||||
$valid_rooms = array();
|
||||
foreach($input as $line) {
|
||||
$room_info = extractRoomInfo($line);
|
||||
$generated_checksum = generateChecksum($room_info['room_name']);
|
||||
if($generated_checksum == $room_info['checksum']) {
|
||||
$valid_rooms[] = $room_info;
|
||||
$valid_room_sum += (int)$room_info['sector_id'];
|
||||
}
|
||||
}
|
||||
echo "valid room sum: $valid_room_sum<br />\n";
|
||||
|
||||
// Part 2
|
||||
foreach($valid_rooms as $room) {
|
||||
$decrypted_name = decryptRoomName($room['room_name'], (int)$room['sector_id']);
|
||||
echo "room name: $decrypted_name, sector: {$room['sector_id']}<br />\n";
|
||||
}
|
|
@ -0,0 +1,54 @@
|
|||
<?php
|
||||
|
||||
set_time_limit(0);
|
||||
|
||||
/*
|
||||
* Advent of Code 2016
|
||||
* Day 5 (part 1 and 2)
|
||||
*/
|
||||
|
||||
function calculateHashes($salt, $max = 8) {
|
||||
$result = array();
|
||||
$count = 0;
|
||||
$start = 0;
|
||||
|
||||
$cache_file = md5($salt).".cache";
|
||||
if(file_exists($cache_file)) {
|
||||
$result = file($cache_file);
|
||||
if(count($result) >= $max)
|
||||
return $result;
|
||||
}
|
||||
|
||||
for($i = 0; $i < 1000000000; $i++) {
|
||||
$hash = md5($salt.$i);
|
||||
if(substr($hash, 0, 5) === '00000') {
|
||||
$result[$count++] = $hash;
|
||||
if($count >= $max)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
file_put_contents($cache_file, implode("\n", $result));
|
||||
return $result;
|
||||
}
|
||||
|
||||
$puzzle_input = 'reyedfim';
|
||||
$hashes = calculateHashes($puzzle_input, 30);
|
||||
|
||||
// Part 1
|
||||
$password = '';
|
||||
for($i = 0; $i < 8; $i++) {
|
||||
$password .= substr($hashes[$i], 5, 1);
|
||||
}
|
||||
echo "Step 1 Password: $password\n";
|
||||
|
||||
// Part 2
|
||||
$password = array_fill(0, 8, '_');
|
||||
for($i = 0; $i < count($hashes); $i++) {
|
||||
$pos = substr($hashes[$i], 5, 1);
|
||||
$char = substr($hashes[$i], 6, 1);
|
||||
if (is_numeric($pos) && (int)$pos < 8 && $password[(int)$pos] === '_')
|
||||
$password[(int)$pos] = $char;
|
||||
|
||||
}
|
||||
echo "Step 2 Password: ".implode($password);
|
Loading…
Reference in New Issue