Ada pengkodean dan decoding run run klasik.
input output
a3b2c5 aaabbccccc
Dan itu cukup lurus ke depan dan dilakukan sebelumnya.
Tantangannya adalah untuk juga memperhitungkan perilaku non-standar ketika beberapa karakter mendahului panjang lari ( satu digit dari 0-9). Setiap karakter sebelum digit panjang run (digit terakhir sebelum non-digit atau akhir string) memiliki nilai yang diterapkan secara individual dan dicetak secara berurutan.
Beberapa input dan output tes termasuk beberapa kasus tepi:
input output
ab3c5 aaabbbccccc
a0b3 bbb
13b1 111b
a13b1 aaa111b
a123b1 aaa111222b
aa2a1b1 aaaaab
- Urutan karakter (
[a-zA-Z0-9]+
) harus diikuti oleh panjang lamanya ([0-9]
) - Hanya input yang valid yang perlu dipertimbangkan (
([a-zA-Z0-9]+[0-9])*
)- ya, string kosong adalah input yang valid.
- Input adalah melalui input standar, output melalui output standar
Ini adalah kode golf, jumlah byte menentukan pemenangnya.
Jawaban:
Pip, 22 + 1 = 23 byte
Menggunakan
-r
bendera Perhatikan bahwa ini mengharuskan Anda untuk 1) memasukkan EOF setelah input (Ctrl-D di Linux, Ctrl-Z di Windows) atau 2) menyalurkan input dari tempat lain.Penjelasan:
Hasil operasi peta sebenarnya adalah daftar daftar, tetapi secara default daftar hanya disatukan ketika dicetak, jadi tidak perlu konversi manual ke string.
Contoh, dengan input
a13b1
:Pip memiliki dukungan regex dasar pada ... 2 hari yang lalu . Waktu yang tepat!
sumber
-r
bendera. (Pertanyaan menentukan bahwa input harus berasal dari STDIN.)q
alih-aliha
tanpa tanda tambahan, tapi sepertinya ada bug dan meminta input dua kali.Perl / Bash
5440 + 1 = 41 byteIni pada dasarnya adalah sebuah regex di dalam sebuah regex. Dan sedikit keajaiban.
Penjelasan
Regex luar
/(\D*\d*)(\d)/g
mengekstrak setiap grup yang dikodekan run-length. Kami menangkap hal-hal untuk diulangi$1
dan jumlah pengulangan di$2
. Sekarang kami mengganti setiap kelompok tersebut dengan perluasan kelompok itu. Untuk itu, kami mengevaluasi kode"\$1=~s/./\$&x$2/egr"
dua kali (seperti dengan/ee
bendera pada substitusi luar).Evaluasi pertama hanya akan menginterpolasi jumlah pengulangan ke dalam string - variabel lainnya dilindungi oleh backslash. Jadi dengan asumsi input
a14
, kita sekarang akan memiliki kode$1=~s/./$&x4/egr
, yang akan dievaluasi lagi.Ini akan menerapkan substitusi ke konten
$1
(hal yang diulanga1
). Substitusi cocok dengan setiap karakter.
. The$&
variabel memegang seluruh pertandingan, yang kita ulangix4
kali. Kami melakukan ini secara/g
lobal untuk setiap pertandingan dan/r
membuat string yang diganti daripada memodifikasi$1
variabel (yang hanya baca). Jadi hasil dari substitusi batin adalahaaaa1111
.The
-p
bendera berlaku substitusi untuk setiap baris input dan mencetak hasilnya.sumber
-p
pengubah. Saya menghitung 45 byte. Selain itu, Anda harus dapat menggunakan\D
alih-alih[a-z]
, yang juga menghilangkan kebutuhani
.CJam,
33 3127 byteUghh, kurangnya ekspresi reguler membuat ini cukup lama ...
Bagaimana itu bekerja
Kami mengulangi semua karakter dari string input dan di setiap iterasi, melacak karakter yang terakhir ditemui (dimulai dengan karakter kosong untuk pertama kalinya). Kemudian kami memeriksa apakah karakter saat ini adalah non-numerik dan karakter terakhir adalah numerik. Jika demikian, kami mengulangi setiap karakter sebelumnya (yang belum pernah diulang), jumlah kali.
(Perluasan kode yang agak ketinggalan zaman)
Cobalah online di sini
sumber
rs ,
4371 karakterYah, ini berubah dengan cepat. Angka bodoh ...
Coba di sini!
Versi asli (tidak berfungsi dengan input seperti
123
):Penjelasan
Baris pertama menempatkan spasi di antara run yang berisi angka, misalnya berubah
a313
menjadia3 13
.Baris kedua terus memperluas pengkodean terkompresi seperti
aa5
kea5a5
.Baris ketiga mengubah setiap instance
a5
menjadiaaaaa
menggunakan operator pengulangan .Baris terakhir menghilangkan spasi.
sumber
a123b1
?Javascript ( ES6 ),
8683 byteBerkomentar:
sumber
alert(prompt().replace(/(.+?)(\d)(?!\d)/g,(a,b,c)=>Array(c+1).join(b)))
melakukan hal yang sama Panjangnya hanya 71 byte.Array(6).join('12')
dan itu akan kembali'1212121212'
.alert(prompt().replace(/(.+?)(\d)(?!\d)/g,(a,b,c)=>Array(-~c).join(b)))
(panjangnya sama 71 byte, diuji pada es6fiddle.net/ia7gocwg )CJam,
2725 byteCobalah online di juru bahasa CJam .
Bagaimana itu bekerja
sumber
Pyth,
333228 byteCobalah secara online: Demonstrasi atau Uji harness
Penjelasan
Saya akan menjelaskan kode menggunakan contoh input
aa1a23b2
. Semoga ini sedikit lebih mudah diikuti daripada tanpa.sumber
Ruby 73
Pengujian: http://ideone.com/L1fssb
sumber
JavaScript 112
sumber
Python 2.7, 98 byte
Ini hanya melakukan pencarian regex sederhana untuk digit yang tidak diikuti oleh digit, dan kemudian melakukan string aritmatika pada setiap grup dan menggabungkan mereka semua kembali bersama.
sumber
raw_input
menjadiinput
tetapiprint
membutuhkan tanda kurung.Julia,
105999587 byteIni menciptakan fungsi tanpa nama yang mengambil string saat input a mengembalikan string. Untuk menyebutnya, berikan nama, mis
f=s->...
.Dua pemahaman array digunakan di sini, satu bersarang di dalam yang lain. Pemahaman luar bekerja pada setiap kecocokan string input terhadap ekspresi reguler
\D*\d*\d
. Pemahaman bagian dalam mengulangi setiap karakter pertandingan sesuai dengan digit yang tertinggal. Elemen-elemen dari array dalam digabungkan menjadi sebuah string, jadi array luar adalah sebuah array string. Ini bergabung dan dikembalikan.Di Julia, string dapat diperlakukan seperti array karakter. Namun, perhatikan bahwa
Char
danString
tipe dalam Julia tidak memiliki metode yang sama didefinisikan; khususnya, tidak ada metode untuk pengulangan menggunakan^
untuk karakter. Ini menggunakan solusi yang berbelit-belit:chop()
.string()
.int('4')
tidak mengembalikan 4. Sebaliknya, ia mengembalikan codepoint, yang dalam hal ini adalah 52. Dengan demikian kita dapat mengurangi 48 untuk mendapatkan kembali integer yang sebenarnya.string(b)
sesuai denganint(p[end]) - 48
.Contoh:
sumber
Python 3,
148144136135 BytesTerima kasih kepada Pietu1998 dan mbomb007 untuk sarannya.
Python 2,
161151147139138 BytesMungkin hari ini hanya merupakan hari yang panjang di tempat kerja, tetapi saya tidak bisa seumur hidup mencari tahu cara bermain golf ini ..
sumber
raw_
keluar, tanda kurung keprint
).len(d)>0
dapat diganti dengand
karena daftar kosong adalah palsu dan daftar kosong tidak benar.list(...)
dapat langsung menujufor
. Kurung dalamw([...])
tidak perlu karena itu satu-satunya argumen. Anda dapat menghapus ruang di) for
. Itu semua hal kecil yang saya buat sejauh ini.list()
karena string dapat diubah. Anda bisa menggunakannyaw=r=''
. Jika Anda sering mengubahnya, lihat solusi saya. :)if c.isdigit()
bisa menjadiif'/'<c<':'
, jika saya tidak salah.Java 7, 175 byte
Tantangannya lebih sulit daripada yang terlihat, imo ..
Tidak digabungkan & kode uji:
Coba di sini.
Keluaran:
sumber