data Tree a
= Nil
| Branch a (Tree a) (Tree a)
notEach
= \t
-> go t
id [] where go Nil wrap acc = acc
go (Branch x l r) wrap acc
= wrap
(Branch
(not x
) l r
) :
go l (\lU -> wrap (Branch x lU r))
(go r (\rU -> wrap (Branch x l rU)) acc)
procreateL 0 = Nil
procreateL n
= Branch
(n `
rem`
2 == 0) (procreateL
(n
- 1)) (procreateL
(n `
div`
2))
procreateR 0 = Nil
procreateR n
= Branch
(n `
rem`
2 == 0) (procreateR
(n `
div`
2)) (procreateR
(n
- 1))
test = do
guard $ notEach (procreateL 3) == [Branch True (Branch True (Branch False Nil Nil) (Branch False Nil Nil)) (Branch False Nil Nil),Branch False (Branch False (Branch False Nil Nil) (Branch False Nil Nil)) (Branch False Nil Nil),Branch False (Branch True (Branch True Nil Nil) (Branch False Nil Nil)) (Branch False Nil Nil),Branch False (Branch True (Branch False Nil Nil) (Branch True Nil Nil)) (Branch False Nil Nil),Branch False (Branch True (Branch False Nil Nil) (Branch False Nil Nil)) (Branch True Nil Nil)]
guard $ notEach (procreateR 3) == [Branch True (Branch False Nil Nil) (Branch True (Branch False Nil Nil) (Branch False Nil Nil)),Branch False (Branch True Nil Nil) (Branch True (Branch False Nil Nil) (Branch False Nil Nil)),Branch False (Branch False Nil Nil) (Branch False (Branch False Nil Nil) (Branch False Nil Nil)),Branch False (Branch False Nil Nil) (Branch True (Branch True Nil Nil) (Branch False Nil Nil)),Branch False (Branch False Nil Nil) (Branch True (Branch False Nil Nil) (Branch True Nil Nil))]
guard
$ length (notEach
$ procreateL
150) == 1564307 guard
$ length (notEach
$ procreateR
150) == 1564307
main = test
aW1wb3J0IENvbnRyb2wuTW9uYWQKCmRhdGEgVHJlZSBhCiAgICA9IE5pbAogICAgfCBCcmFuY2ggYSAoVHJlZSBhKSAoVHJlZSBhKQogICAgZGVyaXZpbmcgKFNob3csIEVxKQoKbm90RWFjaCA6OiBUcmVlIEJvb2wgLT4gW1RyZWUgQm9vbF0Kbm90RWFjaCA9IFx0IC0+IGdvIHQgaWQgW10gd2hlcmUKICAgIGdvIDo6IFRyZWUgQm9vbCAtPiAoVHJlZSBCb29sIC0+IFRyZWUgQm9vbCkgLT4gW1RyZWUgQm9vbF0gLT4gW1RyZWUgQm9vbF0KICAgIGdvIE5pbCB3cmFwIGFjYyA9IGFjYwogICAgZ28gKEJyYW5jaCB4IGwgcikgd3JhcCBhY2MKICAgICAgICA9IHdyYXAgKEJyYW5jaCAobm90IHgpIGwgcikgOgogICAgICAgICAgZ28gbCAoXGxVIC0+IHdyYXAgKEJyYW5jaCB4IGxVIHIpKQogICAgICAgICAgKGdvIHIgKFxyVSAtPiB3cmFwIChCcmFuY2ggeCBsIHJVKSkgYWNjKQoKcHJvY3JlYXRlTCA6OiBJbnQgLT4gVHJlZSBCb29sCnByb2NyZWF0ZUwgMCA9IE5pbApwcm9jcmVhdGVMIG4gPSBCcmFuY2ggKG4gYHJlbWAgMiA9PSAwKSAocHJvY3JlYXRlTCAobiAtIDEpKSAocHJvY3JlYXRlTCAobiBgZGl2YCAyKSkKCnByb2NyZWF0ZVIgOjogSW50IC0+IFRyZWUgQm9vbApwcm9jcmVhdGVSIDAgPSBOaWwKcHJvY3JlYXRlUiBuID0gQnJhbmNoIChuIGByZW1gIDIgPT0gMCkgKHByb2NyZWF0ZVIgKG4gYGRpdmAgMikpIChwcm9jcmVhdGVSIChuIC0gMSkpCgp0ZXN0IDo6IElPICgpCnRlc3QgPSBkbwogICAgZ3VhcmQgJCBub3RFYWNoIChwcm9jcmVhdGVMIDMpID09IFtCcmFuY2ggVHJ1ZSAoQnJhbmNoIFRydWUgKEJyYW5jaCBGYWxzZSBOaWwgTmlsKSAoQnJhbmNoIEZhbHNlIE5pbCBOaWwpKSAoQnJhbmNoIEZhbHNlIE5pbCBOaWwpLEJyYW5jaCBGYWxzZSAoQnJhbmNoIEZhbHNlIChCcmFuY2ggRmFsc2UgTmlsIE5pbCkgKEJyYW5jaCBGYWxzZSBOaWwgTmlsKSkgKEJyYW5jaCBGYWxzZSBOaWwgTmlsKSxCcmFuY2ggRmFsc2UgKEJyYW5jaCBUcnVlIChCcmFuY2ggVHJ1ZSBOaWwgTmlsKSAoQnJhbmNoIEZhbHNlIE5pbCBOaWwpKSAoQnJhbmNoIEZhbHNlIE5pbCBOaWwpLEJyYW5jaCBGYWxzZSAoQnJhbmNoIFRydWUgKEJyYW5jaCBGYWxzZSBOaWwgTmlsKSAoQnJhbmNoIFRydWUgTmlsIE5pbCkpIChCcmFuY2ggRmFsc2UgTmlsIE5pbCksQnJhbmNoIEZhbHNlIChCcmFuY2ggVHJ1ZSAoQnJhbmNoIEZhbHNlIE5pbCBOaWwpIChCcmFuY2ggRmFsc2UgTmlsIE5pbCkpIChCcmFuY2ggVHJ1ZSBOaWwgTmlsKV0KICAgIGd1YXJkICQgbm90RWFjaCAocHJvY3JlYXRlUiAzKSA9PSBbQnJhbmNoIFRydWUgKEJyYW5jaCBGYWxzZSBOaWwgTmlsKSAoQnJhbmNoIFRydWUgKEJyYW5jaCBGYWxzZSBOaWwgTmlsKSAoQnJhbmNoIEZhbHNlIE5pbCBOaWwpKSxCcmFuY2ggRmFsc2UgKEJyYW5jaCBUcnVlIE5pbCBOaWwpIChCcmFuY2ggVHJ1ZSAoQnJhbmNoIEZhbHNlIE5pbCBOaWwpIChCcmFuY2ggRmFsc2UgTmlsIE5pbCkpLEJyYW5jaCBGYWxzZSAoQnJhbmNoIEZhbHNlIE5pbCBOaWwpIChCcmFuY2ggRmFsc2UgKEJyYW5jaCBGYWxzZSBOaWwgTmlsKSAoQnJhbmNoIEZhbHNlIE5pbCBOaWwpKSxCcmFuY2ggRmFsc2UgKEJyYW5jaCBGYWxzZSBOaWwgTmlsKSAoQnJhbmNoIFRydWUgKEJyYW5jaCBUcnVlIE5pbCBOaWwpIChCcmFuY2ggRmFsc2UgTmlsIE5pbCkpLEJyYW5jaCBGYWxzZSAoQnJhbmNoIEZhbHNlIE5pbCBOaWwpIChCcmFuY2ggVHJ1ZSAoQnJhbmNoIEZhbHNlIE5pbCBOaWwpIChCcmFuY2ggVHJ1ZSBOaWwgTmlsKSldCiAgICBndWFyZCAkIGxlbmd0aCAobm90RWFjaCAkIHByb2NyZWF0ZUwgMTUwKSA9PSAxNTY0MzA3CiAgICBndWFyZCAkIGxlbmd0aCAobm90RWFjaCAkIHByb2NyZWF0ZVIgMTUwKSA9PSAxNTY0MzA3CiAgICAKbWFpbiA9IHRlc3Q=