Tujuan dari tantangan ini adalah untuk menulis program atau fungsi yang mengembalikan jumlah serangan paling sedikit yang diperlukan untuk menyelesaikan kursus yang diberikan.
Memasukkan
- Tata letak kursus dapat diteruskan dengan cara dan format yang sesuai yang Anda inginkan. (baca dari konsol, diteruskan sebagai parameter input, baca dari file atau lainnya, multiline-string, array string, karakter dua dimensi / array byte).
- Posisi awal bola dan lubang bisa dilewati sebagai input juga, itu tidak harus diurai dari input. Dalam kasus uji mereka dimasukkan dalam kursus untuk memastikan tidak ada kebingungan tentang posisi sebenarnya.
- Anda dapat memetakan kembali karakter input ke sesuatu yang lain, selama mereka masih dapat dikenali sebagai karakter yang berbeda (mis. Karakter ASCII yang dapat dicetak).
Keluaran
- Program harus mengembalikan skor serendah mungkin (jumlah paling sedikit serangan yang diperlukan untuk mencapai lubang) untuk setiap kursus lulus sebagai input dalam format yang masuk akal (string, integer, float atau haiku yang menggambarkan hasil)
- Jika kursus tidak mungkin dikalahkan, kembalikan
-1
(atau nilai kepalsuan lain pilihan Anda yang tidak akan dikembalikan untuk kursus yang dapat dikalahkan ).
Contoh:
Dalam contoh ini posisi diberi notasi berbasis 0, X / Y, kiri-ke-kanan, atas-bawah - tetapi Anda dapat menggunakan format apa pun yang Anda suka karena hasilnya benar-benar bebas format.
Memasukkan:
###########
# ....#
# ...#
# ~ . #
# ~~~ . #
# ~~~~ #
# ~~~~ #
# ~~~~ o #
# ~~~~ #
#@~~~~ #
###########
Ball (Start-Position): 1/9
Hole (End-Position): 8/7
Keluaran:
8
Aturan dan bidang
Kursus ini dapat terdiri dari bidang-bidang berikut:
'@'
Ball - Awal kursus'o'
Hole - Tujuan dari kursus'#'
Wall - Ball akan berhenti ketika membentur dinding'~'
Air - Harus dihindari'.'
Pasir - Bola akan segera berhenti di pasir' '
Ice - Ball akan terus meluncur sampai menyentuh sesuatu
Aturan dasar dan batasan permainan:
- Bola tidak bisa bergerak secara diagonal, hanya kiri, kanan, atas dan bawah.
- Bola tidak akan berhenti di depan air, hanya di depan dinding, di atas pasir dan di dalam lubang.
- Tembakan ke dalam air tidak valid / tidak mungkin
- Bola akan tetap berada di dalam lubang, tidak melewatinya seperti di es
- Kursus selalu persegi panjang.
- Kursus ini selalu dibatasi oleh air atau dinding (tidak diperlukan pemeriksaan batas).
- Selalu ada tepat satu bola dan satu lubang.
- Tidak semua kursus mungkin untuk dikalahkan.
- Mungkin ada beberapa jalur yang menghasilkan skor (terendah) yang sama.
Celah dan Kondisi Kemenangan
- Celah standar dilarang
- Program harus diakhiri
- Anda tidak dapat membuat aturan tambahan (memukul bola begitu keras hingga melompati air, melambung dari dinding, melompati ladang pasir, kurva di sudut, dll.)
- Ini adalah kode-golf , jadi solusi dengan jumlah karakter paling sedikit menang.
- Solusi harus dapat menangani semua kasus uji yang disediakan, jika ini tidak mungkin karena pembatasan bahasa yang digunakan, harap sebutkan dalam jawaban Anda.
Uji kasus
Kursus # 1 (2 serangan)
####
# @#
#o~#
####
Kursus # 2 (tidak mungkin)
#####
#@ #
# o #
# #
#####
Kursus # 3 (3 pukulan)
~~~
~@~
~.~
~ ~
~ ~
~ ~
~ ~
~.~
~o~
~~~
Kursus # 4 (2 serangan)
#########
#~~~~~~~#
#~~~@~~~#
## . ##
#~ ~ ~ ~#
#~. o .~#
#~~~ ~~~#
#~~~~~~~#
#########
Kursus # 5 (tidak mungkin)
~~~~~~~
~... ~
~.@.~.~
~... ~
~ ~ ~.~
~ . .o~
~~~~~~~
Jawaban:
JavaScript (ES6), 174 byte
Mengambil input dalam sintaks
curlingcurrying([x, y])(a)
, di mana x dan y adalah koordinat 0-diindeks dari posisi awal dan [] adalah matriks bilangan bulat, dengan0
= es,1
= dinding,2
= pasir,3
= lubang dan4
= airKembali
0
jika tidak ada solusi.Cobalah online!
Berkomentar
sumber
Python 3 , 273 byte
Cobalah online!
-41 byte terima kasih kepada ovs
-1 byte terima kasih kepada Jonathan Frech
sumber
if k+1
mungkinif-~k
?C #,
461418 byteIni hanya implementasi referensi non-kompetitif untuk (semoga) menghidupkan kembali tantangan ini:
Ditarik oleh Kevin Cruijssen
Tidak disatukan
Cobalah online
sumber
int P(string[]C){int w=C[0].Length,i=0,l=c.Length;var c=string.Join("",C);var h=new int[l];for(var n=new List<int>();i<l;n.Add(i++))h[i]=c[i]!='@'?int.MaxValue:0;for(i=1;;i++){var t=n;n=new List<int>();foreach(int x in t){foreach(int d in new[]{-1,1,-w,w}){for(int j=x+d;c[j]==' ';j+=d);if(c[j]=='#'&h[j-d]>s){h[j-d]=s;n.Add(j-d);}if(c[j]=='.'&h[j]>s){h[j]=s;n.Add(j);}if(c[j]=='o')return s;}}if(n.Count<1)return -1;}}
(418 bytes). Juga, bisakah Anda menambahkan tautan TIO dengan kode uji?