Você não ama aqueles diagramas de vista explodida nos quais uma máquina ou um objeto é desmontado em suas partes menores?
Vamos fazer isso com uma string!
O desafio
Escreva um programa ou função que
- insere uma string contendo apenas caracteres ASCII imprimíveis ;
- disseca a string em grupos de caracteres iguais a não espaço (as "partes" da string);
- gera esses grupos em qualquer formato conveniente, com algum separador entre os grupos .
Por exemplo, dada a sequência
Ah, abracadabra!
a saída seria os seguintes grupos:
! , UMA aaaaa bb c d h rr
Cada grupo na saída contém caracteres iguais, com espaços removidos. Uma nova linha foi usada como separador entre grupos. Mais sobre os formatos permitidos abaixo.
Regras
A entrada deve ser uma sequência ou uma matriz de caracteres. Ele conterá apenas caracteres ASCII imprimíveis (o intervalo inclusivo do espaço ao til). Se o seu idioma não suportar isso, você poderá inserir a entrada na forma de números que representam códigos ASCII.
Você pode supor que a entrada contenha pelo menos um caractere não espacial .
A saída deve consistir em caracteres (mesmo que a entrada seja por meio de códigos ASCII). Deve haver um separador inequívoco entre os grupos , diferente de qualquer caractere não espacial que possa aparecer na entrada.
Se a saída for via retorno de função, também poderá ser uma matriz ou seqüências de caracteres, ou uma matriz de matrizes de caracteres ou estrutura semelhante. Nesse caso, a estrutura fornece a separação necessária.
Um separador entre os caracteres de cada grupo é opcional . Se houver um, a mesma regra se aplica: ele não pode ser um caractere não espacial que pode aparecer na entrada. Além disso, não pode ser o mesmo separador usado entre os grupos.
Fora isso, o formato é flexível. aqui estão alguns exemplos:
Os grupos podem ser cadeias separadas por novas linhas, como mostrado acima.
Os grupos podem ser separados por qualquer caractere não ASCII, como
¬
. A saída para a entrada acima seria a string:!¬,¬A¬aaaaa¬bb¬c¬d¬h¬rr
Os grupos podem ser separados por n > 1 espaços (mesmo que n seja variável), com caracteres entre cada grupo separados por um único espaço:
! , A a a a a a b b c d h r r
A saída também pode ser uma matriz ou lista de seqüências retornadas por uma função:
['!', 'A', 'aaaaa', 'bb', 'c', 'd', 'h', 'rr']
Ou uma matriz de matrizes de caracteres:
[['!'], ['A'], ['a', 'a', 'a', 'a', 'a'], ['b', 'b'], ['c'], ['d'], ['h'], ['r', 'r']]
Exemplos de formatos que não são permitidos, de acordo com as regras:
- Uma vírgula não pode ser usada como separator (
!,,,A,a,a,a,a,a,b,b,c,d,h,r,r
), porque a entrada pode conter vírgulas. - Não é aceito descartar o separador entre grupos (
!,Aaaaaabbcdhrr
) ou usar o mesmo separador entre grupos e dentro de grupos (! , A a a a a a b b c d h r r
).
Os grupos podem aparecer em qualquer ordem na saída. Por exemplo: ordem alfabética (como nos exemplos acima), ordem da primeira aparição na sequência, ... A ordem não precisa ser consistente nem determinística.
Observe que a entrada não pode conter caracteres de nova linha A
e a
são caracteres diferentes (o agrupamento diferencia maiúsculas de minúsculas ).
O menor código em bytes vence.
Casos de teste
Em cada caso de teste, a primeira linha é inserida e as linhas restantes são a saída, com cada grupo em uma linha diferente.
Caso de teste 1:
Ah, abracadabra! ! , UMA aaaaa bb c d h rr
Caso de teste 2:
\ o / \ o / \ o / /// \\\ ooo
Caso de teste 3:
Um homem, um plano, um canal: Panamá! ! ,, : UMA P aaaaaaaaa c ll milímetros nnnn p
Caso de teste 4:
"Mostre-me como você faz esse truque, aquele que me faz gritar", disse ela "" , S aaaaa cc dd eeeeeee hhhhhh ii kk mmmm n ooooo rr ssss tttttt você ww y
Respostas:
Geléia , 5 bytes
Experimente online!
Ele retorna uma matriz, só que, quando é impressa em STDOUT, o separador desaparece.
Esta é realmente uma função que pode ser chamada como tal (no Jelly, cada linha é uma função).
fonte
Python 3.5+,
77464441 bytesBem simples. Percorre os caracteres únicos da string convertendo-os em um conjunto (usando a descompactação iterável estendida do Python 3.5) e, em seguida, usa uma compreensão de lista para construir os diagramas explodidos contando o número de vezes que cada caractere ocorre na string
str.count
. Nós filtramos os espaços removendo-os do conjunto.A ordem da saída pode variar de execução para execução; conjuntos são desordenados, portanto, a ordem na qual seus itens são processados e, portanto, essa resposta é gerada, não pode ser garantida.
Esta é uma expressão lambda; para usá-lo, prefixe
lambda
comf=
.Experimente no Ideone!Ideone usa Python 3.4, o que não é suficiente.Exemplo de uso:
Guardado 3 bytes graças a @shooqie!
fonte
{*s}
paraset(s)
.Retina, 13 bytes
A classificação é muito fácil (é embutida), está separando as letras que levam 9 bytes. Experimente online!
A primeira linha
O
mostra todas as correspondências da expressão regular.
(que é todo caractere), fornecendo-nos!,Aaaaaabbcdhrr
.Correspondência é o estágio padrão para a última linha de um programa e
!
faz com que ele imprima uma lista de correspondências da regex separada por avanço de linha. A regex procura por uma ou mais instâncias de um caractere não espacial em uma linha.fonte
Perl 6 , 28 bytes
Observe que Bag como um Hash ou Set não é ordenado, portanto a ordem dos resultados não é garantida.
Explicação:
fonte
Vim,
50, 46 bytesA explicação / gif virá mais tarde.
fonte
Pitão, 6
Experimente aqui ou execute um conjunto de testes .
Muito simples,
-zd
remove espaços da entrada e.gk
agrupa cada elemento restante por seu valor. Infelizmente, não encontrei uma maneira de usar variáveis de preenchimento automático. Observe que a saída é mostrada como seqüências de caracteres Python, portanto, certos caracteres (leia-se barras invertidas) são escapados. Se você quiser que seja mais legível, adicionej
a no início do código.fonte
Haskell, 38 bytes
Basicamente, a solução de nimi , mas verificando explicitamente apenas as letras que aparecem na string.
fonte
2sable , 7 bytes
Código:
Explicação:
Usa a codificação CP-1252 . Experimente online!
fonte
JavaScript (ES6), 41 bytes
fonte
" "
na matriz retornada? Não tenho certeza se isso é permitidojoin()
sendo chamado com esses backkticks duplos?.join([''])
.join
em seguida, converte isso na string (vazia) e a usa para unir os elementos da matriz. Nem todos os métodos convertem seus parâmetros em string, mas essa técnica é útil naqueles que o fazem.Braquilog ,
147 bytes7 bytes graças a Fatalize.
Experimente online!
fonte
x
para remover@S
(espaço). Eu acredito que este formato de saída (lista de nomes) é válidoHaskell, 40 bytes
Exemplo de uso:
f "Ah, abracadabra!"
->["!",",","A","aaaaa","bb","c","d","h","rr"]
.O padrão
v:w
corresponde apenas à lista com pelo menos um elemento, portanto, todos os caracteres que não estão na entrada são ignorados.Também 40 bytes:
fonte
group
éData.List
também. Enfim, acho que essa sintaxe éghci
apenas e precisa do REPL, portanto é uma linguagem própria . Eu quero ficar com o Haskell padrão.Ruby, 41 + 1 = 42 bytes
+1 byte para
-n
sinalizador.Aceita stdin, por exemplo:
fonte
C #
12598 bytesExplicação
ToArray
chamada e retornar implicitamente apenas um IEnumerable que salva coletivamente 27 bytesfonte
Func<string, string[]>
ou sejas=>s.GroupBy....
R,
1981899695 bytesUngolfed:
Atualmente, esta solução não está funcionando totalmente quando\
está envolvida.Agora é!
Obrigado muito que você @JDL para jogar golfe fora 102 bytes!
fonte
for(i in unique(a=strsplit(gsub(" ","",readline()),"")[[1]]))cat(rep(i,sum(a==i)),"\n",sep="")
- economiza 2 bytes.<-
economizará 1 byte!Rápido,
10591 bytesObrigado a @NobodyNada por 14 bytes :)
Sim, sou bem novo no Swift ...
Os caracteres dentro de um grupo são separados por uma única nova linha. Os grupos são separados por duas novas linhas.
fonte
[Character]
vez de aString
, uma vez que as regras dizem "A entrada deve ser uma string ou uma matriz de caracteres". Além disso,print("")
pode ser substituído por apenasprint()
.print
sem argumentos não funcionou por algum motivo, mas a[Character]
sugestão foi sólida. Obrigado!Oitava , 61 bytes
Essa é uma função anômala que recebe uma string como entrada e gera um array de células de strings.
Experimente a Ideone .
Como funciona
sort
classifica a sequência de entrada. Em particular, os espaços estarão no início.strtrim
remove espaços à esquerda.diff(+y)
calcula diferenças consecutivas entre caracteres (para detectar limites do grupo) ...diff(find([1 diff(+y) 1])
fornece um vetor de tamanhos de grupos.mat2cell
em seguida, divide a sequência classificada em pedaços com esses tamanhos.fonte
Mathematica, 36 bytes
Funções internas
Gather
eCharacters
faz a maior parte do trabalho aqui.fonte
> <> , 49 bytes
Muito desperdício na produção, mas presumo que ainda seja permitido, dada a clareza das regras
Explicação:
encaixe algumas coisas bem apertadas, mesmo usando saltos para contornar algumas funções, para que eu possa executar o ponteiro verticalmente.
Basicamente, isso coloca cada caractere ASCII em sua própria nova linha e, se nenhum desses caracteres existir, a linha ficará em branco
Experimente online
Edit: eu estava errado, havia um erro no código o que faria com que ele nunca fosse concluído se houvesse um espaço na entrada
fonte
Pitão, 5 bytes
Experimente aqui!
Recebe a entrada como uma string Python (ou seja, envolvida em aspas, aspas e barras escapadas, conforme necessário).
Explicação:
Se você garantir pelo menos um espaço na entrada, há uma solução de 4 bytes:
Experimente aqui!
Explicação:
fonte
PowerShell v2 +, 44 bytes
Recebe a entrada
$args[0]
como uma sequência literal de argumento da linha de comando. Lança isso como umachar
matriz e usa o operador-n
ote
qual para extrair espaços (ASCII32
). Isso funciona porque a conversão tem uma precedência de ordem mais alta e, quando uma matriz é usada como operador à esquerda com um escalar à direita, ela age como um filtro.Passamos esse conjunto de caracteres para
Group-Object
, que faz exatamente o que diz. Observe que, como estamos passando caracteres , não cadeias, isso agrupa adequadamente com distinção entre maiúsculas e minúsculas.Agora, temos um (s) objeto (s) personalizado (s) com nomes de grupos, contagens etc. Se apenas imprimirmos, teremos uma série de resultados estranhos. Então, precisamos tubulação aqueles em um loop
|%{...}
e cada iteração-join
o.Group
conjunto em uma única seqüência. Essas seqüências resultantes são deixadas no pipeline e a saída é implícita na conclusão do programa.Exemplo
fonte
Dyalog APL , 11 bytes
Função retornando lista de strings.
(⊂∩¨∪)
a interseção da totalidade e seus caracteres únicos~∘' '
exceto espaçosTryAPL online!
fonte
Processando, 109 bytes
É a abordagem da força bruta, classifica a matriz e passa por ela. Se não corresponder ao último caractere impresso, imprima uma nova linha primeiro. Se estiver em branco, pule a etapa de impressão.
fonte
Javascript (usando a Biblioteca externa - Enumerável) (
7867 bytes)Link para lib: https://github.com/mvegh1/Enumerable
Explicação do código: Isto é o que Enumerable foi feito para fazer! Carregue a sequência na biblioteca, que a converte em uma matriz de caracteres. Filtre as entradas de espaço em branco. Agrupar por char. Escreva cada grupo em uma linha, de acordo com o predicado especificado. Esse predicado diz para unir todos os elementos do grupo atual em uma sequência, sem um delimitador.
fonte
MATL, 7 bytes
Demonstração online do MATL
fonte
Perl6,
484745Obrigado ao manatwork pelas melhorias.
fonte
$a.trim
parece fazê-lo para a condição.$^a.trim&&say $a x$^b
funciona. (Desculpe para adicionar o dicas byte por byte, mas esta é a minha primeira tentativa em Perl6.){
.Ruby, 46 bytes
Experimente online!
Minha versão original do programa, 48 bytes após adicionar o
n
sinalizador:fonte
.count(c)
com.count c
?*
operador está presente nas proximidades, para que o analisador se queixe.map
ele precisa de parênteses extras e((s.chars-[' '])|[]).map
tem o mesmo número de caracteres que(s.chars-[' ']).uniq.map
. E a outra maneira, mais curto para verificar personagens únicos (via regex) já está coberto por @Jordan em outra respostaPython, 107
Pode ser encurtado por lambda, mas mais tarde
fonte
CJam, 10 bytes
Um bloco sem nome que espera a cadeia no topo da pilha e a substitui por uma lista de cadeias.
Experimente online!
Explicação
fonte
Lisp comum, 123
Ungolfed:
Não é a linguagem mais amigável para o golfe. Provavelmente, isso pode ser modificado para retornar a lista de listas em vez de imprimir a string.
fonte
Emacs, 36 pressionamentos de tecla
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!
->Explicação
sort-r
TAB RETURN .RETURN .RETURN\(\(.\)\2*\)
RETURN\1
C-Q C-JRETURN !sort-regexp-fields
com argumentos.
e.
;\(\(.\)\2*\)
->\1\n
em todas as correspondências.fonte