Un hombre vive en la esquina noroeste (0, 0)
de una ciudad con altura h
y anchura w
. Todos los días camina desde su casa hasta la frontera (?, w)
o (h, ?)
. En el siguiente ejemplo, el hombre va a (3, 3)
hoy.
(0, 0) +--+ + + . (0, 4)
|
+ +--+--+ .
|
+ + + + .
|
(3, 0) . . . . . (3, 4)
El hombre registra un poco en cada punto ( +
en el ejemplo anterior). Cada vez que llega a un punto, va hacia el este si el bit es 1
y hacia el sur de lo contrario. La parte se voltea después de que se va. Por ejemplo:
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 el tamaño de la ciudad y el registro del hombre, calcule el destino del hombre después de n
días.
Entrada:
En la primera línea hay tres enteros h
, w
y n
.
En las siguientes h
líneas hay w
enteros, que denotan el registro del hombre.
h <= 1000, w <= 1000, n <= 1000000000
Salida:
Dos enteros, que denotan el destino del hombre después de n
días.
Entrada de muestra:
3 4 3
1 0 1 1
0 1 0 0
1 0 1 0
Salida de muestra:
0 4
Código de muestra:
#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;
}
Puntuación:
- El conteo de bytes más bajo en UTF-8 gana.
- Si el tiempo de ejecución de su código es independiente
n
, reduzca su puntaje en un 50%.- No solo calcules los resultados de todos los 1000000000 días o hagas algo similarmente estúpido para obtener este bono. ¡Encuentra un algoritmo eficiente!
code-golf
simulation
johnchen902
fuente
fuente
n
sea, mi código calcula los resultados de todos los 1000000000 días, luego emite el resultado den
¿Todavía obtengo el bono de -50%?Respuestas:
GolfScript, 52.5 (105 caracteres con 50% de bonificación)
La versión es muy eficiente y se puede probar en línea incluso para valores grandes.
Utiliza un enfoque similar a la solución de user2357112 .
fuente
Python 2, 192 bytes * 0.5 bonus = 96
Para resolver este problema de manera eficiente, la realización clave es que podemos calcular cuántas veces se visita cada celda en función de la cantidad de veces que se visitan las celdas superiores y a la izquierda, sin necesidad de determinar las rutas exactas tomadas. Efectivamente, simulamos
n
viajes a la vez y hacemos un seguimiento de cuántas veces se usa cada celda.Mejora sustancial debido al enfoque basado en el impulso inspirado en la solución de johnchen902 :
Implementación previa basada en extracción:
Versión original sin golf:
fuente
not
a1^
y la larga si la condición se puede escribirf=g[i][j]^v[i][j]&1 j+=f i+=1^f
.r
tomar un parámetro (r = lambda x: ...
), entonces se puede acortarg=[r()for i in x]
ag=map(r,x)
.Rubí,
159143La primera línea utiliza el
*
operador para tomar la primera línea de entrada en una variable y el resto de la entrada en otra. A continuación, unai
función se define para convertir"1 2 3 4"
en[1, 2, 3, 4]
, que se aplica tanto al
yn
. (x
yy
se guardan para más tarde)n[-1]
es el último elemento den
, por lo que el siguiente bloque (la simulación) se ejecuta muchas veces. Primero,x
yy
se inicializan a cero (se declaran fuera del bloque para que su alcance sea lo suficientemente grande), y luego se ejecuta la línea de simulación, locual es bastante explicativo, pero de todos modos aquí hay algunos comentarios:Editar: nueva línea de simulación proporcionada por Howard, ¡gracias! Estoy bastante seguro de que entiendo cómo funciona, pero no tengo tiempo para agregar una explicación, por lo que se agregará más adelante.
Finalmente,
p x,y
genera los números, ¡y listo!fuente
$/
y el ciclo while se puede reducir a(x+=f=l[x][y]^=1;y+=f^1)while x<n[0]&&y<n[1]}
.Delphi XE3 (437 bytes ||
897874 sin bono contado)Al pensar en cómo resolver esto con la bonificación, pensé en lo siguiente.
Si caminas 4 días, la celda 0,0 se cambia 4 veces. La celda a su derecha se cambia dos veces más que la celda debajo de ella.
Si hay un número desigual de días y el número en la celda comienza con 1, la celda de la derecha obtiene uno más que la celda de abajo, y al revés si la celda es 0.
Al hacer esto para cada celda, puede ver si el valor final debe cambiarse por: La celda se cambió X veces. si X mod 2> 0, cambie la celda.
Resultados en el siguiente código:
{Whispers at JohnChen902} ¿recibo tu voto a favor ahora? :PAG
Sin golf
fuente
C ++ 213 bytes * 0.5 = 106.5
Aquí está mi solución. Es similar a la solución de user2357112 , pero hay varias diferencias:
Aquí está la versión sin golf:
fuente
--*o;
y, en cambio, cambie qué caso mueve al tipo hacia abajo y qué caso mueve al tipo hacia la derecha.Python, 177 bytes
Mi primer intento en Code Golfing, ¡lo siento si me equivoqué aquí! Código utilizado para capturar la entrada en función del código del usuario2357112.
Entrada:
Salida:
fuente
R, 196 bytes * 0.5 = 98
Sin golf:
Uso:
fuente