Tantangannya adalah mengurai string seperti yang dilakukan Python dan mencetak isi string.
- Input (argumen baris perintah atau stdin) : string literal (misalnya
"hello"
) (atau beberapa literal, lihat rangkaian literal string di bawah) - Output (stdout) : isi string (misalnya
hello
)
Aturan untuk mengurai string:
- Sebuah string literal dilampirkan dalam pasangan yang cocok dari tanda kutip tunggal (
'a'
), tanda kutip ganda ("a"
), tanda kutip tunggal tiga ('''a'''
) atau tanda kutip ganda ganda ("""a"""
). Pengulangan pertama dari jenis kutipan yang membuka string mengakhiri string. - Backslash lolos:
\'
dalam string menjadi'
,\"
menjadi"
dan\\
menjadi\
. Anda tidak perlu menerapkan lolos backslash lainnya. Garis miring terbalik yang bukan bagian dari urutan pelarian tetap merupakan garis miring terbalik. - Rangkaian literal string: Isi literal string yang berdekatan digabungkan. Misalnya,
"hello" 'world'
menjadihelloworld
. - Masukan mungkin berisi spasi yang bukan bagian dari literal apa pun.
- Anda tidak perlu mendukung jenis ruang putih apa pun, baik di dalam maupun di luar literal.
Aturan tambahan:
eval
,exec
dan hal serupa tidak diperbolehkan untuk menguraikan literal atau bagian dari itu.- Anda dapat berasumsi bahwa input tersebut valid.
- Anda dapat mengasumsikan panjang input maksimum 1023 karakter.
Contoh:
"hello" ' world'
->hello world
"""\"""'\\\A"""
->"""'\\A
( '''"""'''"""'''""" )
(tanpa tanda kurung, tetapi dengan spasi) ->"""'''
Kode terpendek menang.
Jawaban:
Perl, 54 karakter
Tepat ketika saya memposting ini, saya perhatikan bahwa itu hampir identik dengan solusi Ruby Jan Dvorak. Saya sedikit kecewa dengan betapa miripnya itu, pada kenyataannya, tetapi saya akan mengatakan "Orang-orang hebat berpikiran sama" dan biarkan begitu saja.
Program ini menyoroti kasus sudut aneh dalam menghitung karakter dalam skrip Perl: Dengan membaca saya, kehadiran tanda kutip tunggal dalam skrip berarti bahwa saya perlu menghitung
-p
opsi sebagai dua karakter terhadap total saya. Biasanya, saat menghitung ukuran skrip Perl, karakter awal dasbor pada opsi dianggap gratis, dengan justifikasi bahwa ia dapat digabungkan dengan-e
yang memperkenalkan program dengan benar ... tetapi kemudian Anda juga harus memperhitungkan setiap pelarian tambahan Anda harus memasukkan skrip pada baris perintah. Kutipan tunggal membutuhkan banyak pelarian, jadi untuk menghindari hukuman itu saya harus menghitungnya sebagai skrip dijalankan dari file, dan karena itu saya mendapatkan#!/usr/bin/perl
secara gratis, tetapi tidak ada karakter opsi. Agak membingungkan.sumber
(('|")\2{2}?)
panjangnya sama dengan("""|'''|"|')
C, 178 karakter
Ini adalah salah satu solusi C di mana semuanya dilakukan di dalam geng rantai operator ternary.
Program ini bekerja dengan menyalin kembali karakter ke buffer yang sama, menimpa karakter metak.
d
memegang pembatas ketika di dalam string, dant
benar jika pembatas adalah kuotasi tiga.sumber
'foo\\'
merujuk ke string foo \, yang kemudian diikuti oleh karakter yang bukan spasi putih atau pembatas string.Rubi,
7473 karakterInti di sini adalah dua regex: Yang pertama menentukan batas string dan memilih konten saja. Perubahan ada untuk menghapus semua yang tidak ada di dalam string, dan juga menjatuhkan string yang tidak tertutup.
Serangan balik diperlakukan sebagai possesif-opsional diikuti oleh apa pun. Jadi,Karena mesin regex tidak akan mundur ke(\\?.)
input yang valid (terima kasih @breadbox), satu backslash tidak dapat cocok di sana. Kutipan ditangani melalui pengulangan malas. Regex kedua kemudian strip backslash sebelum masing-masing karakter dapat melarikan diri. Regex tergantung pada mesin untuk selalu memilih alternatif paling kiri terlebih dahulu.Saya juga mempertimbangkan pendekatan state-machine, tetapi ternyata cukup besar (19 status x 4 kelas karakter) dibandingkan dengan solusi regex. Saya masih dapat memposting mesin negara jika ada yang tertarik.
sumber
'foo\\'
adalah string pertama danbar'
berada di luar konteks string ketika inputnya adalah'foo\\'bar'