Dada uma frase de entrada que consiste em uma ou mais palavras [a-z]+
e zero ou mais espaços , imprima um histograma de arte ASCII (gráfico de barras) da distribuição de letras da frase de entrada.
O histograma deve ser disposto horizontalmente, ou seja, com a tecla da letra na parte inferior, em ordem alfabética da esquerda para a direita, com um eixo Y rotulado 1-
e a cada 5 unidades. O eixo Y deve ser o menor múltiplo de cinco que seja pelo menos tão alto quanto a barra mais alta e deve estar alinhado à direita. O eixo X é identificado com as letras de entrada, sem espaços entre eles. Por exemplo, a entrada a bb dd
deve ter rótulo abd
e não ab d
, pulando o c
. As barras em si podem ser feitas de qualquer caractere ASCII consistente - usarei X
aqui em meus exemplos.
test example
5-
X
X X
1-XXXXXXXX
aelmpstx
Uma vez que existem três e
, dois t
e um de almsx
.
Mais exemplos:
the quick brown fox jumped over the lazy dogs
5-
X X
X X
XX X X X XX
1-XXXXXXXXXXXXXXXXXXXXXXXXXX
abcdefghijklmnopqrstuvwxyz
now is the time for all good men to come to the aid of their country
10-
X
X
X X
X X X
5- X X X
X X X X
X XX XXXX X
XXXXX XXXXXXX X
1-XXXXXXXXXXXXXXXXXX
acdefghilmnorstuwy
a bb ccc dddddddddddd
15-
X
X
10- X
X
X
X
X
5- X
X
XX
XXX
1-XXXX
abcd
a bb ccccc
5- X
X
X
XX
1-XXX
abc
E / S e regras
- A entrada pode ser obtida em qualquer formato razoável e por qualquer método conveniente . Isso também significa que você pode inserir entradas em maiúsculas, se isso fizer mais sentido para o seu código.
- Novas linhas à esquerda / à direita ou outro espaço em branco são opcionais, desde que os caracteres sejam alinhados adequadamente.
- Um programa completo ou uma função são aceitáveis. Se uma função, você pode retornar a saída em vez de imprimi-la.
- A saída pode ser no console, retornada como uma lista de cadeias, retornada como uma única cadeia, etc.
- As brechas padrão são proibidas.
- Isso é código-golfe, portanto todas as regras usuais de golfe se aplicam e o código mais curto (em bytes) vence.
Respostas:
Stax , 37 bytes
Execute e depure
fonte
R ,
239230 bytesExperimente online!
table
faz o trabalho pesado aqui, unificando os personagens, ordenando-os e retornando suas contagens.Tudo o resto é apenas garantir que as compensações sejam corretas para impressão, que é o trabalho "real" de um desafio da arte ascii.
Graças a @dylnan por apontar um bug.
Obrigado a @rturnbull pela
scan
abordagem, eliminando 2 bytes.fonte
gnu sed -r,
516490278249+ 1 bytesExperimente online!
Estou certo de que isso pode ser melhorado
, mas, por enquanto, isso deve ser bom, considerando que é feito no sed, onde você não tem aritmética ou classificação nativas.Então, eu menti, isso não era bom o suficiente, então eu o melhorei (reescrevi) em outros 212 bytes, com uma dica sobre o algoritmo de classificação do charlatão de vacas , o que me deu uma idéia para diminuir a conversão unária para decimal.Descrição do funcionamento interno:
Isso classifica a entrada e separa os grupos com espaços. Isso funciona anexando primeiro um alfabeto em maiúsculas mais o espaço separado por dois pontos no final. Em seguida, move cada caractere na frente dos dois pontos para um caractere correspondente atrás dos dois pontos usando uma substituição que não diferencia maiúsculas de minúsculas em um loop. As letras maiúsculas são substituídas por espaços e a sequência é copiada para o espaço em espera.
Esse loop funciona reduzindo o tamanho de cada grupo de caracteres em um, acrescentando a linha original classificada e aumentando os contadores unários após os dois pontos que permaneceram na classificação. Ele faz um loop até que uma linha vazia com um número de 5 * n + 1 seja atingida (uma vez que a última linha resulta em espaço em branco). O espaço do padrão se parece com isso após o loop:
A seguir, a formatação:
E, finalmente, o conversor unário para decimal permanece:
Ele basicamente anexa uma string onde está o conhecimento da conversão. Você pode interpretá-lo como: espaço: -> 1 e 0-> 1-> 2-> 3-> 4-> 5-> 6-> 7-> 8-> 9-> 10. A expressão de substituição
s/(.)I(.*\1(I?.))|;.*/\3\2/
funciona de maneira semelhante à da classificação, substituindo os caracteres na frente de I's [(.)I
] pelo caractere que fica ao lado da frente da I na seqüência de conversão [(.*\1(I?.))
] e, se não houver mais, ele remove a sequência anexada [|;.*
]. A substituição [/\nI/s/^/ /Mg
] adiciona preenchimento, se necessário.Agradecimentos ao vacas charlatão por reduzir o tamanho em 26 bytes e pelo algoritmo de classificação mais curto.
fonte
\w
(corresponde aos caracteres da palavra) em vários locais para salvar alguns bytes. Também:b ... tb
pode simplesmente se tornars/\B\w/X/g
. Você pode remover a linha que se segues/:/:,/g
, modificando as substituições anteriores. Você pode olhar em goo.gl/JvD7Rs (link TIO reduzido para o programa sed) para ver o que quero dizer.zyx...cba
à entrada.Dyalog APL ,
1099796959388 bytesExperimente online!
Requer
⎕IO←0
Way muitos bytes salvos graças a Adám e Vacas quack !
fonte
⍵[⍋⍵]~' '
(os tipos e remove espaços antes de passar através⌸
)'X'/⍨≢
→∊⍕¨×
⍵>0
→×⍵
2⌷⍴
→≢⍉
duas vezes05AB1E ,
5847 bytesExperimente online!
-11 bytes graças a @Emigna
fonte
Python 2 , 192 bytes
Experimente online!
Explicação
A linha 2 calcula os valores do histograma de maneira bastante direta, descartando
' '
.A linha 3 usa o truque da computação
ceil(x/5)
como-(-x/5)
: arredondamos a frequência máxima até o próximo múltiplo de 5 usando a fórmula-x/5*-5
. Isto éh
.A linha 4 é um loop que conta de
h
baixo a0
inclusivo, imprimindo cada linha:Se
y%5==2>>y
imprimirmos uma etiqueta. É quandoy
∈ {1, 5, 10, 15, 20,…}(Essa fórmula pode ser mais curta. Precisamos apenas de 1 ou Verdadeiro para {1, 5, 10,…} e 0 ou Falso ou até mesmo um número inteiro negativo para todos os outros valores de
y
.)Justificamos à direita o rótulo (ou espaço vazio) em
len(`-h`)
espaços: é uma economia de um byte puralen(`h`)+1
!Em seguida, imprimimos
X
espaços e espaços para esta linha (sey
≥ 1) ou as letras (sey
= 0), percorrendo pares de valores-chaved
em ordem crescente.fonte
'%d-'%y*(y%5==2>>y)
. Você se importa se eu usar isso na minha resposta?-~-(y%5*~-y)
funciona também, mas infelizmente é um byte a mais.Carvão , 62 bytes
Experimente online! Link é a versão detalhada do código. Explicação:
Crie uma lista de 27 listas.
Empurre cada caractere de entrada para a lista correspondente à sua posição no alfabeto minúsculo. Caracteres não minúsculos são enviados para a 27ª lista.
Descarte o 27º elemento da lista.
Pegue os comprimentos de todos os elementos da lista.
Imprima as letras minúsculas correspondentes aos elementos da lista diferentes de zero.
Imprima os elementos da lista diferentes de zero para cima. Como essa é uma matriz de números inteiros, cada número inteiro é impresso como uma linha (agora vertical), cada um em uma coluna separada.
Calcule o número de marcas de verificação no eixo Y e faça um loop sobre elas.
Calcule a posição da próxima marca de seleção.
Pule para a próxima marca.
Imprima a marca de ré invertida e de trás para frente, alinhando-a efetivamente com a direita.
fonte
Gelatina , 48 bytes
Que campo minado para atravessar!
Um programa completo imprimindo o resultado (como um link monádico, ele retornaria uma lista contendo caracteres e números inteiros de
[0,9]
)Experimente online! Ou veja a suíte de testes
Quão?
fonte
APL (Dyalog Classic) , 56 bytes
Experimente online!
fonte
Ruby ,
250248234188173157153 bytesExperimente online!
Graças a:
-x/5*-5
|[]
fonte
Java (JDK 10) , 296 bytes
Experimente online!
Créditos
fonte
--m%5==0
pode ser--m%5<1
, porque você também tem o&m>0
cheque. Em<=d[a]?"x":" "
pode serm>d[a]?" ":"x"
.(--m%5<1|m==1)&m>0
para--m%5<1|m==1&&m>0
Pitão, 65 bytes
Experimente aqui
Explicação
fonte
JavaScript (Node.js) ,
262256 bytes* Obrigado a @Shaggy por reduzir em 2 bytes
Experimente online!
fonte
1.
aceite as entradas como uma variedade de caracteres individuais,2.
Substituax!=" "
porx>" "
.3.
Substituam=0
pori=m=0
emap((x,i)=>
commap(x=>
.Python 2 ,
249224219215205197187188182176 bytesExperimente online!
Retorna uma lista de listas de caracteres que representam linhas.
map(list,yticks)
lá.y==1
substituído pory<2
.'%d-'%y*(y%5==2>>y)
vez de(`y`+'-')*(not y%5or y<2)
.Ligeiramente não destruído:
fonte
C # (.NET Core) ,
344340338 + 18 bytesInclui 18 bytes para
using System.Linq;
Guardado 6 bytes graças a @KevinCruijssen.
Experimente online!
fonte
j< m;
que pode ser removido. Eint i=0,j
pode ser colocado como,i=0,j
após as outras entradas para -4 bytes no total. Você precisará incluir os 18 bytes para ousing System.Linq;
no entanto ..for(;i<t;){string p=i>0&i%5<1|i==1?i+"-":"",q=p.PadLeft(o);for(j=o;j<m;){...}a[i++]=q;}
parafor(string p,q;i<t;)for(p=i>0&i%5<1|i==1?i+"-":"",q=p.PadLeft(j=o);j<m;a[i++]=q){...}
. Experimente online.Bash + coreutils,
332324323318312302298296293291 bytesExperimente online!
Anotado:
Obrigado a @IanM_Matrix por salvar 3 bytes.
fonte
cat b
poderia estar<b
salvando 3 caracteresC, 201 bytes
A entrada é obtida da linha de comando (primeiro argumento). Usa pontos de exclamação em vez de Xs para reduzir ainda mais o tamanho do código. O contador à esquerda tem sempre três caracteres.
Testado com GCC e clang.
fonte
for(p=b[1];*p;p++)
provavelmente pode serfor(p=b[1]-1;*++p;)
,main(int a,char **b)
provavelmente poderia ser jogado param(a,b)char**b;
.a!=1
será booleano,a%5&&a!=1?
deve ser equivalente aa%5&a!=1?
oua%5&&~-a
.Excel VBA, 316 bytes
Uma função de janela imediata do VBE anônimo que recebe entrada da célula
[A1]
e sai para a janela imediata do VBE.Versão Ungolfed
fonte
Perl 5
-n
,198168 bytesExperimente online!
fonte
Python 3 , 177 bytes
Experimente online!
Essa pode não ser a abordagem mais eficiente em bytes em Python, mas eu realmente queria resolver isso com uma lambda "true one-liner".
Produz uma lista de listas de caracteres. Abusa de várias novas linhas e espaços principais, como todo mundo. Na verdade, pode ser ainda mais reduzido para 174 bytes se for aceitável agrupar o resultado em outra lista, para que possamos transferir a
[0]
indexação final para o rodapé.fonte
JavaScript (ES8), 200 bytes
Recebe a entrada como uma matriz de caracteres. Retorna uma string.
Experimente online!
Comentado
fonte