Tulis kode terpendek dalam bahasa pilihan Anda untuk melakukan decoding panjang run dari string yang diberikan.
String akan diberikan sebagai input pada stdin dalam formulir
CNCNCNCNCNCNCNCN
di mana masing C
- masing dapat berupa karakter ASCII yang dapat dicetak dan masing-masing N
digit 1
untuk 9
(inklusif).
Input sampel:
:144,1'1
Output yang sesuai:
:4444,'
Bahasa Pemrograman Shakespeare , 406 byte
Versi tidak disatukan:
Saya menggunakan kompiler Python SPL drsam94 , yang memiliki beberapa bug (itulah sebabnya, misalnya, saya gunakan
Open your mind
sebagai gantiOpen thy mind
dalam versi golf).Untuk menjalankan program ini, gunakan:
Bagaimana itu bekerja
SPL adalah bahasa pemrograman esoteris yang dirancang untuk membuat program terlihat seperti drama Shakespeare. Ini dilakukan dengan menggunakan karakter sebagai variabel, dan pemrosesan dilakukan dengan meminta karakter mengatakan sesuatu satu sama lain.
Ini adalah judul drama; itu diabaikan oleh kompiler.
Di sini kita mendeklarasikan variabel yang digunakan di sisa program. Semuanya antara
,
dan.
diabaikan oleh kompiler. Dalam kasus ini, kami mendeklarasikanRomeo
, digunakan untuk menahan karakter yang sedang diterjemahkan, danJuliet
, digunakan untuk menahan panjang run karakter.Di sini kami menyatakan tindakan pertama dan satu-satunya dalam program ini. Kisah dan adegan seperti label; mereka dapat dilompati kapan saja dengan menggunakan
let us return to scene II
atau beberapa varian itu. Kami hanya menggunakan satu tindakan, karena itu cukup untuk kebutuhan kita. Sekali lagi, apa pun di antara:
dan.
diabaikan oleh kompiler.Di sini kita mendeklarasikan adegan pertama. Adegan diberi nomor dalam angka Romawi: yang pertama adalah
Scene I
, yang keduaScene II
, dan seterusnya.Ini adalah arah panggung; di dalamnya, kita memberi tahu
Romeo
danJuliet
variabel untuk datang ke "panggung". Hanya dua variabel yang bisa berada di "panggung" sekaligus; tahap ini digunakan sehingga kompiler dapat mengetahui variabel mana yang menangani yang mana ketika mereka berbicara. Karena kami hanya memiliki dua variabel, Romeo dan Juliet akan tetap di atas panggung selama jangka waktu program.Deklarasi adegan lain. Adegan II akan dilompat ke untuk memecahkan kode run-length lain.
Bentuk pernyataan ini berarti bahwa Juliet akan mulai berbicara. Segala sesuatu sampai
Romeo:
deklarasi panggung, adegan, atau adegan / tindakan selanjutnya akan menjadi garis yang diucapkan oleh Juliet, dan dengan demikian "aku" akan merujuk ke Juliet, "kamu" / "kamu" ke Romeo, dll.Perintah ini menyimpan nilai ordinal karakter tunggal dari STDIN di
Romeo
.Dalam SPL, kata benda diterjemahkan menjadi 1 atau -1 tergantung pada apakah mereka positif atau negatif. Dalam hal ini,
my mother
diterjemahkan menjadi 1. Kata sifat (positif atau negatif) kalikan kata benda mereka dengan 2.Ini adalah sebuah pertanyaan; di dalamnya, Juliet bertanya apakah
my mother
(AKA 1) "jollier" daripada Romeo. Komparatif dapat diterjemahkan menjadiless than
(jika negatif, sukaworse
) ataugreater than
(jika positif, sukajollier
). Oleh karena itu, pertanyaan ini sampai padaIs 1 greater than you?
.Alasan kami mengajukan pertanyaan ini adalah untuk mendeteksi akhir input. Karena nilai
EOF
bervariasi berdasarkan platform, tetapi biasanya kurang dari 1, kami menggunakan ini untuk mendeteksinya.Jika pertanyaan sebelumnya dievaluasi
true
, kita beralih ke adegan IV — yang hanyalah akhir dari program. Singkatnya, jika kami mendeteksi EOF, kami mengakhiri program.Sekarang kalimat Romeo: "aku" dan "kamu" masing-masing merujuk ke Romeo dan Juliet.
Sekali lagi, pernyataan ini menempatkan nilai ordinal dari satu karakter dari STDIN ke Juliet, yang dalam hal ini adalah run-length dari karakter yang disimpan
Romeo
.Yang ini terlalu lama untuk dibahas dengan sangat terperinci, tetapi percayalah pada saya yang diterjemahkan
Juliet -= 48
. Kami melakukan ini karena Juliet memegang nilai ASCII dari suatu angka, danord('0') == 48
; dalam mengurangi 48, kita menerjemahkan dari nilai ASCII dari angka ke angka itu sendiri.Deklarasi adegan lain. Yang ini untuk loop di mana kita berulang kali mencetak nilai karakter
Romeo
,Juliet
kali.Pernyataan ini menyebabkan Romeo mencetak nilainya sebagai karakter; artinya, nilai karakter apa pun yang sebelumnya disimpan di Romeo sekarang menjadi keluaran.
Babi adalah kata benda negatif, jadi
a hog
diterjemahkan menjadi -1; Oleh karena itu, pernyataan ini dievaluasi untukJuliet -= 1
.Romeo di sini bertanya apakah Juliet "sama busuknya", atau sama dengan, 0.
Jika nilai Juliet adalah 0, kita kembali ke adegan II untuk memecahkan kode run-length karakter lain.
Lain lagi, kita kembali ke adegan III untuk menampilkan karakter Romeo lagi.
Deklarasi adegan terakhir ini hanyalah penanda untuk akhir program. The
[Exeunt]
arah panggung yang diperlukan untuk mendapatkan compiler untuk benar-benar menghasilkan adegan akhir.sumber
GolfScript, 10 karakter
sumber
perl, 27 karakter
sumber
print<>=~s/(.)(.)/$1x$2/ger
. Saya juga cukup yakin maksud Anda$1x$2
, dan bukan sebaliknya./r
didokumentasikan dalam perlop dan ditambahkan dalam v5.14.0-p
bendera membiarkan Anda jatuhprint
dan<>
, jadi jawabannya akan menjadi sederhana:s/(.)(.)/$1x$2/ge
-> 17chars +1 for-p
-> 18 .R 67
sumber
rep
akan memaksatimes
argumen dari karakter ke integer secara otomatis. Cemerlang.Python 3, 52
Python 3 memungkinkan saya untuk menggabungkan pendekatan dua solusi python2 saya.
sumber
raw_input
cocok dengan Python 3input
. Jadi baris pertama harus olehs=input()
s=input() while s:a,b,*s=s;print(a*int(b),end='')
APL (22)
Penjelasan:
T←⍞
: simpan input dalamT
T⊂⍨~⎕D∊⍨T
: pisahkanT
karakter-karakter yang bukan digit↑
:2
ubah menjadi -by-N/2
matrix{⍺/⍨⍎⍵}/
: pada setiap baris dari matriks (/
), mereplikasi (/
) karakter pertama (⍺
) dengan eval (⍎
) dari karakter kedua (⍵
),/
: menyatukan output dari setiap barissumber
Ruby, 30 byte
27 byte kode + 3 byte untuk menjalankannya dengan
-p
flag:sumber
8086 perakitan,
10698 karakterJika angkanya sebelum karakter dalam aliran input, dua baris (18 karakter) dapat dicukur.
sumber
dq 21cdc38821cd08b4 d888ed30c188482c e8ebfce210cd14b4
53 karakter? Saya tidak melihat di mana ia menangani karakter non-huruf besar atau bahkan ...GNU SED, 122 + 2 (-r)
Perlu dijalankan dengan
-r
benderaDapat dikurangi menjadi 110 + 2 dengan mengganti
\v
dengan yang tidak patut0x0B
dan\a
dengan0x07
sumber
\2.{9}
adalah ide bagus) luar biasa!C, 65 karakter
Mendapat input sebagai parameter.
sumber
error: first parameter of 'main' (argument count) must be of type 'int'
. Apakah ada saklar baris perintah?Perl,
1918 karakterAturan untuk menghitung sakelar pada baris perintah ada di sini .
sumber
Keempat, 45 karakter
Diuji dengan pforth pada OS X.
sumber
Python,
6362 karaktersumber
iter
itu ... Saya pikir saya akan menggunakannya sendiri!Windows PowerShell, 55 karakter
Saya mendapatkan perasaan bahwa ini bisa diturunkan lebih, terutama dengan gips dari char ke string dan int, tetapi saya tidak punya waktu untuk terus mengerjakannya sekarang.
sumber
C, 68 karakter
@ ugoren jawaban dalam C sedikit lebih pendek, tetapi jawaban ini sesuai dengan persyaratan bahwa "string akan diberikan sebagai input pada stdin ."
sumber
main(c,n){ ... }
yang akan diteruskan 1 secara default saat program dijalankan.int
arg 1 , tetapi kompiler (s) saya menggunakan komplainerror: second parameter of 'main' (argument array) must be of type 'char **'
sehingga saya tidak bisa lolosmain(c,n)
; Saya harus menggunakanmain(int c,char **n)
. Bisa jadi platform atau gcc.n;main(c)
tetapi tidakmain(n,c)
- cukup baik! :)Haskell,
5856 karakterUpaya nyata pertama saya dalam bermain golf apa pun, jadi mungkin ada beberapa perbaikan yang harus dilakukan di sini.
sumber
read[y]
menyimpan dua karakterreplicate x y
dengan[1..x]>>[y]
. Dengan demikian, baris kedua Anda dapat digantif(x:y:s)=(['1'..y]>>[x])++f s
, yang membuatnya menjadi 53 byte.Japt
-P
, 8 byteInput sebagai array karakter, output sebagai string.
Cobalah
sumber
ò crÏ°îX
jika Anda merasa terlalu menyeramkan!Malbolge Unshackled (varian rotasi 20-trit), 4,494e6 byte
Ukuran jawaban ini melebihi ukuran program maksimum yang dapat diposkan (eh), jadi kodenya terletak di repositori GitHub saya .
Bagaimana cara menjalankannya?
Ini mungkin bagian yang sulit, karena juru bahasa Haskell yang naif akan membutuhkan waktu lama untuk menjalankannya. TIO memiliki juru bahasa Malbogle Unshackled yang layak, tetapi sayangnya saya tidak akan dapat menggunakannya (batasan).
Yang terbaik yang bisa saya temukan adalah varian lebar rotasi 20-trit, yang berkinerja sangat baik, mendekompresi 360 byte per jam .
Untuk membuat penerjemah sedikit lebih cepat, saya telah menghapus semua cek dari penerjemah Malbolge Unshackled milik Matthias Lutter.
Versi modifikasi saya dapat berjalan sekitar 6,3% lebih cepat.
Bekerja!
sumber
05AB1E ,
65 byte-1 byte terima kasih kepada @Grimy .
Output sebagai daftar karakter.
Cobalah online.
Jawaban 6 byte lama tanpa built-length decode builtin:
Cobalah online.
Penjelasan:
sumber
2ι`ÅΓ
adalah 5 byte. Akan sedih jika built-in RLE tidak memenangkan tantangan RLE.Python,
787266 charsumber
GolfScript (10 karakter)
sumber
J - 24
Inti dari pengajuan ini adalah untuk menggunakan keterangan infix.
sumber
Befunge, 49 karakter
sumber
K, 35
sumber
,/{(. y)#x}.'0N 2#
selama 18 byte .Python 2, 58
Ini terinspirasi oleh solusi python Darren Stone - penyalahgunaan iterator!
Ini adalah solusi asli saya (60 karakter)
Pendekatan yang berbeda adalah 3 karakter lebih lama:
sumber
Jawa: 285 charas
sumber
Befunge-98, 22 karakter
sumber
Spasi, 135
(Ganti S, T, L dengan Spasi, Tab, karakter Linefeed.)
Cobalah online [di sini] .
Penjelasan:
sumber
Clojure (107)
Ini terasa sangat lama untuk menjadi Clojure, jika seseorang dapat melakukan yang lebih baik, silakan posting.
sumber