Pemrogramannya sangat kaku. Anda tidak dapat memberi tahu program untuk "menampilkan jumlah pisang", Anda harus memberi tahu print(bananas)
.
Tetapi ketika Anda melakukan itu, Anda berakhir dengan masalah: Anda tidak tahu berapa banyak pisang yang Anda miliki sebelumnya, jadi Anda tidak tahu apakah akan menggunakan jamak.
Terkadang, pemrogram melakukan hal yang malas. Alih-alih memeriksa, mereka hanya mencetak there are X banana(s)
.
Tapi itu jelek, jadi kita perlu program untuk memperbaikinya.
Metode
Untuk menghapus bentuk jamak ambigu dalam string, ikuti langkah-langkah berikut:
Pisahkan string pada spasi menjadi daftar kata.
Untuk setiap kata yang diakhiri dengan
(s)
, lakukan hal berikut:- Jika kata sebelumnya adalah
a
,an
,1
atauone
, menghapus(s)
pada akhir kata. - Jika tidak, jika kata adalah kata pertama dalam string atau kata sebelumnya tidak
a
,an
,1
atauone
, ganti(s)
di akhir kata dengans
.
- Jika kata sebelumnya adalah
Gabung daftar kata kembali bersama menjadi string, melestarikan spasi putih asli.
Contoh
Mari kita ambil string there's a banana(s) and three apple(s)
.
Pertama, kami membagi string menjadi daftar kata: ["there's", "a", "banana(s)", "and", "three", "apple(s)"]
Untuk langkah kedua, kita ambil dua kata yang diakhiri dengan (s)
: banana(s)
dan apple(s)
.
Kata sebelumnya banana(s)
adalah a
, jadi kami menghapus (s)
, membuatnya banana
. Kata sebelumnya apple(s)
adalah three
, jadi kami mengubah (s)
to s
, dengan demikian menjadi apples
.
Kami sekarang punya ["there's", "a", "banana", "and", "three", "apples"]
. Bergabung kembali dengan daftar, kita dapatkan there's a banana and three apples
. Ini adalah hasil akhir kami.
Tantangan)
Buat program atau fungsi yang mengambil string ambigu dalam format apa pun yang masuk akal dan mengembalikan versi string yang tidak ambigu .
Anda dapat mengasumsikan string tidak mengandung baris baru, tab, atau carriage return.
Saya lupa menentukan apakah akan membagi pada kelompok ruang atau ruang (yaitu apakah okay then
dengan dua ruang seharusnya ["okay", "then"]
atau ["okay", "", "then"]
) ketika memposting tantangan, sehingga Anda dapat menganggap salah satu bentuk pemisahan.
Test case
Input -> Output
there are two banana(s) and one leprechaun(s) -> there are two bananas and one leprechaun
there's a banana(s) and three apple(s) -> there's a banana and three apples
apple(s) -> apples
one apple(s) -> one apple
1 banana(s) -> 1 banana
banana -> banana
preserve original whitespace(s) -> preserve original whitespaces
11 banana(s) -> 11 bananas
an apple(s) -> an apple
this is a te(s)t -> this is a te(s)t
I am a (s)tranger(s) -> I am a (s)tranger
Mencetak gol
Karena ini adalah kode-golf , pengiriman dengan byte paling sedikit akan menang!
apple(s)
test case menghasilkanapples
sebagai gantinya? Tantangannya menyatakanOtherwise, if the word is the first word in the string . . . replace the (s) at the end of the word with s.
saya perhatikan bahwa kasus ini menghasilkanapples
kotak pasir untuk tiga revisi pertama tetapi berubah pada yang keempat.There's a single banana(s)
->There's a single bananas
.Jawaban:
Mathematica,
151148 bytePenjelasan
Setel
j
ke karakter spasi putih. Setelk
ke pola "tidakj
" (= karakter bukan spasi).Tambahkan dua spasi putih dan tambahkan satu spasi putih ke input.
Untuk substring yang cocok dengan polanya:
a
), diikuti olehs
), diikuti olehw
), diikuti oleh"(s)"
, diikuti olehJika
a
bukan salah satu dari kata tunggal, evaluasi untuk"s"
, sebaliknya""
.Mengganti pola yang cocok dengan
j
,a
,s
,w
,If[FreeQ[a,"a"|"an"|"1"|"one"],"s",""]
, danj
bergabung bersama-sama.Ambil dari posisi 3 ke posisi -2 (1-diindeks; indeks negatif dihitung dari akhir). Ini karena kami menambahkan tiga spasi di awal.
sumber
Python 3 , 94 byte
Cobalah online!
-4 byte terima kasih kepada i cri everytim (saya pikir ini bisa diterima)
sumber
__import__
tidak mungkin lebih pendek ... Yup, ini 4 byte lebih pendek dari biasanyaimport re
.Retina , 53 byte
Cobalah online!
sumber
banana(s)
dithere's a banana(s) and three apple(s)
- coba perbaikan inia|an
kean?
untuk -1 byteMathematica, 313 byte
sumber
Perl 5, 43 + 1 (-p) = 44 byte
Cocokkan setiap
(s)
akhir kata, gantikan dengan!$1
(1 atau 0) eses.sumber
Pyth - 53 byte
Mengikuti algoritma seperti ini.
Cobalah online di sini .
sumber
there are two banana(s) and one leprechaun(s)
(dua spasi setelahone
). Ruang putih asli dipertahankan, tetapileprechaun(s)
mengabaikanone
sebelumnya.one
danleprechaun(s)
Jelly ,
52 5149 byteJelly tidak memiliki satu atom regex
Program lengkap yang menerima string (menggunakan format Python jika multiline atau mengandung tanda kutip) dan mencetak hasilnya.
Cobalah online! atau lihat test-suite .
Bagaimana?
sumber
Ṫ
tautan terpisah. Apakah ini mencegahṪ
dari menghapus elemen dari daftar asli?Ŀ
untuk melakukannya, tetapi saya tidak melihat cara singkat untuk mengekor di dalam tautan 4, tetapi mungkin ada. Bahkan mungkin ada cara untuk mendapatkan ekor tautan 4 di sana juga!Ŀ
thingy dapat memanggil tautan pertama, itu sebabnyaṪ
tautan itu sendiri.Java (OpenJDK 8) ,
918396 byteCobalah online!
sumber
Perl 5 , 56 +1 (
-p
) = 57 byteCobalah online!
sumber
a hel(s)lo
.a hel(s)lo
ditambahkan ke kasus uji, dan kemudian mungkin Anda akan memperbaiki kode Anda ...JavaScript (ES6),
8887 bytePenjelasan segera hadir.
sumber
\s
dengan `` menurut "Anda dapat mengasumsikan string tidak mengandung baris baru, tab, atau carriage return."(\s|$)
ke akhir regex.JavaScript (ES6), 84 byte
Berikut adalah cara yang menarik untuk mengatur ulang bagian terakhir, yang sayangnya 2 byte lebih lama:
sumber
JavaScript (SpiderMonkey) , 82 byte
Cobalah online!
Versi 78 Byte (kurang kuat)
Ini adalah versi modifikasi dari ETHproductions '(Saya tidak punya 50 rep.)
Penjelasan
/(\S+ +(\S+))\(s\)/g
- pola aktual untuk dicari (amount object(s)
)(_,a)=>a
-_
Adalah menangkap semua variabel,a
adalah(\S+ +(\S+))
"s"[+/^(1|one|an?)/i.test(a)]||""
- Alih-alih mengiris array, buat saja array dummy dan dapatkan indeks (+/.../.test
mengembalikan angka)"s"[+/^(1|one|an?)/i.test(a)]
mengembalikanundefined
(true
, atau1
untuk ujian) kembali""
sumber