Thanks for the feedback. Here's my part 2 [: +/ [: (*@:(+/)@:(3&(({: = {.)\)) *. (#@~. ~: #)@:(2 ]\ ]) *. -.@*@:(+/)@:(3 <:&1@#@~.\ ]))&> ]
Which is countGoodPt2 f. countGoodPt2 lines 53 func 'has2Pair' It has a pair of letters that occurs at least twice ex: has2Pair 'aaaa' ex: 1 = has2Pair 'aaa' NB. overlapping is ok here ex: 0 = has2Pair 'aa ab' has2Pair=: ((#@~. ~: #) @: (2]\])) ) func 'hasNo3Consec' It does not have 3 of the same letters consecutively ex: 1 = hasNo3Consec 'aba ' ex: 0 = hasNo3Consec 'aaa' ex: 0 = hasNo3Consec 'abaaa' ex: 1 = hasNo3Consec 'abaaba' hasNo3Consec=: -.@*@:(+/) @: (3 (<:&1@#@~.)\ ]) ) func 'has2PairNoOverlap' It contains a pair of any two letters that appears at least twice in the string without overlapping, like xyxy (xy) or aabcdefgaa (aa), but not like aaa (aa, but it overlaps). ex: has2PairNoOverlap 'xyxy' ex: has2PairNoOverlap 'aabcdefgaa' ex: 0 = has2PairNoOverlap 'aaa' ex: 0 = has2PairNoOverlap 'ueihvxviirnooomi' has2PairNoOverlap =: has2Pair *. hasNo3Consec ) func 'hasRepeatWithLetterBetween' It contains at least one letter which repeats with exactly one letter between them, like xyx, abcdefeghi (efe), or even aaa. ex: hasRepeatWithLetterBetween 'xyxy' hasRepeatWithLetterBetween =: *@:(+/) @: (3&(({: = {.)\)) ) func 'countGoodPt2' counts how many lines match the criteria in p2 ex: 1 = countGoodPt2 ('aabcdefgaa';'xyxy') countGoodPt2 =: [: +/ ([: (hasRepeatWithLetterBetween *. has2PairNoOverlap) every ]) ) On Sat, Dec 5, 2015 at 10:27 PM, 'Pascal Jasmin' via Programming <programm...@jsoftware.com> wrote: > Like the literate style. I have a few ideas for enhancements. Hopefully > submit something soon. > > > > > ----- Original Message ----- > From: Joe Bogner <joebog...@gmail.com> > To: programm...@jsoftware.com > Sent: Saturday, December 5, 2015 8:38 PM > Subject: Re: [Jprogramming] advent of code day 5 > > I've only had a chance to do pt1 so far and probably can't get to pt2 > until tomorrow > > [: +/ [: ([: */ [: * ([: -.@* [: +/@:(+/"1) (4 2$'abcdpqxy') E."1 ]) , > *@+/@:(1&(|.!.' ') = ]) , [: >:&3@:(+/) 'aeiou' e.~ ])&> ] > > > Here's my solution in literate fixed tacit, read more about this style > at > http://code.jsoftware.com/wiki/User:Joe_Bogner/ByteCodeInterpreter#Tacit_Literate.2C_TDD_Version > > lines =: LF cut fread 'c:/joe/lang-lab/j/advent2015/day5.txt' > > NB. creates and documents a function > NB. could be improved to split out example > NB. or automatically assert on the example > NB. originally from > http://www.jsoftware.com/pipermail/programming/2014-July/038316.html > func=: 3 : 0 > doc=.[(y,'_doc')=: 0 : 0 > lines=.dlb each LF cut doc > 0!:0 > {: lines > examples=.[(y,'_examples')=:3 }. each (#~ (<'ex:') E. 3 {. each [) lines > for_ex. examples do. > ex=.(>ex) > try. > assert ". ex > catch. > smoutput ex , ' failed' > smoutput 'returned ' > smoutput ". ex > end. > > end. > '' > ) > > func 'hasThreeVowels' > tests for whether it contains at least three vowels (aeiou only), > like aei, xazegov, or aeiouaeiouaeiou. > ex: hasThreeVowels 'aaa' > ex: 0 = hasThreeVowels 'aab' > ex: hasThreeVowels 'aei' > ex: hasThreeVowels 'aeiaaaa' > hasThreeVowels =: [: (>:&3) @: (+/) ('aeiou'e.~]) > ) > > func 'hasConsec' > It contains at least one letter that appears twice in a row, like > xx, abcdde (dd), or aabbccdd (aa, bb, cc, or dd). > ex: hasConsec 'abaa' > ex: 0 = hasConsec 'abab' > ex: hasConsec 'zzxz' > ex: hasConsec 'aabbccddeeff' > hasConsec=: *@+/ @: (1&(|.!.' ') = ]) > ) > > func 'hasNoBad' > It does not contain the strings ab, cd, pq, or xy, even if they > are part of one of the other requirements. > ex: 0 = hasNoBad 'axab' > ex: 0 = hasNoBad 'axab' > ex: 1 = hasNoBad 'axac' > ex: 0 = hasNoBad 'xababababx' > ex: 0 = hasNoBad 'abpq' > ex: 0 = hasNoBad 'ejkarcdkdslldugv' > hasNoBad=: ([: -.@* [: +/@:(+/"1) (> 'ab';'cd';'pq';'xy') E."1 ]) > ) > > func 'countGood' > counts how many lines match the criteria > countGood =: ([: +/ [: ([: */ [: * hasNoBad , hasConsec , > hasThreeVowels) every ]) > ) > > lines =: LF cut fread 'c:/joe/lang-lab/j/advent2015/day5.txt' > > > smoutput answer1=: countGood lines > > On Sat, Dec 5, 2015 at 3:43 PM, 'Pascal Jasmin' via Programming > <programm...@jsoftware.com> wrote: >> with utilities to help minimize typing and parentheses >> >> part 1 >> >> Sel =: 1 : '] #~ u' >> >> daF =: 1 : ('a =. (''2 : '', (quote m) , '' u'') label_. 1 : (''u 1 :'' , >> quote a)') >> at =: 'u (v@:) 'daF >> atop =: 'u (v@) 'daF >> nd =: 'u (v&)' daF >> >> # ( 2 (4 2 $ 'abcdpqxy')-:"1 nd\ +./ at ]) +./ at -. atop "1 Sel ( 2 =/\ >> ]) +./ at"1 Sel 'aeiou' ( 3 <: ="0 1 +/"1 atop +/ at)"1 Sel > cutLF a >> >> for part 2, this is a bad solution that involves taking out 3 letters in a >> row but putting back in 4 letters in a row. the spec wasnt super clear on >> that rule, and this turned out to be the answer. >> >> In terms of double adverbs, I did not get rid of all @s. The one in the >> middle is kept because too many gaps between double adverbs makes it hard to >> follow the pairings (though extra whitespace that wont show in email works >> pretty good for this) >> >> >> Less =: 1 : '] -. u' >> >> # +./@( 4 (1 = #@~.)\ ])"1 Sel Less @:((3 (1 = ~.#at)\ ]) +./ atop"1 Sel) >> Less (3 (({. ~: 1&{) *. {. = {:)\ ]) +./ at"1 Sel@:((1 < >./"1)@:([: +/\"1 >> [: = 2 <\ ]) +./ atop"1 Sel) at > cutLF a >> ---------------------------------------------------------------------- >> For information about J forums see http://www.jsoftware.com/forums.htm > > > > ---------------------------------------------------------------------- > For information about J forums see http://www.jsoftware.com/forums.htm > ---------------------------------------------------------------------- > For information about J forums see http://www.jsoftware.com/forums.htm ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm