Cody Fendant has asked for the wisdom of the Perl Monks concerning the following question:

Inspired by the fact that 2013 is the first year since 1987 which has four unique digits, what's your best code to determine the number of unique digits in a number?

Here's what I ended up with, skipping the %unique method:

```\$y = 2013;
(\$y = join('',sort(split(//,\$y)))) =~ tr/0-9//s;
print "unique digits: " .  length(\$y) . \$/;

I'm sure there's something smarter.

Replies are listed 'Best First'.
Re: Golf for unique digits
by BrowserUk (Pope) on Jan 09, 2013 at 11:40 UTC

```C:\test>perl -nlE"s[(.)(?=.*?\1)][]g;say length;"
1987
4
2013
4
2113
3
122398723456321467891356178653534
9
1111111111111111
1
121212121212121212121212
2

With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.
```perl -nlE"say 0+s/(.)(?!.*\1)//g"

- tye

This seems to work just as well?

```perl -nlE"say s/(.)(?!.*\1)//g"

With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.

tye++ ... but I'm stuck to understand how it works?

According to perlop:

Searches a string for a pattern, and if found, replaces that pattern with the replacement text and returns the number of substitutions made.

How does the number of substitutions made equate to the number of characters left after the substitutions?

With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.

.*? can be  .* saving one whole character!

And s[][] -> s/// for another :) Habits!

With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.
You can drop the final semicolon, too. How comes there are not two of them? :-)
لսႽ† ᥲᥒ⚪⟊Ⴙᘓᖇ Ꮅᘓᖇ⎱ Ⴙᥲ𝇋ƙᘓᖇ
Re: Golf for unique digits
by choroba (Archbishop) on Jan 09, 2013 at 11:31 UTC
```perl -E'\$y=2013;\$y=~/\$_/&&\$c++for 0..9;say\$c'
Update: and -> &&. Thanks space_monk.
لսႽ† ᥲᥒ⚪⟊Ⴙᘓᖇ Ꮅᘓᖇ⎱ Ⴙᥲ𝇋ƙᘓᖇ

Can you save a character by using && instead of and?

A Monk aims to give answers to those who have none, and to learn from those who know more.

```perl -E'\$y=2013;\$c+=\$y=~\$_ for 0..9;say\$c'
perl -E'\$y=2013;say~~map\$y=~\$_,0..9'

Yup, just answered my own question and got a birdie
``` perl -E '\$y=2013;\$y=~/\$_/&&\$c++for 0..9;say\$c'
A Monk aims to give answers to those who have none, and to learn from those who know more.
Re: Golf for unique digits
by davido (Cardinal) on Jan 10, 2013 at 09:34 UTC

Hmm, this doesn't beat tye's, but matches it, with a different technique. I wish I could find a way to shave a stroke using this method, but I think I've reached the dead end.

```perl -lnE'@h{/./g}--;say~~keys%h'

And this adaptation of tye's shaves a stroke:

```perl -lnE'say~~s/(.)(?!.*\1)//g'

Dave

This saves 2 strokes over yours:

```perl -plE"@h{/./g}++;\$_=keys%h"

And this saves 2 more over your version of tye's:

```perl -lpE'\$_=s/(.)(?!.*\1)//g'

With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.

```perl -plE"\@h{/./g};\$_=keys%h"

Re: Golf for unique digits
by LanX (Cardinal) on Jan 09, 2013 at 11:41 UTC
```> perl -E'\$_=2013;@h{split//}=();say 0+keys%h'
4

UPDATE: please ignore, breaks the rulez

Cheers Rolf

as a compensation a new approach: =)

```> perl -ple'\$_=join"",sort split//;y///cs;\$_=length'
1987
4
1988
3
2012
3
2013
4

EDIT: shortened the say away...

Cheers Rolf

Isn't this the %uniq method?
لսႽ† ᥲᥒ⚪⟊Ⴙᘓᖇ Ꮅᘓᖇ⎱ Ⴙᥲ𝇋ƙᘓᖇ
it is!

I oversaw the skipping the %unique method part... sorry! =)

Cheers Rolf

Re: Golf for unique digits
by space_monk (Chaplain) on Jan 09, 2013 at 11:47 UTC
choroba's method with ampersands and removing variable
```perl -E'2213=~/\$_/&&\$c++for 0..9;say\$c'