Seorang pria tinggal di sudut barat laut (0, 0)
kota dengan tinggi h
dan lebar w
. Setiap hari ia berjalan dari rumahnya ke perbatasan (?, w)
atau (h, ?)
. Dalam contoh berikut, pria itu pergi ke (3, 3)
hari ini.
(0, 0) +--+ + + . (0, 4)
|
+ +--+--+ .
|
+ + + + .
|
(3, 0) . . . . . (3, 4)
Pria itu mencatat sedikit di setiap titik ( +
contoh di atas). Setiap kali dia mencapai suatu titik, dia pergi ke timur jika bagian itu 1
dan selatan sebaliknya. Bit dibalik setelah dia pergi. Sebagai contoh:
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)
Mengingat ukuran kota dan catatan pria itu, hitung tujuan pria itu setelah n
berhari-hari.
Memasukkan:
Di baris pertama ada tiga bilangan bulat h
,, w
dan n
.
Dalam h
baris berikut adalah w
bilangan bulat, yang menunjukkan catatan pria itu.
h <= 1000, w <= 1000, n <= 1000000000
Keluaran:
Dua bilangan bulat, yang menunjukkan tujuan pria itu setelah n
berhari-hari.
Input sampel:
3 4 3
1 0 1 1
0 1 0 0
1 0 1 0
Output sampel:
0 4
Kode sampel:
#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;
}
Mencetak:
- Hitungan byte terendah dalam kemenangan UTF-8.
- Jika waktu menjalankan kode Anda tidak tergantung
n
, kurangi skor Anda hingga 50%.- Jangan hanya menghitung hasil 1000000000 hari atau melakukan hal yang sama bodohnya untuk mendapatkan bonus ini. Temukan algoritma yang efisien!
code-golf
simulation
johnchen902
sumber
sumber
n
terjadi, kode saya menghitung hasil semua 1000000000 hari, lalu menampilkan hasilnyan
, apakah saya masih mendapatkan bonus -50%?Jawaban:
GolfScript, 52,5 (105 karakter dengan bonus 50%)
Versi ini sangat efisien dan dapat diuji secara online bahkan untuk nilai yang besar.
Ini menggunakan pendekatan yang mirip dengan solusi user2357112 .
sumber
Python 2, 192 byte * 0,5 bonus = 96
Untuk menyelesaikan masalah ini secara efisien, realisasi utama adalah bahwa kita dapat menghitung berapa kali setiap sel dikunjungi berdasarkan berapa kali sel di atas dan di sebelah kiri dikunjungi, tanpa perlu menentukan jalur yang tepat diambil. Secara efektif, kami mensimulasikan
n
perjalanan sekaligus dan melacak berapa kali setiap sel digunakan.Peningkatan substansial karena pendekatan berbasis push yang terinspirasi oleh solusi johnchen902 :
Sebelumnya, implementasi berbasis pull:
Asli, versi tidak dikoleksi:
sumber
not
ke1^
dan lama jika kondisi dapat ditulisf=g[i][j]^v[i][j]&1 j+=f i+=1^f
.r
untuk mengambil parameter (r = lambda x: ...
), maka Anda dapat menyingkatg=[r()for i in x]
menjadig=map(r,x)
.Ruby,
159143Baris pertama menggunakan
*
operator untuk mengambil baris input pertama dalam satu variabel, dan sisanya dari input lainnya. Kemudian suatui
fungsi didefinisikan untuk dikonversi"1 2 3 4"
menjadi[1, 2, 3, 4]
, yang diterapkan untuk keduanyal
dann
. (x
dany
disimpan untuk nanti.)n[-1]
adalah elemen terakhirn
, jadi blok berikut (simulasi) dieksekusi berkali-kali. Pertama,x
dany
diinisialisasi ke nol (mereka dideklarasikan di luar blok sehingga cakupannya cukup besar), dan kemudian garis simulasi dijalankan,yang cukup jelas, tetapi inilah beberapa komentar:Sunting: garis simulasi baru yang disediakan oleh Howard, terima kasih! Saya cukup yakin saya mengerti cara kerjanya tetapi saya tidak punya waktu untuk menambahkan penjelasan, jadi akan ditambahkan nanti.
Akhirnya,
p x,y
menampilkan angkanya, dan kita selesai!sumber
$/
dan loop sementara dapat dikurangi menjadi(x+=f=l[x][y]^=1;y+=f^1)while x<n[0]&&y<n[1]}
.Delphi XE3 (437 bytes ||
897874 tanpa bonus dihitung)Ketika berpikir tentang bagaimana menyelesaikan ini dengan bonus saya memikirkan hal berikut.
Jika Anda berjalan 4 hari sel 0,0 diubah 4 kali. Sel di sebelah kanannya diubah dua kali juga sel di bawahnya.
Jika ada jumlah hari yang tidak merata dan angka dalam sel dimulai dengan 1 sel di sebelah kanan mendapat satu lebih dari sel di bawahnya, dan sebaliknya jika selnya 0.
Dengan melakukan ini untuk setiap sel, Anda dapat melihat apakah nilai akhir harus diubah oleh: Sel diubah X kali. jika X mod 2> 0 maka ubah sel.
Hasil dalam kode berikut:
{Whispers at JohnChen902} apakah saya mendapatkan suara Anda sekarang? : P
Tidak disatukan
sumber
C ++ 213 byte * 0,5 = 106,5
Ini solusinya. Ini mirip dengan solusi user2357112 , tetapi ada beberapa perbedaan:
Ini adalah versi yang tidak disunat:
sumber
--*o;
, dan alih-alih mengganti kasir yang Anda pindahkan dan yang Anda pindahkan lelaki ke kanan.Python, 177 byte
Percobaan pertama saya di Code Golfing, maaf jika ada yang salah di sini! Kode yang digunakan untuk mengambil input berdasarkan kode user2357112.
Memasukkan:
Keluaran:
sumber
R, 196 byte * 0,5 = 98
Tidak Disatukan:
Pemakaian:
sumber