¿No te encantan los diagramas de vista explosionada en los que una máquina u objeto se desarma en sus piezas más pequeñas?
¡Hagámosle eso a una cuerda!
El reto
Escribir un programa o función que
- ingresa una cadena que contiene solo caracteres ASCII imprimibles ;
- disecciona la cadena en grupos de caracteres sin espacio (las "piezas" de la cadena);
- genera esos grupos en cualquier formato conveniente, con algún separador entre grupos .
Por ejemplo, dada la cadena
Ah, abracadabra!
la salida sería los siguientes grupos:
! , UNA aaaaa cama y desayuno do re h rr
Cada grupo en la salida contiene caracteres iguales, con espacios eliminados. Se ha usado una nueva línea como separador entre grupos. Más información sobre los formatos permitidos a continuación.
Reglas
La entrada debe ser una cadena o una matriz de caracteres. Solo contendrá caracteres ASCII imprimibles (el rango inclusivo desde el espacio hasta la tilde). Si su idioma no lo admite, puede tomar la entrada en forma de números que representan códigos ASCII.
Puede suponer que la entrada contiene al menos un carácter no espacial .
La salida debe constar de caracteres (incluso si la entrada se realiza mediante códigos ASCII). Tiene que haber un separador inequívoco entre grupos , diferente de cualquier carácter que no sea espacio que pueda aparecer en la entrada.
Si la salida es a través del retorno de función, también puede ser una matriz o cadenas, o una matriz de matrices de caracteres, o una estructura similar. En ese caso, la estructura proporciona la separación necesaria.
Un separador entre los caracteres de cada grupo es opcional . Si hay uno, se aplica la misma regla: no puede ser un carácter no espacial que pueda aparecer en la entrada. Además, no puede ser el mismo separador que se usa entre grupos.
Aparte de eso, el formato es flexible. Aquí hay unos ejemplos:
Los grupos pueden ser cadenas separadas por nuevas líneas, como se muestra arriba.
Los grupos pueden estar separados por cualquier carácter no ASCII, como
¬
. La salida para la entrada anterior sería la cadena:!¬,¬A¬aaaaa¬bb¬c¬d¬h¬rr
Los grupos pueden estar separados por n > 1 espacios (incluso si n es variable), con caracteres entre cada grupo separados por un solo espacio:
! , A a a a a a b b c d h r r
La salida también puede ser una matriz o una lista de cadenas devueltas por una función:
['!', 'A', 'aaaaa', 'bb', 'c', 'd', 'h', 'rr']
O una matriz de matrices de caracteres:
[['!'], ['A'], ['a', 'a', 'a', 'a', 'a'], ['b', 'b'], ['c'], ['d'], ['h'], ['r', 'r']]
Ejemplos de formatos que no están permitidos, de acuerdo con las reglas:
- Una coma no se puede usar como separador (
!,,,A,a,a,a,a,a,b,b,c,d,h,r,r
), porque la entrada puede contener comas. - No se acepta soltar el separador entre grupos (
!,Aaaaaabbcdhrr
) o usar el mismo separador entre grupos y dentro de grupos (! , A a a a a a b b c d h r r
).
Los grupos pueden aparecer en cualquier orden en la salida. Por ejemplo: orden alfabético (como en los ejemplos anteriores), orden de la primera aparición en la cadena, ... El orden no tiene por qué ser coherente o incluso determinista.
Tenga en cuenta que la entrada no puede contener caracteres de nueva línea A
y a
son caracteres diferentes (la agrupación es sensible a mayúsculas y minúsculas ).
El código más corto en bytes gana.
Casos de prueba
En cada caso de prueba, se ingresa la primera línea y las líneas restantes son la salida, con cada grupo en una línea diferente.
Caso de prueba 1:
Ah, abracadabra! ! , UNA aaaaa cama y desayuno do re h rr
Caso de prueba 2:
\ o / \ o / \ o / /// \\\ ooo
Caso de prueba 3:
Un hombre, un plan, un canal: ¡Panamá! ! ,, ,, : UNA PAGS aaaaaaaaa do ll mm nnnn pags
Caso de prueba 4:
"Muéstrame cómo haces ese truco, el que me hace gritar" dijo "" , S aaaaa cc dd eeeeeee hhhhhh ii kk mmmm norte ooooo rr ssss tttttt tu ww y
Respuestas:
Jalea , 5 bytes
Pruébalo en línea!
Devuelve una matriz, solo que cuando se imprime en STDOUT, el separador desaparece.
De hecho, esta es una función que se puede llamar como tal (en Jelly, cada línea es una función).
fuente
Python 3.5+,
77464441 bytesBastante simple. Revisa los caracteres únicos en la cadena convirtiéndolo en un conjunto (usando el desempaquetado iterativo extendido de Python 3.5), luego usa una comprensión de la lista para construir los diagramas explotados contando el número de veces que cada carácter aparece en la cadena
str.count
. Filtramos espacios eliminándolos del conjunto.El orden de la salida puede variar de una ejecución a otra; los conjuntos no están ordenados, por lo que no se puede garantizar el orden en que se procesan sus elementos y, por lo tanto, esta respuesta.
Esta es una expresión lambda; para usarlo, prefijo
lambda
conf=
.Pruébalo en Ideone!Ideone usa Python 3.4, que no es suficiente.Ejemplo de uso:
¡Guardado 3 bytes gracias a @shooqie!
fuente
{*s}
paraset(s)
.Retina, 13 bytes
La clasificación es muy fácil (es una función integrada), separa las letras que toman 9 bytes. Pruébalo en línea!
La primera línea
O
contiene todas las coincidencias de la expresión regular.
(que es cada personaje), dándonos!,Aaaaaabbcdhrr
.La coincidencia es la etapa predeterminada para la última línea de un programa, y
!
hace que imprima una lista de coincidencias separadas por saltos de línea de la expresión regular. La expresión regular busca una o más instancias de un carácter no espacial en una fila.fuente
Perl 6 , 28 bytes
Tenga en cuenta que Bag like a Hash or Set no está ordenado, por lo que no se garantiza el orden de los resultados.
Explicación:
fuente
Vim,
50, 46 bytesExplicación / gif vendrá más tarde.
fuente
Pyth, 6
Pruébelo aquí o ejecute un Test Suite .
Bastante simple,
-zd
elimina espacios de la entrada y.gk
agrupa cada elemento restante por su valor. Desafortunadamente, no he encontrado una manera de hacer uso de las variables de autocompletar. Tenga en cuenta que la salida se muestra como cadenas de Python, por lo que se escapan ciertos caracteres (lectura: barras invertidas). Si desea que sea más legible, agregue unj
al principio del código.fuente
Haskell, 38 bytes
Básicamente, la solución de nimi , pero verificando explícitamente solo las letras que aparecen en la cadena.
fuente
2sable , 7 bytes
Código:
Explicación:
Utiliza la codificación CP-1252 . Pruébalo en línea!
fuente
JavaScript (ES6), 41 bytes
fuente
" "
en la matriz devuelta? No estoy seguro si eso está permitidojoin()
llama con esos backkticks dobles?.join([''])
.join
luego lo convierte a la cadena (vacía) y lo usa para unir los elementos de la matriz. No todos los métodos convierten sus parámetros en cadenas, pero esta técnica es útil para aquellos que lo hacen.Brachylog ,
147 bytes7 bytes gracias a Fatalize.
Pruébalo en línea!
fuente
x
para eliminar@S
(espacio). Creo que este formato de salida (lista de cadenas) es válidoHaskell, 40 bytes
Ejemplo de uso:
f "Ah, abracadabra!"
->["!",",","A","aaaaa","bb","c","d","h","rr"]
.El patrón
v:w
solo coincide con la lista con al menos un elemento, por lo que se ignoran todos los caracteres que no están en la entrada.También 40 bytes:
fuente
group
es deData.List
. De todos modos, creo que esta sintaxis esghci
única y necesita REPL, por lo que es un lenguaje propio . Quiero seguir con el estándar Haskell.Ruby, 41 + 1 = 42 bytes
+1 byte para
-n
bandera.Toma entrada en stdin, por ejemplo:
fuente
C #
12598 BytesExplicación
ToArray
llamada y devolver implícitamente un IEnumerable que colectivamente ahorra 27 bytesfuente
Func<string, string[]>
s=>s.GroupBy....
R,
1981899695 bytesSin golf:
Esta solución actualmente no funciona por completo, cuando\
están involucrados.Ahora es !
Gracias mucho que @JDL para jugar al golf a cabo 102 bytes!
fuente
for(i in unique(a=strsplit(gsub(" ","",readline()),"")[[1]]))cat(rep(i,sum(a==i)),"\n",sep="")
- ahorra 2 bytes.<-
ahorrará 1 byte!Swift,
10591 bytesGracias a @NobodyNada por 14 bytes :)
Sí, soy bastante nuevo en Swift ...
Los caracteres dentro de un grupo están separados por una nueva línea. Los grupos están separados por dos líneas nuevas.
fuente
[Character]
lugar de aString
, ya que las reglas dicen "La entrada debe ser una cadena o una matriz de caracteres". Además,print("")
se puede reemplazar por soloprint()
.print
sin argumentos no funcionó por alguna razón, pero la[Character]
sugerencia fue sólida. ¡Gracias!Octava , 61 bytes
Esta es una función anónima que toma una cadena como entrada y genera una matriz de cadenas de celdas.
Prueba en Ideone .
Cómo funciona
sort
ordena la cadena de entrada. En particular, los espacios estarán al principio.strtrim
Elimina los espacios iniciales.diff(+y)
calcula diferencias consecutivas entre caracteres (para detectar límites de grupo) ...diff(find([1 diff(+y) 1])
da un vector de tamaños de grupo.mat2cell
luego divide la cadena ordenada en trozos con esos tamaños.fuente
Mathematica, 36 bytes
Funciones incorporadas
Gather
yCharacters
hacen la mayor parte del trabajo aquí.fuente
> <> , 49 bytes
Un desperdicio muy espacioso en la salida, pero supongo que todavía está permitido dada la indulgencia de las reglas
Explicación:
ajusta algunas cosas bastante apretadas, incluso usando saltos para desplazar algunas funciones para que pueda ejecutar el puntero verticalmente.
Básicamente, esto coloca a cada carácter ASCII en su propia nueva línea, y si ninguno de esos caracteres existe, la línea estará en blanco
Pruébalo en línea
Editar: estaba equivocado, había un error en el código que haría que nunca se completara si hubiera un espacio en la entrada
fuente
Pyth, 5 bytes
Pruébalo aquí!
Toma datos como una cadena de Python (es decir, entre comillas, comillas escapadas y barras diagonales según sea necesario).
Explicación:
Si garantiza al menos un espacio en la entrada, hay una solución de 4 bytes:
Pruébalo aquí!
Explicación:
fuente
PowerShell v2 +, 44 bytes
Toma la entrada
$args[0]
como una cadena literal de argumento de línea de comando. Lanza eso como unachar
matriz y usa el-n
e
operador ot qual para extraer espacios (ASCII32
). Esto funciona porque la conversión tiene una prioridad de orden superior, y cuando se usa una matriz como operador de la izquierda con un escalar como la derecha, actúa como un filtro.Pasamos ese conjunto de caracteres a
Group-Object
, que hace exactamente lo que dice. Tenga en cuenta que ya que estamos pasando caracteres , no cadenas, esto se agrupa correctamente con mayúsculas y minúsculas.Ahora, tenemos un objeto u objetos personalizados que tienen nombres de grupos, recuentos, etc. Si imprimimos eso, tendremos una gran cantidad de resultados extraños. Entonces, necesitamos canalizarlos en un bucle
|%{...}
y cada iteración-join
del.Group
conjunto en una sola cadena. Esas cadenas resultantes se dejan en la tubería, y la salida está implícita al finalizar el programa.Ejemplo
fuente
Dyalog APL , 11 bytes
Función que devuelve la lista de cadenas.
(⊂∩¨∪)
la intersección de la totalidad y sus personajes únicos~∘' '
excepto espaciosTryAPL en línea!
fuente
Procesamiento, 109 bytes
Es el enfoque de la fuerza bruta, ordena la matriz y luego repítela. Si no coincide con el último carácter impreso, imprima primero una nueva línea. Si es un espacio en blanco, omita el paso de impresión.
fuente
Javascript (usando una biblioteca externa - Enumerable) (
7867 bytes)Enlace a lib: https://github.com/mvegh1/Enumerable
Explicación del código: ¡Esto es para lo que se hizo Enumerable! Cargue la cadena en la biblioteca, que la convierte en una matriz de caracteres. Filtre las entradas de espacios en blanco. Agrupar por char. Escriba cada grupo en una línea, de acuerdo con el predicado especificado. Ese predicado dice unir todos los elementos del grupo actual en una cadena, sin un delimitador.
fuente
MATL, 7 bytes
Demo en línea de MATL
fuente
Perl6,
484745Gracias a manatwork por las mejoras.
fuente
$a.trim
parece hacerlo por la condición.$^a.trim&&say $a x$^b
funciona. (Perdón por agregar las sugerencias byte a byte, pero este es mi primer intento en Perl6.){
.Ruby, 46 bytes
Pruébalo en línea!
Mi versión original del programa completo, 48 bytes después de agregar la
n
bandera:fuente
.count(c)
con.count c
?*
operador está presente cerca, por lo que el analizador se quejará.map
entonces necesita parens adicionales y((s.chars-[' '])|[]).map
tiene la misma cantidad de caracteres que(s.chars-[' ']).uniq.map
. Y la otra forma más corta de verificar caracteres únicos (a través de expresiones regulares) ya está cubierta por @Jordan en otra respuestaPython, 107
Podría ser acortado por lambda, pero luego
fuente
CJam, 10 bytes
Un bloque sin nombre que espera la cadena en la parte superior de la pila y la reemplaza con una lista de cadenas.
Pruébalo en línea!
Explicación
fuente
Lisp común, 123
Sin golf:
No es el lenguaje más amigable para el golf. Esto probablemente podría modificarse para devolver la lista de listas en lugar de imprimir una cadena.
fuente
Emacs, 36 pulsaciones de teclas
C-SPACE C-EM-x
sort-r
TABRETURN.RETURN.RETURNC-AC-M-S-%\(\(.\)\2*\)
RETURN\1
C-QC-JRETURN!Resultado
A man, a plan, a canal: Panama!
->Explicación
sort-r
TAB RETURN .RETURN .RETURN\(\(.\)\2*\)
RETURN\1
C-Q C-JRETURN !sort-regexp-fields
con argumentos.
y.
;\(\(.\)\2*\)
->\1\n
en todas las coincidencias.fuente