(Berdasarkan masalah Math.SE ini , yang juga menyediakan beberapa grafik)
Saya memiliki tongkat yang terlihat seperti ini:
Saya ingin terlihat seperti ini:
Saya bukan pelukis ahli, jadi sebelum saya memulai proyek DIY yang ambisius, saya ingin memastikan bahwa saya tidak berada di atas kepala saya.
Program Anda harus memberi tahu saya berapa banyak langkah yang terlibat dalam mengecat tongkat ini. Setiap langkah melibatkan lukisan area yang kontinyu dengan warna solid, yang menutupi lapisan cat sebelumnya. Untuk contoh di atas, saya bisa melukis setengah kiri biru, setengah kanan merah, dan kemudian dua area hijau yang terpisah untuk total 4 langkah (hijau tidak terus-menerus dicat).
Ini dia di ASCII:
------
bbb---
bbbrrr
bgbrrr
bgbrgr
Ada beberapa cara berbeda untuk mengecat tongkat ini dan berakhir dengan hasil yang sama. Namun, saya hanya tertarik pada perkiraan waktu, yaitu empat langkah.
Tujuan
Program Anda harus menampilkan jumlah langkah minimum yang diperlukan untuk mengecat stik dengan skema warna tertentu. Skema cat akan berupa string karakter, sedangkan outputnya berupa angka. Ini golf kode. Kemenangan program terpendek.
Memasukkan
Program Anda akan menerima skema pewarnaan untuk tongkat dalam bentuk untaian huruf. Setiap huruf unik (peka huruf besar kecil) mewakili warna unik.
YRYGR
grG
GyRyGyG
pbgbrgrp
hyghgy
Keluaran
Angka-angka ini adalah jumlah langkah terkecil yang diperlukan untuk mengecat tongkat.
4
3
4
5
4
Penjelasan
Beginilah cara saya mencapai angka-angka di atas. Program Anda tidak perlu menampilkan ini:
-----
YYY--
YRY--
YRYG-
YRYGR
---
g--
gr-
grG
-------
GGGGGGG
GyyyGGG
GyRyGGG
GyRyGyG
--------
pppppppp
pbbbpppp
pbbbrrrp
pbgbrrrp
pbgbrgrp
------
-yyyyy
-ygggy
hygggy
hyghgy
Sunting: Saya akan menambahkan lebih banyak kasus uji jika terbukti lebih sulit.
Jawaban:
GolfScript,
827267 karakterCukup cepat untuk program GolfScript, contoh:
Algoritma yang digunakan bekerja melalui warna dari kiri ke kanan secara rekursif, sesuai dengan pernyataan berikut:
Jika tidak, ambil warna target dari bagian paling kiri sekarang (yaitu yang pertama tidak dalam warna yang diinginkan).
...
Ambil minimum dari semua angka itu dan tambahkan 1 (untuk langkah saat ini). Kembalikan ini sebagai jumlah langkah optimal.
Algoritma ini berfungsi, karena bagian paling kiri harus dicat pada satu waktu, jadi mengapa tidak segera melakukannya - dengan cara apa pun yang mungkin.
sumber
n!
langkah;) (tapi mungkin ini kompleksitas sebenarnya, saya tidak tahu).JavaScript:
187BytesDengan asumsi kita diizinkan untuk hanya memiliki input dan output ke suatu fungsi (tolong)!
157 Bytesdengan melakukan optimasi jelek lebih lanjut (Yang merupakan bagian dari intinya, dan saya merasa sangat menyenangkan):135 Bytes Saya menyadari bahwa panjang input adalah batas atas dan saya tidak perlu menangani kasus sepele secara terpisah sekarang.
Kasus uji:
Versi yang diperluas:
Untuk setiap karakter input, hitung panjang pola jika kita mengecat warna itu terlebih dahulu. Ini dilakukan dengan berpura-pura kita mengecat warna itu dan kemudian membuat sub bagian dari bit-bit yang bukan warna itu, dan secara rekursif memanggil metode cat pada mereka. Jalur terpendek dikembalikan.
Contoh (
YRYGR
):Awalnya, coba
R
. Ini memberi kita sub kelompokY
danYG
.Y
secara sepele dicat dalam sekali jalan.Untuk
YG
: CobaG
,Y
sepele, panjang2
. CobaY
,G
sepele, panjang 2.YG
karena itu panjang2
.R
Karena itu, melukis dulu memberi kita1 + 1 + 2 = 4
Lalu coba
G
. Ini memberi kita sub kelompokYRY
danR
.R
sepele.Untuk
YRY
:Coba
Y
:R
sepele, panjang2
. CobaR
:Y
danY
dua kelompok, panjangnya3
.YRY
panjang2
.Lukisan
G
pertama memberi1 + 1 + 2 = 4
Lalu coba
Y
. Ini memberikan sub kelompokR
danGR
.R
sepele,GR
panjang2
.Y
panjang4
Implementasi ini kemudian akan memeriksa R dan Y lagi untuk mengurangi panjang kode. Karena itu hasilnya
YRYGR
adalah4
.sumber
m
suatu tempat."abcacba"
.m
hanyalah singkatan untukword.length
:) @Howard Anda benar, saya harus memikirkan kembali ini.Python, 149 karakter
Saya gunakan
?
untuk menandai area yang mungkin warna apa pun.D
memilih wilayah yang berdekatan dari tongkat yang hanya berisi satu warna (plus mungkin beberapa?
s), warna yang bertahan wilayah terakhir, menggantikan daerah itu dengan?
s, dan berulang untuk menemukan semua langkah sebelumnya.Waktu berjalan eksponensial. Cukup cepat untuk melakukan contoh dalam waktu yang wajar (beberapa menit). Saya bertaruh dengan memoisasi itu bisa jauh lebih cepat.
sumber
Python 3 - 122
Tampaknya berhasil, tetapi saya masih belum 100% yakin bahwa metode ini akan selalu menemukan jumlah langkah minimum.
sumber
CoffeeScript -
183 247 224 215207Demo di JSFiddle.net
Versi tidak digabungkan termasuk kode debug dan komentar:
sumber
hyghgy
. Dikatakan 5 tetapi harus 4. (namun, mengembalikan hasil yang benar dari 4 untukhyghgyh
).Haskell, 143 karakter
Ini mencoba semua kemungkinan penulisan ulang hingga panjang string, dan berlanjut sampai menemukan yang membangun pola input. Tak perlu dikatakan, waktu yang eksponensial (dan kemudian beberapa).
sumber
Pencarian pertama yang luas dan sederhana. Itu tidak memasukkan apa pun pada antrian yang sudah terlihat. Ini bekerja di bawah satu detik untuk semua contoh tetapi 'pbgbrgrp' yang sebenarnya membutuhkan satu menit penuh :(
Sekarang saya memiliki sesuatu yang berfungsi, saya akan berusaha menemukan sesuatu yang lebih cepat dan lebih pendek.
Python -
300296sumber
Haskell,
11886 karakterTes berjalan:
Metode ini bahkan tidak terlalu efisien!
sumber