Um homem vive no canto noroeste (0, 0)
de uma cidade com altura h
e largura w
. Todos os dias ele sai de sua casa até a fronteira (?, w)
ou (h, ?)
. No exemplo a seguir, o homem vai para (3, 3)
hoje.
(0, 0) +--+ + + . (0, 4)
|
+ +--+--+ .
|
+ + + + .
|
(3, 0) . . . . . (3, 4)
O homem registra um pouco em cada ponto ( +
no exemplo acima). Toda vez que ele chega a um ponto, ele vai para o leste se a parte estiver 1
e para o sul, caso contrário. O bit é invertido depois que ele sai. Por exemplo:
Day 1: 1--0 1 1 Day 2: 0 1 1 1 Day 3: 1--1--1--1-- Day 4: 0 0 0 0
| | |
0 1--0 0 0 0 1 0 1 0 1 0 1--0 1 0
| | |
1 0 1--0 1--0 0 1 0 1 0 1 0 1--0 1
| | |
Destination: (3, 3) Destination: (3, 1) Destination: (0, 4) Destination: (3, 2)
Dado o tamanho da cidade e o histórico do homem, calcule o destino do homem depois de n
dias.
Entrada:
Na primeira linha são três inteiros, h
, w
e n
.
Nas h
linhas a seguir estão w
números inteiros, denotando o registro do homem.
h <= 1000, w <= 1000, n <= 1000000000
Resultado:
Dois inteiros, indicando o destino do homem depois de n
dias.
Entrada de amostra:
3 4 3
1 0 1 1
0 1 0 0
1 0 1 0
Saída de amostra:
0 4
Código de amostra:
#include <iostream>
using namespace std;
bool d[1000][1000];
int main(){
int h, w, n;
cin >> h >> w >> n;
for(int i = 0; i < h; i++)
for(int j = 0; j < w; j++)
cin >> d[i][j];
int i, j;
while(n--)
for(i = 0, j = 0; i < h && j < w;){
bool &b = d[i][j];
d[i][j] ? j++ : i++;
b = !b;
}
cout << i << " " << j << endl;
}
Pontuação:
- Menor contagem de bytes em vitórias UTF-8.
- Se o tempo de execução do seu código for independente
n
, reduza sua pontuação em 50%.- Não basta calcular os resultados de todos os 1000000000 dias ou fazer qualquer coisa estúpida para obter esse bônus. Encontre um algoritmo eficiente!
code-golf
simulation
johnchen902
fonte
fonte
n
seja, meu código calcula os resultados de todos os 1000000000 dias e depois gera o resultado den
, ainda recebo o bônus de -50%?Respostas:
GolfScript, 52,5 (105 caracteres com bônus de 50%)
A versão é muito eficiente e pode ser testada on-line, mesmo para grandes valores.
Ele usa uma abordagem semelhante à solução do user2357112 .
fonte
Python 2, 192 bytes * 0,5 de bônus = 96
Para resolver esse problema com eficiência, a principal conclusão é que podemos calcular quantas vezes cada célula é visitada com base no número de vezes que as células acima e à esquerda são visitadas, sem precisar determinar os caminhos exatos. Efetivamente, simulamos
n
viagens de uma só vez e acompanhamos quantas vezes cada célula é usada.Melhoria substancial devido à abordagem baseada em push, inspirada na solução de johnchen902 :
Implementação anterior, baseada em pull:
Versão original e não destruída:
fonte
not
que1^
eo tempo se condição pode ser escritof=g[i][j]^v[i][j]&1 j+=f i+=1^f
.r
usar um parâmetro (r = lambda x: ...
), poderá abreviá-log=[r()for i in x]
parag=map(r,x)
.Ruby,
159143A primeira linha usa o
*
operador para capturar a primeira linha de entrada em uma variável e o restante da entrada em outra. Em seguida, umai
função é definida para converter"1 2 3 4"
em[1, 2, 3, 4]
, que é aplicada a ambosl
en
. (x
ey
são salvos para mais tarde.)n[-1]
é o último elemento den
, portanto, o seguinte bloco (a simulação) é executado tantas vezes. Primeiro,x
ey
são inicializados com zero (eles são declarados fora do bloco para que seu escopo seja grande o suficiente) e, em seguida, a linha de simulação é executada, oque é bastante autoexplicativo, mas aqui estão alguns comentários:Edit: nova linha de simulação fornecida por Howard, obrigado! Tenho certeza de que entendo como funciona, mas não tenho tempo para adicionar uma explicação; portanto, uma será adicionada mais tarde.
Finalmente,
p x,y
produz os números, e terminamos!fonte
$/
e o loop while pode ser reduzido para(x+=f=l[x][y]^=1;y+=f^1)while x<n[0]&&y<n[1]}
.Delphi XE3 (437 bytes ||
897874 sem bônus contado)Ao pensar em como resolver isso com o bônus, pensei no seguinte.
Se você andar 4 dias, a célula 0,0 será alterada 4 vezes. A célula à direita é alterada duas vezes mais que a célula abaixo dela.
Se houver um número desigual de dias e o número na célula começar com 1, a célula à direita terá mais um que a célula abaixo e o contrário, se a célula for 0.
Ao fazer isso em cada célula, você pode ver se o valor final deve ser alterado por: A célula foi alterada X vezes. se X mod 2> 0, mude a célula.
Resultados no seguinte código:
{Whispers at JohnChen902} recebo seu voto positivo agora? : P
Ungolfed
fonte
C ++ 213 bytes * 0,5 = 106,5
Aqui está a minha solução. É semelhante à solução do user2357112 , mas há várias diferenças:
Aqui está a versão não destruída:
fonte
--*o;
. Em vez disso, alterne qual caso move o cara para baixo e qual caso move o cara para a direita.Python, 177 bytes
Minha primeira tentativa no Code Golfing, desculpe se entendi algo errado aqui! Código usado para capturar a entrada com base no código do usuário2357112.
Entrada:
Resultado:
fonte
R, 196 bytes * 0,5 = 98
Ungolfed:
Uso:
fonte