Dado um quadrado de números naturais positivos, escreva um programa que encontre um caminho horizontal e vertical com a soma dos números ao longo deles sendo máxima. Um caminho horizontal vai da primeira coluna para a última e precisa aumentar a posição da coluna em um em cada etapa. Um caminho vertical vai da primeira linha à última e precisa aumentar sua posição da linha em um em cada etapa. Além disso, a posição da linha em um caminho horizontal pode permanecer a mesma ou mudar uma em qualquer direção, da mesma forma para os caminhos verticais.
Para ilustrar, o seguinte pode ser um caminho válido:
O caminho a seguir seria inválido, pois retrocede (e permanece na mesma linha em alguns lugares):
O caminho a seguir seria igualmente inválido, pois altera a posição da linha em mais de um em uma única etapa:
Nota: A solução deve ser executada em um período de tempo aceitável.
Entrada
n linhas de entrada com n inteiros positivos separados por espaço são dadas na entrada padrão. 2 ≤ n ≤ 40. Cada linha é terminada por uma quebra de linha. Os números são pequenos o suficiente para que a soma máxima caiba em um número inteiro assinado de 32 bits.
Resultado
As somas máximas dos caminhos horizontais e verticais (nessa ordem) separadas por um único espaço.
Entrada de amostra 1
1 2
1 2
Saída de amostra 1
3 4
Entrada de amostra 2
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
2 1 4 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 4 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 4 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 5 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Saída de amostra 2
37 35
Entrada de amostra 3
683 671 420 311 800 936
815 816 123 142 19 831
715 588 622 491 95 166
885 126 262 900 393 898
701 618 956 865 199 537
226 116 313 822 661 214
Saída de amostra 3
4650 4799
Para sua conveniência, preparamos alguns casos de teste no bash (graças ao Ventero ) e no PowerShell, nos quais você pode executar seu programa. A invocação é:, <test> <command line>
então algo como ./test python paths.py
ou ./test.ps1 paths.exe
. Diverta-se :-)
bash
script de teste! Eu gostaria que todo o código de golfe viesse com isso.Respostas:
GolfScript - 49 caracteres aprimorados Nabb
51 caracteres50caracteresestritamente e absolutamente necessários + 3 preguiçosos que executaram apenas 156 caracteres principalmente redundantes51 solução:
53 solução:
O método funciona em duas linhas por vez, uma contendo as somas máximas atingidas em cada ponto e outra contendo a próxima linha.
a / 14: repita duas vezes, uma vez para cada resultado.
8: Pegue a primeira linha da entrada e troque-a por trás da matriz de entrada, agora no primeiro conjunto de somas máximas.
b / 13: itera sobre cada linha restante na matriz.
9: Coloque 0 no início das somas máximas.
c / 12: itera sobre cada elemento da linha.
10: Faça uma cópia das somas máximas com o primeiro elemento removido.
11: Pegue os 3 primeiros elementos das somas máximas, classifique-os e adicione o maior ao elemento atual da linha.
56 solução:
1: Da entrada à matriz de matrizes em 9 caracteres, na verdade isso poderia ter sido feito com apenas 1, mas quebrei essa chave para que isso seja necessário.
2: 4 caracteres apenas para fazer uma cópia transposta.
3: Matriz de 99 0s em 5 caracteres, provavelmente poderia ser feita de uma maneira mais inteligente, mas eu fumo muita maconha para descobrir como.
4: Loop duplo excessivamente complicado que itera sobre todos os elementos da entrada e faz alguma lógica nebulosa ou algo parecido para produzir o resultado. O Nabb provavelmente criará algo equivalente em cerca de 3½ caracteres.
5: A essa altura, o resultado já está lá, dentro de uma matriz, esse código bobo está lá para tirá-lo (e colocar um monte de sobras de lixo (e colocar o resultado no lugar)).
6: Este é um comando tão simples que sua contagem de caracteres provavelmente seria negativa em uma solução ideal. 7: Neste ponto, o programa está realmente pronto, mas devido à falta de clareza no código anterior, a saída está na ordem errada e falta espaço, então aqui vamos mais alguns bits pelo ralo.
fonte
{}*
vez de(\{}%
.J, 91
95Recuso-me a fazer IO, diminuindo drasticamente minha pontuação.Passa em todos os testes no equipamento de teste (embora só funcione se a entrada terminar com uma linha finalizada, como no equipamento de teste).Eu removi a manipulação das terminações de linha do Windows, pois Chris sugeriu que não era necessário. A versão multiplataforma teria
a=:".;._2 toJ(1!:1)3
como primeira linha.Explicação:
f
fornece o par de soluções chamando p normalmente e com a entrada transposed (|:
).p
tira o máximo (>./
) dos totais de linhas da aplicaçãoc
entre cada linha (c/
)c
ocupa duas linhas (x e y). Ele adiciona x a cada um de y, y aumentou 1 célula (1|.!.0 y
) e y reduziu 1 célula (_1|.!.0 y
). Em seguida, são necessários os máximos das três alternativas para cada linha. (>./
) O resto é rank [sic] - não tenho certeza se estou fazendo certo.fonte
Haskell: 314 caracteres necessários
Nota: isso requer o módulo Data.Vector . Não tenho certeza se ele está incluído na plataforma Haskell ou não.
Versão não destruída:
Esta solução usa preguiça, em conjunto com o Data.Vector , para memorização. Para cada ponto, a solução para o caminho máximo desde o final até o final é calculada e, em seguida, armazenada na célula de Vector
m
e reutilizada quando necessário.fonte
Ruby 1.9, 155 caracteres
Solução simples que passa em todos os casos de teste.
fonte
Haskell, 154 caracteres
fonte
zipWith3
reduzirá o código?foldl1 max
, que adiciona caracteres, mas permite fatorar foldl1 e max, o que deve salvar os caracteres.maximum.foldl1
,max
Emax
--vs--f=foldl1;m=max;
,f m.f
,m
, em
. - ou 20 vs. 22. Então, não, não salva.m=max
. E o zipWith3?J, 109 + 10 = 119 caracteres
Corra com
tr
:Como de costume em J, a maior parte do código é para entrada / saída. O código "real" tem 65 caracteres:
Passa em todos os casos de teste
fonte
#!/usr/bin/env jconsole
no topo do arquivo e defina o sinalizador executável.Python, 149
Se eu calculasse apenas um caminho mais curto vertical ou horizontal,
isso poderia ser feito no local, economizando cerca de um terço dos bytes.
fonte
Python, 204 caracteres
fonte