Removing lists with zero at any position
Clash Royale CLAN TAG#URR8PPP
up vote
8
down vote
favorite
I want to delete the complete list within a list containing 0
at any position.
I tried using:
DeleteCases[Tuples[Range[-2, 2], 2], 0 ..]
-2, -2, -2, -1, -2, 0, -2, 1, -2, 2, -1, -2, -1, -1, -1, 0,
-1, 1, -1, 2, 0, -2, 0, -1, 0, 1, 0, 2, 1, -2, 1, -1, 1, 0, 1, 1,
1, 2, 2, -2, 2, -1, 2, 0, 2, 1, 2, 2
But only the lists starting with 0
are removed.
How can I remove the entire list that contains 0
at any place?
list-manipulation array
add a comment |Â
up vote
8
down vote
favorite
I want to delete the complete list within a list containing 0
at any position.
I tried using:
DeleteCases[Tuples[Range[-2, 2], 2], 0 ..]
-2, -2, -2, -1, -2, 0, -2, 1, -2, 2, -1, -2, -1, -1, -1, 0,
-1, 1, -1, 2, 0, -2, 0, -1, 0, 1, 0, 2, 1, -2, 1, -1, 1, 0, 1, 1,
1, 2, 2, -2, 2, -1, 2, 0, 2, 1, 2, 2
But only the lists starting with 0
are removed.
How can I remove the entire list that contains 0
at any place?
list-manipulation array
add a comment |Â
up vote
8
down vote
favorite
up vote
8
down vote
favorite
I want to delete the complete list within a list containing 0
at any position.
I tried using:
DeleteCases[Tuples[Range[-2, 2], 2], 0 ..]
-2, -2, -2, -1, -2, 0, -2, 1, -2, 2, -1, -2, -1, -1, -1, 0,
-1, 1, -1, 2, 0, -2, 0, -1, 0, 1, 0, 2, 1, -2, 1, -1, 1, 0, 1, 1,
1, 2, 2, -2, 2, -1, 2, 0, 2, 1, 2, 2
But only the lists starting with 0
are removed.
How can I remove the entire list that contains 0
at any place?
list-manipulation array
I want to delete the complete list within a list containing 0
at any position.
I tried using:
DeleteCases[Tuples[Range[-2, 2], 2], 0 ..]
-2, -2, -2, -1, -2, 0, -2, 1, -2, 2, -1, -2, -1, -1, -1, 0,
-1, 1, -1, 2, 0, -2, 0, -1, 0, 1, 0, 2, 1, -2, 1, -1, 1, 0, 1, 1,
1, 2, 2, -2, 2, -1, 2, 0, 2, 1, 2, 2
But only the lists starting with 0
are removed.
How can I remove the entire list that contains 0
at any place?
list-manipulation array
list-manipulation array
edited 15 hours ago
kglr
159k8184384
159k8184384
asked 19 hours ago
dykes
836
836
add a comment |Â
add a comment |Â
3 Answers
3
active
oldest
votes
up vote
8
down vote
DeleteCases[Tuples[Range[-2, 2], 2], ___, 0, ___] (* or *)
DeleteCases[data, 0, 0|1,0|0,1]
-2, -2, -2, -1, -2, 1, -2, 2, -1, -2, -1, -1, -1,
1, -1, 2, 1, -2, 1, -1, 1, 1, 1, 2, 2, -2, 2, -1, 2,
1, 2, 2
Alternatively, if you can, remove zeros from the input lists before using Tuples
:
Tuples[Join[-Reverse@#, #]&@Range[2],2]
same result
Even if data = Tuples[Range[-2, 2], 2]
is already created, processing data
to create a zero-free input list and using Tuples
on it is (to my surprise) faster than using Pick
to remove entries with zeros from pairs of data:
data = Tuples[Range[-100, 100], 2];
ra = Tuples[Join[-Reverse @ #, #]& @ Range[100],2]; // RepeatedTiming // First
0.0000524
rb = With[r = DeleteCases[DeleteDuplicates @ Flatten[data], 0],
Tuples[r, 2]];// RepeatedTiming // First
0.000178
rc = Pick[data, Unitize[data].1, 1, 2];//RepeatedTiming//First (*from @Henrik's answer*)
0.0013
rd = DeleteCases[data, 0, 0|1,0|0,1];// RepeatedTiming // First
0.017
re = DeleteCases[data, ___, 0, ___];// RepeatedTiming // First
0.026
rf = Select[data, FreeQ[0] ];// RepeatedTiming // First (*from David's answer *)
0.060
ra == rb == rc == rd == re == rf
True
Well.... if you're free to delete 0 before using Tuples simply useTuples[-2, -1, 1, 2, 2]
.
– David G. Stork
18 hours ago
@David, yes; i used the more cumbersome way to deal with cases likeRange[-100, 100]
– kglr
18 hours ago
1
Oh, methodb
andc
... nice out-of-the-box-thinking!
– Henrik Schumacher
16 hours ago
DeleteCases[DeleteDuplicates @ Flatten[data], 0]
is not packed, whileJoin[-Reverse @ #, #]& @ Range[100]
is, explaining the difference in timing
– Carl Woll
15 hours ago
@CarlWoll, good point. But in this case,DeleteDuplicates @ Flatten[data]
(which is packed) already takes0.00011
seconds (RepeatedTiming) compared to3.06*10^-6
forJoin[-Reverse @ #, #]& @ Range[100]
, simply because the former processes a list with dimensions40401,2
and the latter with just200
.
– kglr
14 hours ago
add a comment |Â
up vote
7
down vote
Here a more cumbersome (not a code golfer) but faster approach:
data = Tuples[Range[-100, 100], 2];
a = DeleteCases[data, ___, 0, ___]; // RepeatedTiming // First
b = Pick[data, Unitize[data].1, 1, 2]; // RepeatedTiming // First
a == b
0.028
0.00098
True
This skips pattern matching in favor of faster vectorized functions.
add a comment |Â
up vote
7
down vote
Or...
Select[Tuples[Range[-2, 2], 2], ! MemberQ[#, 0] &]
or as @ThatGravityGuy points out...
Select[Tuples[Range[-2, 2], 2], FreeQ[#, 0] &]
1
Instead of!MemberQ
couldn't you just useFreeQ
?
– That Gravity Guy
18 hours ago
Oooh... of course. Yes. Thanks.
– David G. Stork
18 hours ago
You can use the operator formFreeQ[0]
instead ofFreeQ[#, 0] &
– kglr
17 hours ago
.. or operator forms of bothSelect
andFreeQ
:Select[FreeQ@0]@data
– kglr
15 hours ago
add a comment |Â
3 Answers
3
active
oldest
votes
3 Answers
3
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
8
down vote
DeleteCases[Tuples[Range[-2, 2], 2], ___, 0, ___] (* or *)
DeleteCases[data, 0, 0|1,0|0,1]
-2, -2, -2, -1, -2, 1, -2, 2, -1, -2, -1, -1, -1,
1, -1, 2, 1, -2, 1, -1, 1, 1, 1, 2, 2, -2, 2, -1, 2,
1, 2, 2
Alternatively, if you can, remove zeros from the input lists before using Tuples
:
Tuples[Join[-Reverse@#, #]&@Range[2],2]
same result
Even if data = Tuples[Range[-2, 2], 2]
is already created, processing data
to create a zero-free input list and using Tuples
on it is (to my surprise) faster than using Pick
to remove entries with zeros from pairs of data:
data = Tuples[Range[-100, 100], 2];
ra = Tuples[Join[-Reverse @ #, #]& @ Range[100],2]; // RepeatedTiming // First
0.0000524
rb = With[r = DeleteCases[DeleteDuplicates @ Flatten[data], 0],
Tuples[r, 2]];// RepeatedTiming // First
0.000178
rc = Pick[data, Unitize[data].1, 1, 2];//RepeatedTiming//First (*from @Henrik's answer*)
0.0013
rd = DeleteCases[data, 0, 0|1,0|0,1];// RepeatedTiming // First
0.017
re = DeleteCases[data, ___, 0, ___];// RepeatedTiming // First
0.026
rf = Select[data, FreeQ[0] ];// RepeatedTiming // First (*from David's answer *)
0.060
ra == rb == rc == rd == re == rf
True
Well.... if you're free to delete 0 before using Tuples simply useTuples[-2, -1, 1, 2, 2]
.
– David G. Stork
18 hours ago
@David, yes; i used the more cumbersome way to deal with cases likeRange[-100, 100]
– kglr
18 hours ago
1
Oh, methodb
andc
... nice out-of-the-box-thinking!
– Henrik Schumacher
16 hours ago
DeleteCases[DeleteDuplicates @ Flatten[data], 0]
is not packed, whileJoin[-Reverse @ #, #]& @ Range[100]
is, explaining the difference in timing
– Carl Woll
15 hours ago
@CarlWoll, good point. But in this case,DeleteDuplicates @ Flatten[data]
(which is packed) already takes0.00011
seconds (RepeatedTiming) compared to3.06*10^-6
forJoin[-Reverse @ #, #]& @ Range[100]
, simply because the former processes a list with dimensions40401,2
and the latter with just200
.
– kglr
14 hours ago
add a comment |Â
up vote
8
down vote
DeleteCases[Tuples[Range[-2, 2], 2], ___, 0, ___] (* or *)
DeleteCases[data, 0, 0|1,0|0,1]
-2, -2, -2, -1, -2, 1, -2, 2, -1, -2, -1, -1, -1,
1, -1, 2, 1, -2, 1, -1, 1, 1, 1, 2, 2, -2, 2, -1, 2,
1, 2, 2
Alternatively, if you can, remove zeros from the input lists before using Tuples
:
Tuples[Join[-Reverse@#, #]&@Range[2],2]
same result
Even if data = Tuples[Range[-2, 2], 2]
is already created, processing data
to create a zero-free input list and using Tuples
on it is (to my surprise) faster than using Pick
to remove entries with zeros from pairs of data:
data = Tuples[Range[-100, 100], 2];
ra = Tuples[Join[-Reverse @ #, #]& @ Range[100],2]; // RepeatedTiming // First
0.0000524
rb = With[r = DeleteCases[DeleteDuplicates @ Flatten[data], 0],
Tuples[r, 2]];// RepeatedTiming // First
0.000178
rc = Pick[data, Unitize[data].1, 1, 2];//RepeatedTiming//First (*from @Henrik's answer*)
0.0013
rd = DeleteCases[data, 0, 0|1,0|0,1];// RepeatedTiming // First
0.017
re = DeleteCases[data, ___, 0, ___];// RepeatedTiming // First
0.026
rf = Select[data, FreeQ[0] ];// RepeatedTiming // First (*from David's answer *)
0.060
ra == rb == rc == rd == re == rf
True
Well.... if you're free to delete 0 before using Tuples simply useTuples[-2, -1, 1, 2, 2]
.
– David G. Stork
18 hours ago
@David, yes; i used the more cumbersome way to deal with cases likeRange[-100, 100]
– kglr
18 hours ago
1
Oh, methodb
andc
... nice out-of-the-box-thinking!
– Henrik Schumacher
16 hours ago
DeleteCases[DeleteDuplicates @ Flatten[data], 0]
is not packed, whileJoin[-Reverse @ #, #]& @ Range[100]
is, explaining the difference in timing
– Carl Woll
15 hours ago
@CarlWoll, good point. But in this case,DeleteDuplicates @ Flatten[data]
(which is packed) already takes0.00011
seconds (RepeatedTiming) compared to3.06*10^-6
forJoin[-Reverse @ #, #]& @ Range[100]
, simply because the former processes a list with dimensions40401,2
and the latter with just200
.
– kglr
14 hours ago
add a comment |Â
up vote
8
down vote
up vote
8
down vote
DeleteCases[Tuples[Range[-2, 2], 2], ___, 0, ___] (* or *)
DeleteCases[data, 0, 0|1,0|0,1]
-2, -2, -2, -1, -2, 1, -2, 2, -1, -2, -1, -1, -1,
1, -1, 2, 1, -2, 1, -1, 1, 1, 1, 2, 2, -2, 2, -1, 2,
1, 2, 2
Alternatively, if you can, remove zeros from the input lists before using Tuples
:
Tuples[Join[-Reverse@#, #]&@Range[2],2]
same result
Even if data = Tuples[Range[-2, 2], 2]
is already created, processing data
to create a zero-free input list and using Tuples
on it is (to my surprise) faster than using Pick
to remove entries with zeros from pairs of data:
data = Tuples[Range[-100, 100], 2];
ra = Tuples[Join[-Reverse @ #, #]& @ Range[100],2]; // RepeatedTiming // First
0.0000524
rb = With[r = DeleteCases[DeleteDuplicates @ Flatten[data], 0],
Tuples[r, 2]];// RepeatedTiming // First
0.000178
rc = Pick[data, Unitize[data].1, 1, 2];//RepeatedTiming//First (*from @Henrik's answer*)
0.0013
rd = DeleteCases[data, 0, 0|1,0|0,1];// RepeatedTiming // First
0.017
re = DeleteCases[data, ___, 0, ___];// RepeatedTiming // First
0.026
rf = Select[data, FreeQ[0] ];// RepeatedTiming // First (*from David's answer *)
0.060
ra == rb == rc == rd == re == rf
True
DeleteCases[Tuples[Range[-2, 2], 2], ___, 0, ___] (* or *)
DeleteCases[data, 0, 0|1,0|0,1]
-2, -2, -2, -1, -2, 1, -2, 2, -1, -2, -1, -1, -1,
1, -1, 2, 1, -2, 1, -1, 1, 1, 1, 2, 2, -2, 2, -1, 2,
1, 2, 2
Alternatively, if you can, remove zeros from the input lists before using Tuples
:
Tuples[Join[-Reverse@#, #]&@Range[2],2]
same result
Even if data = Tuples[Range[-2, 2], 2]
is already created, processing data
to create a zero-free input list and using Tuples
on it is (to my surprise) faster than using Pick
to remove entries with zeros from pairs of data:
data = Tuples[Range[-100, 100], 2];
ra = Tuples[Join[-Reverse @ #, #]& @ Range[100],2]; // RepeatedTiming // First
0.0000524
rb = With[r = DeleteCases[DeleteDuplicates @ Flatten[data], 0],
Tuples[r, 2]];// RepeatedTiming // First
0.000178
rc = Pick[data, Unitize[data].1, 1, 2];//RepeatedTiming//First (*from @Henrik's answer*)
0.0013
rd = DeleteCases[data, 0, 0|1,0|0,1];// RepeatedTiming // First
0.017
re = DeleteCases[data, ___, 0, ___];// RepeatedTiming // First
0.026
rf = Select[data, FreeQ[0] ];// RepeatedTiming // First (*from David's answer *)
0.060
ra == rb == rc == rd == re == rf
True
edited 9 hours ago
answered 19 hours ago
kglr
159k8184384
159k8184384
Well.... if you're free to delete 0 before using Tuples simply useTuples[-2, -1, 1, 2, 2]
.
– David G. Stork
18 hours ago
@David, yes; i used the more cumbersome way to deal with cases likeRange[-100, 100]
– kglr
18 hours ago
1
Oh, methodb
andc
... nice out-of-the-box-thinking!
– Henrik Schumacher
16 hours ago
DeleteCases[DeleteDuplicates @ Flatten[data], 0]
is not packed, whileJoin[-Reverse @ #, #]& @ Range[100]
is, explaining the difference in timing
– Carl Woll
15 hours ago
@CarlWoll, good point. But in this case,DeleteDuplicates @ Flatten[data]
(which is packed) already takes0.00011
seconds (RepeatedTiming) compared to3.06*10^-6
forJoin[-Reverse @ #, #]& @ Range[100]
, simply because the former processes a list with dimensions40401,2
and the latter with just200
.
– kglr
14 hours ago
add a comment |Â
Well.... if you're free to delete 0 before using Tuples simply useTuples[-2, -1, 1, 2, 2]
.
– David G. Stork
18 hours ago
@David, yes; i used the more cumbersome way to deal with cases likeRange[-100, 100]
– kglr
18 hours ago
1
Oh, methodb
andc
... nice out-of-the-box-thinking!
– Henrik Schumacher
16 hours ago
DeleteCases[DeleteDuplicates @ Flatten[data], 0]
is not packed, whileJoin[-Reverse @ #, #]& @ Range[100]
is, explaining the difference in timing
– Carl Woll
15 hours ago
@CarlWoll, good point. But in this case,DeleteDuplicates @ Flatten[data]
(which is packed) already takes0.00011
seconds (RepeatedTiming) compared to3.06*10^-6
forJoin[-Reverse @ #, #]& @ Range[100]
, simply because the former processes a list with dimensions40401,2
and the latter with just200
.
– kglr
14 hours ago
Well.... if you're free to delete 0 before using Tuples simply use
Tuples[-2, -1, 1, 2, 2]
.– David G. Stork
18 hours ago
Well.... if you're free to delete 0 before using Tuples simply use
Tuples[-2, -1, 1, 2, 2]
.– David G. Stork
18 hours ago
@David, yes; i used the more cumbersome way to deal with cases like
Range[-100, 100]
– kglr
18 hours ago
@David, yes; i used the more cumbersome way to deal with cases like
Range[-100, 100]
– kglr
18 hours ago
1
1
Oh, method
b
and c
... nice out-of-the-box-thinking!– Henrik Schumacher
16 hours ago
Oh, method
b
and c
... nice out-of-the-box-thinking!– Henrik Schumacher
16 hours ago
DeleteCases[DeleteDuplicates @ Flatten[data], 0]
is not packed, while Join[-Reverse @ #, #]& @ Range[100]
is, explaining the difference in timing– Carl Woll
15 hours ago
DeleteCases[DeleteDuplicates @ Flatten[data], 0]
is not packed, while Join[-Reverse @ #, #]& @ Range[100]
is, explaining the difference in timing– Carl Woll
15 hours ago
@CarlWoll, good point. But in this case,
DeleteDuplicates @ Flatten[data]
(which is packed) already takes 0.00011
seconds (RepeatedTiming) compared to 3.06*10^-6
for Join[-Reverse @ #, #]& @ Range[100]
, simply because the former processes a list with dimensions 40401,2
and the latter with just 200
.– kglr
14 hours ago
@CarlWoll, good point. But in this case,
DeleteDuplicates @ Flatten[data]
(which is packed) already takes 0.00011
seconds (RepeatedTiming) compared to 3.06*10^-6
for Join[-Reverse @ #, #]& @ Range[100]
, simply because the former processes a list with dimensions 40401,2
and the latter with just 200
.– kglr
14 hours ago
add a comment |Â
up vote
7
down vote
Here a more cumbersome (not a code golfer) but faster approach:
data = Tuples[Range[-100, 100], 2];
a = DeleteCases[data, ___, 0, ___]; // RepeatedTiming // First
b = Pick[data, Unitize[data].1, 1, 2]; // RepeatedTiming // First
a == b
0.028
0.00098
True
This skips pattern matching in favor of faster vectorized functions.
add a comment |Â
up vote
7
down vote
Here a more cumbersome (not a code golfer) but faster approach:
data = Tuples[Range[-100, 100], 2];
a = DeleteCases[data, ___, 0, ___]; // RepeatedTiming // First
b = Pick[data, Unitize[data].1, 1, 2]; // RepeatedTiming // First
a == b
0.028
0.00098
True
This skips pattern matching in favor of faster vectorized functions.
add a comment |Â
up vote
7
down vote
up vote
7
down vote
Here a more cumbersome (not a code golfer) but faster approach:
data = Tuples[Range[-100, 100], 2];
a = DeleteCases[data, ___, 0, ___]; // RepeatedTiming // First
b = Pick[data, Unitize[data].1, 1, 2]; // RepeatedTiming // First
a == b
0.028
0.00098
True
This skips pattern matching in favor of faster vectorized functions.
Here a more cumbersome (not a code golfer) but faster approach:
data = Tuples[Range[-100, 100], 2];
a = DeleteCases[data, ___, 0, ___]; // RepeatedTiming // First
b = Pick[data, Unitize[data].1, 1, 2]; // RepeatedTiming // First
a == b
0.028
0.00098
True
This skips pattern matching in favor of faster vectorized functions.
edited 19 hours ago
answered 19 hours ago


Henrik Schumacher
37.6k249107
37.6k249107
add a comment |Â
add a comment |Â
up vote
7
down vote
Or...
Select[Tuples[Range[-2, 2], 2], ! MemberQ[#, 0] &]
or as @ThatGravityGuy points out...
Select[Tuples[Range[-2, 2], 2], FreeQ[#, 0] &]
1
Instead of!MemberQ
couldn't you just useFreeQ
?
– That Gravity Guy
18 hours ago
Oooh... of course. Yes. Thanks.
– David G. Stork
18 hours ago
You can use the operator formFreeQ[0]
instead ofFreeQ[#, 0] &
– kglr
17 hours ago
.. or operator forms of bothSelect
andFreeQ
:Select[FreeQ@0]@data
– kglr
15 hours ago
add a comment |Â
up vote
7
down vote
Or...
Select[Tuples[Range[-2, 2], 2], ! MemberQ[#, 0] &]
or as @ThatGravityGuy points out...
Select[Tuples[Range[-2, 2], 2], FreeQ[#, 0] &]
1
Instead of!MemberQ
couldn't you just useFreeQ
?
– That Gravity Guy
18 hours ago
Oooh... of course. Yes. Thanks.
– David G. Stork
18 hours ago
You can use the operator formFreeQ[0]
instead ofFreeQ[#, 0] &
– kglr
17 hours ago
.. or operator forms of bothSelect
andFreeQ
:Select[FreeQ@0]@data
– kglr
15 hours ago
add a comment |Â
up vote
7
down vote
up vote
7
down vote
Or...
Select[Tuples[Range[-2, 2], 2], ! MemberQ[#, 0] &]
or as @ThatGravityGuy points out...
Select[Tuples[Range[-2, 2], 2], FreeQ[#, 0] &]
Or...
Select[Tuples[Range[-2, 2], 2], ! MemberQ[#, 0] &]
or as @ThatGravityGuy points out...
Select[Tuples[Range[-2, 2], 2], FreeQ[#, 0] &]
edited 18 hours ago
answered 19 hours ago


David G. Stork
21.4k11646
21.4k11646
1
Instead of!MemberQ
couldn't you just useFreeQ
?
– That Gravity Guy
18 hours ago
Oooh... of course. Yes. Thanks.
– David G. Stork
18 hours ago
You can use the operator formFreeQ[0]
instead ofFreeQ[#, 0] &
– kglr
17 hours ago
.. or operator forms of bothSelect
andFreeQ
:Select[FreeQ@0]@data
– kglr
15 hours ago
add a comment |Â
1
Instead of!MemberQ
couldn't you just useFreeQ
?
– That Gravity Guy
18 hours ago
Oooh... of course. Yes. Thanks.
– David G. Stork
18 hours ago
You can use the operator formFreeQ[0]
instead ofFreeQ[#, 0] &
– kglr
17 hours ago
.. or operator forms of bothSelect
andFreeQ
:Select[FreeQ@0]@data
– kglr
15 hours ago
1
1
Instead of
!MemberQ
couldn't you just use FreeQ
?– That Gravity Guy
18 hours ago
Instead of
!MemberQ
couldn't you just use FreeQ
?– That Gravity Guy
18 hours ago
Oooh... of course. Yes. Thanks.
– David G. Stork
18 hours ago
Oooh... of course. Yes. Thanks.
– David G. Stork
18 hours ago
You can use the operator form
FreeQ[0]
instead of FreeQ[#, 0] &
– kglr
17 hours ago
You can use the operator form
FreeQ[0]
instead of FreeQ[#, 0] &
– kglr
17 hours ago
.. or operator forms of both
Select
and FreeQ
: Select[FreeQ@0]@data
– kglr
15 hours ago
.. or operator forms of both
Select
and FreeQ
: Select[FreeQ@0]@data
– kglr
15 hours ago
add a comment |Â
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fmathematica.stackexchange.com%2fquestions%2f181781%2fremoving-lists-with-zero-at-any-position%23new-answer', 'question_page');
);
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password