Entrada:
- Una matriz que contiene tres enteros:
0
,1
y2
en cualquier orden (es decir[2, 0, 1]
) - Y una cadena de longitud> = 2 que solo contiene letras alfabéticas (tanto mayúsculas como minúsculas) y dígitos (es decir
a1B2c3
)
Salida:
Según la matriz, clasificamos y damos salida a la cadena.
¿Como funciona esto?
- La matriz indica la precedencia de orden de
a-z
,A-Z
y0-9
, el primer ser0
; segundo ser1
; y tercer ser2
. - Los caracteres individuales de la cadena se pueden ordenar en función de eso.
Ejemplo:
- Formación:
[2, 0, 1]
- Cuerda:
a1B2c3
Según la matriz, sabemos que nuestra orden de precedencia es 0-9a-zA-Z
.
En base a esto, podemos convertir y salida de la cadena: 123acB
.
Reglas de desafío:
- Para la matriz, puede elegir usar una entrada indexada 0 o 1 indexada, por
[3, 1, 2]
lo que también es una entrada válida si prefiere usar matrices indexadas 1. - La cadena (tanto de entrada como de salida) sólo contiene caracteres válidos:
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
. - Si su idioma no es compatible con matrices (o si decide), usted es libre de utilizar cadenas en lugar de matrices para el primer parámetro (es decir
012
,[0,1,2]
, etc.).
Reglas generales:
- Este es el código de golf , por lo que la respuesta más corta en bytes gana.
No permita que los lenguajes de code-golf lo desanimen a publicar respuestas con lenguajes que no sean codegolf. Trate de encontrar una respuesta lo más breve posible para 'cualquier' lenguaje de programación. - Se aplican reglas estándar para su respuesta, por lo que puede usar STDIN / STDOUT, funciones / método con los parámetros adecuados, programas completos. Tu llamada.
- Las lagunas predeterminadas están prohibidas.
- Si es posible, agregue un enlace con una prueba para su código.
- Además, agregue una explicación si es necesario.
Casos de prueba:
[2, 0, 1] & a1B2c3 -> 123acB
[2, 1, 0] & aAaA909UuHWw9gh2 -> 02999AAHUWaaghuw
[2, 1, 0] & 6Bx43 -> 346Bx
[1, 0, 2] & jfjf33g -> ffgjj33
[0, 2, 1] & AbC13 -> b13AC
[1, 2, 0] & Qfl0l -> Q0fll
[0, 1, 2] & 9870abcABC -> abcABC0789
[0, 2, 1] & test123 -> estt123
[2, 0, 1] & WHAT -> AHTW
[2, 0, 1] & WhAt -> htAW
[1, 0, 2] & 102BACbac -> ABCabc012
code-golf
string
array-manipulation
sorting
Kevin Cruijssen
fuente
fuente
"123"
Sería un formato válido para el primer parámetro?123
,012
,[0,1,2]
,[0, 1, 2]
,0;1;2
o lo que usted prefiera.Respuestas:
05AB1E ,
151412 bytesCódigo:
Explicación:
Utiliza la codificación CP-1252 . Pruébalo en línea! .
fuente
²
y usando en₂
lugar de26
.Python 2,
6766 bytesPruébalo en Ideone .
fuente
JavaScript (ES6), 87 bytes
Si la matriz de entrada dio el orden, en lugar de la precedencia, de los tres rangos (esto solo hace una diferencia
[1, 2, 0]
y[2, 1, 0]
cuyos efectos se intercambian), entonces esto habría funcionado durante 80 bytes:Leí mal la pregunta y todavía obtuve 7 votos a favor con esto. Siéntase libre de eliminar sus votos a favor y dárselos a @CharlieWynn, quien obtuvo la mejor corrección para mi enfoque.
fuente
Array.sort
el parámetro de función opcional, pero esto funciona mucho mejor.Jalea , 13 bytes
Pruébalo en línea! o verificar todos los casos de prueba .
Cómo funciona
fuente
Pyth,
171615 bytesBanco de pruebas.
¡Gracias a @FryAmTheEggman por un byte y @Jakube por otro!
fuente
'UT
lugar des'MT
.'UT
es un error y`UT
no da como resultado la misma cadena.Javascript es6 77 bytes
fuente
?
s a cada expresión regular, esto asegura que la coincidencia devuelva resultados (en su mayoría cadenas vacías, pero desaparecen de todos modos), evitando el(||[])
, ahorrando así 3 bytes en general.TSQL,
199191 bytesGolfizado:
Sin golf:
Violín
fuente
APLX , 19 bytes
⎕a⎕A⎕D
dígitos superiores inferiores(
...)[a]
reordenar según la matriz a∊
aplanar(
... de)⍋s
acuerdo con ese "alfabeto", dé los índices que ordenarían la cadena ss[
...]
usa eso para reordenar sfuente
⎕a
, porque es un nombre cuádruple sensible a mayúsculas y minúsculas. Mucho mejor (para jugar al golf y en general) para lo que estoy presionando; para obtener⌈
y⌊
doblar mayúsculas y minúsculas en los datos de caracteres, como en K. Entonces tendremos en⌊⎕A
lugar de⎕a
.Python 2, 121 bytes
fuente
Clojure, 74 bytes
Para cada valor en la primera lista, obtiene la expresión regular apropiada y la aplica a la cadena de entrada. El resultado es una lista de listas de símbolos que coinciden con la expresión regular. Luego ordena cada uno y concatena el resultado en una lista y transfórmalo en una cadena.
Puede verlo en línea aquí: https://ideone.com/dqAkxg
fuente
Retina ,
4339 bytesEl recuento de bytes asume la codificación ISO 8859-1. El avance de línea final es significativo.
Se espera que la entrada sea el orden de clasificación como una lista basada en cero sin delimitadores en la primera línea, y la cadena que se ordenará en la segunda línea, por ejemplo
Pruébalo en línea!
Explicación
Usaré el ejemplo de entrada anterior para guiarte por el código:
Etapa 1: sustitución
La expresión regular en sí es justa
.
(coincide con cualquier carácter sin salto de línea), que está rodeada por!..."
. Sin embargo,2=
existe un límite que le dice a Retina que aplique la sustitución solo al segundo partido de la expresión regular. Entonces obtenemos esto:Etapa 2: transliteración
Una etapa de transliteración simplemente realiza una sustitución de carácter por carácter. El
¶
representa un salto de línea y sed
expande a0123456789
(aunque podemos ignorar todos los dígitos después2
). Eso significa que esta transliteración corresponde a la siguiente asignación:En
04
la parte delantera hay dos límites, que juntos indican que solo los primeros cuatro caracteres de este conjunto deben transcribirse. Esos son los dígitos en la primera línea, así como el salto de línea que separa las dos líneas, así que obtenemos esto:Al frente de la cadena ahora tenemos tres pares de estos caracteres:
Tenga en cuenta que los segundos caracteres de los pares están simplemente en su orden ASCII normal (y siempre serán los mismos). Los usaremos más adelante para ordenar los grupos de caracteres en la entrada principal en el orden requerido.
Los primeros caracteres son un poco más interesantes: su importancia es que
%
viene antes de los dígitos en la tabla ASCII,@
viene antes de las letras mayúsculas (pero después de los dígitos) y^
viene antes de las letras minúsculas (pero después de las letras mayúsculas). Esto nos ayudará a agrupar los marcadores de posición (es decir, el segundo carácter de cada par) con el conjunto correcto de caracteres.Etapa 3: Ordenar
Esta es una etapa de clasificación simple. Coincide con dos caracteres si el primero no es un carácter de palabra (por lo tanto, coincide con los tres pares de los que acabo de hablar) o un solo carácter de lo contrario (coincide con cada carácter de la entrada principal individualmente), y clasifica esas cadenas. Esto tiene dos propósitos: trae los caracteres dentro de cada grupo en el orden correcto (y dado que la clasificación es estable, este orden no se desordenará en la siguiente etapa), y debido a los
%@^
marcadores, inserta los pares en el posiciones correctas:Etapa 4: Ordenar
Esta etapa clasifica todas las coincidencias de la
.\w+
expresión regular que, debido a la codicia, coincide con un marcador de posición (es decir, uno de!"#
) junto con todos los caracteres de palabras después de él. Es decir, clasifica estas tres cadenas, cuyo orden está determinado únicamente por el carácter marcador:"24! BOR #afo
Si bien esto se baraja alrededor de esos marcadores (dejando los otros tres marcadores en su lugar), lo más importante es que trae los dígitos y las letras en el orden correcto:
Etapa 5: sustitución
Todo lo que queda es una pequeña limpieza, donde eliminamos todos los marcadores uniéndolos y reemplazándolos por nada.
fuente
JavaScript (ES6), 65
Nota: el orden ASCII 'natural' es 0-9, AZ, az, que es justo lo opuesto al OP 0,1,2. Asi que
fuente
Haskell,
6263 bytesEjemplo de uso:
"cD12ab" # [2,0,1]
->"12abcD"
.Cómo funciona:
Editar: @Christian Sievers encontró un error. ¡Gracias! Corregido por 1 byte adicional.
fuente
Stax , 15 bytes
Ejecútelo y depúrelo en línea
Este envío de 15 bytes está empaquetado en una variante del juego de caracteres CP437. La representación ascii correspondiente toma 18 bytes:
Sin embargo, estoy bastante seguro de que se puede recortar aún más.
VlVd+
también puede serVLA|(
, que a la izquierda gira el0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
por diez elemenets. El código completo también puede serVlVd+26/,e@:f,{[Io
, que lee la pila de entrada dos veces en lugar de leerlos todos al principio en la pila principal, y utiliza un formato de entrada diferente (más tradicional), como se muestra en este .fuente
Dyalog APL , 22 bytes
(819⌶⎕A)
doblar el alfabeto en mayúsculas a minúsculas(
…)⎕A⎕D[a]
Dígitos superiores inferiores reordenados de acuerdo con la matriz a∊
aplanars⍋⍨
para la cadena s , obtenga los índices que ordenarían s según ese "alfabeto"s[
...]
usa eso para reordenar sfuente
PowerShell v2 +, 107 bytes
Estoy explorando algoritmos usando expresiones regulares, pero hasta ahora todos parecen más largos.
Toma la entrada como una matriz explícita
$n
(ver ejemplos a continuación) y una cadena$s
que se convierte inmediatamente en una matriz de caracteres. Luego estamos construyendo tres elementos de una nueva matriz dinámica, cada uno de ellos encapsulado con un-join
:-
(($s=$s|sort)|?{$_-ge97})
-
($s|?{$_-in65..96})
-
($s|?{$_-lt58})
El primero lo tomamos
$s
y lo ejecutamosSort-Object
. Afortunadamente, dado que ya lo hemos lanzado como una matriz de caracteres, es una clasificación entre mayúsculas y minúsculas. Eso se vuelve a guardar$s
y luego se canaliza a aWhere-Object
con una cláusula mayor que97
(es decir, ASCII en minúsculaa-z
). El segundo es paraA-Z
y el tercero para0-9
.Por lo tanto, ahora tenemos una serie de cadenas, donde cada cadena se compone de uno de los tres tipos de caracteres y se ordena. Cortamos eso con
[$n]
y luego-join
el resultado juntos para formar nuestra cadena de salida final. Eso queda en la tubería y la impresión está implícita.Casos de prueba
fuente
Ruby, 56 bytes
Portado de @Dennis respuesta.
Una solución alternativa de 58 bytes que me gusta más, inspirada en @Neil y modificada ligeramente de su respuesta.
¡Pruebe cualquiera de las versiones en línea! (La versión comentada es la solución alternativa)
fuente
Código de máquina x86 de 32 bits, 70 bytes
En hexadecimal:
Este procedimiento espera que el orden de clasificación de la clase de caracteres sea una cadena terminada en NULL de 3 caracteres (0..2)
ESI
y la cadena para clasificarEDI
. La clasificación se realiza in situ utilizando una versión extremadamente subóptima (en cuanto al rendimiento) de la clasificación de burbujas.fuente
Emacs Lisp, 183 bytes
Ligeramente más corto que Java ...
fuente
Clojure, 77 bytes
No es tan corto como el de
re-seq
base, y no pude encontrar la forma de expresar eso "(apply str(mapcat sort(map(...))))
" en menos espacio.group-by
crea un mapa hash que puede usarse como una función, cuando se consulta con un ingeger entre 0 y 2 devuelve el grupo correspondiente, esto ordena las tres clases diferentes de caracteres.Esto sería más compacto que la
re-seq
solución si hubiera más clases de caracteres para manejar, ya que esto solo requiere 5 caracteres / grupo adicionales como en57 1,
lugar de 8 para expresiones como#"[a-z]"
.fuente
Python 2,
14011710110099 bytesTodos dicen: "¡Ewww!". Al menos es legible ... la tos no es realmente tos
Pruébalo en línea
fuente
R , 101 bytes
Crea un vector con az, AZ y 0-9 en un orden determinado y reordena los caracteres de la cadena de entrada para que coincida con este orden.
Pruébalo en línea!
fuente
J, 40 bytes
fuente
Java 8,
221212193156 bytesPor supuesto, también debería intentar responder a mi propio desafío. :) (Y como es habitual en Java.)
-28 bytes guardados gracias a @cliffroot .
Explicación:
Pruébalo aquí
fuente
[^a-z]
[^A-Z]
[^0-9]
y puede usar engetBytes()
lugar detoCharArray()
^
(no) fue bastante tonto ...;)replaceAll
llamadas repetitivasString c(int[]a,String z){String r[]={"[^a-z]","[^A-Z]","[^0-9]"},o="";for(byte c[],i=0;i<3;){c=z.replaceAll(r[a[i++]],"").getBytes();java.util.Arrays.sort(c);o+=new String(c);}return o;}