Ein Mann lebt in der nordwestlichen Ecke (0, 0)
einer Stadt mit Höhe h
und Breite w
. Jeden Tag geht er von zu Hause zur Grenze (?, w)
oder (h, ?)
. Im folgenden Beispiel geht der Mann bis (3, 3)
heute.
(0, 0) +--+ + + . (0, 4)
|
+ +--+--+ .
|
+ + + + .
|
(3, 0) . . . . . (3, 4)
Der Mann zeichnet an jedem Punkt etwas auf ( +
im obigen Beispiel). Jedes Mal, wenn er einen Punkt erreicht, geht er nach Osten, wenn das Stück ist, 1
und sonst nach Süden. Das Stück wird umgedreht, nachdem er gegangen ist. Beispielsweise:
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)
Berechnen Sie anhand der Größe der Stadt und der Daten des Mannes das Ziel des Mannes nach n
Tagen.
Eingang:
In der ersten Zeile stehen drei Ganzzahlen h
, w
und n
.
In den folgenden h
Zeilen stehen w
ganze Zahlen für den Datensatz des Mannes.
h <= 1000, w <= 1000, n <= 1000000000
Ausgabe:
Zwei ganze Zahlen, die das Ziel des Mannes nach n
Tagen angeben .
Beispiel Input:
3 4 3
1 0 1 1
0 1 0 0
1 0 1 0
Beispielausgabe:
0 4
Beispielcode:
#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;
}
Wertung:
- Die niedrigste Byteanzahl in UTF-8 gewinnt.
- Wenn die Laufzeit Ihres Codes unabhängig ist
n
, reduzieren Sie Ihre Punktzahl um 50%.- Berechnen Sie nicht einfach die Ergebnisse aller 1000000000 Tage oder tun Sie etwas ähnlich Dummes, um diesen Bonus zu erhalten. Finde einen effizienten Algorithmus!
quelle
n
mein Code , egal was passiert, die Ergebnisse aller 1000000000 Tage berechnet und dann das Ergebnis von ausgibtn
, bekomme ich trotzdem den Bonus von -50%?Antworten:
GolfScript, 52.5 (105 Zeichen mit 50% Bonus)
Die Version ist sehr effizient und kann auch für große Werte online getestet werden.
Es wird ein Ansatz verwendet, der der Lösung von user2357112 ähnelt .
quelle
Python 2, 192 Bytes * 0,5 Bonus = 96
Um dieses Problem effizient zu lösen, können wir anhand der Häufigkeit, mit der die Zellen oben und links besucht werden, berechnen, wie oft jede Zelle besucht wird, ohne dass die genauen Pfade ermittelt werden müssen. Effektiv simulieren wir
n
Trips auf einmal und verfolgen, wie oft jede Zelle verwendet wird.Wesentliche Verbesserung durch Push-basierten Ansatz, inspiriert von der Lösung von johnchen902 :
Bisherige Pull-basierte Implementierung:
Originale, ungolfierte Version:
quelle
not
bis1^
und das lange kürzen , wenn die Bedingung geschrieben werden kannf=g[i][j]^v[i][j]&1 j+=f i+=1^f
.r
einen Parameter zu nehmen (r = lambda x: ...
), dann können Sie verkürzeng=[r()for i in x]
zug=map(r,x)
.Ruby,
159,143In der ersten Zeile wird der
*
Operator verwendet, um die erste Eingabezeile in einer Variablen und den Rest der Eingabe in einer anderen Variablen zu erfassen. Dann wird einei
wird Funktion zu konvertieren definiert"1 2 3 4"
in[1, 2, 3, 4]
, die beide aufgetragen wirdl
undn
. (x
undy
werden für später gespeichert.)n[-1]
Ist das letzte Element vonn
, so wird der folgende Block (die Simulation) so oft ausgeführt. Als erstesx
undy
werden auf Null initialisiert (sie sind außerhalb des Blocks erklärt , so dass deren Umfang groß genug ist), und dann die Simulation Linie ausgeführt wird,das ist ziemlich selbsterklärend ist, aber hier ist einige Kommentar sowieso:Edit: Neue Simulationszeile von Howard, danke! Ich bin mir ziemlich sicher, dass ich verstehe, wie es funktioniert, aber ich habe keine Zeit, eine Erklärung hinzuzufügen, daher wird eine später hinzugefügt.
Schließlich
p x,y
gibt die Zahlen aus, und wir sind fertig!quelle
$/
und die while-Schleife kann auf reduziert werden(x+=f=l[x][y]^=1;y+=f^1)while x<n[0]&&y<n[1]}
.Delphi XE3 (437 Bytes ||
897874 ohne Bonus gezählt)Als ich darüber nachdachte, wie ich das mit dem Bonus lösen könnte, dachte ich an Folgendes.
Wenn Sie 4 Tage laufen, wird die Zelle 0,0 4 Mal geändert. Die Zelle auf der rechten Seite wird zweimal geändert, ebenso die Zelle darunter.
Wenn es eine ungerade Anzahl von Tagen gibt und die Zahl in der Zelle mit 1 beginnt, erhält die Zelle rechts eine mehr als die Zelle darunter und umgekehrt, wenn die Zelle 0 ist.
Auf diese Weise können Sie für jede Zelle sehen, ob der Endwert geändert werden soll um: Zelle wurde X-mal geändert. wenn X mod 2> 0 ist, dann ändere die Zelle.
Ergibt folgenden Code:
{Whispers at JohnChen902} bekomme ich jetzt deine Zustimmung? : P
Ungolfed
quelle
C ++ 213 Bytes * 0,5 = 106,5
Hier ist meine Lösung. Es ähnelt der Lösung von user2357112 , es gibt jedoch mehrere Unterschiede:
Hier ist die ungolfed Version:
quelle
--*o;
und stattdessen wechseln, in welchem Fall Sie den Kerl nach unten und in welchem Fall Sie den Kerl nach rechts bewegen.Python, 177 Bytes
Mein erster Versuch in Code Golfing, also tut mir leid, wenn ich hier etwas falsch gemacht habe! Code, mit dem die Eingabe basierend auf dem Code von user2357112 erfasst wird.
Eingang:
Ausgabe:
quelle
R, 196 Bytes * 0,5 = 98
Ungolfed:
Verwendung:
quelle