pengantar
Sisyphus mengalami masalah di tempat kerja akhir-akhir ini. Sepertinya dia tidak pernah menyelesaikan apa pun, dan dia akan senang menemukan solusi untuk masalah ini.
Pekerjaannya saat ini membutuhkan menggulingkan batu ke atas bukit. Ia biasanya melakukan pekerjaannya dengan baik, tetapi setiap kali ia berada di dekat puncak bukit, ia berguling lagi.
Dia menjadi benar-benar frustrasi dengan pekerjaannya dan ingin menyelesaikan masalah secara ilmiah dengan memiliki komputer yang mensimulasikan batu yang bergulir menuruni bukit.
Kebetulan Sisyphus tidak pandai pemrograman, jadi mungkin Anda bisa membantunya?
Tantangan
Setelah perkenalan konyol ini, mari kita berbisnis. Program Anda akan menerima ilustrasi bukit dan batu yang terlihat mirip dengan ini:
#o
##
###
######
########
Dimana #
mewakili bagian dari bukit dan o
mewakili batu.
Anda sekarang harus mengimplementasikan program yang memindahkan lapisan batu ke bawah. Sebagai contoh, output di atas harus:
#
##o
###
######
########
Jika ada daerah yang rata secara horizontal, bukit hanya berguling secara horizontal, jadi ...
o
########
... ini hanya akan membuat gulungan batu ke samping.
o
########
Jika ada area vertikal, batu itu jatuh ke bawah satu langkah, jadi ...
#o
#
#
#####
... akan menghasilkan ...
#
#o
#
#####
Anda juga akan menerima lebar dan tinggi gambar masing-masing dalam satu baris di atas gambar. Jadi, secara lengkap, input sampel kami akan terlihat seperti ini:
10 5
#o
##
###
######
#########
(Perhatikan bahwa spasi putih di sini adalah spasi. Pilih teks dan lihat apa yang saya maksud.)
Beberapa detail
- Ketika rock sudah berada di baris terakhir saat menjalankan program, Anda dapat memilih untuk menghentikan program atau output input yang tidak berubah
- Bukit hanya turun ke bawah
Program Anda harus memformat output persis sama dengan input (termasuk dimensi), jadi jika Anda menyalurkan output program itu sendiri, ia menghitung langkah selanjutnya.
Anda dapat mengasumsikan selalu ada jalan ke bawah, jadi masukan tempat jalur "diblokir" dapat menyebabkan perilaku yang tidak ditentukan
Anda dapat mengasumsikan selalu ada spasi di baris terakhir. Batu itu harus "beristirahat" di sana, jadi setelah memanggil program beberapa kali, selalu menyalurkan outputnya ke dalam dirinya sendiri, Anda harus berakhir dengan batu di baris terakhir, meletakkan di tempat ruang sebelumnya.
Anda dapat menerima input dalam bentuk apa pun yang Anda suka (stdin, file, ...). Anda harus memposting program SELURUH (sehingga semua variabel pra-diinisialisasi dihitung sebagai kode).
Garis diakhiri dengan
\n
.Anda bisa mendapatkan beberapa input contoh di sini (pastikan Anda menyalin spasi dengan benar!)
Ini adalah kode-golf , sehingga pengiriman karya dengan byte paling sedikit akan menang.
Pemenang akan dipilih pada 26 Juli 2014. Anda dapat memposting solusi setelah itu, tetapi Anda tidak bisa menang
Jika Anda memiliki pertanyaan, beri tahu saya di komentar.
Selamat bermain golf!
#
s, jadi ada satu ruang di ujungnya karena lebarnya adalah 10. Dalam hal ini (setelah beberapa iterasi) batu akan terletak di tempat spasi putih (jadi di bagian bawah -pojok kanan).Jawaban:
Regex (.NET, Perl, PCRE, JavaScript, ... rasa), 25 byte
Ya, ini akan menimbulkan perdebatan lagi, apakah ekspresi reguler adalah program yang valid, tetapi saya akan mencegahnya dan mengatakan bahwa pengajuan ini hanya untuk bersenang-senang dan tidak perlu dipertimbangkan untuk pemenang. (Berbeda dengan varian Perl 31 byte di bagian bawah;).)
Jadi di sini adalah solusi penggantian regex murni.
Pola (perhatikan ruang trailing):
Penggantian (perhatikan ruang utama):
Hitungan byte adalah untuk jumlah keduanya.
Anda dapat mengujinya di http://regexhero.net/tester/ . Pastikan untuk memilih ujung garis bergaya Unix dan "pertahankan format yang disisipkan" saat menempel. Jika masih tidak berhasil, Anda masih telah menempelkan ujung garis gaya Windows. Perbaikan termudah dalam hal itu adalah untuk mengganti
\n
dengan\r\n
dalam pola untuk melihat itu berfungsi.Berikut adalah fungsi 48 byte ECMAScript 6 yang menggunakan ini
Akhirnya, saya juga punya program yang sebenarnya. Ini 31 byte Perl (termasuk dua byte untuk
p
dan0
bendera; terima kasih kepada Ventero untuk sarannya!).Jika Anda ingin mengujinya, jangan menyimpannya dalam file, lakukan saja
sumber
\n
dengan\r\n
)Python - 190
Mengiris dan merangkai horor, serta terlalu banyak variabel. Saya yakin ini bisa bermain golf lebih banyak, tapi saya tidak bisa memikirkan fungsi python yang pintar saat ini. Input disimpan dalam string
s
.Karena string python tidak dapat diubah, saya mengganti karakter dengan menggabungkan semua karakter sebelumnya, karakter baru saya, dan semua karakter setelahnya. Saya menggunakan lebar bukit dan pengindeksan untuk menentukan di mana batu harus menggulung.
sumber
Ruby, 65/55 karakter
Kupikir saya akan melihat berapa lama solusi itu tidak hanya membuang masalah pada masalah.
Seperti yang diharapkan, ini tidak sesingkat solusi regex m.buettner - tetapi juga tidak lebih lama.
Saat menggunakan bendera juru bahasa, ini dapat disingkat menjadi 55 karakter (53 untuk kode, 2 untuk bendera):
Jalankan kode seperti ini:
sumber
JavaScript HTML - 251 karakter
( 251 jika Anda menghitung kode di dalam tanda kutip tunggal yang membaca input dan mengembalikan output. 359 jika Anda menghitung kotak input, string input, tombol, dll. 192 jika Anda menghitung hanya itu yang berfungsi.)
Kode golf:
http://goo.gl/R8nOIK
Klik "Pergi" berulang kali.
metode
Saya menggunakan String.match () untuk memecah bukit menjadi 5 bagian, lalu saya mengubah satu atau dua bagian. Saya sedang belajar JavaScript, jadi saran apa pun akan dihargai.
Kode yang Dapat Dibaca
sumber
Python 2 -
289252 byteSaya membuat beberapa perbaikan signifikan tetapi ini masih mengerikan. Beberapa byte lagi dapat disimpan dengan mengonversikannya ke Python 3 tetapi saya tidak dapat menambahkannya.
Pertama, saya menemukan batu itu. Jika karakter tepat di bawahnya
'#'
, ganti setiap instance'o '
dengan' o'
. Karena dijamin ada ruang ekstra di ujungnya, ini akan selalu memindahkan batu ke kanan.Terlepas dari apakah saya hanya melakukan itu atau tidak, saya memindahkan seluruh grid dengan
zip(*m)
. Lalu, saya melakukan penggantian lain'o '
dengan' o'
. Jika ada ruang di sebelah kanan batu, itu berarti bahwa di kotak nyata ada ruang di bawahnya, jadi itu akan dipindahkan. Kemudian saya memindahkan kembali dan mencetak.sumber
#
, dan saya melakukan pemeriksaan itu sebelum saya melakukan pemeriksaan untuk bergerak secara vertikal.Python (201)
sumber
awk, 152
Lebih Mudah Dibaca
sumber
php
485484 karakterSaya tahu ini sangat besar dibandingkan dengan entri oleh m.buettner tetapi yang terbaik yang bisa saya lakukan untuk saat ini. Saya pikir pasti ada cara yang lebih cepat untuk mengubah string input menjadi array multi dimensi tetapi sekarang sudah sangat terlambat.
Dan meskipun tidak kompetitif saya menyukai puzzle ini. Ingin ekstensi untuk menunjukkan di mana bola berakhir, atau setelah sejumlah langkah, mungkin ditambahkan setelah lebar dan tinggi pada jalur input. Dapat menambahkan itu dengan sangat mudah ke versi ini.
Ini kode saya: Input ada di variabel pertama.
Anda dapat melihatnya di sini dalam aksi di codepad
Sunting: Mengubah codepad dan kode di atas seperti mengeluarkan 0 bukan o, yang menyebabkan masalah ketika saya mencoba untuk memberi makan keluaran kembali ke program. Memperbaiki sekarang dan menyimpan satu char!
sumber
Groovy -
263261256 karakterGolf. Baca file menjadi String, dan gunakan fungsi
p
untuk meniru suatu fungsiString.putAtIndex(index,value)
:Tidak digabungkan (agak):
sumber
try{
alih- alihtry {
dancatch(Exception
bukannyacatch (Exception
.R, 234
Manipulasi string bukan titik terkuat R.
Lebih mudah dibaca:
sumber
C (182)
Atau, jika Anda benar-benar ingin membaca kode:
sumber
Clojure - 366 karakter
Tanpa regex. File input yang diperlukan bernama "d". Golf:
Tidak Disatukan:
Contoh dijalankan (hanya satu kasus, untuk singkatnya):
Saya seorang pemula. Saran diterima.
sumber
MATLAB, 160
Bagian yang menyakitkan adalah input file. Perhitungan aktual hanya akan menjadi 114 byte:
sumber