Un homme vit dans le coin nord-ouest (0, 0)
d'une ville de hauteur h
et de largeur w
. Chaque jour, il marche de son domicile à la frontière (?, w)
ou (h, ?)
. Dans l'exemple suivant, l'homme va (3, 3)
aujourd'hui.
(0, 0) +--+ + + . (0, 4)
|
+ +--+--+ .
|
+ + + + .
|
(3, 0) . . . . . (3, 4)
L'homme enregistre un peu à chaque point ( +
dans l'exemple ci-dessus). Chaque fois qu'il atteint un point, il va vers l'est si le bit est 1
et vers le sud sinon. Le mors est retourné après son départ. Par exemple:
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)
Compte tenu de la taille de la ville et du dossier de l'homme, calculez la destination de l'homme après plusieurs n
jours.
Contribution:
Dans la première ligne sont trois entiers, h
, w
et n
.
Dans les h
lignes suivantes sont des w
nombres entiers, dénotant le dossier de l'homme.
h <= 1000, w <= 1000, n <= 1000000000
Production:
Deux entiers, indiquant la destination de l'homme après des n
jours.
Exemple d'entrée:
3 4 3
1 0 1 1
0 1 0 0
1 0 1 0
Exemple de sortie:
0 4
Exemple de code:
#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;
}
Notation:
- Nombre d'octets le plus bas dans les victoires UTF-8.
- Si le temps d'exécution de votre code est indépendant de
n
, réduisez votre score de 50%.- Ne vous contentez pas de calculer les résultats de tous les 1000000000 jours ou de faire quelque chose de stupide pour obtenir ce bonus. Trouvez un algorithme efficace!
la source
n
soit, mon code calcule les résultats de tous les 1000000000 jours, puis affiche le résultat den
, ai-je toujours le bonus de -50%?Réponses:
GolfScript, 52,5 (105 caractères avec 50% de bonus)
La version est très efficace et peut être testée en ligne même pour des valeurs importantes.
Il utilise une approche similaire à la solution de user2357112 .
la source
Python 2, 192 octets * 0,5 bonus = 96
Pour résoudre ce problème efficacement, la réalisation clé est que nous pouvons calculer combien de fois chaque cellule est visitée en fonction du nombre de visites des cellules au-dessus et à gauche, sans avoir besoin de déterminer les chemins exacts empruntés. En effet, nous simulons les
n
déplacements à la fois et gardons une trace du nombre de fois où chaque cellule est utilisée.Amélioration substantielle grâce à une approche push inspirée de la solution de johnchen902 :
Implémentation précédente basée sur l'extraction:
Version originale non golfée:
la source
not
à1^
et le long si la condition peut être écritef=g[i][j]^v[i][j]&1 j+=f i+=1^f
.r
à prendre un paramètre (r = lambda x: ...
), vous pouvez le raccourcirg=[r()for i in x]
eng=map(r,x)
.Ruby,
159143La première ligne utilise l'
*
opérateur pour saisir la première ligne d'entrée dans une variable et le reste de l'entrée dans une autre. Ensuite, unei
fonction est définie pour se convertir"1 2 3 4"
en[1, 2, 3, 4]
, qui est appliquée à la fois àl
etn
. (x
ety
sont enregistrés pour plus tard.)n[-1]
est le dernier élément den
, donc le bloc suivant (la simulation) est exécuté autant de fois. Tout d'abord,x
ety
sont initialisés à zéro (ils sont déclarés en dehors du bloc pour que leur portée soit suffisamment grande), puis la ligne de simulation est exécutée,ce qui est assez explicite, mais voici quand même quelques commentaires:Edit: nouvelle ligne de simulation fournie par Howard, merci! Je suis sûr de bien comprendre comment cela fonctionne, mais je n'ai pas le temps d'ajouter une explication, donc une sera ajoutée plus tard.
Enfin,
p x,y
sort les chiffres, et c'est fait!la source
$/
et la boucle while peut être réduite à(x+=f=l[x][y]^=1;y+=f^1)while x<n[0]&&y<n[1]}
.Delphi XE3 (437 octets ||
897874 sans bonus compté)En pensant à la façon de résoudre ce problème avec le bonus, j'ai pensé à ce qui suit.
Si vous marchez 4 jours, la cellule 0,0 est modifiée 4 fois. La cellule à sa droite est modifiée deux fois ainsi que la cellule située en dessous.
S'il y a un nombre de jours inégal et que le nombre dans la cellule commence par 1, la cellule de droite obtient un de plus que la cellule en dessous, et inversement si la cellule est 0.
En procédant ainsi pour chaque cellule, vous pouvez voir si la valeur finale doit être modifiée par: La cellule a été modifiée X fois. si X mod 2> 0, changez la cellule.
Résultats dans le code suivant:
{Whispers at JohnChen902} puis-je obtenir votre vote positif maintenant? : P
Non golfé
la source
C ++ 213 octets * 0,5 = 106,5
Voici ma solution. Elle est similaire à la solution de user2357112 , mais il existe plusieurs différences:
Voici la version non golfée:
la source
--*o;
, et en changeant plutôt le cas où vous déplacez le gars vers le bas et le cas où vous déplacez le gars vers la droite.Python, 177 octets
Mon premier essai dans Code Golfing, donc désolé si je me suis trompé ici! Code utilisé pour saisir l'entrée en fonction du code de l'utilisateur2357112.
Contribution:
Production:
la source
R, 196 octets * 0,5 = 98
Non golfé:
Usage:
la source