Se você classificar uma string, normalmente obterá algo como:
':Iaaceeefggghiiiiklllllmnnooooprrssstttttuuyyyy
Sim, essa foi a primeira frase classificada.
Como você pode ver, há um monte de caracteres repetidos, aa
, eee
, ttttt
, 9 espaços e assim por diante.
Se adicionarmos 128
ao valor ASCII da primeira duplicata, 256
da segunda e 384
da terceira e assim por diante, classificá-la novamente e emitir a nova string (módulo 128 para recuperar os mesmos caracteres), obteremos a string:
':Iacefghiklmnoprstuy aegilnorstuy egilosty iloty lt
(Observe o espaço à esquerda e os 4 espaços à direita).
A string é "sequencialmente ordenados" <space>':I....uy
, <space>aeg....uy
, <space>egi....ty
, <space>iloty
, <space>lt
, <space>
, <space>
, <space>
, <space>
.
Talvez seja mais fácil visualizar isso se usarmos uma string com dígitos. A corda 111222334
vai quando "ordenada" ser: 123412312
.
Desafio:
Para nenhuma surpresa, o desafio é escrever um código que classifique uma string de acordo com a descrição acima.
Você pode assumir que a sequência de entrada conterá apenas caracteres ASCII imprimíveis no intervalo 32-126 (espaço para til).
Casos de teste:
**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(),()()()()
Isso é código-golfe , então o código mais curto em cada idioma contado em bytes ganhará ref .
{'S', 'g', 'i', 'n', 'r', 't'}
em Python, já que a maneira "normal" de fazê-lo é"String"
.{'a','b'}
não é aceito em Matlab, pois você pode adicionar um personagem para cada um dos personagens como este:{'aa','b'}
. Sua entrada e saída devem estar no mesmo formato.Respostas:
Pitão, 5 bytes
Suíte de teste
Muito simples: agrupe e classifique, transponha, concatene.
fonte
Gelatina , 3 bytes
Experimente online!
Como funciona
Oh garoto, esse desafio foi quase feito para Jelly.
O grupo atom (
Ġ
) pega uma matriz 1 como entrada e agrupa índices que correspondem a elementos idênticos da matriz. A matriz de grupos de índices é classificada com os elementos correspondentes como chaves, que é precisamente a ordem que exigimos para esse desafio.Em seguida, o zip atom (
Z
) transpõe linhas e colunas da matriz de índices gerada (irregular). Isso consiste simplesmente em ler as colunas da matriz, pulando elementos que não estão presentes nessa coluna. Como resultado, obtemos o primeiro índice do caractere com o ponto de código mais baixo, seguido pelo primeiro índice do caractere com o segundo ponto de código mais baixo,… seguido pelo segundo índice do caractere com o ponto de código mais baixo, etc.Finalmente, o átomo não indexado (
ị
) recupera os elementos da matriz de entrada em todos os seus índices na ordem gerada. O resultado é uma matriz de caracteres 2D, que a Jelly nivela antes de imprimi-la.1 Jelly não tem um tipo de string , apenas matrizes de caracteres.
fonte
Python 3,
10910510410399939088817969 bytes2 bytes salvos graças ao FlipTack
7 bytes salvos porque o flornquake pegou meu erro burro
2 bytes salvos graças ao xnor
10 bytes salvos graças a Dennis
Explicação
Começamos convertendo nossa string em uma lista usando um splat e armazenando essa lista em uma variável
a
. Então, enquanto nossaa
lista não estiver vazia, passamos por cada membro únicoa
em ordem classificada, imprima-o e remova uma cópia desse caractere da lista.Cada iteração impressa imprime uma cópia de cada caractere presente em
a
.fonte
set
é um conjunto não classificado.f
uma string em vez de uma lista para salvar alguns bytes.a=list(input())
, você pode fazera.remove(c)
, o que é uma economia líquida.Haskell, 44 bytes
Exemplo de uso:
Classifique, agrupe caracteres iguais a uma lista de strings (por exemplo,
"aabbc"
->["aa","bb","c"]
), transponha e achatar em uma única string novamente.fonte
Python 2 , 75 bytes
Experimente online!
fonte
lambda s:`[sorted((1e9+s[:i].count(c),c)for i,c in enumerate(s))]`[18::21]
funciona para strings com comprimento máximo9e9
.[]
e mudar18
para17
salvar dois bytes.lambda s:`sorted((1e9+s[:i].count(c),c)for i,c in enumerate(s))`[17::21]
zip
, mas não acho que a adição1e9
já tivesse me ocorrido ... Obrigado!Dyalog APL , 21 caracteres = 39 bytes
t[
...]
índice t (a ser definido em breve) com ...0~⍨
zeros removidos de∊
o alistado (achatado)⍉
transposto(⊢⌸t)[
...;]
digitado * t , indexado por linha por ...⍋
os índices que classificariam∪
as letras únicas det←
t , que tem o valor de⍞
entrada de texto solicitadaTryAPL online!
*
⊢⌸t
cria uma tabela onde as linhas (preenchidas com zeros para uma tabela retangular) listam os índices de cada letra única em t .fonte
⌸
faz com que tudo seja UTF-8 em vez de um byte por caractere.C,
10910610510410210097989691 BytesFaça backup de 98 bytes, necessário para inicializar j para tornar f (n) reutilizávelAté 96 bytes usando coloca no lugar de strlen B-)É estranho que eu tenha voltado ao strlen, mas me livrei do loop for (; i ++;), então agora reduzimos para 91 bytes. Aparentemente, a página de manual do put lê;
... tive sorte de estar trabalhando em primeiro lugar
código de teste ...
Aqui estão alguns casos de teste, agora é hora de resolver isso
fonte
Mathematica,
686059 bytesAceita uma String. Produz uma String.
Se a lista de caracteres fosse permitida (46 bytes):
Versão usando
Sort
(40 bytes):Esta versão não pode ser minha resposta porque
Sort
não pode ser usada aqui;Sort
classifica por ordem canônica, não por código de caractere.fonte
Characters
comando tecnicamente produz uma lista de cadeias de comprimento 1.Python 2,
7776 bytesUtiliza uma string entre aspas como entrada de stdin.
Experimente online!
fonte
JavaScript (ES6), 79 bytes
Funciona extraindo o conjunto de caracteres exclusivos, classificando-o, removendo-os da string original e calculando recursivamente o tipo do restante da string. Solução de 81 bytes que achei interessante:
fonte
J ,
1615 bytesEste é um verbo que pega e retorna uma string. Experimente online!
Miles economizou um byte, obrigado!
Explicação
Nada muito chique aqui: classifique principalmente por ordem de ocorrência, secundariamente por valor de caractere.
fonte
Mathematica, 55 bytes, não concorrente
Edit: Infelizmente, o Mathematica não
sort
é por códigos de caracteres, mas por ordem alfabética, onde maiúsculas seguem imediatamente em minúsculas (ou seja, são classificadas como ).Hi There
{ , e, e, h, H, i, r, T}
Isso funciona usando padrões:
fonte
Rule (->)
deve serRuleDelayed (:>)
(sem alteração na contagem de bytes) porque os dois lados doRule
têm variáveis.Rule
pode causar conflitos com definições pré-existentes. Por exemplo:a=3;5/.{a_->a}
retorna3
, não5
. (a_->a
avalia comoa_->3
- se você usara_:>a
, permanece assim ea=3;5/.{a_:>a}
retorna5
).Brainf * ck ,
458226 bytesExperimente online! - BF
Numberwang ,
262226 bytesExperimente online! - NO
Coloquei os dois aqui porque são códigos idênticos.
fonte
PHP, 83 bytes
Infelizmente você não pode ter
unset
um ternário, então eu preciso usar o tempo irritantemente longoarray_filter
.Use como:
fonte
Python 2, 70 bytes
Experimente online
Isso é muito ineficiente. O link de teste altera
i>>7
parai>>5
e define o limite de recursão para 10000. Supõe que as entradas tenham apenas valores ASCII até 126.Usa o truque div-mod para iterar através de dois loops: contagem mínima
i/128
no loop externo e valores ASCIIi%128
no loop interno. Inclui um caracterec
com o valor ASCII especificado se o número de vezes que ele aparecer na sequência for pelo menos a sua contagem mínima.O código usa um truque para simular a atribuição,
c=chr(i%128)
para que possa ser referenciada na expressão(s.count(c)>i>>7)*c
. Pythonlambda
s não permitem atribuição porque eles apenas recebem expressões. A conversão para umdef
programa completo ainda é uma perda líquida aqui.Em vez disso, a função envia o valor
chr(i%128)
para a próxima chamada recursiva como uma entrada opcional. Isso é desativado em um porquei
foi incrementado, mas não importa, desde que a sequência não contenha caracteres especiais'\x7f'
(também podemos aumentar de 128 para 256). A inicialc=''
é inofensiva.fonte
V ,
3736 bytesObrigado @DJMcMayhem pelo byte!
Experimente online!
Não tenho certeza se gosto da regex no final, mas precisava fazer a
ò
pausa de alguma forma.Explicar
fonte
Íî
(ou:%s/\n//g
) é menor queVGgJ
Perl 6 , 68 bytes
Fiquei um pouco surpreso ao descobrir que não há uma maneira integrada de agrupar elementos semelhantes em uma lista. É isso que o bit do mapa de squish faz.
fonte
a
para@a
(+2 bytes). Além disso,grep *eq$_,
pode ser gravadogrep $_,
(-3 bytes), pois uma string é um correspondente inteligente válido.{[~] flat roundrobin |.comb.classify(~*){*}.sort»[*]}
- Essa variação é de apenas 54 bytes.classify
solução baseada em como uma resposta separada agora.JavaScript (ES6),
7775 bytesStable classifica a sequência lexicograficamente classificada pela nª ocorrência
fonte
1+~~
é o mesmo que-~
.Perl 6 , 54 bytes
Explicação:
{ }
: Um lambda que leva um argumento - por exemplo21211
..comb
: Dividir o argumento de entrada em uma lista de caracteres - por exemplo(2,1,2,1,1)
..classify(~*)
: Agrupe os caracteres usando a comparação de cadeias como condição de agrupamento, retornando um hash não ordenado - por exemplo{ 2=>[2,2], 1=>[1,1,1] }
.{*}
: Retorna uma lista de todos os valores do Hash - por exemplo[2,2], [1,1,1]
..sort
: Classifique - por exemplo[1,1,1], [2,2]
.»[*]
: Remova os contêineres de itens nos quais as matrizes foram agrupadas devido ao hash, para que não sejam consideradas como um único item na etapa a seguir - por exemplo(1,1,1), (2,2)
.roundrobin |
: Zip das sub-listas até que todos estão esgotados - por exemplo(1,2), (1,2), (1)
.flat
: Achatar o resultado - por exemplo1, 2, 1, 2, 1
.[~]
: Concatene para obter uma sequência novamente - por exemplo12121
.(O crédito pela
roundrobin
abordagem vai para a resposta de Sean .)fonte
05AB1E , 15 bytes
Experimente online! ou como um conjunto de testes
Explicação
10 dos 15 bytes destinam-se a entender a maneira do 05AB1E de lidar com seqüências de caracteres de tamanho diferente.
fonte
FSharp,
194190170140133 133 bytesUsar Seq em vez de Matriz economiza alguns bytes
Definindo um nome mais curto e usando outros mapas para evitar um
(fun ->)
bloqueioAcontece que o F # pode mapear um caractere para um in, portanto, remover o nome abreviado de System.Text.Encoding.ASCII e adicionar outro mapa economiza 20 bytes!
Retornar um array de caracteres em vez de uma string me salva 30 bytes!
Eu não preciso mais ter certeza de que é uma string, me economiza 7 bytes
fonte
JavaScript (ES6), 114 bytes
Separado com nova linha para maior clareza, não faz parte da contagem de bytes:
Demo
fonte
Clojure, 79 bytes
Uma função anônima, retorna uma sequência de caracteres. Suporta até 10 ^ 9 repetições de qualquer caractere, o que deve ser suficiente.
fonte
Retina , 24 bytes
Experimente online!
fonte
Ruby, 59 + 1 = 60 bytes
Adiciona um byte para o
-n
sinalizador. Porto da solução de dicionário @PatrickRoberts.fonte