O problema
Um cenário do fim do mundo está descrito por três números em uma única linha, n
, m
, e p
. A seguir a essa linha estão as n
linhas com m
valores por linha. Cada valor representa o total de unidades de água que cada célula pode conter.
As p
linhas a seguir descrevem o clima para os próximos p
dias. 1 unidade de chuva cai em uma única célula por dia. Se a quantidade de água em uma célula exceder a quantidade que ela pode reter, ela inundará. Se várias células adjacentes estiverem em plena capacidade, elas serão tratadas como uma célula que compartilha vizinhos comuns (pense no Campo Minado quando você clicar em um grupo de espaços em branco).
- Uma única célula do meio tem 4 vizinhos
- Duas células do meio adjacentes, com capacidade total, são tratadas como uma célula que possui 6 vizinhos
- Uma célula de canto único tem 2 vizinhos
- Uma célula de parede única possui 3 vizinhos
Quando uma célula é inundada, ocorre um evento de inundação. Todo o excesso de água é distribuído igualmente aos seus vizinhos. Se isso fizer com que um ou mais vizinhos sejam inundados, outro evento de inundação ocorrerá. Isso continua até que a água se estabilize ou a cidade fique completamente inundada.
Exemplo de entrada
7 5 3
3 2 3 4 5
2 2 0 3 4
1 1 2 3 3
4 1 2 2 2
4 1 1 2 2
4 4 1 2 2
4 4 2 2 2
0 0
1 2
4 3
0 0
significa que choveu na linha 1, col 11 2
significa que choveu na linha 2, coluna 3 (que pode reter água zero e inundar imediatamente!)
Após p
dias de chuva, se a cidade estiver completamente inundada, produza Sink . Caso contrário, saída Swim .
Saída de exemplo
Nadar
Suposições
- A entrada pode ser fornecida através do stdin, lida em "city.txt" ou aceita como argumento. Todos os três são permitidos para não invalidar nenhuma resposta já publicada.
- As capacidades de água serão números inteiros não negativos.
Mais de 40 equipes de estudantes universitários de graduação (de A&M, UT, LSU, Rice, Baylor etc.) competindo em um concurso de programação com uma variedade de idiomas disponíveis não conseguiram resolver esse problema em 5 horas. Por causa disso, não posso deixar de mencionar que há um problema nesse quebra-cabeça que torna a solução trivial. O código mais curto ainda vence, porque tenho certeza de que o código mais curto também resolverá o quebra-cabeça.
n
linhas dem
valores ou o contrário? Seu exemplo não corresponde à especificação escrita.0.25
unidades para cada célula adjacente (assumindo uma única célula inundada no meio)?Respostas:
Golfscript,
3730 caracteresNovo e aprimorado, graças a PeterTaylor por dicas:
Explicação :
O programa então termina, produzindo a pilha.
Versão antiga + explicação:
Mesma abordagem que Fors , apenas Golfscripted =). Provavelmente pode se tornar mais eficiente. A entrada é de stdin.
Explicação :
O programa gera a pilha, que é apenas a resposta.
fonte
]
sem uma correspondência[
coletará toda a pilha em uma matriz, para que uma inicial[~]
possa ser simplificada para~]
. Para obter os primeirosgrid_size
elementos de uma matriz, use<
, portanto,<{+}*
certamente você poderá economizar um pouco em adicionar a capacidade total.0>"Sink""Swim"if
pode ser0>"SinkSwim"4/=
~]
? Eu tentei e não parecia funcionar. O último hack é bom que tenha que ser"SwimSink"
- irá usá-lo. e a coisa do array também parece promissora, vai começar a trabalhar nisso.ruby golfscript.rb
e ainda não funcionou ... você pode verificar se funciona do seu lado? Eu recebo o mesmo erro em ambos:undefined method '+' for nil:NilClass (NoMethodError)
C:
1009695 caracteresCinco horas? Levei cinco minutos. :)
Aragaer, obrigado pelas simplificações! No entanto, reorganizei as declarações e argumentos da variável para main, visto que Clang lança um erro se o segundo argumento para main for de outro tipo que não o
char **
.fonte
p;main(n,m){for(scanf("%d%d%d",&n,&m,&p),n*=m;n--;scanf("%d",&m),p-=m);puts(p>0?"Sink":"Swim");}
n,m;main(p){for(scanf("%d%d%d",&n,&m,&p),n*=m;n--;scanf("%d",&m))p-=m;puts(p>0?"Sink":"Swim");}
. Eu também brinquei com a idéia den-=scanf
, mas não tenho certeza se o programa estará correto depois disso. Primeiroscanf
pode ser movido para a frentefor
sem alterar a contagem de caracteres.n-=scanf...
não funcionaria, comon-=1
basicamente é um pré-incremento, então ele perderia o canto sudeste. A outra mudança é ótima.Python, 4 linhas, 175 caracteres
Lol, eu me pergunto se as mais de 40 equipes acabaram encontrando o problema ... depois de trabalhar da maneira mais difícil.
fonte
#
.input()
emap()
:n,_,p=map(int,input().split());print(['sink','swim'][p>sum(sum(map(int,input().split()))for a in range(n))])
Recurso duplo J (50 caracteres) e K (40)
Acontece que, como sempre, esses dois têm exatamente a mesma estrutura em suas soluções, portanto, ambos estão aqui. K é muito mais curto, porém, o que é uma surpresa agradável.
Explicação:
".1!:1]1
- Leia na primeira linha e converta para números inteiros.(...)/0 2{
- Pegue os itens no índice 0 e 2 (n
ep
respectivamente) e use-os como argumentos esquerdo e direito para o verbo(...)
, respectivamente.+1!:1@#1:
- Leia emn+p
linhas.[+/@".@$
- Pegue ($
) as primeirasn
linhas ([
), descartando o restante, depois converta para números inteiros (".
) e some em cada linha (+/
).]<[:+/
- Adicione as somas da linha e compare esse valor com o argumento corretop
. Produzimos true sep
for menor que a soma.>Sink`Swim{~
- SelecioneSwim
se a compra acima resultou em verdadeiro ouSink
falso.Uso:
E agora o K:
Explicado:
. 0:`
- Leia uma linha de entrada e converta para uma matriz de números inteiros.{...}.
- Use esses três númerosn m p
como argumentosx y z
para esta função.0::'(x+z)#`
- Criex+z
cópias do identificador do arquivo de entrada`
e leia em uma linha para cada um deles (0::'
)..:'x#
- Pegue os primeirosx
itens e converta cada um em um vetor de números.z<+//
- Soma a matriz inteira e teste para ver se é maior quez
.`Sink`Swim@
- RetorneSink
ou deSwim
acordo com o retorno do teste verdadeiro.Uso:
fonte
APL, 35
Não tenho certeza se permitido, mas ele deixa de aceitar entradas após a "cidade"
x←⎕
Recebe entrada e armazena-a em variávelx
(números delimitados por espaço são interpretados como uma matriz numérica)1⌷
Extrair índice 1 (matrizes APL são baseadas em uma)⍳
Gere uma matriz de 1 até o argumento (1⌷x←⎕
neste caso)¨
operação "Map"{+/⎕}
Retire a matriz de insira e retorne a soma+/
Soma a matriz gerada pela operação do mapa4×x[3]>
Teste se a soma <x[3]
(retorna 1 ou 0) e multiplique 4'SwimSink'⌽⍨
Gire a string'SwimSink'
por esse valor4↑
Finalmente, extraia os 4 primeiros caracteres da stringfonte
⎕IO←0
e substitua4↑'SwimSink'⌽⍨4×
por'Swim' 'Sink'⊃⍨
,x[3]
comx[2]
e1⌷x
com⊃x
para salvar dois bytes.AWK, 70
Esta é uma violação de laindir na minha submissão (86):
fonte
NR<=h
deve serNR<=h+1
, caso contrário, você terá falsos sumidouros quando a última linha de capacidades for ignorada. Isso também pode ser encurtado para 70 comon{for(;NF;NF--)s+=$NF;n--}NR==1{n=$1;p=$3}END{print p<s?"Swim":"Sink"}
CoffeeScript -
128113Uma função que aceita a string como o único argumento:
fonte
`p>x?"Sink":"Swim"`
vez deif p>x then"Sink"else"Swim"
. Parens para a terceira declaração também não são necessários.SED, 128
Foi divertido escrever uma
sed
versão disso. Tem as seguintes deficiências:Assume que a cidade possui mais de duas colunas, para reconhecer facilmente as linhas de chuva.
Assume que a capacidade de cada cidade esteja no intervalo de 0 a 9.
Aqui está:
Ligue com a
-n
bandeira.fonte
SWI-Prolog 79
Se você não se importa com o fato de que esta resposta recebe entrada por consulta, em vez de via stdin:
A resposta não valida o formato de entrada, mas não acho que seja um problema, pois o concurso de programação também não exige que você faça isso.
Consulta de amostra (usando o exemplo na pergunta):
fonte
Python - 152
fonte
,
, antes e depois'
, depois)
...Scala - 128
Pode ser possível omitir alguns parênteses ou algo assim, mas Scala é realmente inconstante sobre pontuação e estilo sem pontos e () vs {} e outros enfeites.
fonte
Javascript - 73 caracteres
Assume que a entrada está na variável
s
e geraSwim
ouSink
.Exemplo:
Da pergunta original - inserindo isso no console do navegador:
Saídas:
fonte