Tantangan ini terinspirasi oleh permainan papan yang saya mainkan beberapa waktu lalu.
Kisah tantangan ini tidak harus dibaca, yaitu tujuan dari tantangan- bagian harus menjelaskan semua yang diperlukan.
Cerita
Orang-orang terkunci di dalam ruangan besar dengan monster yang melahap manusia. Dinding ruangan terpesona, memindahkan benda-benda ke seberang ruangan saat disentuh. Kata monster itu berjalan melintasi ruangan, berburu daging. Manusia pertama yang terlihat akan dikonsumsi oleh giginya yang tajam.
Tujuan Tantangan
Anda diberi peta ruangan, termasuk lokasi orang dan monster.
%%%KLMNOPQRSTA%
%%J B
%I % C
H D
G %% E
F F
E % G
D H
C % I%
B J%%
%ATSRQPONMLK%%%
Mari kita jabarkan komponen peta.
- Surat dari
A
keT
: Jika monster melangkah ke salah satu dari ini, itu akan dipindahkan ke penampilan kedua surat ini dan tidak mengubah arahnya. Hanya akan ada nol atau dua huruf apa pun di papan tulis. %
: Ubin dinding. Hanya untuk memformat & terlihat bagus.#
: Lokasi awal monster itu.*
: Lokasi orang.
Beberapa hal tambahan yang perlu diperhatikan tentang peta:
- Dimensi peta dan lokasi objek tidak akan konstan, jadi kode Anda harus beradaptasi secara dinamis dengannya.
Monster itu akan selalu pergi ke arah yang saat ini dihadapinya (menghadap ke barat di awal) kecuali jika ia melihat manusia, dalam hal ini ia akan berbalik ke arah manusia terdekat .
Monster itu melihat manusia jika tidak ada ubin dinding atau teleporter dalam garis horizontal atau vertikal lurus antara manusia dan manusia.
Hal lain yang perlu diperhatikan adalah bahwa jika monster itu berada di depan dinding yang kokoh ( %
) atau harus memutuskan antara dua manusia, itu akan selalu memprioritaskan tepat di sebelah kiri.
Jika monster itu tidak dapat berbelok ke kanan dan membuat langkah ke depan untuk beberapa alasan, itu akan berbelok ke kiri sebagai gantinya.
Jadi, pada akhirnya, urutan monster yang memprioritaskan arah adalah kita maju, kanan, kiri, mundur.
Memasukkan
- Peta, termasuk lokasi awal monster dan posisi orang-orang sebagai karakter masing-masing. Seharusnya tidak ada input selain string peta, atau larik string, atau karakter.
Input dapat diterima dalam format apa pun yang wajar; string tunggal atau array string untuk peta.
Keluaran
Koordinat orang yang pertama kali dimakan monster itu.
Koordinat mulai dari sudut kiri atas dan diindeks 0, sehingga ubin pertama akan memiliki koordinat (0 | 0). Jika Anda menggunakan pengindeksan 1, harap sebutkan dalam jawaban Anda.
Aturan
- Ini adalah kode-golf , kode terpendek dalam byte yang menang dalam bahasa apa pun.
- Celah standar dilarang.
- Anda mungkin berasumsi bahwa monster itu akan selalu dapat mencapai manusia.
Uji Kasus
Memasukkan:
%%%KLMNOPQRSTA%
%%J B
%I %* C
H * D
G %% E
F # F
E % G
D * H
C % I%
B J%%
%ATSRQPONMLK%%%
Keluaran:, (10,2)
karena monster itu tidak dapat melihat dua orang lain ketika berlari melewati mereka, ia akan dipindahkan ke F
dinding lain , di mana ia kemudian akan melihat orang terakhir.
Memasukkan:
%%%KLMNOPQRSTA%
%%J B
%I * C
H %%% * D
G #% E
F %%% % F
E G
D % H
C * I%
B * J%%
%ATSRQPONMLK%%%
Keluaran: (12,3)
Memasukkan:
%%%KLMNOPQRSTA%
%%J B
%I %%% C
H *%#% D
G E
F F
E % G
D H
C I%
B J%%
%ATSRQPONMLK%%%
Keluaran: (6, 3)
Memasukkan:
%%%%%%%%%%%%%%%
%#% %%% %
%A%ABCD %*% %
%*F G %%% %
% %BC% FD %
% % % %%%%
% % % %%
% % %% G %
% %
%*% % % %
%%%%%%%%%%%%%%%
Keluaran: (1,9)
Semoga berhasil!
Jawaban:
Python 2 ,
565 .. 422 445 1 .. 444 463 2 .. 468467463 byteCobalah online!
Menyimpan banyak byte berkat Halvard , Ian dan Jonathan
1: Dapatkan lebih lama, untuk memperbaiki kasus berbalik dua kali, dan untuk menemukan lokasi monster.
2: Lebih lama lagi .. Monster seharusnya tidak mengubah arah saat berteleportasi.
sumber
l.replace('#',' ')
->l.replace(*"# ")
.Perl 6 ,
343334333328322308 byteCobalah online!
(Tidak ada baris baru dalam kode aktual. Saya menyisipkannya hanya untuk membungkus garis agar lebih mudah dibaca.)
Ini tidak dapat menangani peta di mana dimungkinkan untuk melihat di luar batas peta. (I. e. Memetakan dengan ruang kosong di perbatasan.) Jika ini penting, +5 byte. Tapi, karena teleporter memblokir LoS sekarang, seharusnya tidak.
Penjelasan : Ini adalah fungsi yang mengambil peta sebagai daftar daftar karakter. Mari kita bagi menjadi beberapa pernyataan:
my \m=%((^@^a X ^@a[0]).map:{.[0]i+.[1]=>@a[.[0]][.[1]]});
: Mari kita membuat hash ("kamus" untuk Pythonists) yang disebutm
(ini adalah variabel sigilless, jadi kita perlu secara eksplisit tentang menetapkan hash ke dalamnya dengan%(...)
) yang mengaitkan kunci kompleks bentukx+iy
dengan karakter yang ada di kolom thy
danx
th th dari peta.my \a=m<>:k.classify({m{$_}});
: Ini membuat "kamus terbalik" darim
, disebuta
: ada satu kunci yang terkait dengan setiap nilai dalamm
, dan nilainya adalah daftar koordinat kompleks (kunci dalamm
) yang berisi karakter itu. Jadi, misalnyaa{"#"}
akan memberikan daftar semua koordinat di mana ada#
di peta. (Ini juga merupakan variabel sigilless, tapi kami beruntung karenaclassify
mengembalikan hash.)my$m=a<#>[0];my$d=-1
: Setel posisi monster awal. Kami mencari#
di dalam hash terbalika
. Kita harus menggunakan[0]
karenaa<#>
masih daftar, bahkan ketika itu hanya mengandung 1 elemen. The$d
berisi arah rakasa; kami mengaturnya ke Barat. (Arahnya adalah bilangan kompleks juga, begitu-1
juga barat.)Oke, pernyataan selanjutnya cukup jahat. Pertama, mari kita lihat ini:
{$^q;first ?*,map {(((my$u=m{my$t=$m+$_*$q})~~"%")*(1+!($_-1))+($u~~"A".."Z"))*m+($u~~"*")*abs($t-$m)},^m}
Ini adalah rutin yang mengevaluasi LoS dalam arah yang diberikan. Jika ada manusia di arah ini, ia mengembalikan jarak ke manusia. Jika ada dinding atau teleport di arah ini, ia mengembalikan jumlah kuadrat dari peta. (Intinya adalah untuk memberikan angka yang begitu tinggi sehingga lebih besar daripada jarak yang sah untuk manusia.) Akhirnya, jika dinding berada di arah ini dan dalam jarak 1, kita mengembalikan 2 × jumlah kuadrat total dari peta. (Kami ingin tidak pernah berlari menembus dinding, jadi ini membutuhkan skor yang lebih besar. Kami akan segera memilih minimum.)Kami menggunakan ini dalam konstruk
$d=($d,i*$d,-i*$d,-$d).min( LoS deciding block );
. Karena kita menggunakan bilangan kompleks untuk semuanya, kita dapat dengan mudah mendapatkan arah yang relatif maju, kanan, kiri dan mundur dari arah semula hanya dengan mengalikannya dengan 1, i, -i (ingat bahway
sumbu bergerak ke arah lain yang Anda bisa digunakan untuk dari matematika) dan -1, masing-masing. Jadi kita membentuk daftar arah dalam urutan ini, dan menemukan arah yang memiliki "jarak ke manusia" minimal (sesuai dengan blok di atas), yang memastikan bahwa setiap manusia mengalahkan setiap dinding dan apa pun mengalahkan dinding yang benar di bawah hidung monster itu. Kami menggunakan fakta bahwamin
fungsi memberi yang pertamanilai minimal. Jika ada ikatan jarak antara beberapa arah, monster itu akan memilih maju ke kanan ke kiri ke belakang, yang persis seperti yang kita inginkan. Jadi kita mendapatkan arahan baru yang kemudian ditugaskan$d
.$m+=$d;
hanya membuat monster itu melangkah ke arah yang baru.$m=$d+(a{m{$m}}∖~$m).pick while m{$m}~~"A".."Z"
mengurus bank-bank. Katakanlah monster itu ada di sebuah teleportA
. Pertama kita mencariA
di hash terbalik%a
dan yang muncul dua posisi teleportasiA
, kemudian kita membuang posisi saat ini menggunakan operator perbedaan set (yang terlihat seperti garis miring terbalik). Karena ada tepat 2 kejadian dari masing-masing teleport di peta dan monster itu pasti berdiri di atas satu, perbedaannya akan menjadi satu set dengan 1 elemen. Kami kemudian gunakan.pick
untuk memilih elemen acak (percaya atau tidak, tapi ini adalah cara terpendek untuk mendapatkan elemen set elemen 1 :—)). Hal semacam ini terjadi sampai monster itu berakhir di suatu tempat bukan di portal.Segala sesuatu dalam 4 paragraf terakhir menggambarkan satu konstruksi bentuk besar-besaran
{change direction; step; handle teleports}...{m{$m}~~"*"}
. Ini adalah urutan yang memanggil blok di sebelah kiri...
sampai kondisi di sebelah kanan...
adalah benar. Dan itu benar ketika monster itu berada di lapangan dengan manusia. Daftar itu sendiri berisi nilai-nilai pengembalian blok besar di sebelah kiri, yang merupakan sampah (kemungkinan besar(Any)
) karena mengembalikan nilai loop sementara di akhir. Pada dasarnya, kami menggunakannya sebagai loop sementara yang lebih murah. Nilai daftar dibuang (dan kompiler mengeluh tentang "penggunaan yang tidak berguna...
dalam kontes wastafel", tetapi siapa yang peduli). Ketika semua ini dilakukan, kita kembali$m
- posisi monster setelah menemukan manusia, masih sebagai bilangan kompleks (jadi, untuk tes pertama, kita memberi10+2i
dan seterusnya).sumber
JavaScript (ES6),
258245Kurang golf
Uji
sumber