Solved part 1 similarly.
Not sure if I've got something new for part 2, but my main insight was that
each number is uniquely defined by it's "segment intersections" with the
numbers 1, 4 and 8. Calculating those from a normalized input and applying
them to the left side gives me the numbers represented. Those can finally
be applied to the right side - code follows:
rd=: ([: /:~&.> ;:);._2 NB. Includes sorting of "words"
d=: rd 0 : 0
be cfbegad cbdgef fgaecd cgeb fdcge agebfd fecdb fabcd edb | fdgacbe cefdb
cefbgd gcbe
edbfga begcd cbg gc gcadebf fbgde acbgfd abcde gfcbed gfec | fcgedb cgb
dgebacf gc
fgaebd cg bdaec gdafb agbcfd gdcbef bgcad gfac gcb cdgabef | cg cg fdcagb
cbg
fbegcd cbd adcefb dageb afcb bc aefdc ecdab fgdeca fcdbega | efabcd cedba
gadfec cb
aecbfdg fbg gf bafeg dbefa fcge gcbea fcaegb dgceab fcbdga | gecf egdcabf
bgf bfgea
fgeab ca afcebg bdacfeg cfaedg gcfdb baec bfadeg bafgc acf | gebdcfa ecba
ca fadegcb
dbcfg fgd bdegcaf fgec aegbdf ecdfab fbedc dacgb gdcebf gf | cefg dcbef
fcge gbcadfe
bdfegc cbegaf gecbf dfcage bdacg ed bedf ced adcbefg gebcd | ed bcgafe
cdgba cbgef
egadfb cdbfeg cegd fecab cgb gbdefca cg fgcdab egfdb bfceg | gbdfcae bgc cg
cgb
gcafb gcf dcaebfg ecagb gf abcdeg gaef cafbge fdbac fegbdc | fgae cfgab fg
bagce
)
+/, 2 4 3 7 =/"1 #&> _4&{."1 d NB. (*) 1 4 7 8 have 2 4 3 7 segments
resp.
26
n=: ;: 'abcefg cf acdeg acdfg bcdf abdfg abdefg acf abcdefg abcdfg'
NB. i ~ Matrix of number of "segment intersections" with 1 4 8
i=: (+/@e.~&>/ 1 4 8&{) n
NB. r ~ Matrix of numbers represented by the "words" on the left side
r=: i i."2 (+/@e.~&>/"1 ({"1~ 2 4 7 i."1~ #&>)) 10 {."1 d
+/ 10&#. r {"1~ (10&{. i."(1) _4&{.)"1 d NB. (**)
61229
Thanks. Stefan.
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm