แปลงเอกพจน์เป็นพหูพจน์


27

คำนามมีสองรูปแบบเอกพจน์และพหูพจน์ การแปลงระหว่างสองคนนี้ค่อนข้างง่าย

  1. sโดยปกติแล้วคุณจะจบมันด้วย อดีต =>carcars

  2. ถ้ามันจบลงด้วยs, x, z, chหรือจบมันด้วยsh esอดีต =>busbuses

  3. ถ้ามันจบลงด้วยการyที่มีพยัญชนะก่อนที่มันจะเปลี่ยนไปy iesอดีต =>pennypennies

  4. ถ้ามันจบลงด้วยfหรือเปลี่ยนไปfe vesอดีต =>knifeknives

  5. ถ้ามันจบลงด้วยการที่มีพยัญชนะก่อนที่มันจะเปลี่ยนไปo oesอดีต =>potatopotatoes


งาน

คุณจะได้รับคำนามเอกพจน์ คุณต้องแปลงคำนามที่ให้เป็นพหูพจน์และเอาท์พุท


กฎระเบียบ

  • คุณจะไม่ได้รับคำนามที่ผิดปกติเช่นและmousemoose

  • คุณจะไม่ได้รับการยกเว้นเช่นsafe( safes; ละเมิด # 4), piano( pianos; ละเมิด # 5) และo( oes, ละเมิด # 5)

  • คุณจะไม่ได้รับคำศัพท์ที่มีรูปแบบพหูพจน์ที่เป็นไปได้สองรูปแบบขึ้นไปเช่นmosquito( mosquitosหรือmosquitoes) และroof( roofsหรือrooves)

  • คุณจะไม่ได้รับคำนามนับไม่ได้

  • y ไม่นับเป็นสระ


ตัวอย่าง

car => cars
bus => buses
potato => potatoes
knife => knives
penny => pennies
exception => exceptions
wolf => wolves
eye => eyes
decoy => decoys
radio => radios

คำถามที่แก้ไขเพื่อความชัดเจน รู้สึกฟรีเพื่อย้อนกลับ
JungHwan Min

11
Ahh, อังกฤษ - กองใหญ่ของกฎเกณฑ์โดยพลการและกรณีพิเศษ :)
ผลไม้แยก

38
@ Challenger5 ใช่ แต่คุณสามารถเข้าใจมันผ่านความคิดที่ละเอียดถี่ถ้วน ;)
JungHwan Min

@MatthewRoh ฉันได้แก้ไขพยัญชนะด้านหน้าเพื่อให้ชัดเจนขึ้น เพิ่มกรณีทดสอบสองสามรายการในกรณีเดียวกัน หากฉันเข้าใจผิดโปรดแก้ไขเพื่อชี้แจง
ghosts_in_the_code

2
@ Challenger5 หากคุณเปรียบเทียบภาษาอังกฤษกับภาษาดัตช์มีกฎใด ๆ แทบทั้งหมด .. ดัตช์มีกฎและกรณีพิเศษและกรณีพิเศษที่ขัดแย้งกับกรณีพิเศษเหล่านั้นและในบางกรณีแม้แต่กรณีพิเศษที่ขัดแย้งกับกรณีพิเศษเหล่านั้นที่กรณีพิเศษเหล่านั้นขัดแย้งกัน ;)
Kevin Cruijssen

คำตอบ:


46

Mathematica ขนาด 9 ไบต์

Pluralize

ใช่มีในตัวสำหรับสิ่งนี้!

ตัวอย่างผลลัพธ์

Pluralize["car"]

cars

Pluralize /@ {"bus", "potato", "knife", "penny", "exception", "wolf", "eye"}

{"buses", "potatoes", "knives", "pennies", "exceptions", "wolves", "eyes"}


6
Waaaaaat! มีบางสิ่งที่ Mathematica ไม่มีในตัวใช่หรือไม่
KeyWeeUsr

2
D: Builtins ได้โจมตีความท้าทายนี้เช่นกัน
Matthew Roh


18

Retina , 57 53 56 55 58 57 ไบต์

ขอบคุณ MartinEnder สำหรับคำแนะนำการเล่นกอล์ฟ

ขอบคุณ BusinessCat สำหรับการเล่นกอล์ฟ 1 ไบต์

([^aeiou]o|sh?|ch|z|x)$
$1e
fe?$
ve
([^aeiou])y$
$1ie
$
s

ลองออนไลน์!

คำอธิบาย (ล้าสมัย)

([^aeiou])y$
$1ie

เปลี่ยน{consonant}yเป็น{consonant}ie

([^aeiou]o|[fxzs]|[sc]h)$
$&e

ผนวกeเมื่อสิ้นสุดคำที่มี{consonant}o, f, x, z, s, หรือshch

fe$
ve

เปลี่ยนตอนจบfeเป็นve

$
s

ในที่สุดต่อท้ายsคำ

การแก้ไข

  • เพิ่มไบต์เพราะฉันลืมกฎข้อที่สอง
  • เพิ่มไบต์เพื่ออัปเดตด้วยeyeตัวอย่าง

1
ขออภัยถ้านี่เป็นคำถามที่โง่ฉันไม่ได้ใช้ Retina เหตุใดจึงต้องใช้วงเล็บเหลี่ยมในบรรทัดแรก
user2390246

ไม่เป็นไรฉันคิดว่าฉันตอบคำถามของตัวเองแล้ว เป็นเพราะการอ้างอิงการค้นหาในบรรทัดต่อไปนี้
user2390246

ใช่มันเป็นเพราะเราต้องการจับตัวละครก่อนที่จะyใช้$1
Kritixi Lithos

ฉันคิดว่าฉันได้รับใน 57 ไบต์: ลองออนไลน์
ธุรกิจ Cat

16

JavaScript (ES6),  109  97 ไบต์

s=>s[R='replace'](/([^aeiou])y$/,'$1ie')[R](/fe?$/,'ve')[R](/([^aeiou]o|[sxz]|[cs]h)$/,'$1e')+'s'

ลองออนไลน์!


ทำไมคุณถึงต้อง()อยู่ต่อหน้าfe?
Kodos Johnson

1
@KodosJohnson replace()การทำซ้ำทั้งหมดรวมถึงการอ้างอิงถึงกลุ่มการจับคู่แรก (พร้อม$1) นั่นเป็นเหตุผลที่ฉันต้องการกลุ่มการจับคู่ที่ว่างเปล่าที่นี่
Arnauld

คุณเคยลอง(?<![aeiou])yไหม
ติตัส

@Titus แต่น่าเสียดายที่ JS ไม่ได้ใช้การยืนยันที่ดู
Arnauld

11

แบตช์ 325 ไบต์

@set/ps=
@for %%v in (a e i o u)do @(
for %%e in (o y)do @if %s:~-2%==%%v%%e goto s
if %s:~-2%==%%vf set s=%s:~,-1%ve&goto s
if %s:~-3%==%%vfe set s=%s:~,-2%ve&goto s
)
@if %s:~-1%==y set s=%s:~,-1%ie
@for %%e in (o s x z)do @if %s:~-1%==%%e set s=%s%e
@for %%e in (c s)do @if %s:~-2%==%%eh set s=%s%e
:s
@echo %s%s

สิ่งที่เกี่ยวกับ@echo offการเริ่มต้นมากกว่า@ทุกที่? นอกจากนี้@set/ps=ดูเหมือนว่าสนิมนิด ๆ หน่อย ๆ จากโทรศัพท์ sตัวแปรจะไม่ยอมรับค่าการแบ่งหรือไม่
KeyWeeUsr

@KeyWeeUsr @echo offมีขนาด 9 ไบต์แล้วโดยไม่ต้องขึ้นบรรทัดใหม่ดังนั้นจึงไม่ช่วยอะไรเลย นอกจากนี้ยัง@set/ps=จำเป็นต้องใส่ค่าในสถานที่แรก
Neil

7

Haskell, 216 207 205 bytes

ขอบคุณ @Lynn, @ user1472751 และ @Laikoni สำหรับความช่วยเหลือ!

import Data.List
(!)s=or.map(\x->x`isSuffixOf`s)
c=['b'..'z']\\"eiou"
p s|s!(words"s x z ch sh"++map(:"o")c)=s++"es"|s!map(:"y")c=init s++"ies"|s!["f"]=init s++"ves"|s!["fe"]=(init.init)s++"ves"|0<1=s++"s"

อ่านง่าย

import Data.List;

endsWithOneOf :: String -> [String] -> Bool
endsWithOneOf str ends = (or . map (\end -> end `isSuffixOf` str)) ends 

consonants :: [Char]
consonants = ['a'..'z'] \\ "aeiou"

pluralize :: String -> String
pluralize str
    | str `endsWithOneOf` (words "s x z ch sh" ++ (map (:"o") consonants)) = str ++ "es"
    | str `endsWithOneOf` (map (:"y") consonants) = init str ++ "ies"
    | str `endsWithOneOf` ["f"] = init str ++ "ves"
    | str `endsWithOneOf` ["fe"] = (init.init) str ++ "ves"
    | otherwise = str ++ "s"

คำอธิบาย

import Data.ListisSuffixOfสำหรับฟังก์ชั่น endsWithOneOf( ในเวอร์ชัน golfed) ส่งคืนว่าหนึ่งในองค์ประกอบรายการเป็นจุดสิ้นสุดของสตริงหรือไม่ consonants(c)เป็นเพียงรายการของพยัญชนะทั้งหมด

ในที่สุดpluralize(p)ตรวจสอบตอนจบและส่งกลับพหูพจน์ที่เหมาะสม

ตัวอย่าง:

p "potato" == "potatoes"

1
ทางออกที่ดี! นี่คือ 216 อักขระแต่มีความยาวหลายไบต์ทำให้โซลูชันของคุณ 226 ไบต์ (ความท้าทายรหัสกอล์ฟมีการทำคะแนนอย่างชัดเจนในหน่วยไบต์เนื่องจากจำนวนตัวอักษรช่วยให้คุณโกงบางครั้ง) คุณสามารถเปลี่ยนชื่อเป็น!! นอกจากนี้ยังwords"s x z ch sh"บันทึก 5 ไบต์ การลบ parens ไปรอบ ๆ(map(:"o")c))และ(map(:"y")c))ประหยัดอีก 4
ลินน์

ขอบคุณสำหรับความช่วยเหลือ @Lynn! ฉันใช้คำแนะนำของคุณ
Eisfunke

2
คุณสามารถบันทึกหนึ่งไบต์โดยใช้c=['b'..'z']\\"eiou"เนื่องจาก'a'ถูกลบออกเสมอ
user1472751

1
0<1Trueเป็นหนึ่งไบต์สั้นกว่า การขึ้นบรรทัดใหม่นั้นมีจำนวนไบต์เดียวกัน;แต่ทำให้โค้ด golfed อ่านง่ายขึ้นเล็กน้อย
Laikoni


5

Röda , 80 ไบต์

f&s{s~="([^aeiou])y$","$1ie","([sxz]|[cs]h|[^aeiuo]o)$","$1e","fe?$","ve"s.="s"}

ฟังก์ชั่นแก้ไขข้อโต้แย้งของมัน การใช้: main word { f word; print word }นี่คือรุ่นที่ใช้ค่าส่งคืน (83 ไบต์):

f s{s~="([^aeiou])y$","$1ie","([sxz]|[cs]h|[^aeiuo]o)$","$1e","fe?$","ve";[s.."s"]}

และด้านล่างเป็นฟังก์ชั่นที่อ่านค่าจำนวนมากมายจากอินพุตสตรีมและผลักฟอร์มพหูพจน์ไปยังเอาต์พุตสตรีม ( 87 83 ไบต์):

{replace"([^aeiou])y$","$1ie","([sxz]|[cs]h|[^aeiuo]o)$","$1e","fe?$","ve","$","s"}

มันเป็นฟังก์ชั่นนิรนามเนื่องจากมันสั้นกว่าการสร้างฟังก์ชั่นที่มีชื่อ


คุณจะแสดงผลลัพธ์ของฟังก์ชันแรกได้อย่างไร (ฟังก์ชันที่ขึ้นต้นด้วยf&s) เพียงแค่f("word")ดูเหมือนจะไม่แสดงอะไร
Kritixi Lithos

@KritixiLithos พารามิเตอร์เป็นการอ้างอิงดังนั้นอาร์กิวเมนต์ต้องเป็นตัวแปร
fergusq

5

PHP, 103 100 ไบต์

<?=preg_replace(['/([^aeiou]o|sh?|x|z|ch)$/','/(?<![aeiou])y$/','/fe?$/'],['\1e',ie,ve],$argv[1]).s;

ลองออนไลน์!

preg_replaceฟังก์ชั่นใช้เวลาในอาร์เรย์ของรูปแบบและเปลี่ยน

  • บันทึก 2 ไบต์ขอบคุณ Titus
  • บันทึก 1 ไบต์ขอบคุณ Dewi Morgan

2
ผมคิดว่าคุณสามารถบันทึกหนึ่งไบต์ด้วยและ-R $argnและการใช้การยืนยันด้วยการyประหยัดสอง: (?<![aeiou])y$อนุญาตieเป็นการทดแทน: ไม่ \1ไม่มีเครื่องหมายคำพูด
ติตัส

1
อีกไบต์จาก([^aeiou]o|sh?|x|z|ch)$
Dewi Morgan

@Titus จริงๆแล้วดูเหมือนว่าจะมีโทษ 1 ไบต์สำหรับการใช้งาน-R(แต่ไม่ใช่-r)เพื่อที่จะไม่เปลี่ยนจำนวนไบต์ แต่น่าเสียดาย แต่ข้อเสนอแนะ lookbehind ใช้งานได้ดี ขอบคุณ
Kodos Johnson

4

Python 3, 271 239 199 ไบต์

ขอบคุณ @ovs ที่ลดขนาดลง 72 ไบต์!

lambda s,v="aeiou":(s[-2:]=="fe"and s[:-2]+"ve"or s[:-1]+((s[-1]=="y"and s[-2]not in v)*"ie"or s[-1]=="f"and"ve"or s[-1]+((s[-1]in"sxz"or s[-2:]in["ch","sh"])+(s[-1]=="o"and s[-2]not in v))*"e"))+"s"

ลองออนไลน์!


1
elifคุณสามารถลบช่องว่างที่ไม่จำเป็นบางอย่างและรวมแรกและครั้งสุดท้าย รายการอักขระเดียวสามารถถูกแทนที่ด้วยสตริง การเปลี่ยนไปใช้ python ช่วยประหยัดเพิ่มอีก 3 ไบต์ tio
ovs

@ovs เสร็จแล้วขอบคุณ! ผมไม่ได้รวมelifs แต่เพราะนั่นหมายความว่าจะกลายเป็นpotato potaties
numbermaniac

1
ฉันมองผิดบรรทัด;) คุณสามารถรวม if กับ elif ล่าสุด ในการบันทึกไบต์เพิ่มเติมให้แทนที่บรรทัดสุดท้ายด้วยprint(s+"s")และลบตัวอักษรอื่นเช่นกันทุกตัวที่คุณต่อท้ายคำ Tio
ovs

1
เมื่อคุณแทนที่ตรรกะ if / elif ของคุณด้วยand/*และor/+ทำให้ฟังก์ชันแลมบ์ดาที่ไม่มีชื่อคุณสามารถรับมันได้ต่ำกว่า 200 ไบต์ (ฉันสลับเคสไปนิดหน่อย)
ovs

@ovs Ooh นั่นprint(s+"s")เป็นคนฉลาด การเปลี่ยนแปลงทั้งหมด; คุณเขียนใหม่ทั้งหมดเลยฮ่า ๆ ๆ ขอบคุณ! (ฉันไม่รู้ด้วยซ้ำว่าคุณสามารถทำTrue and "string"เช่นนั้นได้)
numbermaniac

2

sed, 70 79ไบต์

69 78 + 1 สำหรับการตั้งค่าสถานะ-E(BSD) / -r(GNU)

s/([^aeiou])y$/\1ie/
s/([^aeiou]o|[fxzs]|[sc]h)$/&e/
s/fe/ve/
s/$/s/

พอร์ตโดยตรงของคำตอบที่จอประสาทตา


2

Pip , 63 61 ไบต์

Y`[^aeiou]`OaR[C`sh?|x|z|ch`Cy.'y`fe?`y.'o].'$[_B.'i'v_].'e's

ใกล้เคียงกับการจับจอประสาทตา! แต่มันอาจจะไม่เกิดขึ้น :(

ลองออนไลน์!

คำอธิบาย

กลยุทธ์พื้นฐาน: Replace จะทำการแทนที่หลายครั้งหลังจากที่อื่นเมื่อได้รับรายการรูปแบบและการแทนที่ เราต้องการเปลี่ยนสิ่งต่อไปนี้:

  • (sh?|x|z|ch)$ -> เพิ่ม e
  • [^aeiou]y-> เปลี่ยนyไปiและเพิ่มe
  • fe?-> เปลี่ยนเป็นvและเพิ่มe
  • [^aeiou]o -> เพิ่ม e

ถ้าอย่างนั้นเราก็ต้องการที่จะทำการsเปลี่ยนแปลง

เคล็ดลับ:

  • Cผู้ประกอบการได้รับ regex, wraps ในกลุ่มจับ; เป็นหนึ่งไบต์สั้นกว่าC`xyz``(xyz)`
  • รายการของ regexes หรือการแทนที่ที่ลงท้ายด้วยอักขระเดียวกันทั้งหมดสามารถสร้างขึ้นได้โดยการต่ออักขระเข้ากับรายการแทนที่จะรวมไว้ในรายการทั้งหมด การเชื่อม Scalar (สตริง) เข้ากับรูปแบบ (regex / การแทนที่) เชื่อมโยงกับรูปแบบ
  • แทนที่จะเชื่อมโยงs(และต้องจัดการกับลำดับที่มาก่อนRและ.) เราสามารถOใส่ส่วนหลักของคำแล้วพิมพ์sแยกต่างหาก

รหัสเว้นระยะและแสดงความคิดเห็น:

                  a is 1st cmdline input (implicit)
Y`[^aeiou]`       Yank the consonant regex into the y variable
O a R             Output (without newline): a, with the following replacements:
 [                List of regexes to replace:
  C `sh?|x|z|ch`    (sh?|x|z|ch)
  Cy . 'y           ([^aeiou])y
  `fe?`             fe?
  y . 'o            [^aeiou]o
 ] . '$           End of list; concatenate $ to each item
 [                List of replacements:
  _                 Identity function (replace with whole match)
  B                 B is short for {b}, a function returning its second argument; as a
                    callback function for regex replacement, the second argument is
                    the value of capturing group 1 (the consonant before y)
    . 'i            To that, concatenate i
  'v                Scalar literal v
  _                 Identity function
 ] . 'e           End of list; concatenate e to each item
's                Return Scalar literal s, which is autoprinted

2

C #, 73 163 ไบต์:

Func<string,string>p=System.Data.Entity.Design.PluralizationServices.PluralizationService.CreateService(System.Globalization.CultureInfo.CurrentCulture).Pluralize

ใช่ภาษาอื่นที่มีอยู่ภายใน (แม้ว่าคุณจะต้องเพิ่มการอ้างอิงถึงSystem.Data.Entity.Design.dll)

ใช้:

var words = new[] { "car", "bus", "potato", "knife", "penny", "exception", "wolf", "eye", "decoy", "radio" };
foreach (var word in words)
{
    var plural = p(word);
    Console.Out.WriteLine($"{word} => {plural}");
}

เอาท์พุท:

car => cars
bus => buses
potato => potatoes
knife => knives
penny => pennies
exception => exceptions
wolf => wolves
eye => eyes
decoy => decoys
radio => radios

ยินดีต้อนรับสู่เว็บไซต์ ฉันจะเรียกใช้รหัสนี้ได้อย่างไร
ข้าวสาลีตัวช่วยสร้าง

@WheatWizard อัพเดทแล้ว ฉันควรจะรวมรายละเอียดเพิ่มเติม (ใช้งบ ฯลฯ ) ในการนับไบต์?
RoadieRich

สิ่งที่น่าสนใจของเรื่องไม่สำคัญสิ่งที่ตรงกันข้ามของเรื่องนี้ (Singularize) ล้มเหลวในการทดสอบง่ายๆ ตัวอย่างเช่นมันเชื่อว่า "หลักสูตร" เอกพจน์คือ "หลักสูตร"
Morgan Thrapp

ฉันคิดว่าเนมสเปซจะต้องรวมอยู่ในจำนวนไบต์ของคนนี้โดยเฉพาะอย่างยิ่งเนื่องจากมันไม่ใช่หนึ่งใน 'ปกติ' แต่ฉันคิดว่าอย่างน้อยคุณก็ต้องห่อมันด้วยแลมบ์ดาผ่านการโต้แย้งไปยังวิธีการ เช่นนี้เป็นเพียงกลุ่มวิธี
pinkfloydx33

@ pinkfloydx33 ดีกว่าตอนนี้?
RoadieRich


2

รางวิ่งขนาด 18 ไบต์

$><<gets.pluralize

ตัวอย่าง:

$ echo knife | rails r filename.rb
knives

ตอนนี้เป็นภาษาที่ลึกลับ
เวน

2

Python ขนาด296 ไบต์

z = input()
if z[-1]in['s','x','z','ch','sh']:print(z+'es')
elif z[-1]=='y'and z[-2]not in['a','e','i','o','u']:print(z[:-1]+'ies')
elif z[-2:]=='fe':print(z[:-2]+'ves')
elif z[-1]=='f':print(z[:-1]+'ves')
elif z[-1]=='o'and z[-2]not in['a','e','i','o','u']:print(z[:-1]+'oes')
else:print(z+'s')

0

พอร์ตโดยตรงของ Retina:

Ruby , 111 ไบต์

'sub(/([^aeiou])y/){"#{$1}ie"};sub(/(.*)([^aeiou]o|[fxzs]|[sc]h)$/){"#{$1}#{$2}e"};sub(/fe/,"ve");sub(/$/,"s")'

ลองออนไลน์!

เรียกใช้ruby -lpeและจัดหาไฟล์input.txtสำหรับอาร์กิวเมนต์ CLI แรก


อาจจะมากกว่า 'golfed' Btw: สามารถเพิ่มไฟล์หนึ่งไฟล์ลงใน TIO ได้หรือไม่
stephanmg

0

C, 321 ไบต์

#define E else if(
#define C unsigned char
C*p(C*b){static C r[999],i,w,n,m;for(n=w=i=0;r[i]=b[i];n=w,w=b[i++]);m=!strchr("aeiou",n);if(strchr("sxz",w)||(w=='h'&&strchr("cs",n))||(w=='o'&&m))r[i++]='e';E'y'==w&&m)r[i-1]='i',r[i++]='e';E'f'==w)r[i-1]='v',r[i++]='e';E'f'==n&&w=='e')r[i-2]='v';r[i++]='s';r[i]=0;return r;}

ทดสอบ:

C*mx[]={"car","bus","potato","knife","penny","exception","wolf","eye","decoy","radio",0};

main()
{unsigned i;
 for(i=0;mx[i];++i)
    printf("[%s] [%s]\n", mx[i], p(mx[i]));
 return 0;
}

ผล:

[car] [cars]
[bus] [buses]
[potato] [potatoes]
[knife] [knives]
[penny] [pennies]
[exception] [exceptions]
[wolf] [wolves]
[eye] [eyes]
[decoy] [decoys]
[radio] [radios]
[radio] [radios]

มันควรจะเป็นไม่ได้wolves wolfves
mbomb007

@ceilingcat เกี่ยวกับ "static C r [256], / * Z =" aeiou ", i = 0, w, n;" แทนที่ "static C r [256]; C / * Z =" aeiou ", i = 0, w, n;"
RosLuP


-1

Java 7, 408 ไบต์

แข็งแรงเล่นกอล์ฟ:

boolean b="bcdfghjklmnpqrstvwxyzs".contains(String.valueOf(s.charAt(s.length()-2))); String x=s.substring(0,s.length()-1);if(s.endsWith("s")||s.endsWith("x")||s.endsWith("z")||s.endsWith("ch")||s.endsWith("sh"))return s+"es";if(s.endsWith("y")&&b)return x+"ies";if(s.endsWith("f")) return x+"ves";if(s.endsWith("fe"))return s.substring(0,s.length()-2)+"ves";if(s.endsWith("o")&&b)return s+"es";return s+="s";

โดยพื้นฐานแล้วการทดสอบว่าจุดสิ้นสุดของสตริงคืออะไรและการเพิ่ม / การแทนที่ตัวอักษรขึ้นอยู่กับว่าเป็นกรณีใด บูลีนและสตริงที่จุดเริ่มต้นเป็นเพียงการลบการทำซ้ำในกรณีทดสอบและทำให้รหัสมีขนาดเล็กลง

รุ่นที่อ่านได้:

public static String pluralize(String s){

// Consonant at the 2nd last position?
boolean b = "bcdfghjklmnpqrstvwxyzs".contains(String.valueOf(s.charAt(s.length()-2))); 

// Substring for cases where last letter needs to be replaced
String x = s.substring(0,s.length()-1);

if(s.endsWith("s") || s.endsWith("x") || s.endsWith("z") || s.endsWith("ch") || s.endsWith("sh"))
    return s + "es";
if(s.endsWith("y") && b)
    return x + "ies";
if(s.endsWith("f")) 
    return x + "ves";
if(s.endsWith("fe"))
    return s.substring(0,s.length()-2) + "ves";
if(s.endsWith("o") && b)
    return s + "es";

return s += "s";
}

6
คุณไม่สามารถใช้ตัวอย่าง
Okx
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.