単数形を複数形に変換する


27

名詞には、単数形と複数形の2つの形式があります。これら2つの間の変換は非常に簡単です。

  1. 通常、あなたはそれで終わりますs。例 car=> cars

  2. それはで終わる場合sxzchまたはsh、でそれを終わらせますes。例 bus=> buses

  3. y直前の子音で終わる場合、をに変更yiesます。例 penny=> pennies

  4. fまたはで終わる場合はfe、に変更しvesます。例 knife=> knives

  5. o直前の子音で終わる場合は、に変更しoesます。例 potato=> potatoes


仕事

単数形の名詞が与えられます。指定された名詞を複数形に変換して出力する必要があります。


ルール

  • mouseやなどの不規則な名詞は与えられませんmoose

  • safesafes;違反#4)、pianopianos;違反#5)およびooes、違反#5)などの例外は与えられません。

  • mosquitomosquitosまたはmosquitoes)やroofroofsまたはrooves)など、2つ以上の複数形の可能性がある単語は与えられません。

  • 数えられない名詞は与えられません。

  • y 母音としてカウントされません。


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

わかりやすくするために質問を編集しました。ロールバックしてください。
ジョンファンミン

11
ああ、英語
-arbitrary意

38
@ Challenger5はい、しかし、あなたは厳しい徹底的な考えを通してそれを理解することができます。;)
ジョンファンミン

@MatthewRoh私はそれをより明確にするために前線の子音を編集しました。また、同じためのテストケースをいくつか追加しました。誤解した場合は、編集して明確にしてください。
ghosts_in_the_code

2
@ Challenger5英語をオランダ語と比較すると、ルールはほとんどありません。オランダ語には、ルールと特別なケース、およびそれらの特別なケースと矛盾する特別なケースがあります。;)
ケビンクルーイッセン

回答:


46

Mathematica、9バイト

Pluralize

はい、これにはビルトインがあります!

サンプル出力

Pluralize["car"]

cars

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

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


6
わぁぁぁあぁっ!Mathematicaに組み込まれていないものはありますか?
KeyWeeUsr

2
D:組み込み関数は、あまりにもこの挑戦を攻撃してきた
マシュー盧を


18

網膜57 53 56 55 58 57バイト

ゴルフの提案をしてくれたMartinEnderに感謝

ゴルフ1バイトのBusinessCatに感謝

([^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}ofxzsshまたはch

fe$
ve

末尾feをに変更しますve

$
s

最後にs単語にを追加します。

編集

  • 2番目のルールを忘れたため、バイトを追加しました
  • eye例として更新するバイトを追加しました

1
これが馬鹿げた質問なら申し訳ありませんが、私はRetinaを使用していません。最初の行に丸括弧が必要なのはなぜですか?
user2390246

気にしないで、私は自分の質問に答えたと思います。これは、次の行のルックバック参照が原因です。
user2390246

私たちは前に文字をキャプチャしたいのでうん、それはだy使用$1
KritixiのLithos

57バイトで手に入れたと思います。オンラインで試してください
ビジネスキャット

16

JavaScript(ES6)、 109  97バイト

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

オンラインでお試しください!


どうして()前にいるのfe
コドスジョンソン

1
@KodosJohnsonすべてのreplace()反復には、最初に一致するグループへの参照が含まれます(withを使用$1)。そのため、ここでは空の一致グループが必要です。
アーナルド

試しました(?<![aeiou])yか?
タイタス

@Titus残念ながら、JSは後読みアサーションを実装していません。
アーナルド

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=最初に値を入力する必要があります。
ニール

7

ハスケル、216 207 205バイト

@ 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.List機能のためisSuffixOfendsWithOneOfゴルフバージョンでは)リスト要素の1つが文字列の終わりかどうかを返します。 consonants(c)すべての子音のリストです。

最後に、pluralize(p)エンディングをチェックし、適切な複数形を返します。

例:

p "potato" == "potatoes"

