Dada uma sequência que consiste em caracteres ASCII imprimíveis , produza uma saída que consiste em seus caracteres exclusivos na ordem original . Em outras palavras, a saída é a mesma que a entrada, exceto que um caractere é removido se ele tiver aparecido anteriormente.
Nenhum componente interno para localizar elementos exclusivos em uma matriz pode ser usado (por exemplo, o MATLAB possui uma unique
função que faz isso). A ideia é fazê-lo manualmente.
Detalhes adicionais:
- De qualquer funções ou programas são permitidos.
- A entrada e a saída podem estar na forma de argumentos de função, stdin / stdout (mesmo para funções) ou uma mistura deles.
- Se stdin ou stdout forem usados, uma string será entendida apenas como a sequência de caracteres . Se forem usados argumentos de função, a seqüência de caracteres podem precisar de ser fechado entre aspas ou símbolos equivalentes que a linguagem de programação de usos de escolha para definir strings.
- A saída deve ser uma sequência contendo apenas os caracteres exclusivos da entrada. Portanto, não há quebras de linha extras, espaços etc. A única exceção é: se a saída for exibida no stdout, a maioria das funções de exibição adicionará um final
\n
(para separar a string do que virá a seguir). Portanto, um final\n
é aceitável no stdout . - Se possível, poste um link em um intérprete / compilador on - line para que outros possam experimentar seu código.
Este é o código golf , pelo que o código mais curto em bytes vence.
Alguns exemplos , assumindo stdin e stdout:
String de entrada:
Type unique chars!
Cadeia de saída:
Type uniqchars!
String de entrada
"I think it's dark and it looks like rain", you said
String de saída
"I think'sdarloe,yu
String de entrada
3.1415926535897932384626433832795
String de saída
3.14592687
Respostas:
GolfScript, 2 bytes
ou alternativamente:
Eu publiquei isso há um tempo atrás no tópico Dicas para jogar golfe no GolfScript . Ele funciona duplicando a sequência de entrada (que é colocada na pilha automaticamente pelo intérprete GolfScript e que se comporta da maioria das maneiras como uma matriz de caracteres) e, em seguida, levando consigo a interseção (
&
) ou união (|
) definida . A aplicação de um operador set a uma matriz (ou sequência) reduz as duplicatas, mas preserva a ordem dos elementos.fonte
CJam, 3 bytes
Setwise ou da entrada com uma lista vazia. As operações de conjunto CJam preservam a ordem dos elementos.
Experimente online
fonte
C # 6, 18 + 67 = 85 bytes
Requer esta
using
declaração:O método real:
Esse método salva alguns caracteres definindo a função como um lambda , suportado no C # 6. É assim que ficaria no C # pré-6 (mas não destruído):
Como funciona: chamo o
Where
método na string com um lambda com dois argumentos:x
representando o elemento atual,i
representando o índice desse elemento.IndexOf
sempre retorna o primeiro índice do caractere passado para ele; portanto, sei
não for igual ao primeirox
, é um caractere duplicado e não deve ser incluído.fonte
static void Main
etc.).Retina , 14 bytes
Cada linha deve ter seu próprio arquivo separado, ou você pode usar o
-s
sinalizador para ler um arquivo.Para explicar, usaremos esta versão mais longa, porém mais simples:
A primeira linha é o regex com o qual corresponder (
+`
é a cadeia de configuração que continua em execução até que todas as substituições tenham sido feitas). A regex procura um caractere (vamos chamá-lo de C), seguido por zero ou mais caracteres arbitrários, seguido por C. Os parênteses indicam grupos de captura, portanto substituímos a correspondência por C ($1
) e os caracteres entre ($2
), removendo a duplicata de C.Por exemplo, se a sequência de entrada fosse
unique
, a primeira execução corresponderiauniqu
comu
eniq
como$1
e$2
, respectivamente. Em seguida, substituiria a substring correspondente na entrada original poruniq
, dandouniqe
.fonte
Perl, 21 (20 bytes +
-p
)Uso:
fonte
$h{$&}
e usando uma lógica E em vez de um operador ternário:s/./!$h{$&}++&&$&/eg
1
s na saída, mas não! Obrigado, atualizando!s/./$h{$&}++||$&/eg
(eu me apaixonei por isso também no começo). Vergonha, porque isso teria sido outro byte salvo.Macarrão 0.0.2 , 233 bytes
Este é um programa completo, que insere STDIN e sai em STDOUT.
Versão embrulhada, para valor estético:
E uma versão fortemente "comentada" e não-golfada (não há comentários em Macarrão, então eu apenas uso literais de string nua):
(Este é o primeiro programa de macarrão real (que realmente faz alguma coisa)! \ O /)
fonte
JavaScript ES7,
373325 bytesAbordagem bastante simples usando o operador de espalhamento de
compreensãoES6Set
e ES7Array:22 bytes a menos que a
indexOf
abordagem. Trabalhou em vários casos de teste.fonte
for
expressão 's não são necessários e você pode torná-lo função anônima como algumas outras soluções fiz:s=>[for(c of Set(s))c].join``
. (Pálido atualização: não 100% de certeza, mas anew
palavra-chave parece também desnecessário.)new
resultadoUncaught TypeError: Constructor Set requires 'new'
no Google Chrome.C # 6 - 18 + 46 = 64
e depois
O
Enumerable.Union
método de extensão especifica que os elementos são retornados na ordem original:Operações definidas que não se destinam especificamente a encontrar valores únicos parecem ser permitidas a julgar pelas outras respostas.
fonte
string u(string s)=>String.Join("",s.Distinct());
mas isso é um pouco mais.Distinct()
, mas ela foi excluída porqueDistinct()
não é permitida neste desafio, pois é um método especificamente destinado a encontrar valores únicos.s => string.Concat(s.Union(s))
válido? Esse seria o delegado passado para aFunc<string, string>
como argumento.JavaScript ES6, 47 bytes
O teste abaixo funciona em todos os navegadores.
fonte
<i?'':e
peça faz?e
estiver antes do índice atuali
, ele retornará uma string vazia, livrando-se assim do caractere. Se essa for a primeira instância, ela simplesmente retornae
e nenhuma alteração é feita.MATLAB, 23
Faz a "união de conjunto" da string de entrada consigo mesma, usando o método 'stable' que não classifica e depois imprime.
Isso funciona porque
union
retorna apenas valores não duplicados após a mesclagem. Então, basicamente, se vocêunion
usar a string em si mesma, ela produzirá uma string comoType unique chars!Type unique chars!
e depois removerá todas as duplicatas sem classificação.Não há necessidade de
unique
:)fonte
unique
não é permitido, desculpe! Está na definição de desafiosetdiff
com a'stable'
opção?disp
porque, em seguida, você tem uma função que retorna uma string, o que é permitidointersect
com'stable'
para obter o mesmo efeito. Eu ia escrever isso, mas, dada essa resposta, não é mais original, lol.> <> , 16 bytes
> <> não tem strings, então usamos o codebox. Devido à natureza toroidal de> <>, o seguinte é executado em um loop:
Observe que isso usa o fato de que a entrada contém apenas ASCII imprimível, pois isso não funcionaria se o ASCII 0 estivesse presente.
fonte
Feixe ,
2318 bytesExperimente online!
fonte
Elemento ,
221918 bytesExemplo de entrada / saída:
hello world
->helo wrd
Isso funciona simplesmente processando a string, um caractere de cada vez, e acompanhando quais já foram vistas antes.
fonte
Python 2, 42 bytes
Usa algumas funções anônimas e
reduce
.Experimente online
fonte
Python 3, 44
Constrói a string de saída
r
caractere por caractere, incluindo o caracterec
da entrada apenas se ainda não o tivermos visto.O Python 2 seria 47, perdendo 4 caracteres
raw_input
e economizando 1 em não precisar de parersprint
.fonte
input
no Python 2, para tornar o seu byte mais curto.APL, 3
Isso aplica a união (∪) entre cada elemento do vetor, obtendo uma iteração que tem o efeito de remover duplicatas.
Teste em tryapl.org
Antigo:
Isso usa ~ (com argumentos invertidos, usando ⍨) aplicado entre cada elemento do argumento. O resultado é que, para cada elemento, se já estiver na lista, ele será apagado.
fonte
Perl,
5427 bytesTeste:
fonte
print exists($h{$_})?"":$_
→$h{$_}||print
$h{$_}||=print
e o uso<>=~/./g
também ajudaria a economizar um pouco mais!map
também melhoraria a economia:map{$h{$_}||=print}<>=~/./g
PHP, 72 bytes
84 bytesUsa os caracteres como chaves para uma matriz associativa e depois imprime as chaves. A ordem dos elementos da matriz é sempre a ordem de inserção.
Obrigado Ismael Miguel pela
str_split
sugestão.fonte
<?foreach(str_split($argv[1])as$c)$a[$c]=0;echo join('',array_keys($a));
Mais curto e faz o mesmo.while($c=$argv[1][$i++*1])
. Isso substitui o todoforeach
. Tudo o resto é igual"0"
. Tente "abc0def" como entrada.Pitão, 7 bytes
Pseudo-código:
z = entrada
soma do índice de ordenação em z de N sobre o conjunto de z.
fonte
Julia,
4542 bytesVersão antiga:
O código constrói a nova sequência de caracteres, acrescentando novos caracteres a ela e, em seguida,
join
os reúne em uma sequência adequada no final. A nova versão salva alguns caracteres iterando através da compreensão do array. Também salva um byte usando em?:
vez de||
(pois elimina a necessidade de colchetes em torno da atribuição).Solução alternativa, 45 bytes, usando recursão e regex:
Julia, 17 bytes
(Versão alternativa)
Isso usa
union
basicamente como um substituto paraunique
- eu não considero a resposta "real", pois interpreto "não useunique
" para significar "não use uma única função interna que tenha o efeito de retornar o único elementos ".fonte
Java, 78 bytes
Um loop simples ao verificar a saída quanto a caracteres já presentes. Aceita entrada como a
char[]
.fonte
C, 96 bytes
Isso usa uma matriz de números inteiros, indexados pelo número de caracteres ASCII. Os caracteres são impressos apenas se esse local na matriz estiver definido como FALSE. Depois que cada novo caractere é encontrado, o local na matriz é definido como TRUE. Isso pega uma linha de texto da entrada padrão, terminada por uma nova linha. Ele ignora caracteres não ASCII.
Ungolfed:
fonte
C - 58
Agradecemos a @hvd e @AShelly por salvar um monte de personagens. Sugeriram várias maneiras de torná-lo muito mais curto que o original:
Como você pode ver, a modificação no local parece ser a mais curta (até agora!) O programa de teste é compilado sem avisos usando
gcc test.c
Obrigado por toda a ajuda. Agradeço todos os conselhos dados para encurtar tanto!
fonte
r
comoint
(e omitir aint
) para salvar alguns bytes:f(s,r)char*s;{...}
. Mas limita seu código a plataformas ondechar*
é do mesmo tamanhoint
e, é claro, onde os compiladores são tão brandos quanto o seu e o meu.if(x)y
porx?y:0
f(char*s){int a[128]={0};for(;*s;s++)a[*s]++?0:putchar(*s);}
*q
e incrementar apenasq
se o personagem aparecer mais cedo, permitindo um pouco mais de compilação:void f(char*s,char*r){for(char*q=r;*q=*s;strchr(r,*s++)<q||q++);}
(Observe questrchr(r,*s++)<q
sempre está bem definido, não há UB lá, porquestrchr
não pode retornarNULL
nesta versão.) Exceto pelo tipo de retorno, é ainda mais curto que a versão do @ AShelly.Ruby,
3024 caracteres(Código de 23 caracteres + opção de linha de comando de 1 caractere.)
Exemplo de execução:
fonte
CJam, 9
Isso não converte uma string em um conjunto, mas executa um tipo de diferença de conjunto para determinar se um caractere é encontrado em uma string. Experimente online
Explicação:
Outra versão, 13 bytes:
Isso não faz nada relacionado a conjuntos. Experimente online
Explicação:
fonte
TI-BASIC, 49 bytes
As variáveis da equação raramente são úteis, pois levam 5 bytes para armazenar, mas são
Y₁
úteis aqui como oX
caractere da string, economizando 3 bytes. Como não podemos adicionar cadeias de caracteres vazias no TI-BASIC, iniciamos a cadeia com o primeiro caractere de Str1, depois percorremos o restante da cadeia, adicionando todos os caracteres que ainda não foram encontrados.fonte
Matlab, 46 bytes
Ele usa uma função anônima, com argumentos de função como entrada e saída:
(Não consegui fazer isso funcionar em um intérprete on-line do Octave.)
Exemplo de uso:
fonte
,1
withany
, btw.1
é paratriu
(eu preciso remover a diagonal), não paraany
Befunge -93, 124 bytes
Teste-o neste intérprete online .
Isso foi mais difícil do que eu esperava. Vou postar uma explicação mais completa amanhã, se alguém quiser, mas aqui está uma visão geral do que meu código faz.
2,0
e se estendendo para a direita. Isso é verificado para ver se o caractere atual é uma duplicata.0,0
e o contador de loop de verificação de duplicação é armazenado1,0
.0,0
é incrementado.fonte
PHP,
56.54Afastar a resposta do @ fschmengler usando a
array_flip
versão duas vezes segunda usa o método variável e depende da conversão da string para true, negando-a como false, e depois convertendo-a de volta para a string vazia no primeiro argumento para salvar alguns bytes no segundo. Barato!fonte
Haskell , 29 bytes
Linha única aninhada e sem nome de variável:
Mesma contagem, salva em uma função nomeada
f
como uma declaração de nível superior:Observe que há uma otimização pouco trapaceira que eu não fiz no espírito de gentileza: tecnicamente ainda é permitido pelas regras deste desafio usar uma codificação de entrada e saída diferente para uma string. Ao representar qualquer um
string
por sua codificação parcialmente aplicada da Igreja\f -> foldr f [] string :: (a -> [b] -> [b]) -> [b]
(com o outro lado da bijeção fornecida pela função($ (:))
), isso diminui para($ \x->(x:).filter(x/=))
apenas 24 caracteres.Evitei postar a resposta de 24 caracteres como minha resposta oficial, porque a solução acima poderia ser tentada no intérprete acima como se
foldr(\x->(x:).filter(x/=))[]"Type unique chars!"
a solução golfed fosse escrita:como uma abreviação para a declaração literal que seria a mais insana:
Mas é uma versão perfeitamente válida da estrutura de dados representada como funções puras. (Claro, você também pode usar
\f -> foldr f [] "Type unique chars!"
, mas isso é presumivelmente ilegítimo, pois usa listas para realmente armazenar os dados; portanto, sua parte foldr deve ser presumivelmente composta na função "resposta", com mais de 24 caracteres.)fonte