PROBLEMA
Dadas duas palavras, encontre o vencedor em uma batalha raiz digital .
Defina a raiz digital de uma palavra da seguinte maneira:
- A cada letra do alfabeto é atribuído um número: A = 1, B = 2, C = 3, ..., Z = 26
- Adicione os valores para cada letra para totalizar a palavra. Veja "CAT", por exemplo. C + A + T = 3 + 1 + 20 = 24
- Adicione todos os dígitos que compõem esse resultado: 24 => 2 + 4 = 6
- Repita a etapa 3 até atingir um único dígito. Esse dígito único é a raiz digital da palavra.
Regras:
- Um vencedor é declarado se sua raiz digital for maior que a outra.
- Se os valores da raiz digital forem iguais, reduza as palavras removendo todas as instâncias da letra de valor mais alto das palavras e recalculando.
- Repita as etapas 1 e 2 até que haja um vencedor ou uma das palavras tenha apenas uma única letra (ou nenhuma letra) restante.
- Se os valores da raiz digital forem iguais após o processo de redução, a palavra mais longa será declarada vencedora.
- Se as palavras tiverem o mesmo comprimento e nenhum vencedor for encontrado após o processo de redução, nenhum vencedor será declarado.
Regras especiais:
- Não é permitido o uso de módulo no cálculo da própria raiz digital . Pode ser usado em qualquer outro lugar.
- Suponha que as palavras consistam apenas em letras maiúsculas - sem pontuação, sem espaços, etc.
ENTRADA
Puxe as palavras por stdin (separadas por vírgula). parâmetros do método, ou como você desejar. Deixe claro em sua solução ou no código como as palavras são analisadas ou preparadas.
SAÍDA
Mostre a palavra vencedora. Se não houver vencedor, exiba "STALEMATE".
Exemplos:
intput: CAN, BAT
CAN = 18 = 9
BAT = 23 = 5
saída: CAN
intput: ZOO, NÃO
ZOO = 56 = 11 = 2
NO = 29 = 11 = 2
OO = 30 = 3
N = 14 = 5
saída: NÃO
UPDATE : A entrada deve ser lida usando stdin com as palavras como uma sequência separada por vírgula.
UPDATE : Adicionados alguns exemplos para testar.
ATUALIZAÇÃO : esclareceu a remoção da letra mais valorizada em caso de empate - isso também altera levemente a condição de parada - se uma palavra tiver uma letra ou zero letras, o processo de encurtamento será interrompido
fonte
Respostas:
J, 100
corre assim:
ele não ainda aceitar a entrada exatamente como solicitado.
fonte
APL (Dyalog) (
9186)Explicação (em ordem de execução):
⎕ML←3
: defina ML como 3 (isso⊂
significa partição média, entre outras coisas).G←Z⊂⍨','≠Z←⍞
: lê a entrada, separa por vírgulas, armazena em G e passa para a função.+/¨⎕A∘⍳¨⍵
: calcule a pontuação de cada palavra. (⎕A
é uma lista que contém o alfabeto.)Z←{2>⍴⍕⍵:⍵⋄∇+/⍎¨⍕⍵}¨
: calcule a raiz digital para cada pontuação (somando todos os dígitos, enquanto houver mais de um dígito) e armazene-os em Z.Z≡∪Z
: se todas as pontuações forem únicas ...:G[↑⍒Z]
: ... em seguida, imprima a palavra com a pontuação mais alta (da lista original).⋄1∊↑¨⍴¨⍵:'STALEMATE'
: caso contrário (se houver um empate), se uma das palavras tiver comprimento 1, produza STALEMATE.⋄∇1∘↓¨⍵
: caso contrário, retire a primeira letra de cada palavra e execute a função novamente.fonte
Ruby - 210
Testes:
fonte
d,e=(a,b=gets.split ?,).map{|w|w.bytes.sort}
."If the words are of equal length and no winner is found after going through the shortening process, no winner is declared."
Haskell, 205 caracteres
Amostras de execuções:
w
, módulo mais antigo e mais curto importadofonte
',':b
→_:b
(-2), se você não estiver muito apegado ao processamento deinteract$unlines.map([...]).lines
váriasputStr.[...]=<<getLine
linhas → (-11), se você se permitir diminuir a saídaputStr
→print
(-1). Eu odeio essas operações de negação usando tantos caracteres, mas não consigo encontrar uma maneira de contornar isso.Perl, 224
225229Golfe básico (nada inteligente ainda):
Perl 5.10 e superior, execute com
perl -M5.010 <file>
ouperl -E '<code here>'
fonte
K, 106
Usa o tratamento de exceções para detectar erros de pilha, que resultam em casos de impasse.
fonte
VBA (
242462)Acontece que o código abaixo não corresponde à especificação, então tive que refazer o trabalho, adicionando muito comprimento (veja acima). : - / Talvez seja possível jogar mais golfe, mas já é bastante compacto e duvido que seja capaz de trazê-lo de volta a uma pontuação competitiva.
O original (abaixo) não removeu a letra de maior valor das palavras quando houve um empate.
fonte
Isso realmente me agradou e é o meu primeiro post. Embora seja antigo, notei que ninguém havia feito uma versão php, então aqui está a minha.
534 caracteres.
Agora não tenho certeza das regras para começar, então comecei com $ f = 'CAN, CBN' como minha entrada. Espero que esteja certo. Eu executei todos os testes e ele passou em todos eles, embora não seja particularmente elegante. Eu realmente preciso dormir um pouco agora, mas me diverti muito trabalhando nisso - obrigado por um ótimo quebra-cabeça.
Codificado em http://codepad.org/ZSDuCdin
fonte
$f=trim(fgets(fopen('php://stdin')));
para tirar a entrada.$w=fgetcsv(STDIN);
funciona melhor.D: 326 caracteres
Mais legivelmente:
fonte
Mathematica
Alguns detalhes ainda estão faltando
fonte
Mathematica
220207Depois de escrever isso, notei que isso segue o mesmo raciocínio usado por Belisário,
Uso
Como a resposta não é competitiva (por muito tempo), decidi usar um formato de entrada mais agradável ao Mathematica.
fonte
CoffeeScript - 335
Não estou tão feliz com este como eu poderia ter sido, mas eu vou colocá-lo de qualquer maneira. A pontuação real é muito concisa (
y
função), mas osif
resultados para comparar (emz
) são bastante longos.Para usá-lo, ligue
z
com suas duas palavras (por exemploz 'FOO','BAR'
). Ele marcará as duas palavras e retornará a palavra com maior pontuação. Se houver empate, ele será repetido com as palavras modificadas (mantendo os originais retornando eventualmente, daí os dois parâmetros extras) que obtém dax
função.O javascript equivalente (expandido) para os interessados:
fonte
Raquete 479 bytes
Ungolfed:
Teste:
Saída:
fonte
PHP,
339(não especificado),410382359339337 bytesEDIT 1 : +71 bytes. Usando em
STDIN
vez defopen('php://stdin','r');
e tags curtas. Além disso, total conformidade com as especificações.EDIT 2 : -28 bytes. Usando em
fgetcsv(STDIN)
vez deexplode(',',trim(fgets(STDIN)))
e usadofor
loop em vez dewhile
loop.EDIT 3 : -23 bytes. Funções mescladas
a
eb
mescladas para loops.EDIT 4 : -20 bytes. Transformado
c
de recursivo em loop. Em seguida, remova a funçãoc
e coloque seu código no espaço para nome global.EDIT 5 : -2 bytes. Obrigado a @Titus pela
-r
bandeira.fonte
-r
bandeiraJAVA
fonte
C ++, 473 (estou pegando emprestado uma chapinha)
Tenho certeza de que poderia encurtá-lo de alguma forma, mas estou cansado.
Editar: originalmente assumiu o argumento da linha de comando, modificado para usar cin. Provavelmente são alguns caracteres a mais agora, mas estou cansado demais para recontá-lo.
fonte
Python: 383 caracteres
execute a função
c('CAN','BAT')
:fonte
F #,
559533530 bytesAinda não competitivo. Tenho certeza de que c pode ser reduzido, assim como as últimas linhas. Não ter acesso mais fácil aos argumentos da linha de comando também está prejudicando aqui.
Experimente online!
Versão ungolfed
fonte
PHP,
296281267 bytesexecute
-n
ou experimente on-line (o TiO inclui quebra).Em fevereiro de 2011, a versão atual do PHP era 5.3.5; então eu não pude
[$a,$b]=fgetcsv(...)
e tal)count_chars
inlinesubstr
Mas nenhum dos dois teria economizado muito; então não importa muito.
As coisas mais caras foram os loops (é claro) e a regra 4 (
4036 bytes).fonte