The spec doesn't disqualify strings containing 'aaa'; it just says that they do not meet the repeated-nonoverlapping-pair requirement. You should accept 'aaaxyxy' and 'aaaxybxy'.

Style points:

-.@* is the same as 0&=

*@:(+/) is the same as +./   (but +./ can quit earlier)

Henry Rich

On 12/6/2015 10:55 AM, Joe Bogner wrote:
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


----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to