Kullanıcı CarpetPython , artan arama alanı nedeniyle buluşsal çözümlere daha fazla odaklanan bu soruna yeni bir bakış attı . Şahsen ben bu meydan okuma benimkinden daha güzel olduğunu düşünüyorum, o yüzden bir deneyin!
Vektörel yarış, bir kalem ve bir kare kare kağıt ile oynanabilen bağımlılık yapan bir oyundur. Kağıdın üzerine rasgele bir yarış pisti çiziyorsunuz, bir başlangıç ve bitiş tanımlıyorsunuz ve sonra nokta büyüklüğündeki arabanızı sıra tabanlı bir şekilde kullanıyorsunuz. Mümkün olduğu kadar çabuk bitirin ama bir duvarda kalmamaya dikkat edin!
Parça
- Harita, her hücrenin tam sayı koordinatlarına sahip olduğu iki boyutlu bir ızgaradır.
- Izgara hücreleri üzerinde hareket edersiniz.
- Her ızgara hücresi, parçanın bir parçası veya bir duvardır.
- Tam olarak bir iz hücresi başlangıç koordinatıdır.
- Hedef olarak en az bir iz hücresi belirlendi. Bunlardan herhangi birine inmek yarışı tamamlar. Birden fazla hedef hücre mutlaka bağlı değildir.
Arabayı Yönetmek
Aracınız belirli bir koordinatta ve hız vektörüyle başlar (0, 0)
. Her turda, hızın her bir bileşenini ayarlayabilir ±1
veya olduğu gibi bırakabilirsiniz. Sonra, ortaya çıkan hız vektörü aracınızın konumuna eklenir.
Bir resim yardımcı olabilir! Kırmızı daire son sıranızdaydı. Mavi daire şu anki pozisyonunuz. Hızınız kırmızıdan mavi daireye vektördür. Bu sırada hızınızı nasıl ayarladığınıza bağlı olarak yeşil dairelerin herhangi birine gidebilirsiniz.
Eğer varsa kara bir duvarda, hemen kaybederler.
Senin görevin
Tahmin ettiniz: girdi olarak bir yarış pisti verildiğinde, aracı hedef hücrelerden birine mümkün olduğu kadar az zamanda yönlendiren bir program yazın . Çözümünüz, keyfi izlerle makul derecede iyi başa çıkabilmeli ve verilen test durumlarına göre özellikle optimize edilmemelidir.
Giriş
Programınız çağrıldığında, stdin'den okuyun :
target
n m
[ASCII representation of an n x m racetrack]
time
target
Parçayı tamamlamak için harcayabileceğiniz maksimum dönüş sayısıdır ve parça time
için toplam süre bütçenizdir (saniye cinsinden değil). Zamanlamayla ilgili ayrıntılar için aşağıya bakınız.
Yeni satır ayrılmış parça için aşağıdaki karakterler kullanılır:
#
- duvarS
- başlangıç*
- bir hedef.
- diğer tüm iz hücreleri (yol)
n x m
Sağlanan ızgara dışındaki tüm hücrelerin duvar olduğu belirtilir.
Koordinat orijini sol üst köşede.
İşte basit bir örnek:
8
4.0
9 6
###...***
###...***
###...***
......###
S.....###
......###
0 tabanlı dizinlemeyi kullanarak başlangıç koordinatı olur (0,4)
.
Her hamleden sonra daha fazla girdi alacaksınız:
x y
u v
time
Nerede x
, y
, u
, v
tüm 0 tabanlı tam sayılardır. (x,y)
şu anki konumunuz ve (u,v)
mevcut hızınız. Bunun x+u
ve / veya y+v
sınırların dışında olabileceğine dikkat edin.
time
saniye cinsinden zaman bütçenizden geriye kalan her şeydir. Bunu görmezden gelmekten çekinmeyin. Bu, yalnızca uygulamalarını zaman sınırına çıkarmak isteyen katılımcılar içindir.
Oyun bittiğinde (bir duvara indiğiniz, sınırların dışına çıkmış, target
dönüşleri aştığınız , zamanınız dolmuş veya hedefe ulaştığınız için), boş bir çizgi alacaksınız.
Çıktı
Her tur için stdout'a yaz :
Δu Δv
burada Δu
ve Δv
her biri -1
, 0
, 1
. Bu, (u,v)
yeni pozisyonunuzu belirlemek için eklenecektir . Sadece netleştirmek için, talimatlar aşağıdaki gibidir.
(-1,-1) ( 0,-1) ( 1,-1)
(-1, 0) ( 0, 0) ( 1, 0)
(-1, 1) ( 0, 1) ( 1, 1)
Yukarıdaki örnek için en uygun çözüm
1 0
1 -1
1 0
Denetleyicinin kendisini stderr'e eklemediğini unutmayın , bu nedenle botunuzu geliştirirken ihtiyaç duyabileceğiniz her türlü hata ayıklama çıktısı için kullanabilirsiniz. Lütfen gönderilen kodunuzda bu tür çıktıları kaldırın / yorum yapın.
Botunuzun her bir turda cevap vermesi yarım saniye sürebilir. Daha uzun süren dönüşlerde, target/2
saniye başına bir bütçe (parça başına) olacak . Bir dönüş yarım saniyeden daha uzun sürdüğünde, ek süre zaman bütçenizden düşülecektir. Zaman bütçeniz sıfıra ulaştığında, mevcut yarış iptal edilir.
Yeni: Pratik nedenlerden dolayı, bir hafıza limiti belirlemeliyim (çünkü hafıza makul parça boyutları için zamandan daha sınırlı görünüyor). Bu nedenle, yarışmacının Proses Gezgini tarafından Özel Bayt olarak ölçülen 1GB'tan fazla bellek kullandığı herhangi bir test çalışmasını iptal etmek zorunda kalacağım .
puanlama
20 parçanın bir kriter var . Her parça için:
- Parçayı tamamlarsanız puanınız, bölünmüş
target
bir hedef hücreye ulaşmak için gereken hareket sayısıdır . - Eğer zaman / bellek tükenirse veya hedefe ulaşmak değil önce
target
dönüşler geçtikten veya herhangi bir zamanda aut / a duvarında indirseydim puanınız olduğunu2
. - Eğer programınız deterministik değilse, puanınız o yolda 10'un üzerinde koşunun ortalamasıdır (lütfen cevabınızı belirtiniz).
Genel puanınız, bireysel takip puanlarının toplamıdır. En düşük puan kazanır!
Ayrıca, her katılımcı resmi listeye eklenecek ek bir kıyaslama izi sağlayabilir (ve şiddetle tavsiye edilir) . Bu yeni parça dahil olmak üzere önceki cevaplar yeniden değerlendirilecektir. Bu, hiçbir çözümün mevcut test durumlarına çok yakın bir şekilde uyarlanmadığından emin olmak ve kaçırmış olabileceğim ilginç olayları hesaba katmaktır (ancak hangisini tespit edebilirsiniz).
Kravat kırma
Şimdi zaten optimal bir çözüm olduğuna göre, bu muhtemelen katılımcıların puanları için ana faktör olacaktır.
Eğer bir bağ varsa (tüm parçaları en iyi şekilde veya başka bir şekilde çözen birkaç cevap nedeniyle), bağı kırmak için ek (daha büyük) test durumları ekleyeceğim. Bu bağlayıcıları yaratırken herhangi bir insani yanlılığı önlemek için, bunlar sabit bir şekilde üretilecektir :
- Bu şekilde üretilen son parçaya
n
göre kenar uzunluğunu arttıracağım10
. (Bağları koparmazlarsa boyutları atlayabilirim.) - Temel bu vektör grafiktir
- Bu, Mathematica pasajı kullanılarak istenen çözünürlükte rasterleştirilecektir .
- Başlangıç sol üst köşede. Özellikle, parçanın sonundaki en üstteki sıranın en solundaki hücre olacaktır.
- Amaç sağ alt köşede. Özellikle, parçanın sonundaki en alt sıranın en sağındaki hücre olacaktır.
target
İrade4*n
.
İlk kriterin son parçası zaten böyle üretildi n = 50
.
Kontrol eden, denetleyici
Gönderileri test eden program Ruby'de yazılmıştır ve kullanacağım kıyaslama dosyasıyla birlikte GitHub'da bulunabilir . Orada randomracer.rb
rastgele hareketler seçen basit bir bot var. İletişimin nasıl çalıştığını görmek için botun temel yapısını başlangıç noktası olarak kullanabilirsiniz.
Kendi botunuzu, seçtiğiniz bir parça dosyasına karşı aşağıdaki gibi çalıştırabilirsiniz:
ruby controller.rb track_file_name command to run your racer
Örneğin
ruby controller.rb benchmark.txt ruby randomracer.rb
Depo ayrıca iki sınıf içerir Point2D
ve Track
. Gönderiniz Ruby'de yazılmışsa, rahatınız için bunları kullanmaktan çekinmeyin.
Komut satırı anahtarları
Sen komut satırı anahtarları ekleyebilir -v
, -s
, -t
Benchmark'ın dosya adından önce. Birden fazla anahtar kullanmak istiyorsanız, örneğin, bunu da yapabilirsiniz -vs
. Onların yaptığı budur:
-v
(ayrıntılı): Kontrol cihazından biraz daha fazla hata ayıklama çıktısı üretmek için bunu kullanın.
-s
(sessiz): Konumunuzu ve hızınızı kendiniz takip etmeyi tercih ederseniz ve zaman bütçesini umursamıyorsanız, bu bayrakla her dönüş (gönderiminize gönderilen) bu üç satırlık satırı kapatabilirsiniz.
-t
(tracks): Test edilecek bireysel parçaları seçmenize izin verir. Örneğin -t "1,2,5..8,15"
, sadece 1, 2, 5, 6, 7, 8 ve 15 numaralı parçaları test eder. Bu özellik ve seçenekler ayrıştırıcı için Ventero'ya çok teşekkürler .
Gönderiminiz
Özet olarak, lütfen cevabınıza aşağıdakileri ekleyin:
- Puanın.
- Eğer siz rastgelelik kullandığınız Birden ishal üzerinden puanınızı ortalamasını böylece, bu belirtiniz.
- Gönderiminizin kodu.
- Seçtiğiniz dil için bir Windows 8 makinesinde çalışan ücretsiz bir derleyicinin veya tercümanın konumu.
- Gerekirse derleme talimatları.
- Gönderinizi çalıştırmak için kullanılan bir Windows komut satırı dizesi.
- Gönderiniz için
-s
bayrak gerekip gerekmediği. - (isteğe bağlı) Kriterlere eklenecek yeni ve çözülebilir bir iz.
target
Manuel olarak parçanız için makul bir karar vereceğim . Parça ölçüt eklendiğinde, cevabınızı düzeltirim. Sizden farklı bir pist sorma hakkını saklı tutuyorum (orantısız şekilde büyük bir pist eklerseniz, pistte müstehcen ASCII resimleri vb. Dahil). Test senaryosunu benchmark setine eklediğimde, bu yazıdaki karmaşayı azaltmak için cevabınızdaki parkuru benchmark dosyasındaki linkle değiştireceğim.
Gördüğünüz gibi, tüm gönderimleri bir Windows 8 makinesinde test edeceğim. Gönderinizi Windows'ta çalıştırmanın kesinlikle bir yolu yoksa, Ubuntu VM'de de deneyebilirim. Ancak bu, oldukça yavaş olacaktır; bu nedenle, zaman sınırını aşmak istiyorsanız, programınızın Windows'ta çalıştığından emin olun.
En iyi sürücü vektörleşsin!
Ama ben oynamak istiyorum!
Kendini daha iyi hissetmek için oyunu kendin denemek istersen, bu uygulama var . Orada kullanılan kurallar biraz daha sofistike, ancak yararlı olacak kadar benzer.
Liderler Sıralaması
Son güncelleme: 01.09.2014, 21:29 UTC
Kriterlerdeki parça sayısı: 25
Tie-breaker boyutları: 290, 440
- 6.86688 - Kuroi Neko
- 8.73108 - kullanıcı2357112 - 2. gönderim
- 9.86627 - nneonneo
- 10.66109 - kullanıcı2357112 - 1. gönderim
- 12.49643 - Ray
- 40.0759 - takma ad117 (olasılıksal)
Ayrıntılı test sonuçları . (Olası başvurular için puanlar ayrı ayrı belirlenmiştir.)