Circle Maze Checker


12

Nesnenin labirentte hareket etmesi gereken küçük rulmanlı ahşap oyuncakları biliyor musunuz? Bu böyle. Bir labirent ve bir dizi hamle verildiğinde, topun nerede biteceğini belirleyin.

Tahta dikey olarak tutulur ve top sadece tahta döndürüldüğünde yerçekimi ile hareket eder. Her "hareket" bir dönüştür (radyan cinsinden).

Labirent basitçe eşmerkezli dairesel duvarlardır, her duvarın dış koridorda tam olarak bir açıklığı vardır, buna benzer (bu duvarların daireler olduğunu ve sivri olmadığını varsayalım):

labirent

Gördüğünüz gibi top ortadan başlıyor ve dışarı çıkmaya çalışıyor. Top , bir rotasyonun ortasında olsa bile, doğru yönlendirme elde edilir edilmez anında düşecektir. Tek bir dönüş, topun birden fazla açıklıktan düşmesine neden olabilir. Örneğin, >= n * 2 * piherhangi bir labirentten kaçmak için bir dönüş yeterlidir.

Oyunun amaçları için 0.001, açıklığın radyanları içinde bulunan bir top "uygun" olarak kabul edilir ve bir sonraki koridora düşer.

Giriş:

Giriş iki bölümden oluşur:

  • Labirent, labirentte nkaç duvar / açıklık olduğunu gösteren bir tamsayı tarafından verilir . Bunu, nbir sonraki koridora geçişin nerede olduğunu gösteren, her birinde birer sayı bulunan çizgiler izler .

  • Hareketler, mkaç hareketin gerçekleştirildiğini temsil eden bir tamsayı olarak verilir , ardından (tekrar ayrı satırlarda) tahtanın radyan cinsinden msaat yönünde dönüşleri (negatif saat yönünün tersidir) verilir.

Tüm geçiş konumları 0 rad = uppozitif radyanların saat yönünde olacağı şekilde verilmiştir .

Yukarıdaki örnek görüntü için, giriş aşağıdaki gibi görünebilir:

7                        // 7 openings
0
0.785398163
3.14159265
1.74532925
4.71238898
4.01425728
0
3                        // 3 moves
-3.92699082
3.14159265
0.81245687

Çıktı: Topun bittiği koridor numarasını çıktılayın. Koridorlar merkezden başlayarak sıfır indekslenir, böylece başlarsınız 0. Bir açıklıktan geçerseniz, koridordasınız demektir 1. Tüm labirentten kaçarsanız, herhangi bir tam sayı çıktısı alın>= n

Numune girişi için üç hamle vardır. Birincisi, topun iki açıklıktan düşmesine neden olacaktır . İkinci bir açıklık ve üçüncü bulur bulmaz birini . Top şimdi koridorda 3, bu yüzden beklenen çıktı:

3

Geçersiz giriş için davranış tanımsız. Geçerli girişi ile, çok iyi oluşturulmuştur n >= 1ve m >= 0.

Puanlama standart kod golf, en az bayt kazanır. Standart boşluklar yasaktır. Giriş sabit kodlanmış olmamalıdır, ancak standart giriş, bağımsız değişkenler, konsol vb.


"Geçersiz giriş için davranış tanımsız." << - Bu tüm bulmacalar koymak gerekir!
TheDoctor

Bu varsayımsal durumda, gerektiğinde accuracy değişken doğrulukla hesaplayabilir ve bir topun düşüp düşmediğini söylemek yeterli olana kadar doğruluğu yükseltebilirsiniz. Bir uyum toleransı ile ilgili bir sorunum (veya en azından mevcut ifadesi), A) birbiri ardına oturanlar 0.001'den daha yakınsa, böylece top sadece tolerans B dikkate alındığında iki seviye düşer) Top bir deliğin 0.001 içinde, deliğe atlar (gerçekten bir şey okumak istiyorsanız).
Wrzlprmft

@Wrzlprmft Top deliğe atlamıyor. Eşiği deliklerin toptan biraz daha geniş olduğu anlamına gelir. Hala aynı yere düşer, sadece bir seviye daha. Eşiğin olduğunu hayal ederseniz 1, sadece büyük deliklerle çalışacaksınız, düştüklerinde topları deliğin merkezine atlamayacaksınız.
Geobits

Girdi neden bu kadar rahatsız edici bir formatta? Tüm programları okumak için gerekenden daha kısa golf eminim: /
Tal

Yanıtlar:


2

Perl, 211 191

Okunabilirlik için yeni satırlar ve girinti ile:

$p=atan2 0,-1;
@n=map~~<>,1..<>;
<>;
while(<>){
    $_=atan2(sin,cos)for@n;
    $y=abs($n[$-]+$_)<$p-.001
        ?$_
        :($_<=>0)*$p-$n[$-];
    $_+=$y for@n;
    $p-.001<abs$n[$-]&&++$-==@n&&last;
    $_-=$y;
    .001<abs&&redo
}
print$-

Girişteki hamle sayısı atılır, stdin'in eof hamlelerin sonunu gösterir.


5

JavaScript 200

function f(i){with(Math)for(m=i.split('\n'),o=m.slice(1,t=+m[0]+1),m=m.slice(t+1),c=PI,p=2*c,r=0,s=1e-3;m.length;c%=p)abs(c-o[r])<s?r++:abs(t=m[0])<s?m.shift(c+=t):(b=t<0?-s:s,c+=p-b,m[0]-=b);return r}

EDIT : İşte bu çözücünün işe yaradığını kanıtlayan animasyonlu bir örnek: http://jsfiddle.net/F74AP/4/

animasyonlu

İşlev, giriş dizesini geçirerek çağrılmalıdır.
İşte OP tarafından verilen örneğin çağrısı:

f("7\n0\n0.785398163\n3.14159265\n1.74532925\n4.71238898\n4.01425728\n0\n3\n-3.92699082\n3.14159265\n0.81245687");

İstendiği 3gibi geri döner .


2
Bu meydan okumadan, "... girdi kodlanmamalıdır ..." . Yanılmıyorsam, bu onu okumanız ve tam bir programa sahip olmanız gerektiği anlamına gelir. Bu sadece bir fonksiyona benziyor.
Rainbolt

2
Anlamıyorum, değerler sabit kodlanmış değil! “... Girdi sabit olarak kodlanmamalı, ancak standart girdi, bağımsız değişkenler, konsol vb . İlgili komple bir program belirtildiği nerede, ben görmüyorum ve yine, IMO bu tam bir JS çözümdür.
Michael

Tam bir program belirtmedim, bu yüzden sadece bir işlevle ilgili bir sorun görmüyorum. Ancak girdinin , yerel diziler halinde düzenlenmemiş yeni satırlarla ayrıldığı belirtilir. Bunu tatmin etmek basit olmalı.
Geobits

1
@Geobits, daha sonra değiştireceğim, şu kemana
Michael M.

1
@ Geobits, doğru! Basit işaret hatası ... Sabit ;-)
Michael
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.