Oh hey! It's a problem related to my current job! Let's try to brute force some passwords like real l337 h4xx0rz.
Day 4 - The Problem
Man, the forces of the Holidays have a consistent problem with security. Every year we have to do some basic offensive security work... Santa's forgotten password, most of the obstacles in our assault on Easter Bunny Corp., cracking High Entropy Passwords, sneaking past lazy guards, or some other bad practice.
Part 1 seems complicated at first, but looking at the whole possibility set might shake some things loose.
Part 2 was mainly difficult for me due to the wording. However, once I figured out that there needs to be at least one number that appears exactly twice, then it was all downhill pedaling.
I was beginning to worry that this was going to be a tougher year with a steep ramp-up!
Ongoing Meta
Dev.to List of Leaderboards
-
120635-5c140b9a
- provided by Linda Thompson
If you were part of Ryan Palo's leaderboard last year, you're still a member of that!
If you want me to add your leaderboard code to this page, reply to one of these posts and/or send me a DM containing your code and any theming or notes you’d like me to add. (You can find your private leaderboard code on your "Private Leaderboard" page.)
I'll edit in any leaderboards that people want to post, along with any description for the kinds of people you want to have on it. (My leaderboard is being used as my office's leaderboard.) And if I get something wrong, please call me out or message me and I’ll fix it ASAP.
There's no limit to the number of leaderboards you can join, so there's no problem belonging to a "Beginner" and a language specific one if you want.
Neat Statistics
I'm planning on adding some statistics, but other than "what languages did we see yesterday" does anyone have any ideas?
Languages Seen On Day 03
- Python x 3
- Clojure x 2
- C++
- Haskell
- Javascript
- Kotlin
- PHP
- Scala
- Swift
Oldest comments (41)
Kotlin Solution
It's important to use
Sequence
here so that the map/filter/count function can happen per item instead of applying to the whole list for each operation.Something about seeing so many greens <3
Waiting for someone to post a functional/not-very-imperative JS solution!
Where in
part1()
are you checking that 2 adjacent digits are the same?Here’s my math/logic for n=3 that expands to a general case simply in my mind (if it doesn’t I can work on a more formal proof)
Given:
a<=b<=c
a==b
ORb==c
Therefore:
distinct(a,b,c)
must be equal to(a,c)
OR(a)
aba
is never a legal patternExplanation of the second therefore: By looking at a 4 digit number that is
abca
we see that since this impliesc<=a<=b
that this isn’t a legal string. We can also insert any number of digits (that follow the rules) betweenb
andc
and the contradiction with given #1 still occurs.Back again with more Clojure. Cool thing to point out on this one: the
frequencies
function. It takes as input a collection, and then returns a map of the values present in that collection, and the count of the times they appear. Made part two real easy.repl.it: repl.it/@ballpointcarrot/AoC-Clojure
github: github.com/ballpointcarrot/AoC/blo...
I had to write my own in kotlin! Their design philosophy states that GroupBy->MapValues(Count) is good enough, and I... kind of agree?
Still handy to do it in one step though.
I'd agree that it's not strictly necessary, as
(group-by identity "112233")
would solve the same problem; however, if you give me a convenience function, I'll take it. :DThrew a Ruby solution together, just because it feels under-represented here. Ended up faster than the Clojure solution, probably because I'm doing the processing for the values as they're generated:
JavaScript...thank goodness I got this one! Still struggling to work out day 3, the mapping ones always get me stuck...I'll get it soon, though!
Basically, I filled out all the digits in my input range, then checked through each number to see if it was in order & had at least one double. Tried to break the second I saw an out of order number, so it would be a bit faster. Thankfully each input number is small, so it ran pretty quickly!
Here's mine. Lot of room for DRY-ing it and making it declarative:
Back in the early 1990s in my CS degree we did a genetic algorithm polynomial solver in Prolog. My Prolog has become a bit rusty through disuse since then but I was hoping for a constraint solving problem to dust it off.
Later I might try again using one of my MiniKanren implementations (e.g. github.com/neilgall/KotlinKanren)
PHP again! I solved it within the first half hour but was too embarrassed by my code to post it here, so spent most of my evening figuring out how to make it look less bad, oops. And I overwrote my Part 1 code, so this is just Part 2:
I did take some inspiration from other solutions to make this improved version :)
These are fine instincts that will serve you well in future pull requests.
No shame in making sure all the corners are sharp and you replaced all the variables named
x
,fart
,someKindaFunc
, etc. (I must admit to editing my posted code after an elegant refactor reveals itself to me)Kotlin code, used
groupBy
for the double digit condition checks - github.com/sup95/AdventOfCode-19/b... :)Unsolicited code review:
filter(x).isEmpty()
is equivalent tonone(x)
filter(x).isNotEmpty()
is equivalent toany(x)
filterNot(x).isEmpty()
is equivalent toall(x)
filterNot(x).isNotEmpty()
is equivalent toany(!x)
c.any{it == x}
is equivalent tox in c
I find future me tends to remember what I was doing faster when I use the any/none/all functions. (They also short-circuit, but the readability boost to my productivity helps more than the loop optimization)
Swift Solution here. By reading the statement I felt easy but took almost same time as yesterday to solve this as well.
Regex to the rescue!
Just to make it clear:
([^1]|^)11([^1]|$)
says:([^1]
find anything other than 1|
or^)
the beginning of the string. The parentheses create a capture group that allows the use of|
to mean "or".11
find "11"([^1]
find anything other than 1|
or$)
the end of the string.Essentially this searches for "11" surrounded by anything that isn't a 1. Then I repeated it for the other digits.
Interesting, I used the same regex for my part 1 too
Nice solution. I've not used rust, but I hear it's really fast!
Nice, although I wouldn't inflict that on my team-mates!
It is a bit of a monster.
I've being trying to think of a way to refine it, but then again I'm not likely to be asked to find numbers like that outside of AoC :D
Even I, someone who loves regexes so much that I made a regex that converted words to Pig Latin, find this hard to read!
It makes sense! I just worry that if I look away from it for too long it will have changed...
It’s still more readable than the regex that “matches a b c where a+b=c” (a,b,c being any rational number)
Wow. ._.
Wow, nice solution.
My JavaScript solution:
The first part was pretty easy and in the second part I was trying to construct a perfect regex initially so that didn't work out. One thing that stumped me a bit was that in rust
string.split("")
throws a""
at the beginning and the end.I haven't completed Day 3 yet, gonna do that later. I figured out the logic for Day 3 but there's some problem with the implementation.
I've uploaded all my Advent of Code 2019 solutions in rust on a github repo : github.com/coolshaurya/advent_of_c...
Day 3 solution using Rust
Haskell solution
Brute force Python solution:
For me, this was 100x easier than day 3.
Some comments may only be visible to logged-in visitors. Sign in to view all comments.