Determinar se todos os dígitos decimais são exclusivos


37

As perguntas excluídas no Stack Overflow às vezes são ótimas para o golfe.

Escreva uma função que use um número inteiro não negativo como entrada e retorne true se todos os dígitos na representação base 10 desse número forem únicos. Exemplo:

48778584 -> false
17308459 -> true

A contagem de caracteres inclui apenas a função.

Se você optar por responder em C ou C ++: sem macros, sem comportamento indefinido; comportamento definido pela implementação e avisos do compilador são bons.


Eu ainda estaria interessado em outras soluções C ou C ++ conforme a pergunta que inspirou esta.
Thomas

11
Por que não há macros C ou C ++ ou comportamento indefinido? Isso é estranhamente limitado a apenas dois idiomas.
dfeuer 14/04

Respostas:


31

Golfscript, 8 7 caracteres:

{`..&=}
  • ` - stringify o argumento
  • .. - clonar duas vezes
  • & - cruzar com ele mesmo (remover duplicatas)
  • = - verifique a igualdade.

se a função precisar ser nomeada (109 caracteres ):

{`..&=}:a

se um programa for suficiente (54 caracteres ):

..&=

5
A parte mais difícil de desafios como esse é ser o primeiro a vê-lo.
Primo 22/05

11
@primo ainda, de alguma forma, eles ainda recebem pontuação de +6 em meio dia.
John Dvorak

11
@JanDvorak A lei da trivialidade de Parkinson no trabalho
Claudiu

2
@ Claudiu Você pode entender a lei. Perceba que você está sendo submetido a isso. Em seguida, vote a resposta de qualquer maneira.
Cruncher 23/05

11
@NathanChere o que você quer dizer? a última (e única) vez em que a brecha foi sugerida caiu para -3 antes de ser excluída pelo sugerente na manhã seguinte. Se você não gostar das respostas golfscript, não faça voto positivo.
John Dvorak

24

Python 2 (28) (32)

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

Os backticks pegam a representação de string. A conversão em um conjunto remove as duplicatas e verificamos se isso diminui o comprimento comparando com 10 ^ d, que é maior que todos os números de dígitos d, mas nenhum número de dígitos (d + 1).

Código antigo:

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


11
Ha eu tinha exatamente essa mesma resposta pronta, basta substituir npori
Claudiu

11
@Claudiu eu também.f=lambda _:len(`_`)==len(set(`_`))
Oberon

Sim, com esses desafios de tamanho pequeno, todo mundo vai convergir praticamente na mesma coisa. Eu também estava tentando lambda n:max(map('n'.count,'n'))<2(as aspas simples são backticks), mas são dois caracteres a mais.
Xnor 21/05

16

APL (6)

≡∘∪⍨∘⍕

Uma das poucas vezes em que o estilo tácito também é mais curto no APL.

São 8 caracteres para dar um nome,

f←≡∘∪⍨∘⍕

mas isso não é necessário para usá-lo:

      ≡∘∪⍨∘⍕ 199
0
      ≡∘∪⍨∘⍕ 198
1
      f←≡∘∪⍨∘⍕
      f¨ 198 199 200 201
1 0 0 1
      ≡∘∪⍨∘⍕¨ 198 199 200 201
1 0 0 1

11
Eu acho que o segundo jot pode ser removido para torná-lo 5. Ainda seria uma função válida por si só (embora fosse necessário o parens de agrupamento para usá-lo com cada operador no último exemplo).
user46915

11

Perl, 19 caracteres

print<>!~/(\d).*\1/

supondo que a saída possa ser tratada como verdadeira e a não saída possa ser tratada como falsa, sua lógica será invertida. Você deve retornar true se não houver repetição.
John Dvorak

@JanDvorak Parece certo. Eu vou consertar isso.
Tal

Operador não-jogo: <>!~/(\d).*\1/.
Primo

@primo Obrigado! Tanto para aprender :)
Tal

3
A entrada é especificada como sendo um número inteiro não negativo, então não acho que você precise verificar isso. Se você realmente não, pode mudar \dpara ..
hvd 22/05

9

Rebmμ (10 caracteres)

e? AtsAuqA

O truque de "mushing" de Rebmu é que não diferencia maiúsculas de minúsculas, então os personagens são executados juntos. Sempre que uma transição de caso é atingida, ela se divide no próximo token. Ao usar transições em vez de um tipo de coisa do CamelCase, a escolha exclusiva para começar com uma corrida de capital significa que é feita uma "palavra-chave". (Embora as palavras-chave possam ser usadas para outros fins na programação simbólica, elas são avaliadas como atribuições por padrão).

Portanto, isso "remove" para:

e? a: ts a uq a

O espaço é necessário porque, uma vez iniciada uma série de execuções de casos alternativos, você não pode usar esse truque para obter uma palavra-chave após a primeira, a menos que comece uma nova execução. Então e?AtsAuqA, você teria conseguido e? a ts a uq a... nenhuma tarefa.

(Observação: pelo que pode não ser um motivo particularmente bom, eu tendem a preferir repensar as soluções para que não haja espaços, se a contagem de caracteres for igual. Como colchetes, parênteses e cadeias terminam implicitamente um símbolo ... geralmente há um justo número de oportunidades para isso.)

De qualquer forma, quando mapeado para o Rebol, abrevia:

equal? a: to-string a unique a

Entre alguns parênteses para ajudar a entender a essência da ordem de avaliação:

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

Portanto, o operador de igualdade de prefixo é aplicado a dois argumentos - o primeiro o resultado da atribuição ada versão da string em si e o segundo o resultado de uniqueser executado nessa string. Acontece que exclusivo retornará os elementos na mesma ordem em que você os passou ... o único "31214" é "3124", por exemplo.

Execute-o com:

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

Há também algumas estatísticas e informações de depuração:

>> 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

Se o requisito é que é necessário definir uma função nomeada / reutilizável, você pode criar uma "função A" que implícitamente aceita um parâmetro nomeado com a|. (Uma função B seria criada com b|um parâmetro chamado A e, em seguida, um chamado B). Então isso adicionaria mais cinco caracteres ... digamos que você chame a função "f"

Fa|[e? AtsAugA]

"Você ri! Eles riram de Einstein! Ou espere ... riram? Eu ... não sei."


Eu costumava pensar que o idioma era pronunciado como Reb moo, mas agora não tenho certeza se deveria ser Rebum mewou Reb mewou algo mais.
Justin

2
Depois de jogar Nethack, eu li Fa|[e? AtsAugA]comoFalse? SomeGibberish
Justin

@Quincunx srealmente decai [em Nethack?
John Dvorak

@JanDvorak Eu já vi algumas cartas decairem [depois de algum tempo
Justin

@ Quincunx Apenas brincando com o logotipo. Eu acho que REBmué provavelmente melhor. De qualquer maneira, a barba está firme ... ela aperta. Acho que você recebe o que paga.
Dr. Rebmu

7

FRACTRAN - 53 38 frações

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

Usa a divisão para contar o número de ocorrências de cada dígito. Chame colocando n no registro 2 e configurando o registro 5 para 1, produz saída no registro 3 (0 se falso, 1 se verdadeiro). Além disso, verifique se o restante do seu programa usa apenas registros> 71.


Edit 25/12/14: Faz 7 meses e desde então obtivemos Stack Snippets, então aqui está um para testar o código (usando meu intérprete que poderia ser melhor aqui ).

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>

Substitua 142857por outro número. A saída deve ser 3^1verdadeira, 1 = 3^0se falsa. Demora um pouco para números maiores (bem, isso é FRACTRAN ...).


6

JavaScript - 23 caracteres

Como uma função (ECMAScript 6):

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

Ou recebendo informações de um prompt (25 caracteres)

!/(.).*\1/.test(prompt())

6

C # 73 60 59

Primeiro golfe para mim ...

Escreva uma função que use um número inteiro não negativo como entrada

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

Poderia remover outro caractere convertendo uintpara int, mas prefiro interpretar a tarefa literalmente do que o contrário. Aqui vamos nós ...


11
Algumas opções:i => (i + "").Distinct().SequenceEqual(i + "");
NPSF3000

@ NPSF3000 Obrigado! Editou minha resposta. Eu tinha algo como isso em mente, mas tudo bem ... eu esqueci completamente de +""ligar por ToString()baixo do capô.
Num Lock

Uma interpretação mais literal de "número inteiro não negativo" sugere que um número inteiro assinado será passado, mas nunca será negativo.
Shaz 22/05

Bem, acho que ele estará ok então ...
Num Lock

Use C # 6 e você pode usar: bool f (int i) => (i + ""). Distinct (). SequenceEqual (i + ""); (53 bytes)
Stephan Schinkel

5

Ruby (24 bytes)

Use uma expressão regular para corresponder a "algum caractere, seguido por zero ou mais caracteres e, em seguida, o mesmo caractere".

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

Se valores verdadeiros ou falsos são aceitos, em vez de literais trueou false, obtemos 20 caracteres:

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

5

C (87)

Como não posso ganhar, vou buscar eficiência.

Código da função:

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;}

Ah, e como ainda não posso comentar nos posts de outras pessoas - gostaria de dizer que essa foi uma solução interessante, mesmo que imprecisa quando "transborda".
DreamWarrior 22/05

5

Mathematica, 35 25 caracteres

(27 se a função precisar de um nome.)

Unequal@@IntegerDigits@#&

EDIT: salvou 8 caracteres graças a belisarius!


Unequal @@ IntegerDigits@# &poderia fazer, eu acho
Dr. belisarius

@belisarius oh legal, eu estava procurando por algo assim, mas não consegui encontrá-lo (e não achei que o encadeado compararia elementos não adjacentes). Obrigado, isso reduz muito isso!
Martin Ender

Você não precisa dar um nome, certo? Unequal@@IntegerDigits@#&tem 25 caracteres.
Akater 23/05

@ Akater verdade, não consigo ver um requisito para o nome no desafio. Obrigado!
Martin Ender

5

R, 53 51 48 34 bytes

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

Experimente online!

Converta em uma string e divida. Converta em uma tabela de contagens menos 1, soma e negação

Inspirado no número mais comum, resposta de Alex e sugestão de Hugh.

Um casal salvou, graças a @plannapus Mais um de @Gregor E um casal de torná-lo uma função anônima

Agora, com um maravilhoso regex, graças a @ J.Doe. Ele procura por qualquer caractere único no número que corresponda a si mesmo, mais na cadeia. O greplcomando retorna uma lógica que é retornada. As expressões regulares do estilo Perl estão definidas como True.


Você também pode converter em sequência usando em paste0vez de toStringe salvar 2 caracteres.
plannapus

Você pode usar em pastevez de paste0salvar mais um caractere.
Gregor


@ J.Doe: ainda melhor! :)
digEmAll

Usou uma abordagem diferente. 35 bytes com regex.
precisa saber é

4

J (9)

Assume que o valor a ser testado é variável b (eu sei que isso pode ser transformado em uma função, mas não tenho idéia de como . J é confuso. Qualquer ajuda sobre isso é apreciada) Obrigado Marinus!

(-:~.)@":

Verifica se o comprimento da repetição de sequência do número com todas as duplicatas removidas é o mesmo que o comprimento da repetição de sequência regular.


Para uma função que você pode fazer (-:~.)@":.
Marinus

@ marinus Oh uau, isso é ainda mais curto do que eu pensava. Obrigado!
ɐɔıʇǝɥʇuʎs

Olá, encontrei e publiquei uma solução J mais curta: -: ~. &. ":
Galen Ivanov

4

R ( 70 , 60 , 53 , 52)

Obrigado a todos pelos comentários úteis! Seus comentários são incorporados na resposta.

### 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)

@ plannapus, você está certo. Fiquei confuso sobre "representação da base 10".
djhurio 22/05

11
Usando a tabela e comparando contra a 0 em vez de duplicado pode salvar alguns personagens
Dason

11
E acho que você pode deixar o parâmetro split sem nome. Estou no meu telefone assim não pode verificar facilmente, mas eu acredito que é o segundo parâmetro de strsplit assim que você poderia usar posicional em vez de argumentos nomeados para salvar caracteres
Dason

11
E já que você já pegou o primeiro elemento do resultado de strsplitpor que não forçar x a um personagem usando c(x,"")? f=function(x)all(table(strsplit(c(x,""),"")[[1]])<2)é 1 caractere mais curto :) #
plannapus

3

Mathematica (20 19)

(22 21 se a função precisar de um nome)

Max@DigitCount@#<2&

ou

Max@DigitCount@#|1&

onde | é inserido como [Esc] divide [Esc]


Agradável. Esqueci que o DigitCount existia e escrevi uma solução baseada na conversão em strings. O seu é muito melhor.
Michael Stern


2

C99, 59 caracteres

a(x){int r=1,f[10]={};for(;x;x/=10)r&=!f[x%10]++;return r;}

C99 não tem int implícito, tecnicamente.
PatrickB 21/05

11
Não apenas "tecnicamente", foi especificamente e intencionalmente removido. Este é um erro de sintaxe no C99 e, além de um diagnóstico necessário, os erros de sintaxe estão na mesma categoria que o comportamento indefinido (explicitamente desaprovado na pergunta): se uma implementação aceitar isso, o padrão não fará nenhum requisito quanto ao comportamento do programa.
hvd 22/05

2

Groovy (36 caracteres)

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

Testou usando:

println f(args[0].toInteger())

'false' pode ser jogado através de '1 == 0' ou possivelmente algo mais inteligente. Boa resposta
Michael Easter

@MichaelEaster 0>1é mais curto.
pastebin.com cortar 0mr8spkT

11
@ace Sim, embora 1 funciona também ...!
Michael Páscoa

@ace, MichaelEaster, thx pela ajuda :-)
Will Lp

@ WillP, como sugerido por MichaelEaster, use !1.
pastebin.com cortar 0mr8spkT

2

Haskell:

 import Data.List

 all ((== 1) . length) . group . sort . show

Um pouco atrasado para a festa, mas como você está importando de Data.Listqualquer maneira, eu sugiro nub, o que remove duplicatas de uma lista. (\x->nub x==x).show
Flonk 30/05

Você não usamos pl ...main = interact $ show . ap (==) nub . show
kazagistar


2

R, 66 65 caracteres

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

Separe os dígitos usando a divisão inteira e o módulo e verifique se estão duplicados.

Uso:

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

Ou, como sugeriu @MickyT, para 63 caracteres:

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

11
Você poderia usar em anyDuplicatedvez de sume duplicatedpor mais 2 #
MickyT 21/12/2014

2

C, 58 bytes

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

Pode manter um registro de até 7 dígitos idênticos antes de rolar.

no programa de teste (é mais fácil ver como ele funciona com a constante em 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));}

Se você tem um grande poder de 2 à mão, a constante pode ser calculada como f&(1<<30)/7*6


Acho que o comentário do @xfix foi destinado ao meu post em vez do seu? Você realmente não usou int main(int)sua resposta ...
pastebin.com slash 0mr8spkT

Ter informações externas que não contam para o código byte / char count obviamente não é permitido. Eu sugiro que você remova a primeira versão (53 bytes).
2501

Por favor, veja meu comentário no resumo da edição .
2501

Votei em rejeitar a edição, mas concordo que as contagens parecem incorretas. Eu faço 67 e 63 (61).
Peter Taylor

Minha edição foi rejeitada por outros usuários. Por favor, reavalie-o.
2501


1

Javascript 73 caracteres

function f(n){return !~(n+'').split('').sort().join('').search(/(\d)\1/)}

1

Entre 98, 17 bytes

Esta é uma resposta não concorrente porque o Befunge não possui funções.

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

Imprime a 1se os dígitos do número forem todos únicos; caso contrário, apenas termina.

Isso funciona acessando uma célula no espaço Funge cuja xcoordenada é o valor ASCII do caractere inserido (recebe o caractere de entrada por caractere) e cuja ycoordenada é 1. Se o dígito não foi visto antes, o valor da célula é 32(caractere de espaço). Se for assim, defino o valor como 1.

Como bônus, isso também funciona para não-números.



1

Perl 6 (19 bytes)

{.comb.uniq==.comb}

.combdivide uma string em caracteres (por exemplo, 42.combgive "4", "2"). .uniqremove todos os caracteres não exclusivos. .combcaracteres na string (originalmente eu usei .chars, mas .combé mais curto). ==converte listas em um número de elementos e compara os números. Quando .é usado sem objeto antes, $_o parâmetro de função padrão é assumido. {}são literais de função.


1

C, 76

Não é nem perto de ganhar, mas vou publicá-lo de qualquer maneira apenas para mostrar uma abordagem alternativa.

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

Imprime uma nova linha se falsa, imprime nada se for verdadeira.


Este programa tem um comportamento indefinido. As assinaturas corretas para main são int main(int, char **)ou int main(void). int main(int)não é válido.
Konrad Borowski

@ xfix Presumo que main()está ok, então?
pastebin.com cortar 0mr8spkT

Sim está bom. Significa o mesmo que main(void)(quando usado na definição, na declaração declara uma função com lista de parâmetros desconhecida).
Konrad Borowski

1

POSIX sh e egrep ( 47 , 43 , 40)

f()([ ! `echo $1|egrep '([0-9]).*\1'` ])
  • [-1 char]: use em !vez de -zcom test- Obrigado DigitalTrauma
  • [-1 char]: use em `CODE`vez de $(CODE)- Obrigado DigitalTrauma
  • [-2 caracteres]: use em fold -1vez de grep -o .1 - Obrigado DigitalTrauma.
  • [-3 caracteres]: verifique se há dígitos repetidos com uma expressão regular com referência anterior.

Se a conformidade com POSIX não for importante, echo PARAM |pode ser substituída por <<<PARAM, reduzindo o comprimento das funções para 37 :

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

Uso:

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

1 A fold -Nnotação foi descontinuada em algumas versões do fold.


f()(! [ `fold -1<<<$1|sort|uniq -d` ])até 38 pela minha contagem
Digital Trauma

@DigitalTrauma: Coisas boas, obrigado por compartilhar. Acho que o comando testado deve ser citado; caso contrário, testele resmunga quando uniq -dretorna mais de uma linha. Portanto, a versão mais curta não-POSIX tem 40 caracteres. Eu sei da [ !notação, mas estou surpreso que ! [também funcione, você sabe por que isso acontece?
Thor

Ah, eu estava usando o bash. Então, acho que é mais longo se você deseja conformidade com POSIX.
Digital Trauma

1

Java ( 131 59 57)

57 caracteres:

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

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

59 caracteres (funciona também com números negativos!):

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

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

Use o loop for para salvar alguns caracteres e use int como uma matriz booleana.

Use & em vez de && para salvar 1 caractere (o Java permite).

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 caracteres (retorna verdadeiro para números negativos):

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;}

com comentários:

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
}

E a resposta é tecnicamente correta (a contagem de caracteres inclui apenas a função, não variáveis ​​globais), mas acho que é trapaça, 29 caracteres:

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

m [] é uma matriz booleana que contém respostas corretas para todos os números inteiros de 32 bits.


"^.*(.).*\\1.*$"Você pode largar ^e $. Eles estão implícitos emmatches()
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̷̨̰́̀ĥ̷̷̳̰̀ĥ̷̳

A segunda abordagem pode ser feita usando 10 bits em um int como uma matriz booleana, o que eliminará a necessidade da tabela principal.
n̴̖̋h̷͉a̷̭̿h̸̡̅ẗ̵̨d̷̰ĥ̷̳

Sei que já faz três anos, mas se você remover o espaço return!na resposta mais curta, poderá chegar a 56 bytes.
Kevin Cruijssen
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.