1
いい解決策!これは216 文字ですが、複数バイト長であるため、ソリューションは226バイトになります。(コードゴルフのチャレンジは、文字を数えると時々チートできるため、バイト単位で明示的に記録されます)!。また、words"s x z ch sh"5バイトを節約します。周りの括弧を削除して(map(:"o")c))(map(:"y")c))さらに4つ節約します。
リン

助けてくれてありがとう、@ Lynn!あなたの提案を実装しました。
アイスファンク

2
は常に削除されるc=['b'..'z']\\"eiou"ため、を使用して1バイトを保存できます'a'
user1472751

1
0<1は、よりも1バイト短くなっていTrueます。また、改行は同じバイト数です;が、ゴルフのコードを少し読みやすくします。
ライコニ


5

ローダ、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、103100バイト

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

オンラインでお試しください!

このpreg_replace関数は、パターンと置換の配列を受け取ります。

  • Titusのおかげで2バイト節約されました。
  • Dewi Morganのおかげで1バイト節約されました。

2
私はあなたがして1つのバイトを保存することができると思う-R$argn。また、アサーションをy2つ保存して使用すると、置換として(?<![aeiou])y$許可さie\1ます。
タイタス

1
別のバイト([^aeiou]o|sh?|x|z|ch)$
デウィモーガン

@Titus実際には、使用-R-rすると1バイトのペナルティがあるように見えます(しかし、そうではありませ)。そのため、残念ながら、バイトカウントは変わりません。しかし、後読みの提案はうまく機能します。ありがとう。
コドスジョンソン

4

Python 3、271 239 199バイト

72バイト削減した@ovsに感謝します!

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完了、ありがとう!elifただし、を組み合わせたのは、その手段potatoがになるためですpotaties
-numbermaniac

1
私は間違った行を見ました;)。ifと最後のelifを組み合わせることができます。さらにバイトを保存するには、最後の行をで置き換えprint(s+"s")、単語に追加するすべてのをelseケースも削除します。ティオ
ovs

1
あなたとあなたのif / elifのロジックを交換するとand/*してor/+と無名のラムダ関数を作る、あなたはそれを得ることができる200バイトの下で(私は例を少しスワップ)
OVS

@ovsおお、それprint(s+"s")は賢い。すべて変更されました。全部書き直しました笑 ありがとう!(私はあなたがTrue and "string"そのようにできることすら知りませんでした)
-numbermaniac

2

sed、70 79バイト

(BSD)/ (GNU)フラグの場合は69 78 + 1-E-r

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

網膜回答の直接ポート。


2

ピップ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->を変更しyi追加しますe
  • fe?->に変更しvて追加しますe
  • [^aeiou]o ->追加 e

それから、私たちはs関係なく取り組む。

トリック:

  • C正規表現所与のオペレータは、キャプチャグループでそれを包みます。C`xyz`は、よりも1バイト短くなってい`(xyz)`ます。
  • すべてが同じ文字で終わる正規表現または置換のリストは、すべてのアイテムに含めるのではなく、リストに文字を連結することで作成できます。スカラー(文字列)をパターン(正規表現/置換)に連結すると、パターンが強制されます。
  • 代わりに、連結のs(および優先順位の順序に対処することR.)、私たちは単にすることができO、その後の単語の主要部分utputと印刷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)は、かなりの数の簡単なテストケースに失敗します。たとえば、「コース」の単数形は「コース」であると確信しています。
モーガンスラップ

特に「通常の」名前空間ではない場合、この名前空間のバイト数に名前空間を含める必要があると思います。しかし、少なくともこれをラムダでラップし、引数をメソッドに渡す必要があると思います。
そのまま

@ pinkfloydx33良くなりましたか?
-RoadieRich


2

Railsランナー、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の直接ポート:

ルビー、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引数としてファイルを提供します。


おそらくもっと「ゴルフ」することができます。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では、「静的C r [256]、/ * Z = "aeiou"、i = 0、w、n;」はどうですか 「静的C r [256]; C / * Z = "aeiou"、i = 0、w、n; "」の代わりに?
11:08の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.