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.
Respostas:
Golfscript,
87 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 ):se um programa for suficiente (
54 caracteres ):fonte
Python 2 (28)
(32)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:
fonte
n
pori
f=lambda _:len(`_`)==len(set(`_`))
lambda n:max(map('n'.count,'n'))<2
(as aspas simples são backticks), mas são dois caracteres a mais.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,
mas isso não é necessário para usá-lo:
fonte
Perl, 19 caracteres
fonte
<>!~/(\d).*\1/
.\d
para.
.Rebmμ (10 caracteres)
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:
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 conseguidoe? 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:
Entre alguns parênteses para ajudar a entender a essência da ordem de avaliação:
Portanto, o operador de igualdade de prefixo é aplicado a dois argumentos - o primeiro o resultado da atribuição
a
da versão da string em si e o segundo o resultado deunique
ser 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:
Há também algumas estatísticas e informações de depuração:
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 comb|
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""Você ri! Eles riram de Einstein! Ou espere ... riram? Eu ... não sei."
fonte
Reb moo
, mas agora não tenho certeza se deveria serRebum mew
ouReb mew
ou algo mais.Fa|[e? AtsAugA]
comoFalse? SomeGibberish
s
realmente decai[
em Nethack?REBmu
é provavelmente melhor. De qualquer maneira, a barba está firme ... ela aperta. Acho que você recebe o que paga.FRACTRAN -
5338 fraçõesUsa 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 ).
Substitua
142857
por outro número. A saída deve ser3^1
verdadeira,1 = 3^0
se falsa. Demora um pouco para números maiores (bem, isso é FRACTRAN ...).fonte
JavaScript - 23 caracteres
Como uma função (ECMAScript 6):
Ou recebendo informações de um prompt (25 caracteres)
fonte
C #
736059Primeiro golfe para mim ...
Poderia remover outro caractere convertendoAqui vamos nós ...uint
paraint
, mas prefiro interpretar a tarefa literalmente do que o contrário.fonte
i => (i + "").Distinct().SequenceEqual(i + "");
+""
ligar porToString()
baixo do capô.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".
Se valores verdadeiros ou falsos são aceitos, em vez de literais
true
oufalse
, obtemos 20 caracteres:fonte
C (87)
Como não posso ganhar, vou buscar eficiência.
Código da função:
fonte
Mathematica,
3525 caracteres(27 se a função precisar de um nome.)
EDIT: salvou 8 caracteres graças a belisarius!
fonte
Unequal @@ IntegerDigits@# &
poderia fazer, eu acho≠
compararia elementos não adjacentes). Obrigado, isso reduz muito isso!Unequal@@IntegerDigits@#&
tem 25 caracteres.R,
53514834 bytesExperimente online!
Converta em uma string e divida. Converta em uma tabela de contagens menos 1, soma e negaçãoInspirado 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
grepl
comando retorna uma lógica que é retornada. As expressões regulares do estilo Perl estão definidas como True.fonte
paste0
vez detoString
e salvar 2 caracteres.paste
vez depaste0
salvar mais um caractere.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.
fonte
(-:~.)@":
.R (
70,60,53, 52)Obrigado a todos pelos comentários úteis! Seus comentários são incorporados na resposta.
fonte
strsplit
por que não forçar x a um personagem usandoc(x,"")
?f=function(x)all(table(strsplit(c(x,""),"")[[1]])<2)
é 1 caractere mais curto :) #Mathematica (
2019)(
2221 se a função precisar de um nome)ou
onde | é inserido como [Esc] divide [Esc]
fonte
Braquilog , 1 byte
Experimente online!
fonte
C99, 59 caracteres
fonte
Groovy (36 caracteres)
Testou usando:
fonte
0>1
é mais curto.!1
.Haskell:
fonte
Data.List
qualquer maneira, eu sugironub
, o que remove duplicatas de uma lista.(\x->nub x==x).show
main = interact $ show . ap (==) nub . show
J (8)
Competentemente separado da minha resposta anterior.
fonte
R,
6665 caracteresSepare os dígitos usando a divisão inteira e o módulo e verifique se estão duplicados.
Uso:
Ou, como sugeriu @MickyT, para 63 caracteres:
fonte
anyDuplicated
vez desum
eduplicated
por mais 2 #C, 58 bytes
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)
Se você tem um grande poder de 2 à mão, a constante pode ser calculada como
f&(1<<30)/7*6
fonte
int main(int)
sua resposta ...Haskell , 34 bytes
Experimente online!
fonte
Javascript 73 caracteres
fonte
Entre 98, 17 bytes
Esta é uma resposta não concorrente porque o Befunge não possui funções.
Imprime a
1
se 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
x
coordenada é o valor ASCII do caractere inserido (recebe o caractere de entrada por caractere) e cujay
coordenada é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.
fonte
PowerShell - 26
fonte
Perl 6 (19 bytes)
.comb
divide uma string em caracteres (por exemplo,42.comb
give"4", "2"
)..uniq
remove todos os caracteres não exclusivos..comb
caracteres 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.fonte
C, 76
Não é nem perto de ganhar, mas vou publicá-lo de qualquer maneira apenas para mostrar uma abordagem alternativa.
Imprime uma nova linha se falsa, imprime nada se for verdadeira.
fonte
int main(int, char **)
ouint main(void)
.int main(int)
não é válido.main()
está ok, então?main(void)
(quando usado na definição, na declaração declara uma função com lista de parâmetros desconhecida).POSIX sh e egrep (
47,43, 40)!
vez de-z
comtest
- Obrigado DigitalTrauma`CODE`
vez de$(CODE)
- Obrigado DigitalTraumafold -1
vez degrep -o .
1 - Obrigado DigitalTrauma.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 :Uso:
1 A
fold -N
notação foi descontinuada em algumas versões dofold
.fonte
f()(! [ `fold -1<<<$1|sort|uniq -d` ])
até 38 pela minha contagemtest
ele resmunga quandouniq -d
retorna 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?Java (
1315957)57 caracteres:
removeu ^ e $ as @ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ sugeridos
59 caracteres (funciona também com números negativos!):
7978 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).
131 caracteres (retorna verdadeiro para números negativos):
com comentários:
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:
m [] é uma matriz booleana que contém respostas corretas para todos os números inteiros de 32 bits.
fonte
"^.*(.).*\\1.*$"
Você pode largar^
e$
. Eles estão implícitos emmatches()
return!
na resposta mais curta, poderá chegar a 56 bytes.