Deslizamentos de terra
Nesse desafio, seu trabalho é prever a extensão dos danos causados por um grande deslizamento de terra. Utilizamos o seguinte modelo bidimensional simplificado, parametrizado por uma altura inicial h >= 0
e um coeficiente crítico c > 0
. Você começa com um penhasco de altura h
, e supõe-se que o terreno seja completamente plano infinitamente à esquerda e à direita dele. Pois h = 6
, a situação é assim:
##########
##########
##########
##########
##########
##########
-----------------------
Os -
alicerces são imóveis e o #
solo é instável. Se a diferença de altura entre duas colunas vizinhas for maior que c
, ocorre um deslizamento de terra : a parte superiorc
unidades do solo da coluna esquerda caem para as próximas c
colunas à direita, uma para cada. A coluna não vazia à direita na figura é instável c = 2
, portanto, um deslizamento de terra é acionado:
#########
#########
##########
##########
##########
############
-----------------------
A coluna ainda é instável, o que causa um segundo deslizamento de terra:
#########
#########
#########
#########
############
############
-----------------------
Agora, a coluna à esquerda ficou instável, então um novo deslizamento de terra é acionado lá:
########
########
#########
###########
############
############
-----------------------
Depois disso, o penhasco fica estável novamente. O bom desse modelo é que a ordem na qual os deslizamentos são processados não importa: o resultado final é o mesmo.
A tarefa
Seu programa recebe os parâmetros inteiros h
e c
como entradas (a ordem não importa, mas você deve especificá-lo em sua resposta) e deve gerar o número total de colunas afetadas pelo deslizamento de terra. Isso significa o número de colunas no penhasco estável resultante, cuja altura é estritamente entre 0
e h
. No exemplo acima, a saída correta é 4
.
Você pode escrever um programa completo ou uma função. A menor contagem de bytes vence e as brechas padrão não são permitidas.
Casos de teste
Estes são dados no formato h c -> output
.
0 2 -> 0
2 3 -> 0
6 2 -> 4
6 6 -> 0
10 1 -> 10
15 1 -> 14
15 2 -> 11
15 3 -> 6
40 5 -> 16
80 5 -> 28
80 10 -> 17
CJam - 70
Experimente em http://cjam.aditsu.net/
Explicação:
O
h
operador verifica o último valor na pilha sem removê-lo. Se um deslizamento de terra ocorreu, o valor é a matriz do penhasco, avaliada como verdadeira porque não está vazia. Caso contrário, o último valor é 0 (falso).Portanto, no caso de deslizamento de terra, o loop continua com a matriz na pilha, caso contrário, termina com um 0 pressionado após a matriz. Esse 0 é então removido da matriz pelo próximo
-
operador.fonte
Python,
200190174Versão expandida:
Edit: Após algumas otimizações, eliminei a terminação do loop inábil por meio de interrupção (economiza 1 byte). Também mudou o slide de fatia baseada em loop.
fonte
sum
de 2 bytes. Além disso, geralmente é melhor definir um programa completo em Python, recebendo informaçõesh,c=input()
e imprimindo o resultado no final.sum
lata você salvar um:sum(h>i>0for i in q)
.c=0
salva um byte (não posso comentar sobre a sua resposta).Python
2-194158 bytes(Observe que o intérprete de redução de conversão do SE converte guias literais em 4 espaços. As linhas 7 e 8 deste programa têm apenas uma única guia [isto é, um byte] de recuo cada.)
Recebe entrada em stdin,
h
primeiro. Por exemplo:Este programa passou por muitas melhorias. Eu estava editando esta resposta para explicar algumas das edições mais importantes, mas estava ficando um pouco longa. Você pode verificar o histórico de edições se estiver curioso.
Explicação
Primeiro,
h
ec
são lidos pelo stdin. No Python 2,input()
é equivalente aeval(raw_input())
, e é por isso que peço uma vírgula separando os números.input()
retorna uma tupla de ints, nenhuma conversão é necessária.Em seguida, é feita uma lista de números inteiros. É
2*h
longo. A primeira metade éh
e a segunda metade é 0. Não tenho nenhum raciocínio para mostrar que isso é suficiente para simular infinitosh
s à esquerda e 0s à direita. Eu meio que tropecei nele e ele funciona em todos os casos de teste; portanto, se alguém puder encontrar informações, não funcionará. De qualquer forma, essa lista é chamadal
, mas outra cópia é chamadab
.b
O valor de realmente não importa, tudo o que importa é que é verdade. Uma lista não vazia é realmente verdadeira e a única maneira deb
ficar vazia aqui é seh
for 0; nesse caso, a resposta correta ainda será impressa. Em qualquer outro caso,b
deve ser verdade para garantir que entramos nowhile b:
loop. No entanto, a primeira coisa que acontece no loop é definirb
0, um valor falsey. Durante cada repetição do loop,b
deve-se voltar especificamente para um número real ou o loop terminará.O restante do loop é a simulação real. É muito ingênuo, essencialmente apenas sendo uma tradução de código da descrição do problema. Se qualquer elemento de
l
forc
maior que o seguinte, é subtraído porc
e os próximosc
elementos têm 1 adicionado a eles. (A mágica bit a bit usada aqui é apenas uma maneira mais curta de escreveri+1+j
, a propósito.) Ao fazer essas transformações,b
é definido como 1. Na primeira vez que nenhuma transformação for feita,b
permanecerá 0 e o loop será encerrado.Qualquer expressão verdadeira é avaliada como
True
, e quando você tenta fazer matemática,True
é avaliada como 1. O mesmo vale paraFalse
e 0. A última linha do programa usa todos os elementos del
comoe
na expressãoh>e>0
e soma o resultado. Isso obtém o número de colunas maior que 0, mas menor que a altura original do penhasco, que é o valor que a pergunta solicita. É impresso e o programa sai.fonte
c-=c
equivalente ac=0
?i+1+j
pode ser escrito comoi-~j
Haskell,
163156151 BytesUso:
h#c
por exemplo,6#2
quais saídas4
.Como funciona: a função auxiliar
s
faz um único deslizamento de terra. Aplicar repetidamentes
até que a saída não mude mais. Conte os elementos afetados.Encontrada a função "aplicar até a saída não mudar" (ou seja,
until=<<((==)=<<)
) no Stackoverflow .fonte
f
como infix (h#c=...
) e movendo awhere
cláusula para a mesma linha. Além disso, ainda existem alguns parênteses para lançar usando$
, embora eu não tenho certeza de quantas ...()
por$
é trilha e erro para mim.Mathematica,
1081041009795Uso:
Exemplo:
fonte
C #
303295Funciona!
Mas é um ....
Eu preciso encontrar um novo idioma;)
Vou verificar essa coisa CJam ...
Melhorado:
fonte
int z=i;int y=i-1;
poderia serint z=i,y=i-1;
. Osfor
loops não fazem coisas complicadas com seus índices, então, por exemplo,for(int i=s.Count-1;i>0;i--)
poderia serfor(int i=s.Count;--i>0;)
.1<0
é uma maneira mais curta de escreverfalse
. Eu suspeito queif(s[s.Count-1]>0)s.Add(0);
poderia perder a condição sem afetar a correção, apenas a velocidade.