Dada una cadena que consiste en caracteres ASCII imprimibles , produce una salida que consta de sus caracteres únicos en el orden original . En otras palabras, la salida es la misma que la entrada, excepto que un carácter se elimina si ha aparecido anteriormente.
No se pueden usar elementos integrados para encontrar elementos únicos en una matriz (por ejemplo, MATLAB tiene una unique
función que hace eso). La idea es hacerlo manualmente.
Más detalles:
- Se permiten funciones o programas .
- La entrada y la salida pueden estar en forma de argumentos de función, stdin / stdout (incluso para funciones) o una combinación de ellos.
- Si se usan stdin o stdout, una cadena se entiende solo como la secuencia de caracteres . Si se utilizan los argumentos de funciones, puede ser necesario la secuencia de caracteres encerrada entre comillas o símbolos equivalentes que el lenguaje de programación de aplicaciones de elección para la definición de las cadenas.
- La salida debe ser una cadena que contenga solo los caracteres únicos de la entrada. Por lo tanto, no hay saltos de línea adicionales, espacios, etc. La única excepción es: si la salida se muestra en stdout, la mayoría de las funciones de visualización agregan un final
\n
(para separar la cadena de lo que vendrá después). Entonces, un final\n
es aceptable en stdout . - Si es posible, colocar un enlace a una línea intérprete / compilador para que otros puedan probar su código.
Este es el código de golf , por lo que gana el código más corto en bytes.
Algunos ejemplos , suponiendo stdin y stdout:
Cadena de entrada:
Type unique chars!
Cadena de salida:
Type uniqchars!
Cadena de entrada
"I think it's dark and it looks like rain", you said
Cadena de salida
"I think'sdarloe,yu
Cadena de entrada
3.1415926535897932384626433832795
Cadena de salida
3.14592687
Respuestas:
GolfScript, 2 bytes
o alternativamente:
Publiqué esto hace un tiempo en los Consejos para jugar al golf en el hilo de GolfScript . Funciona duplicando la cadena de entrada (que el intérprete de GolfScript coloca automáticamente en la pila y que se comporta en la mayoría de los casos como una matriz de caracteres) y luego toma la intersección (
&
) o unión (|
) establecida de sí misma. La aplicación de un operador de conjunto a una matriz (o cadena) contrae cualquier duplicado, pero conserva el orden de los elementos.fuente
CJam, 3 bytes
Setwise o de la entrada con una lista vacía. Las operaciones de configuración de CJam preservan el orden de los elementos.
Pruébalo en línea
fuente
C # 6, 18 + 67 = 85 bytes
Requiere esta
using
declaración:El método actual:
Este método ahorra algunos caracteres al definir la función como lambda , que se admite en C # 6. Así es como se vería en C # pre-6 (pero sin protección):
Cómo funciona: llamo al
Where
método en la cadena con una lambda con dos argumentos: quex
representa el elemento actual, quei
representa el índice de ese elemento.IndexOf
siempre devuelve el primer índice del carácter pasado, por lo que sii
no es igual al primer índice dex
, es un carácter duplicado y no debe incluirse.fuente
static void Main
etc.).Retina , 14 bytes
Cada línea debe ir en su propio archivo separado, o puede usar la
-s
bandera para leer desde un archivo.Para explicarlo, usaremos esta versión más larga pero más simple:
La primera línea es la expresión regular con la que coincide (
+`
es la cadena de configuración que sigue ejecutándose hasta que se hayan realizado todos los reemplazos). La expresión regular busca un carácter (lo llamaremos C), seguido de cero o más caracteres arbitrarios, seguido de C. Los paréntesis indican grupos de captura, por lo que reemplazamos la coincidencia con C ($1
) y los caracteres entre ($2
), eliminando el duplicado de C.Por ejemplo, si la cadena de entrada era
unique
, la primera ejecución coincidiríauniqu
, conu
yniq
como$1
y$2
, respectivamente. Luego reemplazaría la subcadena coincidente en la entrada original conuniq
, dandouniqe
.fuente
Perl, 21 (20 bytes +
-p
)Uso:
fuente
$h{$&}
y usando una lógica Y en lugar de un operador ternario:s/./!$h{$&}++&&$&/eg
1
s en la salida, ¡pero no es así! Gracias, actualizando!s/./$h{$&}++||$&/eg
(me enamoré de eso también al principio). Es una pena porque habría sido otro byte guardado.Macarrones 0.0.2 , 233 bytes
Este es un programa completo, que entra desde STDIN y sale en STDOUT.
Versión envuelta, por valor estético:
Y una versión muy "comentada" y sin golf (no hay comentarios en Macaroni, así que solo uso literales de cadena desnuda):
(¡Este es el primer programa real de macarrones (que realmente hace algo)! \ O /)
fuente
JavaScript ES7,
373325 bytesEnfoque bastante simple usando el operador de propagación de
comprensiones de matrizES6Set
y ES7 :22 bytes menos que el
indexOf
enfoque. Trabajó en un puñado de casos de prueba.fuente
for
la expresión 's no son necesarios y que podrían hacer que sea función anónima al igual que algunas otras soluciones:s=>[for(c of Set(s))c].join``
. (Pálido actualización no es 100% seguro, pero lanew
palabra clave también parece innecesario.)new
resultadoUncaught TypeError: Constructor Set requires 'new'
en Google Chrome.C # 6 - 18 + 46 = 64
y entonces
El
Enumerable.Union
método de extensión especifica que los elementos se devuelven en el orden original:Las operaciones de configuración que no están destinadas específicamente a encontrar valores únicos parecen estar permitidas a juzgar por las otras respuestas.
fuente
string u(string s)=>String.Join("",s.Distinct());
pero eso es un poco más largo.Distinct()
Ya se ha utilizado una respuesta , pero se elimina porqueDistinct()
no está permitida en este desafío, ya que es un método diseñado específicamente para encontrar valores únicos.s => string.Concat(s.Union(s))
valido? Ese sería el delegado pasado a aFunc<string, string>
como argumento.JavaScript ES6, 47 bytes
La siguiente prueba funciona en todos los navegadores.
fuente
<i?'':e
parte?e
es anterior al índice actuali
, devuelve una cadena vacía, eliminando así el carácter. Si esa es la primera instancia, simplemente regresae
y no se realizan cambios.MATLAB, 23
Hace la "unión de conjunto" de la cadena de entrada consigo misma, usando el método 'estable' que no ordena, y luego imprime.
Esto funciona porque
union
solo devuelve valores no duplicados después de la fusión. Entonces, esencialmente, si usaunion
la cadena consigo misma, primero produce una cadena comoType unique chars!Type unique chars!
, y luego elimina todos los duplicados sin ordenar.No hay necesidad de
unique
:)fuente
unique
no permitido, lo siento! Está en la definición del desafíosetdiff
con la'stable'
opción?disp
porque entonces tiene una función que devuelve una cadena, que está permitidaintersect
con'stable'
para lograr el mismo efecto también. Iba a escribir eso, pero dada esta respuesta, ya no es original jajaja.> <> , 16 bytes
> <> no tiene cadenas, por lo que utilizamos el cuadro de código. Debido a la naturaleza toroidal de> <>, lo siguiente se ejecuta en un bucle:
Tenga en cuenta que esto utiliza el hecho de que la entrada solo contiene ASCII imprimible, ya que esto no funcionaría si ASCII 0 estuviera presente.
fuente
Haz ,
2318 bytesPruébalo en línea!
fuente
Elemento ,
221918 bytesEjemplo de entrada / salida:
hello world
->helo wrd
Esto funciona simplemente procesando la cadena un carácter a la vez y haciendo un seguimiento de los que ha visto antes.
fuente
Python 2, 42 bytes
Utiliza un par de funciones anónimas y
reduce
.Pruébalo en línea
fuente
Pitón 3, 44
Crea la cadena de salida
r
carácter por carácter, incluido el carácterc
de la entrada solo si aún no lo hemos visto.Python 2 sería 47, perdiendo 4 caracteres
raw_input
y ahorrando 1 al no necesitar padresprint
.fuente
input
en Python 2, por lo que puede hacer que el suyo sea un byte más corto.APL, 3
Esto aplica la unión (∪) entre cada elemento del vector, obteniendo una iteración que tiene el efecto de eliminar duplicados.
Pruébelo en tryapl.org
El viejo:
Esto usa ~ (con argumentos invertidos, usando ⍨) aplicado entre cada elemento del argumento. El resultado es que para cada elemento, si ya está en la lista, se borra.
fuente
Perl,
5427 bytesPrueba:
fuente
print exists($h{$_})?"":$_
→$h{$_}||print
$h{$_}||=print
y usarlo también<>=~/./g
debería ayudar a ahorrar algunos más!map
también mejoraría el ahorro:map{$h{$_}||=print}<>=~/./g
PHP, 72 bytes
84 bytesUtiliza los caracteres como claves para una matriz asociativa, luego imprime las claves. El orden de los elementos de la matriz es siempre el orden de inserción.
Gracias Ismael Miguel por la
str_split
sugerencia.fuente
<?foreach(str_split($argv[1])as$c)$a[$c]=0;echo join('',array_keys($a));
Más corto y hace lo mismo.while($c=$argv[1][$i++*1])
. Esto reemplaza el todoforeach
. Todo lo demás es igual"0"
. Intente "abc0def" como entrada.Pyth, 7 bytes
Pseudocódigo:
z = entrada
suma del índice ordenado por z en N sobre el conjunto de z.
fuente
Julia,
4542 bytesVersión antigua:
El código construye la nueva cadena agregando nuevos caracteres en ella, luego
join
los une en una cadena adecuada al final. La nueva versión guarda algunos caracteres al iterar a través de la comprensión de la matriz. También guarda un byte usando en?:
lugar de||
(ya que elimina la necesidad de corchetes alrededor de la asignación).Solución alternativa, 45 bytes, usando recursividad y expresiones regulares:
Julia, 17 bytes
(Versión alternativa)
Esto se usa
union
básicamente como un sustituto deunique
: no considero que esta sea la respuesta "real", ya que interpreto "no usarunique
" para significar "no use una sola función incorporada que tenga el efecto de devolver la única elementos".fuente
Java, 78 bytes
Un bucle simple mientras se verifica la salida de caracteres ya presentes. Acepta entradas como a
char[]
.fuente
C, 96 bytes
Esto utiliza una matriz de enteros, indexados por número de caracteres ASCII. Los caracteres solo se imprimen si ese lugar en la matriz está configurado en FALSO. Después de encontrar cada nuevo personaje, ese lugar en la matriz se establece en VERDADERO. Esto toma una línea de texto desde la entrada estándar, terminada por una nueva línea. Ignora los caracteres no ASCII.
Sin golf:
fuente
C - 58
Gracias a @hvd y @AShelly por salvar un montón de personajes. Se sugirieron varias formas de hacerlo mucho más corto que el original:
Como puede ver, la modificación en el lugar parece ser la más corta (¡hasta ahora!) El programa de prueba se compila sin advertencias utilizando
gcc test.c
Gracias por toda la ayuda. Agradezco todos los consejos dados para acortar tanto!
fuente
r
comoint
(y omite elint
) para guardar algunos bytes:f(s,r)char*s;{...}
. Pero limita su código a plataformas dondechar*
tiene el mismo tamaño yint
, por supuesto, donde los compiladores son tan indulgentes como el suyo y el mío.if(x)y
x?y:0
f(char*s){int a[128]={0};for(;*s;s++)a[*s]++?0:putchar(*s);}
*q
, y solo aumentarq
si el carácter apareció antes, lo que permite un poco más de relleno:void f(char*s,char*r){for(char*q=r;*q=*s;strchr(r,*s++)<q||q++);}
(Tenga en cuenta questrchr(r,*s++)<q
siempre está bien definido, no hay UB allí, porquestrchr
no puede regresarNULL
en esta versión). Excepto por el tipo de retorno, es incluso más corto que la versión de @ AShelly.Ruby,
3024 caracteres(Código de 23 caracteres + opción de línea de comando de 1 carácter).
Ejecución de muestra:
fuente
CJam, 9
Esto no convierte una cadena en un conjunto, pero realiza una especie de diferencia de conjunto para determinar si un carácter se encuentra en una cadena. Pruébalo en línea
Explicación:
Otra versión, 13 bytes:
Esto no hace nada relacionado con los conjuntos. Pruébalo en línea
Explicación:
fuente
TI-BASIC, 49 bytes
Las variables de ecuación rara vez son útiles, ya que tardan 5 bytes en almacenarse, pero
Y₁
son útiles aquí como elX
carácter th de la cadena, ahorrando 3 bytes. Como no podemos agregar cadenas vacías en TI-BASIC, comenzamos la cadena con el primer carácter de Str1, luego recorremos el resto de la cadena y agregamos todos los caracteres que aún no se han encontrado.fuente
Matlab, 46 bytes
Utiliza una función anónima, con argumentos de función como entrada y salida:
(No pude hacer que esto funcione en un intérprete en línea de Octave).
Ejemplo de uso:
fuente
,1
conany
, por cierto.1
es paratriu
(necesito eliminar la diagonal), no paraany
Befunge -93, 124 bytes
Pruébelo en este intérprete en línea .
Esto fue más difícil de lo que esperaba. Publicaré una explicación más completa mañana si alguien quiere que lo haga, pero aquí hay una descripción general de lo que hace mi código.
2,0
y extendiéndose hacia la derecha. Esto se verifica para ver si el carácter actual es un duplicado.0,0
y el contador de bucle de verificación de duplicados se almacena en1,0
.0,0
se incrementa.fuente
PHP
5654Eliminar la respuesta de @ fschmengler usando una
array_flip
versión de dos segundos usa un método variable y se basa en convertir la cadena en verdadera, negarla en falso y luego volverla a la cadena vacía en el primer argumento para guardar un par de bytes en el segundo. ¡Barato!fuente
Haskell , 29 bytes
Una línea, anidable, sin nombre variable:
El mismo recuento, guardado en una función denominada
f
como declaración de nivel superior:Tenga en cuenta que hay una optimización ligeramente engañosa que no he hecho con el espíritu de amabilidad: técnicamente todavía está permitido por las reglas de este desafío usar una codificación de entrada y salida diferente para una cadena. Al representar a cualquiera
string
mediante su codificación de Church parcialmente aplicada\f -> foldr f [] string :: (a -> [b] -> [b]) -> [b]
(con el otro lado de la biyección proporcionada por la función($ (:))
), esto se reduce a($ \x->(x:).filter(x/=))
solo 24 caracteres.Evité publicar la respuesta de 24 caracteres como mi respuesta oficial porque la solución anterior podría probarse en el intérprete anterior,
foldr(\x->(x:).filter(x/=))[]"Type unique chars!"
mientras que la solución de golf se escribiría en su lugar:como una forma abreviada de la declaración literal que sería lo más loco:
Pero es una versión perfectamente válida de la estructura de datos representada como funciones puras. (Por supuesto, también puede usarlo
\f -> foldr f [] "Type unique chars!"
, pero eso es presumiblemente ilegítimo ya que usa listas para almacenar realmente los datos, por lo que presumiblemente su parte plegable debe componerse en la función "respuesta", lo que lleva a más de 24 caracteres)fuente