Thanks for the style tips and spec comment.
On Dec 6, 2015 12:14 PM, "Henry Rich" <henryhr...@gmail.com> wrote:

> 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
>
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to