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