Breve descrição do desafio:
baseado no ETAOIN SHRDLU , seu desafio é escrever o programa ou a função mais curto em qualquer idioma que produza as 26 letras do alfabeto inglês com base na frequência na entrada.
Especificação muito longa, seca e completa:
- Seu programa / função receberá como entrada uma sequência de texto, que conterá uma ou mais letras maiúsculas e / ou minúsculas e também poderá conter pontuação, numerais, símbolos e outros caracteres não alfabéticos.
- O programa / função deve produzir apenas as 26 letras maiúsculas do alfabeto inglês, incluindo as que não aparecem na entrada, ordenadas da mais para a menos frequente com base em quantas vezes elas aparecem na entrada.
- Editar: a frequência é calculada sem distinção entre maiúsculas e minúsculas, mas a saída deve estar em maiúsculas.
- Se duas ou mais letras tiverem a mesma frequência, elas podem estar em qualquer ordem.
Nenhuma outra saída, como espaço em branco, é permitida.- Editar 1/7/2014: com base nos comentários, estou alterando esta regra. A única outra saída permitida é o espaço em branco inicial e / ou final opcional, como uma nova linha final. Nenhuma outra saída é permitida.
- Comportamento indefinido é permitido para entrada que não contém nenhuma letra.
O vencedor será escolhido daqui a sete dias, então digite os dedos!
Exemplo de entrada:
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent vitae erat velit. Mauris gravida euismod libero ut tincidunt. Phasellus elit dui, consectetur et egestas in, aliquam vitae diam. Donec eget varius ante. Vestibulum cursus diam aliquet, egestas orci quis, placerat dolor. Proin vel nisi lectus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aliquam erat volutpat. Etiam libero tortor, ornare id dui eget, posuere dignissim libero. Pellentesque commodo consequat volutpat. Integer hendrerit sapien libero, vel viverra augue facilisis sit amet. Quisque consectetur eget nisl quis dignissim. Ut lacinia pretium quam a placerat.
Morbi sed interdum risus, nec pretium lectus. Morbi imperdiet est id accumsan molestie. Duis sed fermentum nisl. Nunc vitae augue mattis, dictum lectus vel, accumsan nisl. Sed ultricies adipiscing rhoncus. Vivamus eu lacus a enim venenatis eleifend. Praesent consectetur tortor non eleifend ultricies. Mauris et odio posuere, auctor erat at, fringilla est. Proin in vestibulum erat. Maecenas congue commodo ante vel varius. Sed tempus mi ut metus gravida, nec dictum libero dapibus. Morbi quis viverra elit. Ut pharetra neque eget lacus tincidunt dictum. Fusce scelerisque viverra tellus et pretium.
Fusce varius adipiscing odio. Nulla imperdiet faucibus sem, at rhoncus ipsum adipiscing vitae. Phasellus imperdiet congue lacus et mollis. Nullam egestas mauris magna, et mollis lectus varius ut. Sed sollicitudin adipiscing dolor, vel elementum elit laoreet molestie. Aliquam nec nulla vel sem ultrices ullamcorper. Nullam nec felis magna. Duis sodales orci non justo aliquam tempus. Integer mi diam, tempor sed vulputate et, varius et nunc. Vestibulum sodales ipsum id mi pharetra, ut convallis mi accumsan. Sed dictum volutpat vestibulum.
Quisque ac dolor sagittis, aliquam libero at, euismod enim. Nulla ullamcorper posuere nulla vitae varius. Nam at dolor non libero elementum pellentesque in in lorem. Fusce porttitor turpis in quam placerat varius. Donec lorem orci, condimentum eu sapien sit amet, aliquet commodo magna. Quisque sed lectus sit amet arcu euismod accumsan et non nunc. Phasellus placerat congue metus, feugiat posuere leo dictum quis. Sed ultricies feugiat eros dignissim bibendum.
Mauris scelerisque consectetur libero eget varius. Aenean neque nunc, ullamcorper vitae orci in, auctor ornare sapien. Nam lacinia molestie imperdiet. Nam vitae mattis nibh. Vestibulum consequat tellus ac nisi sagittis pulvinar. Nullam mollis ornare quam, et venenatis leo porttitor sit amet. Nulla urna neque, dignissim non orci ut, volutpat ultrices erat. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Pellentesque vestibulum tellus nec eros faucibus porta.
Exemplo de saída:
EITUSALNROMCDPVGQBFHJKWXYZ
Nota: existe um empate de 5 vias KWXYZ
para essa entrada.
Editar:
A competição acabou! Obrigado a todos que participaram. E agora para o (s) vencedor (es): As respostas de Dennis 'CJam e Isaacg's Pyth chegaram com 19 caracteres impressionantes. (Desculpe, mas não vou aceitar nenhuma das respostas, porque acho que seria injusto com a outra.) Editar: Seguindo o conselho de Dennis, vou marcar sua resposta como aceita, porque foi a primeira a alcance 19 caracteres. Menções honrosas vão para a resposta Golfscript, de Ilmari Karonen, em terceiro lugar, com 22 caracteres, bem como a resposta Python de 75 caracteres, do undergroundmonorail, que obteve o maior número de votos. Mais uma vez, obrigado a todos que participaram!
Respostas:
CJam,
2119 bytesExperimente online.
Exemplo
(sem nova linha)
Como funciona
Mais ocorrências significa que mais caracteres são removidos; portanto, os caracteres mais frequentes aparecem no início da matriz.
fonte
Python 2 ou 3 -
7775 bytesEu tive uma resposta antes que pegou a entrada do STDIN, mas percebi que era tecnicamente inválida. Eu usei o
input()
que obtém apenas uma única linha, mas o exemplo de entrada da pergunta implica que ele deve lidar com várias linhas ao mesmo tempo. Para atender às especificações, transformei minha resposta em uma função que recebe um argumento de string. Para minha surpresa, era dois bytes menor! Não me ocorreu issoprint(...)
einput()
foi mais longo quef=lambda s:
es
.Isso também torna a resposta compatível com o Python 2 e o Python 3. Originalmente, era apenas o Python 3, porque era usado
input()
(que foi chamadoraw_input()
em 2). Agora que é uma função, funciona em ambas.Explicado
fonte
count
não é uma variável nem nada, é uma função literal. Por mais legal que seja, poder multiplicar o valor de retorno de uma função-1
colocando um-
na frente, esse não é um recurso que o python possui.Bash, 65 bytes
Exemplo
Como funciona
fonte
{A..Z}
. Todos os códigos de idioma LC_COLLATE funcionam, porque o OpenBSD possui apenas LC_COLLATE = C.Pitão 1.0.2 , 19
20Experimente aqui: http://ideone.com/fork/YlWpEJ
Saiba mais sobre Pyth aqui: http://esolangs.org/wiki/Pyth
Exemplo:
Dá:
Explicação:
=ZUw
: Converta entrada para maiúscula e armazene em Z.sV
: Imprima a soma do reverso dem;d
: As últimas entradas deS
: Classificados pela primeira entrada, em ordem crescentem[cZkk)
: As listas [contagem de k em Z, k]UG
: Para k nas letras maiúsculas.Equivalente em Python aproximado:
Isso não é entrada, eu apenas pensei que as pessoas gostariam de vê-lo. No Pyth 1.0.4, o programa a seguir é uma solução em 10 caracteres:
Explicação:
JUw
: Converter entrada em maiúsculas e armazenar em J.o
: (Imprimir) Classificar por_cJN
: -1 * (contagem de N em J)UG
: Acima de N nas letras maiúsculas.Não é uma solução legal porque várias das alterações do Pyth 1.0.2 para 1.0.4, incluindo a adição da função
o
classificar por, foram em resposta a esse problema.fonte
Z
para se referir a ela mais tarde? Apenas colocar a expressãoZ
em seu lugar faria com que a entrada fosse lida várias vezes?Javascript ( ES6 )
119117Edit: (-2) Removida a necessidade de
toUpperCase
usar um RegEx que não diferencia maiúsculas de minúsculas nasplit
chamada.Alternativa (mesmo comprimento): Condensou a classificação e a contagem de caracteres em uma única função.
Em função:
105104Edit: (-1) Condensou a classificação e a contagem de caracteres em uma única função.
fonte
GolfScript, 22 caracteres
Experimente online.
Explicação:
:?
atribui a sequência de entrada ao símbolo?
. (Eu uso um símbolo de pontuação para que o número a seguir91
não seja analisado como parte do nome do símbolo.)91,
constrói uma lista dos números de 0 a 90 (código ASCII deZ
).+
anexa esta lista à string de entrada, convertendo-a de uma matriz de códigos ASCII em uma string (e também removendo convenientemente a string de entrada da pilha).-26>
pega os últimos 26 caracteres dessa sequência, produzindo uma sequência contendo as letras ASCII maiúsculas deA
atéZ
.{ }$
aplica o bloco de código a todos os caracteres na sequência de entrada e classifica esses caracteres de acordo com o resultado..
duplica o caractere e32+
converte a cópia de maiúscula para minúscula. Ele]
coleta esses dois caracteres em uma matriz,?\-
pega a cadeia de entrada armazenada?
e remove todas as ocorrências dos caracteres da matriz e,
conta o comprimento da cadeia restante, que será a chave de classificação. Os caracteres serão classificados em ordem crescente por essa chave e, portanto, em ordem decrescente por número de ocorrências.fonte
91,+-26>
.22
, mais do que25
:)Haskell, 110 bytes
Exemplo de uso:
fonte
(/=c)
e se livrar do0-
?Ruby 2.0, 53 caracteres
EDIT : corrigido para funcionar corretamente com seqüências de linhas múltiplas, obrigado @ durron597!
Cria uma função chamada
f
que pode ser usada da seguinte maneira:Imprime em STDOUT:
fonte
EITASUROLNCMPDVQGBHFKJWXYZ
para o exemplo na perguntagets
retorna uma linha de cada vez. Pode ser corrigido alterandogets
para,gets$n
mas alterá-lo para uma função é 1 char mais curto.Perl,
5446 bytesUPDATE: após otimizações adicionais, ele pode ser compactado para 46 bytes: (thx dennis para
-n
/{}
hack; chinês perl goth para<=>
->-
hack)É para ser executado com run com
perl -nE
Solução original (não precisa de opções especiais de Perl):
Verificado no Perl 5.8.3, 5.14.2
Se você receber um aviso, separe
eg
efor
com um espaço (+1 caractere), se você se importarexemplo de uso:
EXPLICAÇÃO: Em cada caractere (
.
) de cada linha de entrada (for<>
), aplique uma substituição "padrão", que de fato é avaliada como uma expressão (e
sinalizador des///
), que incrementa umuc
caractere upcased ( ) (.
/$&
é menor que o mais óbvio(.)
/$1
) contam no hash (não inicializado) (%h
). Em seguida, o hash da frequência da letra é usado em uma função de comparação de classificação para imprimir o alfabeto maiúsculo na ordem correta.fonte
perl -ne 's/./$h{uc$&}++/eg}{print sort{$h{$b}<=>$h{$a}}A..Z'
-n
eEND{}
, mas eles sempre foram mais .. sinta-se livre para atualizar a resposta, se você quiser-n
envolvewhile(<>){...}
o código. Evito editar o código de outros usuários. Muito fácil cometer um erro, algumas coisas só funcionam em alguns computadores, etc.}{
"injeção", não apenas sobre a-n
opção bem conhecida . Uma não pode esperar que a cadeia de código realmente tecnicamente é envolto pela enquanto seqüência de código de loop antes da execução, não só apenas que de alguma forma funciona como como se estivesse envolto ..$h{$b}<=>$h{$a}
com$h{$b}-$h{$a}
R, 123 bytes
O código foi aprimorado graças às sugestões de @RichieCotton.
Resultado:
fonte
C ++,
185183179177 bytesNão se espera que ganhe, é claro (o C ++ pode vencer?), Mas mesmo assim é um exercício divertido.
Explicação:
fonte
VBScript
181109Atualizado para usar um algoritmo completamente diferente. Bate JavaScript!
Bonita:
Golfe:
fonte
J
4135 BytesDemo:
Explicação:
A chave é anexar a matriz esquerda, de modo que todas as letras estejam disponíveis e já em ordem. Uma conseqüência engraçada do uso de um substantivo como terceiro dente no garfo é que ele funciona tanto como verbo quanto como frase.
fonte
Groovy -
1301231151129892Conforme o conselho do @ cfrick (duas vezes!):
Um pequeno teste (roubado descaradamente de @jpjacobs):
E o teste proposto também está passando
fonte
f={('A'..'Z').collectEntries{c->[c,it.toUpperCase().findAll(c).size()]}.sort{-it.value}.keySet().join()}
para 104it.grep(~/(?i)$c/)
vez deit.toUpperCase().grep(c)
toUpperCase
estava incomodando o inferno fora de mim.SAS - 217 (eu acho)
A entrada deve ser colocada na linha após a instrução cards4 ou nos cartões perfurados apropriados para o seu sistema. Eu acho que essa abordagem salva alguns caracteres vs. a tentativa de citar a entrada.
Estou ciente de que isso não atende à especificação completa, pois retorna apenas caracteres que aparecem na string de entrada. Talvez eu precise repensar isso um pouco.
fonte
AppleScript, 278
Notei que isso
"a" = "A"
é verdade no AppleScript. Eu posso usar isso no código golf, mas o restante do script é muito prolixo. Eu usei o AppleScript 1.8.3.Isso define uma função
f
. Se você adicionarf("a string")
na parte inferior do script e executá-lo no Editor de Script, ele mostrará o resultado.Formatado e comentado:
fonte
VBScript
157156 bytesEdit: alterado msgbox (p) para msgbox p
Mais legível:
Golfe: (155 caracteres + 1 retorno de carro)
Eu o tinha no início 171, com um código que achei mais interessante, mas o método de classificação de confortavelmente o drei é mais curto e requer len (s), o que torna um "for" mais curto que o "while" para o primeiro loop. (bocejar)
fonte
for t=0
deveriafor t=1
, caso contrário você sempre imprime o alfabeto inteiro.J -
3835 charUma função que recebe entrada à direita como uma string. Não é um vencedor, mas foi divertido escrever.
Explicado:
toupper
é um verbo na biblioteca padrão que contém uma string. Isso então se torna o argumento correto do verbo, enquanto o argumento esquerdo é o alfabeto: o código ASCII aponta 65 a 90.[
e,e.~#])
seleciona (#
) as letras no argumento à direita (]
) que são elementos de (e.~
) à esquerda e depois adiciona (,
) o argumento à esquerda ([
). A saber, mantemos apenas os caracteres maiúsculos e adicionamos uma única cópia do alfabeto ao final, para garantir que todos sejam capturados.#/.~@
depois fornece as frequências de cada caractere. Acontece que isso é dado em ordem alfabética; logo depois, podemos separar (\:
) o alfabeto (o argumento da esquerda[
).Um exemplo rápido e preguiçoso abaixo. Sinta-se livre para experimentá-lo para si mesmo em tryj.tk .
fonte
T-SQL 178
Basicamente, esta é minha solução VBScript, mas implementada em SQL.
Isso é abuso de saída XML para concatenar uma coluna. Em uso prático, ele pode ser associado a uma tabela externa para emular
GROUP_CONCAT
funções no MySQL e outras.Declarando a
@
variável:Código:
fonte
Perl, 78 bytes
Resultado para o exemplo na pergunta:
Ungolfed:
fonte
echo -e 'x\ny\n\nz\n'
saída, que deve retornarXYZABCDEFGHIJKLMNOPQRSTUVW
, mas geraXYABCDEFGHIJKLMNOPQRSTUVWZ
. Adivinha o porquê .. :)PHP - 105 bytes
Aqui está um hexdump, causa dos caracteres especiais:
E uma versão um pouco menos golfe:
Exemplo:
fonte
preg_filter()
?echo join(array_keys($f));
pode salvar um byteC # no LINQPad - 203 bytes
Adotei uma abordagem diferente da resposta de Logan Dam. Primeiro, certifiquei-me de que cada caractere na sequência de entrada seja classificado por sua aparência e só exista uma vez na sequência de saída. Depois disso, adicionei todos os caracteres ausentes do alfabeto à string de saída.
Infelizmente, não superaria a resposta de Logan Dam se eu tivesse feito no Visual Studio.
Versão mais legível:
fonte
C # (e LINQ)
255226210 bytesUsando o conselho de Patrick Huizinga, a sintaxe da consulta agora é mais curta:
Explicação:
Sintaxe do método equivalente (217):
Post original:
fonte
P
vez deProgram
e emstring[]a
vez destring[] args
e emc=>...
vez de(c)=>...
.using
instruções, você também pode colocar sua classe dentro doSystem.Linq
espaço para nome e remover as duas usando instruções. Depois, você pode salvar alguns caracteres e ele ainda funcionará bem.namespace
é mais longo do queusing
e os dois{}
s extras me custam mais.namespace System.Linq{}
é claramente mais curto do queusing System;using System.Linq;
apenas olhando para ele. A idéia é omitir os doisusing
completamente.C ++
701322232 bytesPrimeira versão 701 bytes (uso de STL idiomático)
Versão limpa expandida:
A idéia é demonstrar um programa C ++ "adequado" sem hacks. Ignore o clichê e o fato de que isso só é compilado no VC ++
Explicação:
Nós preenchemos A a Z em uma string com iota () , isso garante que, quando contamos as ocorrências, cada caractere apareça mesmo que não esteja na entrada.
transform () copia caractere por caractere da entrada padrão e o coloca no final de s após chamar toupper () em cada um
A contagem de cada caractere é diminuída no mapa (mantendo a contagem negativa, podemos ter uma classificação decrescente sem código extra)
As entradas do mapa de contagens são copiadas para um conjunto de pares, trocando (char, count) por (count, char). Como os conjuntos são ordenados, os classificamos diminuindo a contagem de frequências
Por fim, copiamos o conteúdo do conjunto para padronizar, usando transform e select2nd () para selecionar apenas o segundo membro do par.
O código é bastante legível. Uma solução C ++ 11 pareceria muito mais bonita, pois podemos usar lambdas
Versão C ++ 11 - sem necessidade de lambdas, mas o auto e o range baseados em tornam as coisas muito limpas (pense bem, você pode fazer muito semelhante ao C ++ 98 regular)
Versão expandida:
Próxima iteração (por que ler do stdin quando temos argv):
Versão expandida:
fonte
Gelatina , 9 bytes (não concorrente)
Explicação
É lido como "classificar o alfabeto maiúsculo pelo número de ocorrências na entrada maiúscula, invertida", que é uma tradução literal do desafio: P
Experimente online!
Esse desafio foi vinculado ao Jelly HyperTraining, onde resolvemos o desafio. Postei isso porque fui o primeiro a atingir 10 bytes.
-1 byte graças a Erik the Outgolfer (professor JHT)
fonte
ØAŒuċ¥@ÞU
C ++ 377
Implementa qsort usando contagens de letras na matriz n para classificar o alfabeto na matriz A. Execute via linha de comando:
golf.exe < in.txt
fonte
C, 117 (119) bytes
95
por223
, a um custo de 1 byte extra.char c;
para justc;
e++c
parac=c+1%255
.fonte
PowerShell - 139 caracteres
Primeiro, não sou especialista em PowerShell. Tenho certeza que existem mais curtos que isso. Mas estava feliz com isso e decidiu compartilhar.
Como funciona:
fonte
Ceilão , 98 bytes
fonte
APL,
2620 caracteres⎕a[⍒+/⎕a∘.=('\w'⎕r'\u0')⍞]
⎕a[⍒+/⎕a∘.=1(819⌶)⍞]
-6 graças a Adam.
fonte
('\w'⎕r'\u0')
→1(819⌶)