Heatmaps
Pertimbangkan sebuah ruangan persegi panjang, yang langit-langitnya memiliki kamera termal yang mengarah ke bawah. Di dalam ruangan, ada sejumlah sumber panas intensitas 1-9
, suhu latar belakang sedang 0
. Panas menghilang dari setiap sumber, turun satu unit per langkah (non-diagonal). Misalnya 20x10
ruangan
...........1........
....................
...8................
..5...............2.
....................
.1..................
................1...
.................65.
....................
............2.......
berisi 9 sumber panas, dan gradien suhu yang ditunjukkan oleh kamera termal
34565432100100000000
45676543210000000000
56787654321000000110
45676543210000001221
34565432100000012321
23454321000000123432
12343210000001234543
01232100000012345654
00121000000011234543
00010000000121123432
Dalam bentuk grafis ini mungkin terlihat seperti:
Dari gradien, kita dapat menyimpulkan posisi dan intensitas beberapa sumber panas, tetapi tidak semua. Sebagai contoh, semua 9
s selalu dapat disimpulkan, karena mereka memiliki suhu maksimal, dan begitu pula 8
dalam hal ini, karena menghasilkan maksimum lokal dalam gradien. The 2
dekat perbatasan yang tepat juga dapat disimpulkan, meskipun tidak di maksimum lokal, karena tidak memiliki lain 2
sebagai tetangga. The 5
s, di sisi lain, tidak disimpulkan, karena panas mereka mungkin juga dihasilkan oleh sumber-sumber yang lebih intens di dekat mereka. The 0
s diketahui tidak mengandung sumber panas, tetapi semua ubin lain mungkin berpotensi mengandung satu. Mari kita tunjukkan ubin tidak pasti oleh tanda hubung-
, sumber panas tertentu dengan digit yang sesuai, dan ruang kosong tertentu berdasarkan periode .
:
---------..1........
----------..........
---8-------......--.
----------......--2-
---------......-----
--------......------
-------......-------
.-----......-----6--
..---.......--------
...-.......-2-------
Tugas Anda adalah menghasilkan pola yang disimpulkan ini dari gradien suhu.
Aturan
Anda diberi input sebagai string yang dibatasi oleh baris baru atau pipa vertikal |
, mana yang lebih nyaman, dan output harus dari bentuk yang sama. Mungkin ada pembatas trailing di input dan / atau output, tetapi tidak ada yang sebelumnya. Ukuran input dapat bervariasi, tetapi lebar dan tingginya selalu paling tidak 4
. Fungsi dan program lengkap dapat diterima. Hitungan byte terendah menang, dan celah standar dilarang.
Kasus Uji Tambahan
Memasukkan:
898778765432100
787667654321100
677656543211210
678765432112321
567654321123210
yang terlihat seperti ini dalam bentuk grafis:
Keluaran:
-9---8-------..
-------------..
--------------.
--8---------3--
-----------3--.
Memasukkan:
7898
8787
7676
6565
Keluaran:
--9-
8---
----
----
Memasukkan:
00001
00000
00000
10000
Keluaran:
....1
.....
.....
1....
Jawaban:
CJam,
73 69 6255 bytePEMBARUAN : Algoritma baru. Ruang lingkup yang lebih pendek dan lebih banyak untuk perbaikan
Bagaimana itu bekerja
Logikanya mirip dengan algoritma di bawah ini, tetapi di sini saya tidak memeriksa semua 4 tetangga dalam satu iterasi tunggal. Sebagai gantinya, saya menggunakan pendekatan yang lebih kecil untuk beralih melalui semua baris dan kolom di kedua arah. Berikut langkah-langkahnya:
.
atau-
.Berikut ini contoh yang dijalankan pada input kecil:
Setelah langkah pertama:
Setelah langkah kedua:
Setelah pemetaan terakhir ke karakter tunggal, hasil akhir:
Penjelasan Kode :
Coba di sini
Pendekatan yang lebih tua
Bagaimana itu bekerja
Logikanya sederhana, iterasi melalui grid dan lihat apakah nilai saat ini lebih besar atau sama dengan empat tetangga yang tersisa - atas, bawah, kiri dan kanan. Kemudian mentransformasikan nilai saat ini berdasarkan aturan di atas dan jika nilainya sama dengan 0, buat "." .
Penjelasan Kode
Cobalah online di sini
sumber
JavaScript (ES6) 99
Uji di Firefox / konsol FireBug
Keluaran
sumber
Python 2: 154 byte
Masukan harus dalam bentuk
"00001\n00000\n00000\n10000"
.Mengubah string ke matriks 2D cukup panjang dalam Python. Jadi saya menyimpan format string asli. Saya menyebutkan input,
i
adalah indeks,v
adalah char (Akhirnya menghitung byte yang disimpan dalam solusi golf !!). Untuk setiap pasangan(i,v)
saya menghitung karakter output yang benar, dan bergabung dengan mereka. Bagaimana cara memilih karakter keluaran yang benar? Jikav == '\n'
, output char adalah\n
, ituv == '0'
, daripada char output'.'
. Kalau tidak, saya menguji 4 tetanggav
, yangb[i-b.index('\n')-1]
(atas),b[i-1]
(kiri,b[i+1]
(kanan) danb[i+b.index('\n')+1]
(bawah), jika mereka<= v
dan memilih char'-'
atauv
. Di sini saya membandingkan karakter bukan angka, tetapi berfungsi cukup baik, karena nilai ascii berada dalam urutan yang benar. Juga tidak ada masalah, jikab[i-1]
ataub[i+1]
sama'\n'
, karenaord('\n') = 10
.Pyth:
6158Lebih atau kurang terjemahan skrip Python. Cukup jelek ;-)
Cobalah online: Pyth Compiler / Executor Format input yang sama dengan solusi Python.
sumber
Perl,
77, 75, 7270Trik pencocokan regex 2d standar.
Contoh:
Coba di sini
sumber
Java,
307,304,303,299298Ini pasti tantangan "sempurna" untuk beberapa codegolf Java :)
Input (metode pipa | |):
Keluaran:
sumber
char[]r=a[0].replace("|", <--here"").toCharArray()
.APL, 92
Contoh:
sumber
Ruby 140
Tidak ada yang spesial; hanya beralih melalui peta dan bandingkan nilai saat ini dengan nilai empat tetangga.
Jalankan secara online dengan tes: http://ideone.com/AQkOSY
sumber
R, 223
Tentang yang terbaik yang bisa saya pikirkan saat ini. Berurusan dengan tali itu cukup mahal. Saya pikir ada ruang untuk perbaikan, tetapi tidak bisa melihatnya saat ini
Hasil tes
sumber
J - 69 byte
Contoh:
PS:
(0 : 0)
adalah cara standar J menentukan string. Anda mungkin juga menggunakan|
string yang dibatasi (dengan trailing|
).sumber
Excel VBA - 426
Ini akan menjadi kesempatan langka bahwa VBA memenangkan permainan golf kode apa pun, tetapi karena ini yang paling saya gunakan, menyenangkan untuk bermain-main dengannya. Baris pertama adalah kasus tepi yang membuat ini lebih lama dari yang seharusnya.
Hitungannya tidak termasuk spasi spasi awal.
Saya bermain-main dengan ide mengirim input ke selembar dan bekerja dari sana, tapi saya pikir perulangan string yang lewat karakter-demi-karakter menyimpan kode.
Panggilan dari Jendela Segera:
Output (dalam Window):
sumber
Perl - 226
Anda dapat mencobanya di ideone . Jika ada yang tertarik pada penjelasan, beri tahu saya.
sumber
Haskell - 193
f
adalah fungsi yang mengambil string dalam bentuk0001\n0000\n0000\n1000
dan mengembalikan string yang diperlukan.g
adalah fungsi yang mengambil daftar daftar karakter dan mengembalikan daftar daftar ((kiri, atas), ini, (kanan, bawah)).sumber