Dezesseis pilhas de queijo são colocadas em um quadrado 4x4. Eles são rotulados de a . A menor pilha é e a maior é .
O Hungry Mouse está com tanta fome que sempre vai direto para a pilha maior (ou seja, ) e a come imediatamente.
Depois disso, ele vai para a maior pilha vizinha e rapidamente come essa também. (Sim ... Está com muita fome.) E assim por diante até não haver mais pilha vizinha.
Uma pilha pode ter até 8 vizinhos (horizontal, vertical e diagonal). Não há volta.
Exemplo
Começamos com as seguintes pilhas de queijo:
O rato faminto come primeiro e, em seguida, sua maior pilha vizinha, que é .
Seus próximos movimentos são , , , , , , , , e nesta ordem exata.
Não há mais queijo ao redor do Hungry Mouse, então ele pára por aí.
O desafio
Dada a configuração inicial do queijo, seu código deve imprimir ou retornar a soma das pilhas restantes depois que o Hungry Mouse parar de comê-las.
Para o exemplo acima, a resposta esperada é .
Regras
- Como o tamanho da matriz de entrada é fixo, você pode considerá-lo como uma matriz 2D ou uma matriz unidimensional.
- É garantido que cada valor de a apareça exatamente uma vez.
- Isso é código-golfe .
Casos de teste
[ [ 4, 3, 2, 1], [ 5, 6, 7, 8], [12, 11, 10, 9], [13, 14, 15, 16] ] --> 0
[ [ 8, 1, 9, 14], [11, 6, 5, 16], [13, 15, 2, 7], [10, 3, 12, 4] ] --> 0
[ [ 1, 2, 3, 4], [ 5, 6, 7, 8], [ 9, 10, 11, 12], [13, 14, 15, 16] ] --> 1
[ [10, 15, 14, 11], [ 9, 3, 1, 7], [13, 5, 12, 6], [ 2, 8, 4, 16] ] --> 3
[ [ 3, 7, 10, 5], [ 6, 8, 12, 13], [15, 9, 11, 4], [14, 1, 16, 2] ] --> 12
[ [ 8, 9, 3, 6], [13, 11, 7, 15], [12, 10, 16, 2], [ 4, 14, 1, 5] ] --> 34
[ [ 8, 11, 12, 9], [14, 5, 10, 16], [ 7, 3, 1, 6], [13, 4, 2, 15] ] --> 51
[ [13, 14, 1, 2], [16, 15, 3, 4], [ 5, 6, 7, 8], [ 9, 10, 11, 12] ] --> 78
[ [ 9, 10, 11, 12], [ 1, 2, 4, 13], [ 7, 8, 5, 14], [ 3, 16, 6, 15] ] --> 102
[ [ 9, 10, 11, 12], [ 1, 2, 7, 13], [ 6, 16, 4, 14], [ 3, 8, 5, 15] ] --> 103
[[9, 10, 11, 12], [1, 2, 7, 13], [6, 16, 4, 14], [3, 8, 5, 15]]
Respostas:
Python 2 ,
133130 bytesExperimente online!
Leva uma lista nivelada de 16 elementos.
Como funciona
fonte
a[i+x]for x in[-6,-5,-4,-1,1,4,5,6]
pode ser reduzida paraa[i+j+j/3*2-6]for j in range(9)
(a entrada zero é inofensiva). O Python 3 certamente pode ser mais curto codificando uma cadeia de 8 bytes de comprimento 8, mas o Python 2 ainda pode ser melhor no geral.a=[0]*5
for r in input():a=r+[0]+a
. Talvez exista uma solução de corte de cadeia ainda mais curta que não exija iteração.Python 2 , 111 bytes
Experimente online!
Método e casos de teste adaptados do Bubbler . Leva uma lista simples em STDIN.
O código verifica se dois índices simples
i
ej
representa células em contato, verificando se a diferença de linhai/4-j/4
e a colunai%4-j%4
estão estritamente entre -2 e 2. A primeira passagem, em vez disso, faz com que essa verificação seja bem-sucedida automaticamente, para que a maior entrada seja encontrada, independentemente da adjacência.fonte
MATL ,
504947 bytesEntrada é uma matriz, usando
;
como separador de linhas.Experimente online! Ou verifique todos os casos de teste .
Explicação
fonte
PHP,
177 174171 bytesCorra com
-nr
, forneça elementos da matriz como argumentos ou tente online .fonte
JavaScript, 122 bytes
Eu levei mais de duas voltas erradas nesta e agora estou sem tempo para jogar golfe, mas pelo menos está funcionando. Vou revisitar amanhã (ou, me conhecendo, no trem para casa hoje à noite!), Se eu conseguir encontrar um minuto.
Experimente online
fonte
flatMap()
: pR ,
128124123112110 bytesExperimente online!
Ele cria uma matriz 4x4 (que me ajudou a visualizar as coisas), preenchê-la com zeros, depois começa a partir dos 16 e pesquisa suas pilhas ao redor das próximas maiores e assim por diante.
Na conclusão, ele gera um aviso, mas não tem conseqüências e não altera o resultado.
EDIT: -4 bytes compactando a inicialização da matriz em 1 linha.
EDIT: -1 graças a Robert Hacken
EDIT: -13 bytes combinando as sugestões de Giuseppe e Robin Ryder.
fonte
r==16
parar>15
.which
.m
como um lógico em vez de um número inteiro e, portanto, precisa chamar apenaswhich
uma vez em vez de duas vezes.X%o%Y
é um apelido paraouter(X,Y,'*')
.outer
é uma das funções mais úteis, pois pode funcionar como o recurso "broadcast" do Octave / MATLAB / MATL com operadores arbitrários (vetorizados). Veja aqui ; também útil em raras ocasiões é okronecker
link dessa página.Carvão , 47 bytes
Experimente online! Link é a versão detalhada do código. Explicação:
Converta os números de entrada em caracteres alfabéticos (A = 0 .. Q = 16) e imprima-os como uma grade 4x4.
Comece comendo o Q, ou seja, 16.
Repita enquanto houver algo para comer.
Encontre onde está a pilha. Esta é uma vista linear na ordem principal da linha.
Converter em coordenadas e pular para esse local.
Encontre a maior pilha adjacente.
Coma a pilha atual.
Converta as pilhas novamente em números inteiros e pegue a soma.
Limpe a tela e produza o resultado.
fonte
Powershell,
143141136130 130122121 bytesScript de teste com menos golfe:
Resultado:
Explicação:
Primeiro , adicione as bordas superior e inferior de 0 e faça uma matriz dimensional única:
O PowerShell retornará
$null
se você tentar obter o valor atrás do final da matriz.Segundo , o loop
biggest neighbor pile
iniciou de 16 para um valor diferente de zero. E anulá-lo (o rato faminto come).Terceiro , soma das pilhas restantes.
fonte
SAS,
236219 bytesEntrada em cartões perfurados, uma linha por grade (separada por espaço), saída impressa no log.
Esse desafio é um pouco complicado por algumas limitações de matrizes no SAS:
Atualizações:
infile cards;
Declaração removida (-13)a:
para definição de matriz em vez dea1-a16
(-4)Golfe:
Ungolfed:
fonte
Haskell , 163 bytes
Experimente online!
A
f
função recebe a entrada como uma lista de 4 listas de 4 números inteiros.Ligeiramente não-destruído
fonte
JavaScript (ES7), 97 bytes
Recebe a entrada como uma matriz nivelada.
Experimente online!
Comentado
fonte
APL (Dyalog Unicode) ,
42SBCS de 41 bytesExperimente online!
fonte
Java 10,
272248 bytesAs células são verificadas da mesma forma que na minha resposta para o desafio Todos os oitavos .
-24 bytes graças a @ OlivierGrégoire .
Experimente online.
Explicação:
fonte
int r,c,R=4,M=1,x,y,X,Y;for(r=c=X=Y=0;
, então obrigado. :)J, 82 bytes
Experimente online!
Eu pretendo golfe este mais amanhã, e talvez escrever uma solução mais J-ish semelhante a este um , mas eu percebi que eu tente a abordagem achatada desde que eu não tinha feito isso antes.
fonte
]
emg
?Vermelho , 277 bytes
Experimente online!
É uma solução realmente longa e eu não estou feliz com isso, mas gastei muito tempo corrigindo-o para trabalhar no TIO (aparentemente existem muitas diferenças entre as versões estáveis do Red do Win e Linux), então eu a publico assim mesmo ...
Mais legível:
fonte
Geléia ,
31 3029 bytesComo o método é muito lento para ser executado nos anos 60, com o mouse iniciado,
16
ele a inicia9
e limita sua capacidade, de modo que ela é capaz de comer apenas9
s ou menos. Experimente on-line! (assim aqui ela come9, 2, 7, 4, 8, 6, 3
indo embora97
).Quão?
fonte
Não é o meu melhor trabalho. Há algumas melhorias definitivas a serem feitas, algumas provavelmente fundamentais para o algoritmo usado - tenho certeza de que pode ser aprimorado usando apenas um
int[]
, mas não consegui descobrir como enumerar vizinhos dessa maneira com eficiência. Eu adoraria ver uma solução do PowerShell que usa apenas uma matriz unidimensional!Núcleo do PowerShell , 348 bytes
Experimente online!
Versão mais legível:
fonte
(array|sort)[-1]
invés deMeasure -max
trabalhar no PSv5, mas estava obtendo resultados incorretos no núcleo. Não faço ideia do porquê.(0..10|sort)[-1]
mas ele retorna 10 no PSv5, mas 9 no PS Core. Isso ocorre porque ele é tratado em ordem lexicográfica em vez de numérica. Que vergonha.C (gcc), 250 bytes
Experimente online!
Nota: Este envio modifica a matriz de entrada.
s()
é a função para chamar com um argumento de um mutávelint[16]
(que é o mesmo na memória que umint[4][4]
, que é o que og()
interpreta).s()
localiza a localização do16
na matriz e passa essas informações parag
, que é uma função recursiva que obtém uma localização, define o número nesse local como 0 e, em seguida:Se houver um número positivo adjacente, recorra à localização do maior número adjacente
Senão, retorne a soma dos números na matriz.
fonte
s(int*a){for(i=0;a[i]<16;++i);return g(a,i%4,i/4);}
Wolfram Language (Mathematica) , 149 bytes
Experimente online!
fonte
Adicionar ++ , 281 bytes
Experimente online!
Oof, isso é complicado.
Verifique todos os casos de teste
Como funciona
Para esta explicação, usaremos a entrada
Isso implementa as duas funções auxiliares:
Finalmente, produza t , ou seja, os valores restantes não coletados.
fonte
C # (.NET Core) , 258 bytes
Sem LINQ. O uso System.Collections.Generic é para a formatação posterior - a função não exige isso.
Experimente online!
fonte
Perl 6 ,
151136126125119 bytesSuper solução surrada. Recebe a entrada como uma matriz achatada.
Experimente online!
fonte
Perl 5
-MList::Util=sum -p
, 137 bytesExperimente online!
fonte
K (ngn / k) , 49 bytes
Experimente online!
a entrada (
x
) é uma matriz 1d(+!4 4)!x
um dicionário que mapeia pares de cordas para os valores dex
h::
atribuir a uma variável globalh
*>
a chave correspondente ao valor máximo{
}\
repita até a convergência, coletando valores intermediários em uma listah[,x]:0
zere a posição atual+x+0,'1-!3 3
posições vizinhas(
)#h
filtrá-losh
como um dicionário menor*>
qual vizinho tem o valor máximo? torna-se a posição atual para a nova iteração+/h
finalmente, retorne a soma dosh
valores restantesfonte
Wolfram Language (Mathematica) ,
124115 bytesExperimente online!
Isso pega uma matriz 2D, junta-a de cada lado e a aplana imediatamente para que não tenhamos que gastar a indexação de bytes. O único custo para isso é
Join@@
achatar. Depois, procede como abaixo.Versão de 124 bytes para uma matriz 2D: Experimente online!
Principalmente meu próprio trabalho, com um pouco derivado da resposta de 149 bytes de J42161217 .
Ungolfed:
fonte