Alice e Bob estão jogando um joguinho. Primeiro, eles desenham uma árvore a partir de um nó raiz (indicado por um ponto grosso), sem nós internos, com números nas folhas. Qualquer nó pode ter qualquer número de filhos.
Começamos pela raiz e o primeiro a tocar é Alice (A). Ela deve selecionar um dos filhos do nó atual. Então é a vez de Bob, e ele também seleciona um nó filho. Isso continua até que um nó folha seja alcançado.
Quando um nó folha é atingido, o jogo termina. O objetivo de Alice é terminar em um nó com o maior valor possível e o objetivo de Bob em terminar em um nó com o menor valor possível.
Dada uma árvore em forma de matriz aninhada, retorne o valor da folha que será atingida se Alice e Bob jogarem perfeitamente.
Exemplos:
18: [[67, [[100, [[67, 47], [86], 21, 16], [[46, [14], 35, 85], [71, [18, 63, 69], 99, 22], 3]]], [[18, 32, 42, 80]], [[36, 70], [86, 53, 46, 59], [[41], 86, 35]]], 3]
60: [[[84, 35], [44, 60]], [[24, 98], [16, 21]]]
58: [[53, 77], [58, [82, 41]], 52]
59: [[93, [100, 53], 58, 79], [63, 94, 59], [9, [55, 48]], [40, 10, 32]]
56: [[20, 10, [[[89, 22, 77, 10], 55], [24, 28, 30, 63]]], [[49, 31]], 17, 56]
0: [0]
Você pode assumir que o nó raiz nunca é um nó folha e aponta para pelo menos um nó folha. Você pode assumir que as folhas são números não negativos.
O código mais curto em bytes vence.
fonte
Respostas:
Geléia , 7 bytes
Experimente online! ou verifique todos os casos de teste .
Isso usa o algoritmo da resposta do @ xnor . Para fins de comparação, uma abordagem mais direta que calcula alternativamente mínimos e máximos pesa 8 bytes :
Como funciona
fonte
Python 2, 53 bytes
A questão principal é como alternar entre
max
emin
cada camada. Usando o fato de quemax(l) == -min([-x for x in l])
, em vez disso, negamos cada segunda camada e recorremos a-min
. Para negar cada segunda camada, passamos um multiplicadorc
que se alterna+1
e-1
, quando atingimos uma folha, ajustamos seu valor pelo multiplicador. Reconhecemos estar em uma folha através da condiçãol<[]
, já que o Python 2 trata os números como menos do que as listas.É difícil encurtar o
else/if
ternário, porque qualquer ramo poderia dar um valor Truthy (diferente de zero) ou Falsey (zero).fonte
JavaScript (ES6), 53 bytes
Usa uma abordagem semelhante à resposta do @ xnor. Se os números forem diferentes de zero, apenas 49 bytes:
fonte
Pitão, 21 bytes
Minha primeira resposta Pyth! Obrigado a Dennis pela ajuda :).
fonte
mgd_H
pode sergR_H
. Além disso, em vez de definir uma função, você pode inserirQ
e substituirLgb1
porgQ1
.Mathematica, 13 bytes
ou equivalente
Isso avalia uma função sem nome que pega a árvore e retorna o resultado.
Isso também é essencialmente o mesmo que a solução do xnor: em cada nível, trocamos o sinal da lista e o resultado e usamos
Min
todo o caminho. Isso resultou incrivelmente divertido no Mathematica, porque:Min
pode pegar números ou listas individuais ou até várias listas. Apenas fornece o valor mínimo em todos os seus argumentos. Isso significa que ele funciona tanto em listas quanto em folhas (onde apenas retorna a folha)./@
que é a abreviação deMap
é uma função de ordem superior muito geral no Mathematica. Ele não apenas mapeia uma função sobre as listas, mas também pode mapeá-las sobre qualquer expressão. Os números são uma expressão dessas, mas eles não contêm nenhum elemento a ser mapeado. Isso significa que podemos mapear com segurança qualquer função sobre números, o que não afeta o número.Juntas, essas duas coisas significam que podemos escrever o código sem condicionais, já que o
Min
eMap
operações não são ops nos números e, subsequentemente, as duas negações são canceladas, de modo que a função se torna identidade quando recebe um número.Finalmente, graças a
#0
que é possível escrever funções recursivas não identificadas no Mathematica, o que economiza mais alguns bytes.fonte
Ruby, 46 bytes
Utilizado o truque do @ xnor com
min
para alternar entre max e min.fonte
Julia,
2725 bytesIsso usa o algoritmo da resposta do @ xnor . Experimente online!
fonte