Di Amerika Serikat , dua arah yang berlawanan dari lalu lintas di jalan dipisahkan oleh garis kuning putus-putus jika melewati diperbolehkan dan dua garis kuning solid jika lewat tidak diizinkan.
(Hanya satu sisi yang dapat dilewati untuk memungkinkan melintas di sisi itu, dan garis kuning dapat berarti hal-hal lain seperti pusat atau jalur yang dapat dibalik, tetapi kami tidak memedulikan kasus-kasus tersebut.)
Tulis program yang menggunakan a jangka panjang dikodekan string P
untuk melewati dan N
untuk tidak lewat , dan mencetak versi ASCII jalan yang sesuai. Kecuali untuk garis tengah, jalan selalu memiliki pola yang sama, yang dapat dengan mudah disimpulkan dari contoh di bawah ini.
Akan ada angka desimal positif sebelum masing P
- masing dan N
dalam string input. Angka ini menentukan panjang bagian yang melintas atau tidak ada bagian yang melintas dari bagian jalan saat ini.
Contohnya
Masukan dari 12N
akan menghasilkan 12 kolom tanpa jalan yang lewat (garis tengah semua =
):
____________
============
____________
Masukan dari 12P
akan menghasilkan 12 kolom jalan yang lewat ( -
pengulangan garis tengah ):
____________
- - - - - -
____________
Lewat dan no passing kemudian dapat digabungkan, misalnya 4N4P9N7P1N1P2N2P
akan menghasilkan:
______________________________
====- - =========- - - -=-==-
______________________________
Ini adalah 4 kolom tanpa lewat , lalu 4 lewat , lalu 9 tanpa lewat , dll.
Perhatikan bahwa zona yang lewat selalu dimulai dengan tanda hubung ( -
) di sisi paling kiri, bukan spasi ( ). Ini wajib diisi.
Detail
- Masukan tidak akan pernah memiliki dua
N
zona atau duaP
zona berturut-turut. misalnya4P5P
tidak akan pernah terjadi. - Anda tidak perlu mendukung surat tanpa angka positif terkemuka. Polos
P
akan selalu1P
, plainN
akan selalu1N
. - Mungkin ada ruang trailing selama mereka tidak melampaui kolom terakhir jalan. Mungkin ada satu trailing newline opsional.
- Alih-alih sebuah program, Anda dapat menulis fungsi yang mengambil string yang dikodekan run-length dan mencetak atau mengembalikan jalan ASCII.
- Mengambil input dengan cara standar apa pun (stdin, baris perintah, fungsi arg).
Kode terpendek dalam byte menang. Tiebreaker adalah posting sebelumnya.
Jawaban:
CJam, 38 byte
Bagaimana itu bekerja
Kami pertama kali menetapkan kolom jalan yang benar untuk variabel
N
danP
kemudian hanya mengevaluasi input string. Ini menyisakan sepasang panjang dan kolom di tumpukan. Kami mengelompokkannya, menjalankan RLD di atasnya untuk mendapatkan kolom lengkap, transpos untuk bergabung dengan mereka dan akhirnya, mengonversi kontinu--
menjadi-
.Cobalah online di sini
sumber
JavaScript (ES6), 114
Dengan menggunakan string template , 5 baris umpan yang signifikan harus dihitung.
sumber
rs , 252 karakter
Walaupun ini mungkin tidak masuk hitungan karena saya menambahkan operator konvergensi sebagai penipuan dari Retina Martin Büttner satu jam yang lalu ... Saya toh tidak benar-benar di sini untuk bersaing. Sangat menyenangkan membuat solusi berbasis regex untuk ini.
Saya mendapat baris 2 dari jawaban Retina Martin untuk Bahasa Pemrograman Sepanjang Tahun .
Penjelasan
Ini melakukan banyak keajaiban. Lihat jawaban yang saya tautkan di atas untuk info lebih lanjut.
Pada dasarnya, dengan input
4N4P9N7P1N1P2N2P
, ini akan menjadi hasilnya:Berikutnya:
Ini menggantikan angka-angka yang mendahului simbol larangan lewat (N) dengan tanda sama dengan. Hasilnya dengan input sebelumnya:
Ini:
mengganti angka pertama sebelum simbol yang lewat (P) dengan tanda hubung pertama. Hasil:
Dua baris berikutnya melanjutkan pola yang sama:
Baris pertama menggantikan sisa garis dengan pola dash-space. Yang kedua menangani nomor ganjil; itu menggantikan dasbor terakhir diikuti oleh integer tunggal (seperti
-5
) dengan dasbor-ruang (-
). Sekarang, hasilnya adalah:Sekarang semuanya mulai jatuh ke tempatnya. Baris selanjutnya:
hanya menghapus
#N
dan#P
.atur garis bawah di bagian atas dan bawah untuk memberi:
Terakhir, kami menghapus
A
:sumber
Haskell, 165 byte
Contoh dijalankan (
f
mengembalikan string, jadi untuk tampilan yang lebih baik cetaklah):Cara kerjanya:
p
mengembalikan garis tengah dengan secara parsing mengurai string input dan menyatukan jumlah simbol yang ditemukan oleh fungsi pencariank
. Fungsi utamaf
bergabung dengan daftar lima elemen dengan baris baru, yang terdiri dari baris atas (setiap karakter dari baris tengah diganti dengan_
), baris baru, garis tengah, garis kosong, dan garis bawah (sama seperti atas).sumber
Python 3,
169168 byte. (167 dengan Python 2)Cukup tidak dicemari:
Cobalah online di sini .
sumber
p+=['='*v,('- '*v)[:v]][_[-1]=='P']
di akhir baris sebelumnya dengan titik koma sebelumnya menghemat satu byte.print
.Python 2, 136 byte
Anehnya, mengimpor
re
tampaknya bermanfaat di sini.sumber
PHP, 187 byte
Kode dapat tetap dalam satu baris; itu ditampilkan di sini pada banyak baris agar lebih mudah dibaca (spasi putih dan baris baru yang digunakan untuk memformat tidak dihitung).
Dua byte dapat disimpan dengan tidak mencetak baris baru. Lima byte lagi dapat disimpan dengan menggunakan karakter baris baru nyata pada
echo()
:Enam byte tambahan dapat disimpan dengan menghilangkan inisialisasi
$o
($o='';
) tetapi ini akan memicu pemberitahuan. Pemberitahuan dapat ditekan dengan menjalankan skrip menggunakan baris perintah:Ini membawanya ke 174 byte.
sumber
Rubi,
137135 byteBukan yang terpendek yang bisa saya lakukan, tetapi dekat dengan yang terbaik. Sebagian meminjam dari jawaban Pengoptimal.
Tidak Disatukan:
sumber
(a.shift.zip(*a).map(&:join)*?\n).gsub'--','- '
.C, 155 byte
Lebih mudah dibaca:
Loop luar menghitung garis dari 5 hingga 0.
Loop tengah berulang pada bagian-bagian dari string yang disandikan:
Loop dalam menerjemahkan bagian, seperti,
7P
,, dan mengulangi jumlah yang diperlukan kali (misalnya 7).Setiap iterasi mencetak satu
char
. Nilai darichar
dijelaskan oleh kodel%5?l^2?32:c^78?++x&1?45:32:61:95
:_
)=
)x
1 (diinisialisasi ke 2 olehsscanf
)-
), cetak lain 32 (spasi)sumber
Scala, 163 byte
Coba pertama, mungkin golf lagi.
sumber
Ruby, 94 byte
Pinjam
gsub'--','- '
ide dari jawaban 14mRh4X0r . Saya pikir jawaban itu lebih menarik, meskipun ini lebih pendek.Pengujian:
Menghasilkan:
sumber
biarkan saya memasukkan versi matlab saya
MATLAB (267 b)
memasukkan
String berformat ascii yang diuntai oleh spasi (karena tidak ada ujung rantai '\ 0' di matlab
contoh V = '12N13P'
keluaran
representasi pola jalan
fungsi
fungsi harus dipanggil dari tail-1 (karakter kosong dihapus)
contoh : p (V, numel (V) -1)
Simulasi
coba online di sini
sumber
R, 132 byte
Tidak terlalu senang dengan ini, tapi itu sedikit menyenangkan untuk dilakukan :) Sudah mencoba untuk menyingkirkan beberapa
gsub
s, tetapi usaha saya sia-sia. Saya curiga ada cara yang lebih baik untuk melakukan ini.scan
mendapatkan string dari STDIN dan meraih yang ke-4. Perhatikan bahwa baris kosong memerlukan ruang (atau sesuatu) di dalamnya untuk pemindaian agar terus mendapatkan input.=
s denganN
s,-
dandengan
P
s.NP
- masing danPN
rbind
) dengan karakter pertama dari setiap stringcat
.Uji coba
sumber