Introdução
Considere o seguinte exemplo:
CODE
+ GOLF
——————
GREAT
Esta é uma equação em que cada letra representa um dígito decimal e as palavras representam números naturais (letras semelhantes representam dígitos semelhantes e letras diferentes representam dígitos diferentes). A tarefa é combinar cada letra com seu valor de dígito para que a equação esteja correta. Uma solução para a equação acima é:
9265
+ 1278
——————
10543
Sua tarefa
Sua tarefa é escrever um programa ou uma função que possa resolver essas equações, como visto acima.
Entrada
A entrada é uma sequência no seguinte formato:
[A-Z]+\+[A-Z]+=[A-Z]+
Exemplo:
CODE+GOLF=GREAT
AA+BB=CC
Os espaços são omitidos e somente as letras entre maiúsculas A e Z serão usadas (sem letras maiúsculas ou minúsculas).
Essa sequência pode ser lida a partir da entrada padrão, de um arquivo ou como um parâmetro de função.
Resultado
Você tem as duas opções a seguir para o formato de saída:
- a equação original com os dígitos substituídos
- lista das letras e seus valores
Se houver várias soluções, qualquer (mas apenas uma) delas deve ser retornada. Se não houver soluções, o programa deve retornar uma cadeia vazia ou nula. A saída pode ser retornada como uma sequência, pode ser gravada na saída padrão ou em um arquivo.
Exemplo:
9265+1278=10543
A=1 B=2 C=3
(você pode usar qualquer delimitador)
Regras
- Para facilitar as coisas, os números são aceitos para começar com 0, mas você pode lidar com números com os 0 iniciais como soluções inválidas.
- Letras semelhantes representam dígitos semelhantes e letras diferentes representam dígitos diferentes
- Você pode usar qualquer idioma e a biblioteca padrão do idioma escolhido (sem bibliotecas externas)
- Você não pode se conectar a nenhum recurso na internet (por que você faria assim?)
- Esta é uma tarefa de código de golfe, o código mais curto vence. Caracteres consecutivos de espaço em branco contam como um único caractere. (Portanto, qualquer programa escrito em espaço em branco vence automaticamente)
Eu tenho uma solução um pouco hackish usando 179 caracteres. Se algo não estiver claro, pergunte-me nos comentários.
fonte
If there are no solutions, the program should return an empty string or null.
Loops infinitos ainda não produzem nada ... posso?Respostas:
Python - 48 caracteres
Abusando da regra de espaço em branco.
Primeiro, converti todos os caracteres da resposta da CesiumLifeJacket para o seu valor ASCII (eu poderia ter escrito o meu próprio, mas sou preguiçoso e, de qualquer maneira, não teria afetado a pontuação final). A cadeia longa na minha solução é um espaço para cada um desses valores ASCII e tabulações que os separam. Divida em abas, encontre os comprimentos, converta novamente em caracteres e execute.
O SE converte guias em 4 espaços cada, para que o copypasting não funcione. Você só precisa acreditar em mim :)
fonte
Ruby 2.0, 122 caracteres
Baralhar a força bruta + eval!
Isso ainda não atende aos critérios de retornar cadeia nula / vazia quando não há solução; apenas faz um loop infinito.Se não conseguir encontrar um resultado após ~ 300 milhões de iterações, retornará zero. Perto o suficiente?Ele encontra todas as letras exclusivas na entrada, depois embaralha repetidamente os dígitos de 0 a 9 e tenta combiná-los com as letras até encontrar uma configuração que funcione.
O código é apresentado como uma função chamada
f
que retorna uma sequência com os números substituídos, como na Opção de Saída 1 acima. Exemplo de uso:O tempo de execução do
CODE+GOLF=GREAT
exemplo na minha máquina varia de instantâneo a cerca de 6 segundos - depende da sorte que você tem com os shuffles!Estou particularmente insatisfeito com a parte
gsub(/\b0/,'')
para remover os zeros à esquerda, mas foi a única coisa que consegui impedireval
de interpretar os números como entradas octais.( BÔNUS : Como usa eval, funciona para expressões arbitrárias em Ruby e não apenas para adição!)
fonte
permutation
, mas como você diz, eu estava principalmente preocupado com o comprimento do código.LiveScript (179 caracteres)
Possui tempo de execução determinístico e relativamente rápido e funciona com outros operadores (+, -, *).
fonte
Python,
256213 caracteresTempo de execução horrível, tentará melhorar ainda mais:
fonte
JavaScript 138
Força bruta aleatória.
Pode demorar um pouco (minha melhor chance
CODE+GOLF=GREAT
é de 3 segundos, meus piores 3 minutos).Experimente com uma expressão simples como
A+B=C
fonte
Haskell, 222
Força bruta. Tenta todas as correspondências possíveis até encontrar uma ou depois de concluir todas as tentativas. Estiquei as regras de saída: imprime algo parecido
[[('C','3'),('O','8'),('D','6'),('E','7'),('G','0'),('L','5'),('F','2'),('R','4'),('A','1'),('T','9')]]
com a solução e, se não houver, imprime[]
. Deixe-me saber se eu preciso mudar isso.fonte
CJam - 17
Total de 975 caracteres, mas 960 deles são espaços em branco em 2 sequências; portanto, eles contam como 2 caracteres e, junto com os outros 15, obtemos 17.
975 podem parecer muito, mas observe que a solução python do undergroundmonorail tem 18862 caracteres, eles está apenas em uma única linha :)
Você pode executá-lo em http://cjam.aditsu.net/ para palavras curtas, mas provavelmente deve usar o interpretador java para palavras mais longas. Com o java no meu laptop,
SEND+MORE=MONEY
é executado em 30 a 40 segundos eCODE+GOLF=GREAT
em quase 3 minutos. Ele não aceita números começando com 0 (porque isso não é legal).Aqui está um programa que gera o programa acima (também ajuda se o StackExchange não mostrar o espaço em branco corretamente):
As 11 primeiras linhas contêm o programa original (não jogado de verdade) em uma seqüência de caracteres, e a última linha faz a conversão e adiciona a parte de decodificação.
fonte
Powershell, 137 bytes
porta do LiveScript
Script de teste não destruído:
Resultado:
fonte
PHP,
118113 bytesimprime dígitos abaixo das letras e sai do programa; loop infinitamente se insolúvel. Corra como cano com
-nr
.demolir
fonte
PHP, 145 bytes
função recursiva, imprime a equação resolvida e sai do programa; retorna
NULL
quando insolúvel.Experimente online
demolir
fonte