Diambil langsung dari ACM Winter Programming Contest 2013. Anda adalah orang yang suka mengambil sesuatu secara harfiah. Karena itu, bagimu, akhir Dunia adalah ed; huruf terakhir dari "The" dan "World" disatukan.
Buat program yang mengambil kalimat, dan keluarkan huruf terakhir dari setiap kata dalam kalimat itu dalam ruang sesedikit mungkin (byte paling sedikit). Kata-kata dipisahkan dengan apa pun kecuali huruf dari alfabet (65 - 90, 97 - 122 pada tabel ASCII.) Itu berarti menggarisbawahi, tildes, kuburan, kurung kurawal, dll adalah pemisah. Mungkin ada lebih dari satu pemisah antara setiap kata.
asdf jkl;__zxcv~< vbnm,.qwer| |uiop
-> flvmrp
pigs, eat dogs; eat Bob: eat pigs
-> ststbts
looc si siht ,gnitirw esreveR
-> citwR
99_bottles_of_beer_on_the_wall
->sfrnel
Jawaban:
Perl 5, 18 byte
Membutuhkan
-p
saklar baris perintah. Properti yang disebutkanL
hanya cocok dengan karakter hurufA-Za-z
. Ada beberapa ratus properti yang dinamai demikian, tetapi ketika berhadapan dengan teks ASCII, sangat sedikit yang menarik. Selain itu\pL
, satu-satunya yang lain dari not nyata adalah\pP
, yang cocok dengan tanda baca.Cobalah online!
Perl 5, 17 byte
Peningkatan satu byte oleh Dom Hastings
Membutuhkan
-n
(dan-l
mendukung banyak input).Cobalah online!
Penggunaan sampel
sumber
\w
juga cocok dengan angka dan garis bawah.|.
tidak jelas (bagi saya, setidaknya).-1
dalamprint/\pL*(\pL)/g
, tampaknya keluaran yang sama untuk kasus uji Anda!ed, 35 karakter
Jadi, dunia berakhir pada ed. Karena saya ingin menjadi terlalu literal, saya memutuskan untuk menulis untuk menulis solusinya dengan ed - dan ternyata itu sebenarnya bahasa pemrograman . Ini mengejutkan pendek, bahkan mempertimbangkan banyak solusi yang lebih pendek sudah ada di utas ini. Akan lebih baik jika saya bisa menggunakan sesuatu selain
[a-zA-Z]
, tetapi mengingat ed bukan bahasa pemrograman, itu sebenarnya cukup baik.Pertama, saya ingin mengatakan ini hanya mem-parsing baris terakhir dalam file. Dimungkinkan untuk mem-parsing lebih banyak, cukup ketik
,
di awal dua baris pertama (rentang "semuanya" yang ditentukan ini, yang bertentangan dengan rentang baris terakhir standar), tetapi itu akan meningkatkan ukuran kode menjadi 37 karakter.Sekarang untuk penjelasan. Baris pertama melakukan persis apa yang dilakukan solusi Perl (kecuali tanpa dukungan untuk karakter Unicode). Saya belum menyalin solusi Perl, saya baru saja menemukan sesuatu yang serupa secara kebetulan.
Baris kedua mencetak baris terakhir, sehingga Anda bisa melihat hasilnya. Kekuatan garis ketiga berhenti - saya harus melakukannya, jika tidak
ed
akan mencetak?
untuk mengingatkan Anda bahwa Anda belum menyimpan file.Sekarang untuk bagaimana menjalankannya. Yah, ini sangat sederhana. Jalankan saja
ed
dengan file yang berisi test case, sambil mem-pipkan program saya, seperti itu.-s
diam. Ini mencegahed
dari menghasilkan ukuran file yang jelek di awal. Bagaimanapun, saya menggunakannya sebagai skrip, bukan editor, jadi saya tidak perlu metadata. Jika saya tidak melakukan itu, ed akan menunjukkan ukuran file yang saya tidak bisa mencegah sebaliknya.sumber
Javascript, 49
Itu menggunakan ekspresi reguler untuk menghapus semua karakter yang datang sebelum huruf, serta semua karakter non-huruf. Lalu kita pergi dengan huruf terakhir dari setiap kata.
Terima kasih kepada Tom untuk perbaikan yang bagus.
sumber
alert(prompt().replace(/.(?=[a-z])|[^a-z]/gi,''))
C, 78
Golf:
Dengan spasi putih:
Keluaran:
sumber
c
:main(c,s)char**s;{for
GNU Sed,
403837Pengujian
Jalankan sed:
Keluaran:
Penjelasan
Substitusi pertama menggantikan semua batas kata, yang didahului oleh grup pertandingan yang diinginkan, dengan baris baru. Ini membuatnya mudah untuk menghapus semua karakter asing di substitusi kedua.
Edit
sumber
sed
'ss
perintah memilikii
bendera untuk kasus-kasus yang cocok sensitif:s/[a-z]\b/&\n/gi
.\b
menganggap_
s sebagai huruf, jadi jika ada kata dalam tes AKHIR dengan_
, huruf terakhir kata itu tidak termasuk dalam outputGrep and Paste,
363428Jika baris baru final diperlukan, ganti
tr -d \\n
denganpaste -sd ''
.Edit
tr
bukanpaste
(-4), terima kasih manatwork .sumber
paste -sd ''
, tetapitr -d \\n
lebih pendek. Mengenaigrep
, ia memiliki-i
saklar arti “abaikan”, yang dapat membuatnya lebih pendek:grep -io '[a-z]\b'
.tr
hapus juga baris terakhir. Mode case-sensitive tidak tentu saja lebih pendek, terima kasih.sed, 37 karakter
Panjangnya sama dengan jawaban Thor , tetapi, saya pikir, lebih sederhana.
Logikanya cukup sepele - ganti urutan huruf dengan huruf terakhir mereka, lalu hapus semua non-huruf.
sumber
Mathematica, 39
Uji:
sumber
LetterQ
harus dipanggilLettersQ
:) Saya belum memikirkannya untuk menguji seluruh string.K, 49
.
sumber
Scala, 59 (atau 43)
Dengan asumsi string sudah ada di
s
:Jika Anda perlu membaca dari prompt dan mencetak daripada menggunakan output REPL, konversikan
s
kereadLine
dan masukkanprintln()
59.sumber
x86: 54 byte
Asumsikan rutin cdecl dengan tanda tangan
void world_end(char *input, char *output)
:sumber
Xi, 32
Xi adalah bahasa yang masih dalam fase beta, tetapi tampaknya bekerja dengan baik dengan kode golf jadi saya pikir saya mungkin juga menunjukkan solusi pendek dan fungsional lainnya (dan beriklan sedikit bahasa :-)).
sumber
Mathematica
625752Pengujian
sumber
Python3, 59 karakter
Berurusan dengan benar dengan huruf kapital dan garis bawah. 2 adalah untuk lulus
re.sub
denganre.IGNORECASE
bendera tanpa harus menggunakanre.I
.sumber
Python, 76 karakter
import re;print "".join(re.findall("([a-zA-Z])(?=$|[^a-zA-Z])",raw_input()))
sumber
print
.import re;print(*re.findall("([a-zA-Z])(?=$|[^a-zA-Z])",input()),sep='')
Python 3.x, 64 byte
sumber
for
.Lua, 42
Contoh penggunaan:
lua script.lua "asdf jkl;__zxcv~< vbnm,.qwer| |uiop"
sumber
Mathematica
71474561Kembali ke papan gambar, setelah @belisarius menemukan kesalahan dalam kode.
Pengujian
sumber
\\w
cocok_
, sehingga tidak berfungsi untuk (misalnya)"asdf jkl__zxcv~<vbnm,.qwer| |uiop"
Row@StringTake[ StringCases[#, LetterCharacter ..], -1] &@"asdf jkl__zxcv~<vbnm,.qwer| |uiop"
beri sayaflvmrp
, tetapi#~StringCases~RegularExpression@"\\w\\b" <> "" &@"asdf jkl__zxcv~<vbnm,.qwer| |uiop"
kembali kefvmrp
sini. Apakah kita mendapatkan hasil yang sama ??Python 2,
88 80 75 6968Memasukkan:
435_ASDC__uio;|d re;fG o55677jkl..f
Keluaran:
CodeGolf
Solusi ini dapat disingkat menjadi 67 karakter jika Anda mengizinkan output untuk memasukkan karakter backspace (kode ASCII 8) di awal. Outputnya akan identik secara visual.
Input yang sama, (secara visual) output yang sama.
<BS>
dimaksudkan untuk menjadi karakter backspace.sumber
C #
Metode, 105 byte: (mengasumsikan penggunaan untuk System, System.Text.RegularExpressions and System.Linq)
Program, 211 byte:
sumber
VBA, 147
161sumber
Ruby 2.0, 25 (+1) karakter
Harus dijalankan dengan
-p
sakelar:sumber
ruby
versinya. 1.9.2 keluaran “# <Enumerator: 0x9f65e10> # <Enumerator: 0x9f65d98> # <Enumerator: 0x9f65d34> # <Enumerator: 0x9f65cd0>”.ruby 2.0.0p0 (2013-02-24 revision 39474
). Saat menjalankan program dengan versi 1.8.7 ini menghasilkan nilai ASCII! Tidak tahu ada begitu banyak perbedaan antar versi.gsub(/(\w+)\W*/){$1[-1]}
.Retina , 16 byte
Cobalah online!
Penjelasan
sumber
Retina , 20 byte
Cobalah online
Program ini kompatibel dengan versi 0.8.2
sumber
Java 8, 43 byte
Port @ mbomb007 adalah jawaban Retina .
Penjelasan:
Cobalah online.
Penjelasan tambahan untuk regex:
sumber
(?i)
untuk bendera.Smalltalk , Squeak / Pharo flavor
122 char dengan format tradisional untuk metode ini ditambahkan ke String:
62 karakter di Pharo 1.4, dengan format regex dan aneh
sumber
J: 60 karakter (atau 38 karakter untuk versi yang kurang benar)
Jika kami bersedia membiarkan program terputus setiap kali ada kata yang berakhir dengan titik dua atau garis bawah, maka kami dapat menyederhanakannya menjadi 38 karakter.
Contoh dijalankan:
sumber
(#~[:2&|64 90 96 122&I.@(u:inv)){:&>;:
, atau 43 byte untuk versi non-eksplisit:(#~[:2&|64 90 96 122&I.@(u:inv))@:({:@>)@;:
. Ini menggunakan kata kerja indeks intervalI.
,, yang diartikan64 90 96 122
sebagai himpunan interval(__, 64] (64, 90], (90, 96], (96, 122], (122, _)
, dan mengembalikan indeks iterval yang dimiliki argumennya, kode ascii dari char. Jika indeks ini aneh, ini bukan abjad.;:
interpretabc_
sebagai satu kata karena nama variabel dapat berisi garis bawah. +10 byte untuk ditambahkan(#~~:&'_')
, mungkin perbaikan yang tidak efisien'_'-.~
atau sesuatu yang serupa.Ada dalam PHP . 197 byte :( Saya pemula
DIedit Sekarang ini 171 byte
sumber
foreach((' ',preg_replace('/(\W|_)+/',' ',$_GET['line'])) as $d){$a=substr($d,-1,1);$o=ORD();if(($o>=97 && $o<=122) || ($o>=65 && $o<=90)){echo $a;}}
adalah 149, jika berhasil.\W|_
tidak termasuk digit; jadi Anda harus menambah\d
regex Anda atau menggunakan/[^a-z]+/i
K 30
sumber
Japt v2, 16 byte
Cobalah
sumber
f"%l(?!%l)" q
(tidak bekerja di v2 karena parser tidak suka(?
)