Si ordena una cadena, generalmente obtendrá algo como:
':Iaaceeefggghiiiiklllllmnnooooprrssstttttuuyyyy
Sí, esa fue la primera oración ordenada.
Como se puede ver, hay una gran cantidad de caracteres repetidos, aa
, eee
, ttttt
, 9 espacios y así sucesivamente.
Si agregamos 128
al valor ASCII del primer duplicado, 256
al segundo, 384
al tercero y así sucesivamente, ordénelo nuevamente y genere la nueva cadena (módulo 128 para recuperar los mismos caracteres) obtenemos la cadena:
':Iacefghiklmnoprstuy aegilnorstuy egilosty iloty lt
(Tenga en cuenta el espacio inicial único y los 4 espacios finales).
La cadena se "ordenadas secuencialmente" <space>':I....uy
, <space>aeg....uy
, <space>egi....ty
, <space>iloty
, <space>lt
, <space>
, <space>
, <space>
, <space>
.
Puede ser más fácil visualizar esto si usamos una cadena con dígitos. La cadena 111222334
será cuando "ordenados" ser: 123412312
.
Reto:
Para sorpresa, el desafío es escribir un código que clasifique una cadena de acuerdo con la descripción anterior.
Puede suponer que la cadena de entrada contendrá solo caracteres ASCII imprimibles en el rango 32-126 (espacio para tilde).
Casos de prueba:
**Test cases:**
*:Tacest*es*s*
If you sort a string you'll typically get something like:
':Iacefghiklmnoprstuy aegilnorstuy egilosty iloty lt
Hello, World!
!,HWdelorlol
#MATLAB, 114 bytes
#,14ABLMTbesty 1A
f=@(s)[mod(sort(cell2mat(cellfun(@(c)c+128*(0:nnz(c)-1),mat2cell(sort(s),1,histc(s,unique(s))),'un',0))),128),''];
'()*+,-0128:;=@[]acdefhilmnoqrstuz'(),0128@acefilmnorstu'(),12celmnostu'(),12celnstu(),clnst(),cls(),cs(),()()()()
Este es el código de golf , por lo que el código más corto en cada idioma contado en bytes ganará ref .
{'S', 'g', 'i', 'n', 'r', 't'}
en Python, ya que la forma "normal" de hacerlo es"String"
.{'a','b'}
no se acepta en Matlab ya que se puede añadir un carácter a cada uno de los personajes como este:{'aa','b'}
. Su entrada y salida deben estar en el mismo formato.Respuestas:
Pyth, 5 bytes
Banco de pruebas
Muy sencillo: Agrupar y ordenar, transponer, concatenar.
fuente
Jalea , 3 bytes
Pruébalo en línea!
Cómo funciona
Oh muchacho, este desafío fue hecho para Jelly.
El grupo atom (
Ġ
) toma una matriz 1 como entrada y agrupa índices que corresponden a elementos idénticos de la matriz. La matriz de grupos de índice se ordena con los elementos correspondientes como claves, que es precisamente el orden que necesitamos para este desafío.A continuación, el átomo zip (
Z
) transpone filas y columnas de la matriz de índices generada (irregular). Esto simplemente consiste en leer las columnas de la matriz, omitiendo los elementos que no están presentes en esa columna. Como resultado, obtenemos el primer índice del personaje con el punto de código más bajo, seguido del primer índice del personaje con el segundo punto de código más bajo, ... seguido por el segundo índice del personaje con el punto de código más bajo, etc.Finalmente, el átomo unindex (
ị
) recupera los elementos de la matriz de entrada en todos sus índices en el orden generado. El resultado es una matriz de caracteres 2D, que Jelly aplana antes de imprimirla.1 Jelly no tiene un tipo de cadena , solo conjuntos de caracteres.
fuente
Python 3,
10910510410399939088817969 bytes2 bytes guardados gracias a FlipTack
7 bytes guardados porque flornquake captó mi error tonto
2 bytes guardados gracias a xnor
10 bytes guardados gracias a Dennis
Explicación
Comenzamos convirtiendo nuestra cadena en una lista usando un splat y almacenando esa lista en una variable
a
. Luego, aunque nuestraa
no es la lista vacía, revisamos cada miembro único dea
en orden ordenado, lo imprimimos y eliminamos una copia de ese personaje de la lista.Cada iteración imprime, por lo tanto, imprime una copia de cada personaje presente en
a
.fuente
set
es un conjunto sin clasificar.f
una cadena en lugar de una lista para guardar algunos bytes.a=list(input())
, puede hacerloa.remove(c)
, lo cual es un ahorro neto.Haskell, 44 bytes
Ejemplo de uso:
Ordenar, agrupar caracteres iguales a una lista de cadenas (por ejemplo,
"aabbc"
->["aa","bb","c"]
), transponer y aplanar en una sola cadena, nuevamente.fuente
Python 2 , 75 bytes
Pruébalo en línea!
fuente
lambda s:`[sorted((1e9+s[:i].count(c),c)for i,c in enumerate(s))]`[18::21]
funciona para cadenas con longitud máxima9e9
.[]
y cambiar18
a17
para guardar dos bytes.lambda s:`sorted((1e9+s[:i].count(c),c)for i,c in enumerate(s))`[17::21]
zip
, pero no creo1e9
que se me haya ocurrido agregar ... ¡Gracias!Dyalog APL , 21 caracteres = 39 bytes
t[
...]
índice t (se definirá en breve) con ...0~⍨
ceros eliminados de∊
el alistado (aplanado)⍉
transpuesto(⊢⌸t)[
...;]
tecleado * t , indexado por fila por ...⍋
los índices que ordenarían∪
las letras únicas det←
t , que tiene el valor de⍞
entrada de texto solicitadaTryAPL en línea!
*
⊢⌸t
crea una tabla donde las filas (rellenadas con ceros para una tabla rectangular) enumeran los índices de cada letra única en t .fuente
⌸
hace que todo sea UTF-8 en lugar de un byte por char.C,
10910610510410210097989691 BytesCopia de seguridad de hasta 98 bytes, necesaria para inicializar j para que f (n) sea reutilizableHasta 96 Bytes usando pone en lugar de B-)Es extraño que tuve que retroceder para strlen, pero me libré del ciclo for (; i ++;), así que ahora se ha reducido a 91 Bytes. Al parecer, la página de manual para pone lee;
... tuve suerte de que funcionara en primer lugar
código de prueba ...
Aquí hay algunos casos de prueba, ahora es el momento de jugar golf.
fuente
Mathematica,
686059 bytesAcepta una cadena. Emite una cadena.
Si se permitiera la lista de caracteres (46 bytes):
Versión usando
Sort
(40 bytes):Esta versión no puede ser mi respuesta porque
Sort
no se puede usar aquí;Sort
se ordena por orden canónico, no por código de caracteres.fuente
Characters
comando genera técnicamente una lista de cadenas de longitud 1.Python 2,
7776 bytesToma una cadena entre comillas como entrada de stdin.
Pruébalo en línea!
fuente
JavaScript (ES6), 79 bytes
Funciona extrayendo el conjunto de caracteres únicos, ordenándolos, eliminándolos de la cadena original y calculando recursivamente el tipo del resto de la cadena. Solución de 81 bytes que me pareció interesante:
fuente
J ,
1615 bytesEste es un verbo que toma y devuelve una cadena. Pruébalo en línea!
Miles ahorró un byte, ¡gracias!
Explicación
Aquí no hay nada demasiado elegante: ordenar principalmente por orden de ocurrencia, en segundo lugar por valor de carácter.
fuente
Mathematica, 55 bytes, no competitiva
Editar: Desafortunadamente, Mathematica no
sort
es por códigos de caracteres, sino por orden alfabético, donde las mayúsculas siguen inmediatamente a las minúsculas ( es decir, se ordenan porHi There
{ , e, e, h, H, i, r, T}
).Esto funciona usando patrones:
fuente
Rule (->)
debe serRuleDelayed (:>)
(sin cambios en el conteo de bytes) porque ambos lados deRule
tienen variables.Rule
puede causar conflictos con definiciones preexistentes. Por ejemplo:a=3;5/.{a_->a}
devuelve3
, no5
. (sea_->a
evalúa comoa_->3
si lo usaa_:>a
, permanece así ya=3;5/.{a_:>a}
regresa5
).Brainf * ck ,
458226 bytesPruébalo en línea! - BF
Numberwang ,
262226 bytesPruébalo en línea! - NW
Puse ambos aquí porque son códigos idénticos.
fuente
PHP, 83 bytes
Desafortunadamente no puedes tenerlo
unset
en un ternario, así que necesito usar el molesto largoarray_filter
.Usar como:
fuente
Python 2, 70 bytes
Pruébalo en línea
Esto es muy ineficiente. El enlace de prueba cambia
i>>7
ai>>5
y establece el límite de recursividad a 10000. asume las entradas sólo tiene valores ASCII de hasta 126.Utiliza el truco div-mod para iterar a través de dos bucles: recuentos mínimos
i/128
en el bucle externo y valores ASCIIi%128
en el bucle interno. Incluye un carácterc
con el valor ASCII dado si el número de veces que aparece en la cadena es al menos su recuento mínimo.El código usa un truco para simular la asignación
c=chr(i%128)
para que pueda ser referenciada en la expresión(s.count(c)>i>>7)*c
. Pythonlambda
s no permite la asignación porque solo toman expresiones. La conversión a undef
programa completo o aún es una pérdida neta aquí.En cambio, la función adelanta el valor
chr(i%128)
a la siguiente llamada recursiva como una entrada opcional. Esto está desactivado en uno porquei
se ha incrementado, pero no importa siempre que la cadena no contenga caracteres especiales'\x7f'
(también podríamos aumentar 128 a 256). La inicialc=''
es inofensiva.fuente
V ,
3736 bytes¡Gracias @DJMcMayhem por el byte!
Pruébalo en línea!
No estoy seguro de que me guste la expresión regular al final, pero necesitaba hacer el
ò
descanso de alguna manera.Explique
fuente
Íî
(o:%s/\n//g
) es más corto queVGgJ
Perl 6 , 68 bytes
Me sorprendió un poco descubrir que no hay una forma integrada de agrupar elementos similares en una lista. Eso es lo que hace el bit squish-map.
fuente
a
a@a
(+2 bytes). Además,grep *eq$_,
se puede escribirgrep $_,
(-3 bytes) ya que una cadena es un emparejador inteligente válido.{[~] flat roundrobin |.comb.classify(~*){*}.sort»[*]}
- Esta variación es de solo 54 bytes.classify
solución basada en una respuesta separada ahora.JavaScript (ES6),
7775 bytesEstable ordena la cadena ordenada lexicográficamente por n th ocurrencia
fuente
1+~~
es el mismo que-~
.Perl 6 , 54 bytes
Explicación:
{ }
: Una lambda que toma un argumento, por ejemplo21211
..comb
: Divide el argumento de entrada en una lista de caracteres, p. Ej.(2,1,2,1,1)
..classify(~*)
: Agrupe los caracteres utilizando la comparación de cadenas como la condición de agrupación, devolviendo un Hash desordenado, por ejemplo{ 2=>[2,2], 1=>[1,1,1] }
.{*}
: Devuelve una lista de todos los valores de Hash, por ejemplo[2,2], [1,1,1]
..sort
: Ordenarlo, por ejemplo[1,1,1], [2,2]
.»[*]
: Pele los contenedores de elementos en los que se envolvieron las matrices debido a que están en el hash, para que no se consideren como un solo elemento en el siguiente paso, por ejemplo(1,1,1), (2,2)
.roundrobin |
: Comprime las sublistas hasta que se agoten todas, por ejemplo(1,2), (1,2), (1)
.flat
: Acoplar el resultado, por ejemplo1, 2, 1, 2, 1
.[~]
: Concatenarlo para obtener una cadena de nuevo, por ejemplo12121
.(Crédito por el
roundrobin
enfoque va a la respuesta de Sean ).fuente
05AB1E , 15 bytes
Pruébalo en línea! o como un conjunto de pruebas
Explicación
10 de los 15 bytes son para conocer la forma en que 05AB1E maneja cadenas de compresión de diferente longitud.
fuente
FSharp,
194190170140133 bytesUsar Seq en lugar de Array ahorra un par de bytes
Definir un nombre más corto y usar otros mapas para evitar
(fun ->)
bloqueo.Resulta que F # puede asignar un carácter a una entrada, por lo que eliminar el nombre abreviado de System.Text.Encoding.ASCII y agregar otro mapa me ahorra 20 bytes.
Devolver una matriz de caracteres en lugar de una cadena, ¡me ahorra 30 bytes!
Ya no necesito asegurarme de que sea una cadena, me ahorra 7 bytes
fuente
JavaScript (ES6), 114 bytes
Separado con nueva línea para mayor claridad, no forma parte del recuento de bytes:
Manifestación
fuente
Clojure, 79 bytes
Una función anónima, devuelve una secuencia de caracteres. Admite hasta 10 ^ 9 repeticiones de cualquier personaje, lo que debería ser suficiente.
fuente
Retina , 24 bytes
Pruébalo en línea!
fuente
Ruby, 59 + 1 = 60 bytes
Agrega un byte para la
-n
bandera. Puerto de la solución de diccionario @PatrickRoberts.fuente