Ada permainan yang saya suka mainkan. Itu terjadi pada kotak ukuran terbatas (tapi itu dibungkus, seperti bola). Pada kisi itu, titik acak (hanya bilangan bulat) dipilih. Kemudian, saya, pengguna, diminta untuk memasukkan koordinat. Jika input saya persis sama dengan titik acak, saya diberitahu bahwa saya telah menang. Kalau tidak, saya diberitahu jarak titik-bijaksana antara input saya dan titik acak. Misalnya, jika saya menebak (2,2)
dan titik acak berada (4,3)
, maka jaraknya akan menjadi sqrt[(3-2)^2 + (4-2)^2] = sqrt[5]
.
Permainan berlanjut sampai pemain tiba di lokasi yang benar dari titik tersebut.
Tujuan Membuat versi fungsional permainan yang dijelaskan di atas. Anda harus membuat program lengkap untuk melakukannya. Inilah yang harus dilakukan oleh program Anda:
- Minta dua input: tinggi dan lebar papan. Asalnya ada di kiri atas papan. Input ini tidak akan melebihi
1024
. - Pilih titik acak di papan itu; ini akan menjadi titik untuk ditebak.
- Terima input yang mensimulasikan belokan. Input akan berupa sepasang integer yang dipisahkan ruang atau dua input integer yang terpisah. Menanggapi masukan ini, program akan melakukan satu dari dua hal:
- Jika input cocok dengan titik acak yang dipilih, output pesan menandakan kemenangan pengguna. Saya akan menyarankan "Kamu menang!".
- Jika tidak, keluarkan jarak antara titik input pengguna dan titik acak.
- Setelah pengguna mencapai kemenangan, tampilkan jumlah putaran yang dilakukan pengguna. Program kemudian keluar.
Bonus
Bonus diterapkan sesuai urutan kemunculannya dalam daftar ini
- -150 byte jika program Anda mengambil integer input
D
yang menjelaskan dimensi di mana game berlangsung. Misalnya, jikaD = 3
, maka Anda membuat titik3
bilangan bulat acak , mengambil3
input bilangan bulat, dan menampilkan jarak antara titik-titik itu. - -50% (atau + 50% jika
score < 0
) jika Anda memberikan representasi grafis dari papan (ASCII atau Gambar) yang menunjukkan di mana pengguna sebelumnya telah menebak pada kotak dimensi yang diberikan dan penghitung putaran. (Jika Anda memilih bonus pertama, maka bonus ini hanya berlaku untuk2D
dan1D
mode. Jika Anda menambahkan output grafis 3D, Anda mendapatkan tambahan -50%.) - -60 byte jika Anda dapat memberikan gamemode (dipilih oleh input di awal; yaitu, ketika diberikan
0
, melakukan gamemode biasa; ketika diberikan1
, lakukan gamemode ini) di mana titik bergerak 1 unit dalam arah ortogonal acak per putaran
Lebih lanjut tentang pembungkus
Pembungkus hanya terjadi ketika, dalam bonus ketiga, titik bergerak bergerak melintasi batas mana pun; dalam hal ini, titik bergerak dibengkokkan ke titik masing-masing, seperti:
... ...
..R (move right) R..
... ...
Perilaku membungkus ini tidak mempengaruhi tebakan pengguna, selain dari fakta bahwa titik telah berubah arah.
Papan peringkat
Cuplikan Stack di bagian bawah posting ini menghasilkan katalog dari jawaban a) sebagai daftar solusi terpendek per bahasa dan b) sebagai leaderboard keseluruhan.
Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:
# Language Name, N bytes
di mana N
ukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda dapat menyimpan skor lama di headline, dengan mencoretnya. Contohnya:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Jika Anda ingin memasukkan beberapa angka dalam tajuk Anda (mis. Karena skor Anda adalah jumlah dari dua file atau Anda ingin membuat daftar hukuman penterjemah secara terpisah), pastikan bahwa skor sebenarnya adalah angka terakhir di tajuk:
# Perl, 43 + 2 (-p flag) = 45 bytes
Anda juga dapat membuat nama bahasa menjadi tautan yang kemudian akan muncul di cuplikan:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
10x10
, titik acaknya adalah(9,4)
, dan saya kira(2,2)
, apakah jaraknyasqrt(13)
atausqrt(53)
? (Catatan untuk masa depan: jika Anda melakukan sesuatu yang aneh, jangan masukkan keacakan karena itu hampir tidak mungkin untuk memasok kasus uji). 2. Dalam bonus ketiga, haruskah jarak dihitung dan dikeluarkan sebelum atau setelah titik bergerak?Jawaban:
CJam,
-113-139-152-157-159 byteProgram ini panjangnya 51 byte dan memenuhi syarat untuk bonus -150 byte dan -60 byte .
Mode permainan dan jumlah dimensi dibaca sebagai argumen baris perintah, ukuran di setiap dimensi dari STDIN. Karena pesan kemenangan arbitrer , program akan mencetak
0.0
(jarak ke tujuan) untuk menunjukkan bahwa permainan telah berakhir.Tes berjalan
Bagaimana itu bekerja
sumber
Pyth, 91 (-150 -60) = -119
Solusi lama: (54-150 = -96)
Semua input dilakukan pada baris baru.
1
atau0
)Pertamabilangan bulat KeduaD
mewakili dimensi bermain.D
input mewakili ukuran lapanganD
input dari titik ini adalah dugaanPutar sampel (petunjuk tidak muncul dalam program yang sebenarnya):
sumber
J=YmOvwvw
sebagai gantinyaVvwaYOvw;JY
, yang lebih pendek 2 byte. Saya belum melihat-lihat kode yang lain, tetapi saya kira Anda juga dapat mempersingkat beberapa hal di sana.Python 2, 210 - 150 = 60
Tantangan pertama hanya sejauh ini. Cobalah online
sumber
Pip,
4342 byte - 150 = -108Mengambil dimensi papan sebagai argumen baris perintah (dengan D tersirat dari jumlah argumen). Mengambil tebakan sebagai angka yang dipisahkan ruang pada stdin.
Kode ini mengambil keuntungan besar dari fitur pemrograman array Pip. Array cmdline args disimpan di
g
. Kita menghasilkan titik yang akan ditebak oleh pemetaan operator randrangeRR
lebihg
, dan mencabut daftar yang dihasilkan ke dalamy
variabel. Kemudian muncul loop sementara utama, di mana kondisinya adalah sebagai berikut:Jika jaraknya bukan nol, bagian dalam loop akan mencetaknya. Jika nol, kita sudah mencapai titik target; loop berhenti, dan program menampilkan pesan kemenangan dan jumlah putaran.
Contoh dijalankan:
sumber
R, 134 - 150 = -16 byte
sumber
Haskell, 240 - 150 = 90
sumber
Dyalog APL ,
7771 - 210 = -139Baik:
Perhatikan bahwa ini berjalan dalam indeks asal 0 (
⎕IO←0
) yang merupakan default di banyak APL.Mengambil mode boolean sebagai argumen kanan (
M
), dan ukuran dimensi sebagai argumen kiri (S
).Jumlah dimensi adalah
D
, yang harus diatur (misalnyaD←3
) sebelum memanggil, sesuai OP).P←?S
sasaran mendapatkan titik acak dalam rentang 1 meskipun masing-masing dimensi terikat{
...}⍣≢C←0
ulangi fungsi hingga hasilnya berbedaC
, yang awalnya mendapat0
?2
angka acak 0 atau 1¯1 1[
...]
indeks dari daftar dua angkaM×
dikalikan dengan mode; membuat0
jika mode0
D↑
pad dengan0
s untuk mencocokkan jumlah dimensi(?D)⌽
daftar putar secara acak (0 hingga jumlah dimensi-1)P+
menyesuaikanS|
modulus ukuran-dunia saat ini sasaran,P←
simpanC+←1
penghitungP≢G←⎕:
masukan kenaikan titik sasaran yang baru , dan jika berbeda dari sasaran, maka ...P-G
jarak di setiap dimensi2*⍨
kuadratkan+/
jumlahnya.5*⍨
dengan hasil⎕←
cetak akar kuadrat yang0⊣
mengembalikan 0 (yaitu identik dengan nilai awal, jadi ulangi)C
... selain itu, kembalikan jumlah tebakan (yang berbeda dari 0, hentikan perulangan dan kembalikan nilai terakhir)sumber