Определите, все ли десятичные цифры уникальны

37

Удаленные вопросы о переполнении стека иногда создают отличный материал для гольфа.

Напишите функцию, которая принимает неотрицательное целое число в качестве входных данных и возвращает true, если все цифры в базовом 10 представлении этого числа являются уникальными. Пример:

48778584 -> false
17308459 -> true

Количество символов включает только функцию.

Если вы решите ответить на C или C ++: нет макросов, нет неопределенного поведения; Поведение, определяемое реализацией, и предупреждения компилятора - это нормально.

Томас
источник
Я все еще был бы заинтересован в других решениях на C или C ++ в соответствии с этим вопросом
Томас
1
Почему нет макросов C или C ++ или неопределенного поведения? Это странно ограничивает только два языка.
dfeuer

Ответы:

31

Golfscript, 8 7 символов:

{`..&=}
  • ` - приведите аргумент в соответствие
  • .. - клонировать дважды
  • & - пересекаются с собой (удаляют дубликаты)
  • = - проверить на равенство.

если функция должна быть названа (109 символов ):

{`..&=}:a

если программа достаточна (54 символа ):

..&=
Джон дворак
источник
5
Самое сложное в таких вызовах - увидеть это первыми.
Примо
1
@ primo, так или иначе, они все еще получают +6 баллов в течение полдня.
Джон Дворжак
1
@JanDvorak закон тривиальности Паркинсона на работе
Клавдиу
2
@Claudiu Вы можете понять закон. Поймите, что вы подвергаетесь этому. Тогда все равно ответь.
Cruncher
1
@NathanChere что ты имеешь в виду? в последний (и единственный) раз, когда лазейке предлагалось, она упала до -3, а на следующее утро ее удалитель. Если вам не нравятся ответы на сценарии, не произносите их.
Джон Дворак
24

Python 2 (28) (32)

lambda n:10**len(set(`n`))>n

Обратные черты принимают строковое представление. Преобразование в набор удаляет дубликаты, и мы проверяем, уменьшает ли это длину, сравнивая с 10 ^ d, которое больше, чем все d-значные числа, но не (d + 1) -значные числа.

Старый код:

lambda n:len(set(`n`))==len(`n`)

XNOR
источник
1
Если бы у меня был точно такой же готовый ответ, просто замени nнаi
Клавдиу
1
@ Клаудиу, я тоже.f=lambda _:len(`_`)==len(set(`_`))
Оберон
Да, с этими проблемами размера укуса, все собираются сходиться во многом в одном и том же. Я тоже пытался lambda n:max(map('n'.count,'n'))<2(одинарные кавычки - обратные кавычки), но это на два символа длиннее.
xnor
16

APL (6)

≡∘∪⍨∘⍕

Один из немногих случаев, когда молчаливый стиль укорочен и в APL.

Это 8 символов, чтобы дать ему имя,

f←≡∘∪⍨∘⍕

но это не обязательно использовать его:

      ≡∘∪⍨∘⍕ 199
0
      ≡∘∪⍨∘⍕ 198
1
      f←≡∘∪⍨∘⍕
      f¨ 198 199 200 201
1 0 0 1
      ≡∘∪⍨∘⍕¨ 198 199 200 201
1 0 0 1
Мэринус
источник
1
Я думаю, что второй jot может быть удален, чтобы сделать его 5. Он все еще был бы допустимой функцией сам по себе (хотя для этого потребовалось бы объединить парены, чтобы использовать его с каждым оператором в последнем примере).
user46915
11

Perl, 19 символов

print<>!~/(\d).*\1/
Tal
источник
Предполагая, что выходные данные могут рассматриваться как истина, а отсутствие вывода может рассматриваться как ложное, ваша логика меняется на противоположную. Вы должны вернуть истину, если нет повторения.
Джон Дворжак
@JanDvorak Звучит правильно. Я исправлю это.
Тал
Оператор Not-матч: <>!~/(\d).*\1/.
Примо
@ primo Спасибо! Так много, чтобы учиться :)
Тал
3
Входные данные указаны как неотрицательное целое число, поэтому я не думаю, что вам нужно это проверять. Если вы действительно этого не сделаете, вы можете изменить \dна ..
HVd
9

Rebmμ (10 символов)

e? AtsAuqA

Хитрость Ребму в том, что он не учитывает регистр, поэтому персонажи работают вместе. Всякий раз, когда дело переход к регистру, он разделяется на следующий токен. Используя переходы вместо вещей типа CamelCase, уникальный выбор, чтобы начать с капитального прогона, означает, что «заданное слово» сделано. (Хотя заданные слова могут использоваться для других целей в символьном программировании, по умолчанию они оцениваются как назначения).

Так что это "размешивает", чтобы:

e? a: ts a uq a

Это пространство необходимо, потому что после того, как вы начали серию циклов чередующихся вариантов, вы не можете использовать этот трюк, чтобы получить сет-слово после первого, если не начнете новый цикл. Так e?AtsAuqAбы получил тебяe? a ts a uq a ... без назначения.

(Примечание: по какой-то не очень веской причине я предпочитаю переосмыслить решения, чтобы не было пробелов, если количество символов одинаково. Так как скобки, скобки и строки неявно заканчивают символ ... часто встречаются количество возможностей для этого.)

В любом случае, когда сопоставляется с Rebol, он сокращается:

equal? a: to-string a unique a

Добавьте несколько скобок, чтобы понять суть порядка оценки:

equal? (a: (to-string a)) (unique a)

Таким образом, оператор равенства префикса применяется к двум аргументам: первый - результат присваивания aстроковой версии самого себя, а второй - результат uniqueзапуска этой строки. Бывает так, что unique вернет вам элементы в том же порядке, в котором вы их передали ... так что уникальным для "31214" является, например, "3124".

Запустите это с:

>> rebmu/args "e? AtsAuqA" 17308459             
== true

Там также немного статистики и отладочной информации:

>> rebmu/args/stats/debug "e? AtsAuqA" 48778584 
Original Rebmu string was: 10 characters.
Rebmu as mushed Rebol block molds to: 10 characters.
Unmushed Rebmu molds to: 15 characters.
Executing: [e? a: ts a uq a]
== false

Если требуется, чтобы была определена именованная / повторно используемая функция, вы можете создать «A-функцию», которая неявно принимает параметр с именем a a|. (B-функция будет создана с b|использованием параметра с именем A, затем с именем B). Так что это добавит еще пять символов ... скажем, вы вызываете функцию "F"

Fa|[e? AtsAugA]

"Ты смеешься! Они смеялись над Эйнштейном! Или подожди ... не так ли? Я ... не знаю".

Доктор Ребму
источник
Раньше я думал , язык был объявлен как Reb moo, но теперь я не уверен , что это должно быть Rebum mewили Reb mewили что - то другое.
Джастин
2
После игры в Nethack я прочитал Fa|[e? AtsAugA]какFalse? SomeGibberish
Джастин
@ Quincunx sдействительно разваливается [в Nethack?
Джон Дворжак
@JanDvorak Я видел, как некоторые буквы распадаются [через некоторое время
Джастин
@Quincunx Просто играю с логотипом. Я думаю REBmu, вероятно, лучше. В любом случае, борода тугая ... она сдавливает. Думаю, вы получаете то, за что платите.
Доктор Ребму
7

ФРАКТРАН - 53 38 фракций

47/10 3/5 106/47 3599/54272 53/61 2881/27136 2479/13568 2077/6784 1943/3392 1541/1696 1273/848 1139/424 871/212 737/106 469/53 142/3953 67/71 5/67 1/147 1/363 1/507 1/867 1/1083 1/1587 1/2523 1/2883 1/4107 1/5547 1/7 1/11 1/13 1/17 1/19 1/23 1/29 1/31 1/37 1/43

Использует деление для подсчета количества вхождений каждой цифры. Вызов, поместив n в регистр 2 и установив регистр 5 в 1, выдаст выходной сигнал в регистр 3 (0, если false, 1, если true). Также убедитесь, что остальная часть вашей программы использует только регистры> 71.


Edit 25/12/14: Прошло 7 месяцев, и с тех пор мы получили фрагменты стека, так что вот один из них, чтобы проверить код (используя мой, возможно, лучший интерпретатор здесь ).

var ITERS_PER_SEC=1E5;var TIMEOUT_MILLISECS=5E3;var ERROR_INPUT="Invalid input";var ERROR_PARSE="Parse error: ";var ERROR_TIMEOUT="Timeout";var ERROR_INTERRUPT="Interrupted by user";var running,instructions,registers,timeout,start_time,iterations;function clear_output(){document.getElementById("output").value="";document.getElementById("stderr").innerHTML=""};function stop(){running=false;document.getElementById("run").disabled=false;document.getElementById("stop").disabled=true;document.getElementById("clear").disabled=false}function interrupt(){error(ERROR_INTERRUPT)}function error(msg){document.getElementById("stderr").innerHTML=msg;stop()}function factorise(n){var factorisation={};var divisor=2;while(n>1){if(n%divisor==0){var power=0;while(n%divisor==0){n/=divisor;power+=1}if(power!=0)factorisation[divisor]=power}divisor+=1}return factorisation};function fact_accumulate(fact1,fact2){for(var reg in fact2)if(reg in fact1)fact1[reg]+=fact2[reg];else fact1[reg]=fact2[reg];return fact1};function exp_to_fact(expression){expression=expression.trim().split(/\s*\*\s*/);var factorisation={};for(var i=0;i<expression.length;++i){var term=expression[i].trim().split(/\s*\^\s*/);if(term.length>2)throw"error";term[0]=parseInt(term[0]);if(isNaN(term[0]))throw"error";if(term.length==2){term[1]=parseInt(term[1]);if(isNaN(term[1]))throw"error";}if(term[0]<=1)continue;var fact_term=factorise(term[0]);if(term.length==2)for(var reg in fact_term)fact_term[reg]*=term[1];factorisation=fact_accumulate(factorisation,fact_term)}return factorisation}function to_instruction(n,d){instruction=[];divisor=2;while(n>1||d>1){if(n%divisor==0||d%divisor==0){reg_offset=0;while(n%divisor==0){reg_offset+=1;n/=divisor}while(d%divisor==0){reg_offset-=1;d/=divisor}if(reg_offset!=0)instruction.push(Array(divisor,reg_offset))}divisor+=1}return instruction};function run(){clear_output();document.getElementById("run").disabled=true;document.getElementById("stop").disabled=false;document.getElementById("clear").disabled=true;timeout=document.getElementById("timeout").checked;var code=document.getElementById("code").value;var input=document.getElementById("input").value;instructions=[];code=code.trim().split(/[\s,]+/);for(i=0;i<code.length;++i){fraction=code[i];split_fraction=fraction.split("/");if(split_fraction.length!=2){error(ERROR_PARSE+fraction);return}numerator=parseInt(split_fraction[0]);denominator=parseInt(split_fraction[1]);if(isNaN(numerator)||isNaN(denominator)){error(ERROR_PARSE+fraction);return}instructions.push(to_instruction(numerator,denominator))}try{registers=exp_to_fact(input)}catch(err){error(ERROR_INPUT);return}running=true;iterations=0;start_time=Date.now();fractran_iter(1)};function regs_to_string(regs){reg_list=Object.keys(regs);reg_list.sort(function(a,b){return a-b});out_str=[];for(var i=0;i<reg_list.length;++i)if(regs[reg_list[i]]!=0)out_str.push(reg_list[i]+"^"+regs[reg_list[i]]);out_str=out_str.join(" * ");if(out_str=="")out_str="1";return out_str};function fractran_iter(niters){if(!running){stop();return}var iter_start_time=Date.now();for(var i=0;i<niters;++i){program_complete=true;for(var instr_ptr=0;instr_ptr<instructions.length;++instr_ptr){instruction=instructions[instr_ptr];perform_instr=true;for(var j=0;j<instruction.length;++j){var reg=instruction[j][0];var offset=instruction[j][1];if(registers[reg]==undefined)registers[reg]=0;if(offset<0&&registers[reg]<-offset){perform_instr=false;break}}if(perform_instr){for(var j=0;j<instruction.length;++j){var reg=instruction[j][0];var offset=instruction[j][1];registers[reg]+=offset}program_complete=false;break}}if(program_complete){document.getElementById("output").value+=regs_to_string(registers);stop();return}iterations++;if(timeout&&Date.now()-start_time>TIMEOUT_MILLISECS){error(ERROR_TIMEOUT);return}}setTimeout(function(){fractran_iter(ITERS_PER_SEC*(Date.now()-iter_start_time)/1E3)},0)};
<div style="font-size:12px;font-family:Verdana, Geneva, sans-serif;"><div style="float:left; width:50%;">Code:<br><textarea id="code" rows="4" style="overflow:scroll;overflow-x:hidden;width:90%;">47/10 3/5 106/47 3599/54272 53/61 2881/27136 2479/13568 2077/6784 1943/3392 1541/1696 1273/848 1139/424 871/212 737/106 469/53 142/3953 67/71 5/67 1/147 1/363 1/507 1/867 1/1083 1/1587 1/2523 1/2883 1/4107 1/5547 1/7 1/11 1/13 1/17 1/19 1/23 1/29 1/31 1/37 1/43</textarea><br>Input:<br><textarea id="input" rows="2" style="overflow:scroll;overflow-x:hidden;width:90%;">2^142857 * 5</textarea><p>Timeout:<input id="timeout" type="checkbox" checked="true"></input></p></div><div style="float:left; width:50%;">Output:<br><textarea id="output" rows="6" style="overflow:scroll;width:90%;"></textarea><p><input id="run" type="button" value="Run" onclick="run()"></input><input id="stop" type="button" value="Stop" onclick="interrupt()" disabled="true"></input><input id="clear" type="button" value="Clear" onclick="clear_output()"></input>&nbsp;<span id="stderr" style="color:red"></span></p></div></div>

Заменить 142857на другой номер. Вывод должен быть, 3^1если истина, 1 = 3^0если ложь. Принимает некоторое время для больших чисел (ну, это является FRACTRAN ...).

Sp3000
источник
6

JavaScript - 23 символа

Как функция (ECMAScript 6):

f=x=>!/(.).*\1/.test(x)

Или принимая ввод из приглашения (25 символов)

!/(.).*\1/.test(prompt())
mt0
источник
6

C # 73 60 59

Первый гольф для меня ...

Напишите функцию, которая принимает неотрицательное целое число в качестве входных данных

bool f(int i){return(i+"").Distinct().SequenceEqual(i+"");}

Может лишить другого персонажа путем конвертации uintв int, но я скорее воспринимаю задачу слишком буквально, чем наоборот. Вот так ...

Num Lock
источник
1
Некоторые варианты:i => (i + "").Distinct().SequenceEqual(i + "");
NPSF3000
@ NPSF3000 Спасибо! Отредактировал мой ответ. У меня было что-то подобное в голове, ну да ладно ... Я совсем забыл о +""вызове ToString()под капот.
Num Lock
Более буквальное толкование «неотрицательного целого» предполагает, что целое число со знаком будет передано, но оно никогда не будет отрицательным.
Shaz
Ну, я думаю, тогда все будет хорошо ...
Num Lock
Используйте C # 6, и вы можете использовать: bool f (int i) => (i + ""). Distinct (). SequenceEqual (i + ""); (53 байта)
Стефан Шинкель
5

Рубин (24 байта)

Используйте регулярное выражение для соответствия «некоторый символ, за которым следует ноль или более символов, затем тот же символ».

->(s){!!(s !~/(.).*\1/)}

Если допустимые или ложные значения принимаются, а не литеральные trueили false, то мы получаем 20 символов:

->(s){s !~/(.).*\1/}
Джон Феминелла
источник
5

С (87)

Поскольку я не могу победить, я пойду на эффективность.

Код функции:

int u(uint32_t d){short s=0,f;while(d){f=1<<d%10;if(s&f)return 0;s|=f;d/=10;}return 1;}
DreamWarrior
источник
Да, и поскольку я до сих пор не могу комментировать посты других людей, я бы хотел сказать, что это было аккуратное решение, даже если оно неточное, когда оно «переполняется».
DreamWarrior
5

Mathematica, 35 25 символов

(27, если функции нужно имя.)

Unequal@@IntegerDigits@#&

РЕДАКТИРОВАТЬ: спас 8 символов благодаря Велисарию!

Мартин Эндер
источник
Unequal @@ IntegerDigits@# &мог бы сделать, я думаю
д-р Велизарий
@belisarius о, хорошо, я искал что-то подобное, но не мог найти его (и не думал, что цепочка будет сравнивать несмежные элементы). Спасибо, это сильно укорачивает!
Мартин Эндер
Вам не нужно давать ему имя, верно? Unequal@@IntegerDigits@#&25 символов.
акат
@Akater правда, я не вижу требования к имени в конкурсе. Благодарность!
Мартин Эндер
5

R, 53 51 48 34 байта

function(n)!grepl("(.).*\\1",n,,T)

Попробуйте онлайн!

Преобразовать в строку и разделить. Преобразовать в таблицу отсчетов минус 1, сумма и отрицание

Вдохновленный Самым распространенным ответом числа Алексом и предложением Хью.

Пара спасена, благодаря @plannapus Еще один от @Gregor И пара, сделав это анонимной функцией

Теперь с замечательным отличием регулярных выражений благодаря @ J.Doe. Это ищет любой символ в номере, который совпадает с другим, где в строке. Команда greplвозвращает логическое значение, которое затем возвращается. Регулярные выражения в стиле Perl установлены в True.

MickyT
источник
You can also convert to string using paste0 instead of toString and save 2 characters.
plannapus
You can use paste instead of paste0 to save one more character.
Gregor
@J.Doe: even better ! :)
digEmAll
Used a different approach. 35 bytes with regex.
J.Doe
4

J (9)

Assumes the value to be tested is in variable b (I know this can be made into a function, but don't have a clue on how. J is confusing. Any help on this is appreciated) Thanks Marinus!

(-:~.)@":

Checks if the lenght of the string rep of the number with all the duplicates removed is the same as the lenght of the regular string rep.

ɐɔıʇǝɥʇuʎs
источник
For a function you can do (-:~.)@":.
marinus
@marinus Oh wow, that's even shorter than I thought. Thanks!
ɐɔıʇǝɥʇuʎs
HI, I found and posted a shorter J solution: -:~.&.":
Galen Ivanov
4

R (70, 60, 53, 52)

Thank you all for the useful comments! Your comments are incorporated in the answer.

### Version 70 chars
f=function(x)!any(duplicated(strsplit(as.character(x),split="")[[1]]))

### Version 60 chars
f=function(x)all(table(strsplit(as.character(x),"")[[1]])<2)

### Version 53 chars
f=function(x)all(table(strsplit(paste(x),"")[[1]])<2)

### Version 52 chars
f=function(x)all(table(strsplit(c(x,""),"")[[1]])<2)

f(48778584)
f(17308459)
djhurio
источник
@plannapus, you are right. I got confused about "base 10 representation".
djhurio
1
Using table and comparing against 0 instead of duplicated might save some characters
Dason
1
And I think you could leave the split parameter unnamed. I'm just on my phone so can't check easily but I believe it is the second parameter of strsplit so you could use positional instead of named arguments to save characters
Dason
1
And since you already take the first element of the result of strsplit why not coercing x to a character using c(x,"")? f=function(x)all(table(strsplit(c(x,""),"")[[1]])<2) is 1 character shorter :)
plannapus
3

Mathematica (20 19)

(22 21 if function needs a name)

Max@DigitCount@#<2&

or

Max@DigitCount@#|1&

where | ist entered as [Esc]divides[Esc]

branislav
источник
Nice. I forgot DigitCount existed, and wrote a solution based on conversion to strings. Yours is much better.
Michael Stern
2

C99, 59 chars

a(x){int r=1,f[10]={};for(;x;x/=10)r&=!f[x%10]++;return r;}
Thomas
источник
C99 doesn't have implicit int, technically.
PatrickB
1
Not just "technically", it was specifically and intentionally removed. This is a syntax error in C99, and aside from a required diagnostic, syntax errors are in the same category as undefined behaviour (explicitly disallowed in the question): if an implementation accepts this, the standard makes no requirements whatsoever about the program's behaviour.
hvd
2

Groovy (36 chars)

f={s="$it" as List;s==s.unique(!1)}

Tested it using:

println f(args[0].toInteger())
Will Lp
источник
'false' can be golfed via '1==0' or possibly something more clever. Good answer
Michael Easter
@MichaelEaster 0>1 is shorter.
pastebin.com slash 0mr8spkT
1
@ace Yes, though !1 works too...
Michael Easter
@ace, MichaelEaster, thx for the help :-)
Will Lp
@WillP as suggested by MichaelEaster, use !1 instead.
pastebin.com slash 0mr8spkT
2

Haskell:

 import Data.List

 all ((== 1) . length) . group . sort . show
Paul Johnson
источник
A little late to the party, but since you're importing Data.List anyway I'd suggest nub, which removes duplicates from a List. (\x->nub x==x).show
Flonk
You didnt use pl... main = interact $ show . ap (==) nub . show
kazagistar
2

J (8)

Competely sepertae from my previous answer.

*/@~:@":
ɐɔıʇǝɥʇuʎs
источник
2

R, 66 65 characters

f=function(x)!sum(duplicated((x%%10^(i<-1:nchar(x)))%/%10^(i-1)))

Separate the digits using integer division and modulo, then check if they are duplicates.

Usage:

> f(48778584)
[1] FALSE
> f(17308459)
[1] TRUE

Or, as @MickyT suggested, for 63 characters:

f=function(x)!anyDuplicated((x%%10^(i<-1:nchar(x)))%/%10^(i-1))
plannapus
источник
1
You could use anyDuplicated rather than sum and duplicated for 2 more
MickyT
2

C, 58 bytes

f;a(x){for(f=0;x;x/=10)f+=1<<x%10*3;return!(f&920350134);}

Can keep a tally of up to 7 identical digits before rolling over.

in test program (it's easier to see how it works with the constant in octal)

a(x){int f=0;for(;x;x/=10)f+=1<<x%10*3;return!(f&06666666666);}

main(){
scanf("%d",&r);
printf("%o\n",a(r));}

If you happen to have a large power of 2 handy the constant can be calculated like f&(1<<30)/7*6

Level River St
источник
I think the comment by @xfix was intended for my post instead of yours? You didn't actually used int main(int) in your answer...
pastebin.com slash 0mr8spkT
Having external information that doesn't count towards the code byte/char count is obviously not allowed. I suggest you remove the first version (53 bytes).
2501
Please see my comment in the edit summary.
2501
I voted to reject the edit, but I agree that the counts look wrong. I make them 67 and 63 (61).
Peter Taylor
My edit was rejected by other users. Please re-evaluate it.
2501
1

Javascript 73 chars

function f(n){return !~(n+'').split('').sort().join('').search(/(\d)\1/)}
pllee
источник
1

Befunge 98, 17 bytes

This is a non-competing answer because Befunge does not have functions.

~:1g1`j@1\1p3j@.1

Prints a 1 if the number's digits are all unique; otherwise, it just ends.

This works by accessing a cell in the Funge space whose x coordinate is the ASCII value of the character inputted (takes input character by character) and whose y coordinate is 1. If the digit has not been seen before, the value of the cell is 32 (space character). If that is so, I set the value to 1.

As a bonus, this works for non-numbers as well.

Justin
источник
1

Perl 6 (19 bytes)

{.comb.uniq==.comb}

.comb splits a string into characters (for example, 42.comb gives "4", "2"). .uniq removes all non-unique characters. .comb characters in string (originally I used .chars, but .comb is shorter). == converts lists into number of elements in it, and compares the numbers. When . is used without object before, $_ which is default function parameter is assumed. {} are function literals.

Konrad Borowski
источник
1

C, 76

This is no where near winning, but I'll post it anyway just to show an alternative approach.

c;i;a[99];main(){while(~(c=getchar()))a[c]++;for(;i<99;)a[i++]>1&&puts("");}

Prints a new line if false, prints nothing if true.

pastebin.com slash 0mr8spkT
источник
This program has an undefined behavior. The correct signatures for main are int main(int, char **) or int main(void). int main(int) is not valid.
Konrad Borowski
@xfix I assume main() is ok then?
pastebin.com slash 0mr8spkT
Yes, it's fine. It means the same thing as main(void) (when used in definition, in declaration it declares a function with unknown parameter list).
Konrad Borowski
1

POSIX sh and egrep (47, 43, 40)

f()([ ! `echo $1|egrep '([0-9]).*\1'` ])
  • [-1 char]: Use ! instead of -z with test - Thanks DigitalTrauma
  • [-1 char]: Use `CODE` instead of $(CODE) - Thanks DigitalTrauma
  • [-2 chars]: Use fold -1 instead of grep -o .1 - Thanks DigitalTrauma.
  • [-3 chars]: Check for repeated digits with a backreferenced regular expression.

If POSIX compliance is not important echo PARAM | can be replaced by <<<PARAM, reducing the functions length to 37:

f()([ ! `egrep '([0-9]).*\1'<<<$1` ])

Usage:

$ if f 48778584; then echo true; else echo false; fi
false
$ if f 17308459; then echo true; else echo false; fi
true

1 The fold -N notation is deprecated in some versions of fold.

Thor
источник
f()(! [ `fold -1<<<$1|sort|uniq -d` ]) down to 38 by my count
Digital Trauma
@DigitalTrauma: Good stuff thanks for sharing. I find that the tested command must be quoted, otherwise test croaks on it when uniq -d returns more than one line. So the shortest non-POSIX version is 40 characters. I know about the [ ! notation, but I am suprised that ! [ also works, do you know why that is?
Thor
Ah I was using bash. So I guess its longer if you want POSIX conformance.
Digital Trauma
1

Java ( 131 59 57)

57 characters:

removed ^ and $ as @n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ suggested

boolean u(int n){return !(n+"").matches(".*(.).*\\1.*");}

59 characters (works also with negative numbers!):

boolean u(int n){return !(n+"").matches("^.*(.).*\\1.*$");}

79 78 characters (thanks @n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ ):

Use for loop to save a few charachers and use int as a boolean array.

Use & instead of && to save 1 character (It turns out that java allows it).

boolean u(int n){for(int x=0;n>0&(x>>n%10&1)==0;n/=10)x|=1<<n%10;return n==0;}

131 characters (returns true for negative numbers):

boolean u(int n){int[] p=new int[]{2,3,5,7,11,13,17,19,32,29};double a=9001312320D;while(n>0){a/=p[n%10];n/=10;}return (long)a==a;}

with comments:

boolean unique(int n){
    int[] p=new int[]{2,3,5,7,11,13,17,19,32,29};//list of 10 first primes
    double a=9001312320D;//10 first primes multiplied
    while(n>0){
        a/=p[n%10];//divide by (n%10+1)th prime
        n/=10;//divide n by 10, next digit
    }
    return (long)a==a;//if a is integer then n has all digits unique
}

And answer that is technically correct (character count includes only the function, not global variables), but I think it's cheating, 29 characters:

boolean u(int i){return m[i];}

m[] is boolean array that contains correct answers for all 32-bit integers.

barteks2x
источник
"^.*(.).*\\1.*$" You can drop ^ and $. They are implied by matches()
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳
The 2nd approach can be done by using 10 bits in an int as a boolean array, which will eliminate the need for the prime table.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳
I know it's been three years, but if you remove the space between return! in the shortest answer, you can get to 56 bytes.
Kevin Cruijssen