Assumindo A = 1, B = 2 ... Z = 26, e o valor de uma palavra é a soma desses valores de letras, é possível dividir algumas palavras em duas partes, para que elas tenham valores iguais.
Por exemplo, "wordsplit" pode ser dividido em duas partes: ordsl wpit, porque o + r + d + s + l = w + p + i + t.
Esse foi um desafio que o professor de computação nos deu - é um antigo desafio da Lionhead Studios, aparentemente. Eu o resolvi em Python e postarei minha resposta em breve.
Desafio: O programa mais curto que pode listar todos as divisões possíveis com pontuações iguais. Observe que ele só precisa listar uma para cada grupo de letras - ordsl wpit é o mesmo que rdosl wtip, por exemplo. É mais fácil listá-los na ordem em que aparecem na palavra.
Bônus:
- Se você destacar pares em que ambas as palavras são válidas em inglês (ou alguma permutação das letras), use algum tipo de lista de palavras. (Isso pode ser feito colocando um asterisco ao lado de cada um ou outro método, mas deixe claro.)
- Adicionando a opção para remover duplicatas (esse não deve ser o padrão).
- Suportando mais de duas divisões, por exemplo, três, quatro ou mesmo divisões de sentido n.
Respostas:
Perl, 115
118123Corra com
perl -nE '<code goes here>'
. Esse 'n' é contado no tamanho do código.Substituído:
Com comentários e nomes de variáveis:
Alguns dos truques usados:
1..1<<@_
cobre o mesmo intervalo de bits que0..(1<<@_)-1
, mas é mais curto. (observe que, considerando o problema de mais longe, incluindo os limites do intervalo várias vezes, isso não resultaria em uma saída errada)64-ord$_[$_]
vez de adicionarord$_[$_]-64
ganha um caractere invisível: como termina com um delimitador, tornafor
desnecessário o espaço antes .cond ? var1 : var2 = new_value
.&&
e||
são usadas em vez de condicionais apropriadas.$l-$r
é mais curto que$l!=$r
fonte
J (109)
Saída para
wordsplit
:Explicação:
1!:1[1
: leia uma linha de stdin([{~(i.@!A.i.)@#)
: obter todas as permutações"1
: para cada permutação:(96-~a.&i.)
: obter pontuações de letras}.@(split~&.>i.@#@>)@<
: divida cada permutação das pontuações em cada espaço possível, exceto antes do primeiro e após o último número>(>@(=/@:(+/"1&>)&.>)#[)
: veja quais permutações têm metades correspondentes e selecione estas{&a.@(96&+)&.>
: transformar as pontuações novamente em letras~.(/:{[)
: remover variações triviais (por exemplo,ordsl wpit
eordsl wpti
)fonte
{a,bc}
já for encontrada, para remover,{a,cb}
mas não para remover{bc,a}
. (E, claro, eu não estou ofendido, se eu realmente / HAD / duplicada a resposta de alguém que eu prefiro que se alguém apontou.)c99 - 379 caracteres necessários
A abordagem é bastante óbvia. Existe uma função que soma as palavras de acordo com uma máscara e uma função que as imprime também de acordo com uma máscara. Entrada da entrada padrão. Uma peculiaridade é que a rotina de impressão insere espaços para letras que não estão na máscara. Uma guia é usada para separar os grupos.
Não faço nenhum dos itens de bônus, nem é facilmente convertido para apoiá-los.
Legível e comentado:
Validação
fonte
Ruby: 125 caracteres
Exemplo de execução:
fonte
Mathematica
123111Localiza todos os subconjuntos de palavras que possuem 1/2 do "total ASCII" da palavra
d
,. Em seguida, encontra os complementos desses subconjuntos.d = "WORDSPLIT"
fonte
J, 66 caracteres
Usando dígitos dos números base2 para selecionar todos os subconjuntos possíveis.
fonte
Minha solução está abaixo. É um tamanho quase anti-golfe, mas funciona muito bem. Ele suporta divisões n-way (embora o tempo computacional se torne muito longo para mais de três divisões) e suporta a remoção de duplicatas.
Saída de amostra:
fonte
Lua - 195
a entrada deve estar em maiúsculas:
fonte
Python - 127
e aqui uma versão n-split com 182 bytes sem duplicatas:
A entrada é por exemplo:
fonte