Entrada:
- Uma matriz contendo três números inteiros:
0
,1
e2
em qualquer ordem (isto é,[2, 0, 1]
) - E uma sequência de comprimento> = 2 contendo apenas letras alfabéticas (maiúsculas e minúsculas) e dígitos (ie
a1B2c3
)
Saída:
Com base na matriz, classificamos e produzimos a string.
Como é que isso funciona?
- A matriz indica a ordem de precedência
a-z
,A-Z
e0-9
, sendo o primeiro0
; segundo ser1
; e terceiro ser2
. - Os caracteres individuais da sequência podem ser ordenados com base nisso.
Exemplo:
- Matriz:
[2, 0, 1]
- Corda:
a1B2c3
Com base na matriz, sabemos que nossa precedência de pedidos é 0-9a-zA-Z
.
Com base nisso, podemos converter e gerar a string:123acB
.
Regras do desafio:
- Para a matriz, você pode optar por usar a entrada indexada em 0 ou 1, portanto,
[3, 1, 2]
também é uma entrada válida se você preferir usar matrizes indexadas em 1. - A sequência (entrada e saída) contém apenas caracteres válidos:
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
. - Se o seu idioma não suporta matrizes (ou se você optar por), você é livre para usar cordas em vez de matrizes para o primeiro parâmetro (ou seja
012
,[0,1,2]
, etc.).
Regras gerais:
- Isso é código-golfe , então a resposta mais curta em bytes vence.
Não permita que idiomas com código de golfe o desencorajem a postar respostas com idiomas que não sejam codegolf. Tente encontrar uma resposta o mais curta possível para 'qualquer' linguagem de programação. - As regras padrão se aplicam à sua resposta, para que você possa usar STDIN / STDOUT, funções / método com os parâmetros adequados, programas completos. Sua chamada.
- As brechas padrão são proibidas.
- Se possível, adicione um link com um teste para o seu código.
- Além disso, adicione uma explicação, se necessário.
Casos de teste:
[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
fonte
fonte
"123"
um formato válido para o primeiro parâmetro?123
,012
,[0,1,2]
,[0, 1, 2]
,0;1;2
ou o que você preferir.Respostas:
05AB1E ,
151412 bytesCódigo:
Explicação:
Usa a codificação CP-1252 . Experimente online! .
fonte
²
e usando em₂
vez de26
.Python 2,
6766 bytesTeste em Ideone .
fonte
JavaScript (ES6), 87 bytes
Se a matriz de entrada deu a ordem, e não a precedência, dos três intervalos (isso só faz diferença para
[1, 2, 0]
e[2, 1, 0]
cujos efeitos são trocados), isso funcionaria por 80 bytes:Eu interpretei mal a pergunta e ainda recebi 7 votos positivos com isso. Sinta-se à vontade para remover seus votos e entregá-los a @CharlieWynn, que apresentou a melhor correção para minha abordagem.
fonte
Array.sort
o parâmetro de função opcional, mas isso funciona muito melhor.Gelatina , 13 bytes
Experimente online! ou verifique todos os casos de teste .
Como funciona
fonte
Pitão,
171615 bytesSuíte de teste.
Obrigado a @FryAmTheEggman por um byte e @Jakube por outro!
fonte
'UT
vez des'MT
.'UT
é um erro e`UT
não resulta na mesma string.Javascript es6 77 bytes
fonte
?
s a cada regex, isso garante que a correspondência retorne resultados (principalmente cadeias vazias, mas elas desaparecem de qualquer maneira), evitando o(||[])
, economizando assim 3 bytes no total.TSQL,
199191 bytesGolfe:
Ungolfed:
Violino
fonte
APLX , 19 bytes
⎕a⎕A⎕D
dígitos superiores inferiores(
…)[a]
Reordenar de acordo com a matriz a∊
aplainar(
… De)⍋s
acordo com esse "alfabeto", forneça os índices que classificariam a string ss[
…]
Use isso para reordenar sfonte
⎕a
, porque é um nome quad sensível a maiúsculas e minúsculas. Muito melhor (para jogar golfe e em geral) pelo que estou fazendo lobby; para obter⌈
e⌊
dobrar maiúsculas e minúsculas nos dados dos caracteres, como em K. Então, teremos em⌊⎕A
vez de⎕a
.Python 2, 121 bytes
fonte
Clojure, 74 bytes
Para cada valor na primeira lista, obtém a expressão regular apropriada e aplica-a à sequência de entrada. O resultado é uma lista de listas de símbolos que correspondem ao regex. Em seguida, classifique cada um e concatene o resultado em uma lista e transforme-o em string.
Você pode vê-lo online aqui: https://ideone.com/dqAkxg
fonte
Retina ,
4339 bytesA contagem de bytes assume a codificação ISO 8859-1. O avanço de linha à direita é significativo.
Espera-se que a entrada seja a ordem de classificação como uma lista baseada em zero, sem delimitadores na primeira linha, e a sequência a ser classificada na segunda linha, por exemplo,
Experimente online!
Explicação
Usarei o exemplo de entrada acima para orientá-lo no código:
Etapa 1: Substituição
A própria expressão regular é apenas
.
(corresponde a qualquer caractere que não seja de avanço de linha), que é cercada por!..."
. No entanto,2=
é um limite que diz à Retina para aplicar a substituição apenas na segunda correspondência da regex. Então, nós entendemos isso:Etapa 2: Transliteração
Um estágio de transliteração simplesmente substitui caractere por caractere. O
¶
representa um avanço de linha e sed
expande para0123456789
(embora possamos ignorar todos os dígitos depois2
). Isso significa que essa transliteração corresponde ao seguinte mapeamento:Na
04
frente, existem dois limites, que juntos indicam que apenas os quatro primeiros caracteres deste conjunto devem ser transliterados. Por acaso são os dígitos na primeira linha, bem como o avanço de linha que separa as duas linhas, então obtemos o seguinte:Na frente da string, agora temos três pares desses caracteres:
Observe que os segundos caracteres dos pares estão simplesmente em sua ordem ASCII normal (e sempre serão os mesmos). Nós os usaremos posteriormente para classificar os grupos de caracteres na entrada principal na ordem necessária.
Os primeiros caracteres são um pouco mais interessantes: seu significado é que
%
vem antes dos dígitos na tabela ASCII,@
vem antes das letras maiúsculas (mas depois dos dígitos) e^
vem antes das letras minúsculas (mas depois das letras maiúsculas). Isso nos ajudará a agrupar os marcadores de posição (ou seja, o segundo caractere em cada par) com o conjunto correto de caracteres.Etapa 3: classificação
Este é um estágio de classificação simples. Ele corresponde a dois caracteres se o primeiro não for um caractere de palavra (correspondendo aos três pares de que acabei de falar) ou um único caractere (correspondendo a cada caractere da entrada principal individualmente) e classifica essas sequências. Isso tem dois propósitos: coloca os caracteres dentro de cada grupo na ordem correta (e, como a classificação é estável, essa ordem não será alterada na próxima etapa) e, devido aos
%@^
marcadores, insere os pares no posições corretas:Etapa 4: Classificar
Este estágio classifica todas as correspondências da
.\w+
expressão regular que, devido à ganância, corresponde a um marcador de posição (ou seja, um de!"#
) junto com todos os caracteres de palavra após ela. Ou seja, ele classifica essas três cadeias, cuja ordem é determinada apenas pelo caractere marcador:"24! BOR #afo
Enquanto isso embaralha esses marcadores (deixando os outros três marcadores no lugar), o mais importante é que os dígitos e as letras estão na ordem correta:
Etapa 5: Substituição
Tudo o que resta é uma pequena limpeza, onde removemos todos os marcadores combinando-os e substituindo-os por nada.
fonte
JavaScript (ES6), 65
Nota: a ordem ASCII 'natural' é de 0 a 9, AZ, az, exatamente o oposto do OP 0,1,2. tão
fonte
Haskell,
6263 bytesExemplo de uso:
"cD12ab" # [2,0,1]
->"12abcD"
.Como funciona:
Edit: @ Christian Sievers encontrou um bug. Obrigado! Corrigido por 1 byte adicional.
fonte
Stax , 15 bytes
Execute e depure on-line
Esse envio de 15 bytes é compactado em uma variante do conjunto de caracteres CP437. A representação ascii correspondente leva 18 bytes:
Tenho certeza de que ele pode ser reduzido ainda mais.
VlVd+
também pode serVLA|(
, que à esquerda gira o0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
dez por elemenets. O código inteiro também pode serVlVd+26/,e@:f,{[Io
, que lê a pilha de entrada duas vezes em vez de lê-las todas no início da pilha principal e usa um formato de entrada diferente (mais tradicional), como mostrado neste .fonte
Dyalog APL , 22 bytes
(819⌶⎕A)
dobre o alfabeto maiúsculo para minúsculo(
…)⎕A⎕D[a]
Dígitos superiores inferiores reordenados de acordo com a matriz a∊
aplainars⍋⍨
para a string s , obtenha os índices que classificariam s de acordo com o "alfabeto"s[
…]
Use isso para reordenar sfonte
PowerShell v2 +, 107 bytes
Estou explorando algoritmos usando regex, mas até agora todos parecem mais longos.
Recebe entrada como matriz explícita
$n
(veja exemplos abaixo) e sequência$s
que é imediatamente convertida em uma matriz de caracteres. Estamos construindo três elementos de uma nova matriz dinâmica, cada um deles encapsulado com um-join
:-
(($s=$s|sort)|?{$_-ge97})
-
($s|?{$_-in65..96})
-
($s|?{$_-lt58})
O primeiro pegamos
$s
e executamosSort-Object
. Felizmente, como já o definimos como um array de caracteres, é uma classificação que diferencia maiúsculas de minúsculas. Isso é salvo novamente e, em$s
seguida, canalizado para aWhere-Object
com uma cláusula maior que97
(ou seja, letras minúsculas ASCIIa-z
). O segundo é paraA-Z
e o terceiro para0-9
.Portanto, agora temos uma matriz de cadeias, em que cada cadeia é composta por um dos três tipos de caracteres e é classificada. Nós cortamos isso com
[$n]
e depois-join
o resultado juntos para formar nossa string de saída final. Isso fica no pipeline e a impressão está implícita.Casos de teste
fonte
Ruby, 56 bytes
Portado da resposta @Dennis.
Uma solução alternativa de 58 bytes que eu mais gosto, inspirada no @Neil e modificada ligeiramente em sua resposta.
Experimente qualquer uma das versões online! (a versão comentada é a solução alternativa)
fonte
Código de máquina x86 de 32 bits, 70 bytes
Em hexadecimal:
Este procedimento espera que a ordem de classificação da classe de caracteres seja uma sequência terminada em NULL de 3 caracteres (0..2)
ESI
e a sequência a ser classificadaEDI
. A classificação é feita no local usando uma versão extremamente subótima (em termos de desempenho) da classificação de bolhas.fonte
Emacs Lisp, 183 bytes
Um pouco menor que o Java ...
fonte
Clojure, 77 bytes
Não é tão curto quanto o
re-seq
baseado, e eu não conseguia descobrir como expressar isso "(apply str(mapcat sort(map(...))))
" em menos espaço.group-by
cria um mapa de hash que pode ser usado como uma função; quando consultado com um ingeger entre 0 e 2, retorna o grupo correspondente; isso ordena as três classes diferentes de caracteres.Isso seria mais compacto do que a
re-seq
solução se houvesse mais classes de caracteres para manipular, pois isso leva apenas 5 caracteres / grupo extras, em57 1,
vez de 8, como expressões#"[a-z]"
.fonte
Python 2,
14011710110099 bytesTodo mundo diz: "Ewww!". Pelo menos é legível ... tosse não é realmente tosse
Experimente online
fonte
R , 101 bytes
Cria um vetor com az, AZ e 0-9 em uma determinada ordem e reordena os caracteres da sequência de entrada para corresponder a essa ordem.
Experimente online!
fonte
J, 40 bytes
fonte
Java 8,
221212193156 bytesÉ claro que eu deveria tentar responder também ao meu próprio desafio. :) (E como sempre em Java.)
-28 bytes salvos graças a @cliffroot .
Explicação:
Experimente aqui.
fonte
[^a-z]
[^A-Z]
[^0-9]
e você pode usargetBytes()
em vez detoCharArray()
^
(não) foi muito burro ..;)replaceAll
chamadas 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;}