Recentemente, houve uma pergunta no Stack Overflow em que o OP estava tentando escrever uma função para encontrar a palavra em uma string com as letras mais repetidas. Obviamente, não é difícil escrever uma em segundos, e eu escrevi uma em Javascript o mais curta possível para me divertir. Mas eu não sou especialista em golfe por código, então me pergunto quanto mais curto pode ser esse programa simples!
Desafio
Escreva um programa ou função que capte uma sequência de palavras e retorne ou imprima a palavra com as letras únicas mais repetidas.
Regras:
Escolha a palavra com o maior número de letras únicas repetidas (veja exemplos abaixo)
Se nenhuma palavra tiver letras repetidas, retorne -1.
Se duas palavras tiverem o mesmo número máximo de letras repetidas, escolha a mais próxima do início da sequência.
O menor envio em bytes vence.
Entrada
Tome como entrada uma sequência que consiste em uma ou mais palavras delimitadas por espaço. A entrada pode ser de STDIN (ou alternativa mais próxima), parâmetros de linha de comando ou argumentos de função.
Resultado
Imprima a saída em STDOUT para devolvê-la.
Exemplos
Considere a string aaabbb cccc
. Isso contém duas palavras: aaabbb
e cccc
. A palavra aaabbb
tem 3 a
'e 3 b
' e cccc
tem 4 c
'. Portanto, o número máximo de letras repetidas em aaabbb
é 3 e o máximo em cccc
é 4. Queremos escolher a palavra com o número máximo de letras únicas repetidas, portanto a saída para aaabbb cccc
deve ser cccc
.
Outros casos de teste:
Today, is the greatest day ever! --> greatest
This is a great day --> -1
aaabbb cccc --> cccc
ever
aabb
tem 2 letras repetidas. Seriaaaaabb
considerado como tendo 4 letras repetidas (2ª, 3ª, 4ªa
, 2ªb
) ou 2 letras repetidas (a
eb
).Respostas:
C - GCC -
159145135 bytesSerá atualizado quando eu puder truncá-lo um pouco
Como compilar: gcc -w cg.c
Como executar: ./a.out word1 word2 aass ddaaa ssdddd
Saída: ssdddd
Sem saída / sem correspondência: -1
Primeiro, trapacei um pouco, incorporando as palavras como argumentos do programa, mas fazer com que o GCC analise as palavras e me forneça uma contagem de palavras de graça foi recompensa demais para deixar passar.
Como funciona?
Temos 3 loops aninhados. O primeiro incrementando cada palavra, as próximas duas imitam uma classificação de bolha para comparar valores. A primeira letra nunca é comparada consigo mesma e cada letra subsequente é comparada a cada letra anterior. Sempre que uma palavra tem mais mesmas letras que uma palavra anterior, a palavra é armazenada em x, e a contagem de quantas mesmas letras também é armazenada.
Abuso do GCC
Usamos descargas automáticas globais implícitas para nossos números inteiros. Permitimos que argv seja um int em vez de um caractere (atualmente um caractere, este é um TODO). Utilizamos funções padrão, como puts e getchar. Também usamos o operador de vírgula para sobrecarregar nosso operador trinário (condicional).
Quer 2 bytes a menos?
Substitua "-1" por * z e nomeie o arquivo -1
Programa não ofuscado e não testado:
fonte
Pitão, 14 bytes
Demonstração. Equipamento de teste.
fonte
l
antes.-
parece fazê-lo.K, 35 bytes (faltando -1 requisito, acabei de notar, mas é hora de dormir)
como funciona:
1 tomada
das palavras indexadas por
os índices para colocar em ordem crescente
o máximo
conte onde
string = char
para cada caractere em palavra
para cada palavra em que
w
(palavras) sãoa sequência dividida por espaços
Obviamente, sacrifiquei um pouco de precisão por expressividade e legibilidade na explicação em inglês. Espero que tenha sido interessante.
fonte
,-1
ao final da função.#:&:
pois, a partir do contexto, eles devem analisar como suas formas monádicas. Você também pode usar@
para indexar em vez de colchetes e primeiro (*
) em vez de1#
.Haskell, 100 bytes
Exemplo de uso:
f "Today, is the greatest day ever!"
->"greatest"
Como funciona:
Haskell,
7977 bytes (não testado)Isso usa
sortOn
daData.List
v4.8.0.0, que eu não tenho instalado, então não posso testá-lo.fonte
CJam, 25 bytes
Experimente online
Explicação:
fonte
Python 2,
9777 bytesSolução bastante direta, apenas mapeia a entrada (entre aspas) para uma tupla contendo a palavra e o número de caracteres repetidos. Obtém o máximo e imprime a palavra se a letra mais repetida for repetida, caso contrário, ela imprime -1.
Salvei 20 (!) Bytes reorganizando a ordem de entrada para não precisar de uma chave para encontrar o valor máx.
fonte
SWI-Prolog,
158154149 bytesExemplo:
a("Today, is the greatest day ever!",R).
saídasR = "greatest" .
.fonte
JavaScript,
86111108 bytesDefinitivamente capaz de jogar golfe, a coisa toda -1 adicionou cerca de 20 bytes.
fonte
R, 107 bytes
Ele lê STDIN e imprime em STDOUT.
Ungolfed + explicação:
fonte
C # 166 bytes
Codificação simples. Nada de especial aqui.
C # é péssimo para código de golfe: - /
fonte
JavaScript ( ES7? ), 99
Usando compreensão de matriz, implementada no Firefox, mas não mais incluída no EcmaScript 6.
Teste usando o trecho de código abaixo (somente Firefox)
Ungolfed E mais compatível
fonte
Python, 58
fonte
C (167)
TENTE
COMO É QUE ISSO FUNCIONA?
fonte
Q (44 bytes)
destroçado
fonte
Haskell 96 Bytes
`` ``
r
é uma função que pega uma palavra e retorna uma tupla(n,w)
onden
é o número de ocorrência do caractere mais ocorrente na palavraw
. Por exemplox="norep", y="dnredundant"
, deixe , entãor x=(1,norep), r y=(3,ndredundant)
w
é uma função que utiliza uma sequência que contém várias palavras separadas por espaço e:Dividir a lista no espaço
words p
foreach palavra criar uma lista de
(n,w)
pegue a tupla que tem o maior
n
(contador de ocorrências)Se n for igual a 1, basta retornar a string
-1
, a própria palavra (armazenada no segundo componente da tupla), caso contrário.Por exemplo, pegue
p="Today, is the greatest day ever!"
produz
["Today,","is","the","greatest","day","ever!"]
[(1,"Today,"),(1,"is"),(1,"the"),(2,"greatest"),(1,"day"),(2,"ever!")]
(2, "maior")
2! = 1, então
greatest
é a solução!fonte
Pure Bash (sem comandos externos) 129 bytes
Isso é bastante longo, mas ainda se compara favoravelmente com algumas das outras entradas mais longas.
Não estou totalmente satisfeito com algumas das constantes, ter que usar esse loop for interno é irritante. Alguma sugestão?
fonte