Tekil çoğul çevir


27

Tekil ve çoğul olmak üzere iki tür isim vardır. Bu ikisi arasındaki dönüşüm oldukça kolaydır.

  1. Normalde, onu sonlandırırsın s. ex. car=> cars.

  2. Onunla biterse s, x, z, chveya sh, ile bitirin es. ex. bus=> buses.

  3. Onunla sona ererse y, kendinden öncekini bir ünsüz ile değiştirmek yiçin ies. ex. penny=> pennies.

  4. fVeya ile bitiyorsa fe, olarak değiştirin ves. ex. knife=> knives.

  5. oHemen önce bir ünsüzle biterse , değiştirin oes. ex. potato=> potatoes.


Görev

Size tekil bir isim verilecektir. Verilen ismi çoğul olarak dönüştürmeniz ve çıkarmanız gerekir.


kurallar

  • Size mouseve gibi düzensiz isimler verilmeyecek moose.

  • Size safe( safes# 4 ihlal ediyor), piano( pianos; # 5 ihlal ediyor) ve o( # 5 ihlal ediyor ) gibi istisnalar size verilmeyecek oes.

  • mosquito( mosquitosVeya mosquitoes) ve roof( roofsveya rooves) gibi iki veya daha fazla olası çoğul hali olan sözcükler size verilmeyecektir .

  • Size sayılamayan isimler verilmeyecek.

  • y ünlü olarak sayılmaz.


Örnekler

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

Netlik için düzenlenmiş soru. Geri alma konusunda çekinmeyin.
JungHwan Min,

11
Ahh, English - keyfi kurallar ve özel durumların büyük bir yığın :)
Esolanging Fruit

38
@ Challenger5 Evet, ama yine de zorlu düşüncelerden anlayabilirsiniz. ;)
JungHwan Min

@MatthewRoh Daha sessiz olması için ünsüz kuralını düzenlemiştim. Aynı zamanda birkaç test durumu da eklendi. Yanlış anladıysam, açıklığa kavuşturmak için lütfen düzenleyin.
ghosts_in_the_code

2
@ Challenger5 Eğer İngilizceyi Hollandaca ile karşılaştırırsanız neredeyse hiç kural yoktur. Hollandalıların kuralları ve özel davaları, bu özel davalarla çelişen özel davaları ve bazı durumlarda, özel davalarla çelişen özel davaları bile içeren özel davaları vardır. ;)
Kevin Cruijssen

Yanıtlar:


46

Mathematica, 9 bayt

Pluralize

Evet, bunun için bir yerleşik var!

Örnek çıktı

Pluralize["car"]

cars

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

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


6
Waaaaaat! Mathematica'nın yerleşik bir özelliği yok mu?
KeyWeeUsr

2
D: Builtins de bu zorluğa saldırdı
Matthew Roh


18

Retina , 57 53 56 55 58 57 bayt

Golf önerileri için MartinEnder'e teşekkürler

BusinessCat'a 1 byte golf oynadığı için teşekkürler

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

Çevrimiçi deneyin!

Açıklama (eski)

([^aeiou])y$
$1ie

değişiklikler {consonant}yiçin{consonant}ie

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

Bir ekler ene zaman bir ile kelime uçları {consonant}o, f, x, z, s, shveya ch.

fe$
ve

Sonunu fedeğiştirirve

$
s

Sonunda skelimeye bir tane ekleyin .

Düzenlemeler

  • İkinci kuralı unuttuğum için bayt eklendi
  • eyeÖrnek olarak güncellemek için bayt eklendi

1
Üzgünüm, bu aptalca bir soru ise, Retina'yı kullanmadım. Yuvarlak köşeli ayraçlar neden ilk satırda gerekli?
user2390246

Boşver, sanırım kendi soruma cevap verdim. Bunun nedeni, aşağıdaki satırdaki geri dönüş referansıdır.
user2390246

Evet, çünkü ykullanmadan önce karakteri yakalamak istiyoruz$1
Kritixi Lithos

Sanırım 57 byte aldım: Çevrimiçi deneyin
Business Cat

16

JavaScript (ES6),  109  97 bayt

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

Çevrimiçi deneyin!


Neden ()önünde bir var fe?
Kodos Johnson

1
@KodosJohnson Tüm replace()yinelemeler birinci eşleme grubuna (ile $1) gönderme içerir. Bu yüzden burada boş bir eşleştirme grubuna ihtiyacım var.
Arnauld,

Denedin (?<![aeiou])ymi
Titus

@Titus Ne yazık ki, JS göz kamaştırıcı iddialar uygulamıyor.
Arnauld

11

Toplu iş, 325 bayt

@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

Her yerde @echo offdeğil, başında ne olacak @? Ayrıca, @set/ps=bir telefondan biraz paslı görünüyor. sDeğişken zaten dilimleme değerlerini kabul etmiyor mu?
KeyWeeUsr

@KeyWeeUsr @echo offzaten newline olmadan 9 bayttır, bu yüzden bana hiçbir şey kazandırmaz. Ayrıca, @set/ps=ilk etapta değeri girmek için gereklidir.
Neil

7

Haskell, 216 207 205 bayt

@Lynn, @ user1472751 ve @Laikoni'ye yardım için teşekkürler!

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"

Okunabilir

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"

açıklama

import Data.Listfonksiyon için isSuffixOf. endsWithOneOf( golfed versiyonunda) liste elemanlarından birinin dizenin sonu olup olmadığını döndürür. consonants(c)sadece tüm ünsüzlerin bir listesidir.

Son olarak, pluralize(p)sonları kontrol eder ve uygun çoğullamayı döndürür.

Örnek:

p "potato" == "potatoes"

1
Güzel çözüm! Bu 216 karakterdir , ancak çözümünüzü 226 bayt yapan çok bayt uzunluğundadır. (Kod golf zorlukları, bayt cinsinden açıkça puanlanır, çünkü karakterleri saymak bazen hile yapmanızı sağlar.) !Yine de , adını değiştirebilirsiniz ! Ayrıca, words"s x z ch sh"5 bayt kaydeder. Etrafındaki parenleri çıkarmak (map(:"o")c))ve (map(:"y")c))4 tane daha tasarruf etmek.
Lynn

Yardımın için teşekkürler, Lynn! Önerilerini uyguladım.
Eisfunke

2
Her zaman kaldırıldığından c=['b'..'z']\\"eiou"beri kullanarak bir bayt kaydedebilirsiniz 'a'.
user1472751

1
0<1bir bayttan daha kısa True. Ayrıca yeni satırlar, bayt sayısı ile aynıdır ;ancak golf kodunu biraz daha okunaklı hale getirir.
Laikoni

5

Perl, 66 + 2 ( -plbayrak) = 68 bayt

$_.=/(ch|sh?|x|z|[^aeiou]o)$/+s/([^aeiou])y$/$1i/+s/fe?$/v/?es:"s"

Kullanımı:

perl -ple '$_.=/(ch|sh?|x|z|[^aeiou]o)$/+s/([^aeiou])y$/$1i/+s/fe?$/v/?es:"s"' <<< car

Ideone'da dene.


5

Röda , 80 bayt

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

İşlev argümanını değiştirir. Kullanım: main word { f word; print word }İşte bir dönüş değeri (83 byte) kullanan bir versiyon:

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

Aşağıda, girdi akışından sonsuz sayıda değer okuyan ve çoğul formları çıkış akışına ( 87 83 bayt) iten bir fonksiyon yer almaktadır :

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

Bu isimsiz bir işlevdir, çünkü bu adlandırılmış bir işlev oluşturmaktan daha kısadır.


İlk fonksiyonun sonucunu nasıl elde edersiniz (ile başlayan f&s)? Basitçe bir f("word")şey görünmüyor
Kritixi Lithos

@KritixiLithos Parametre bir referanstır, bu nedenle değişken bir değişken olmalıdır.
fergusq

5

PHP, 103 100 bayt

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

Çevrimiçi deneyin!

preg_replaceFonksiyon desen ve yedek bir dizi alır.

  • Titus sayesinde 2 bayt kaydedildi.
  • Dewi Morgan sayesinde 1 bayt kaydedildi.

2
Sanırım -Rve bir bayt tasarruf edebilirsiniz $argn. Ve yiki iddialı bir iddia kullanmak : değişime (?<![aeiou])y$izin verir ie: hayır \1, fiyat teklifi yok.
Titus

1
Başka bir bayt([^aeiou]o|sh?|x|z|ch)$
Dewi Morgan,

@Titus Aslına bakarsanız kullanma 1 baytlık bir ceza var -R(ama değil -r), bu yüzden ne yazık ki bayt sayısını değiştirmez. Ancak göz kamaştırıcı öneri harika çalışıyor. Teşekkürler.
Kodos Johnson

4

Python 3, 271 239 199 bayt

72 byte düşürdüğü için @ovs'a teşekkürler!

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"

Çevrimiçi deneyin!


1
Gereksiz bazı boşlukları kaldırabilir ve ilk ve sonuncuyu birleştirebilirsiniz elif. Tek karakter listeleri dizelerle değiştirilebilir. Python'a geçmek 3 bayttan tasarruf sağlar. tio
ovs

@ovs Tamam, teşekkürler! Ben birleştirmek vermedi elifdemekse çünkü ancak s potatoolur potaties.
numbermaniac

1
Yanlış çizgide baktım;). İf ile son elif'i birleştirebilirsiniz. Biraz daha fazla bayt kaydetmek için son satırı değiştirin print(s+"s")ve başka bir olayı ve kelimeye eklediğiniz her durumu kaldırın. Tio
ovs

1
Eğer birlikte eğer / elif mantığı değiştirdiğinizde and/*ve or/+ve ismi açıklanmayan bir lambda fonksiyonu yapmak bunu elde edebilirsiniz 200 bayt altında (ben davalar biraz takas)
ovs

@ovs Ooh, bu print(s+"s")zekice. Hepsi değişti; lol her şeyi yeniden yazdın. Teşekkürler! (Böyle yapabileceğini bile bilmiyordum True and "string")
numbermaniac

2

sed, 70 79 bayt

(BSD) / (GNU) bayrağı için 69 78 + 1-E-r

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

Retina cevabının direkt limanı .


2

Pip , 63 61 bayt

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

Retina'yı yakalamak için çok yakın ! Ama muhtemelen olmayacak. :(

Çevrimiçi deneyin!

açıklama

Temel strateji: Replace, desen ve değişiklik listeleri verildiğinde birbiri ardına birkaç değişiklik yapar. Aşağıdaki değişiklikleri yapmak istiyoruz:

  • (sh?|x|z|ch)$ -> ekle e
  • [^aeiou]y-> değiştirmek yiçin ive bir eklemee
  • fe?-> olarak değiştirin vvee
  • [^aeiou]o -> ekle e

O zaman sne olursa olsun uğraşmak istiyoruz .

Püf nokta:

  • CRegex verilen operatör, bir yakalama grubuna sarıyor; C`xyz`bir bayttan daha kısa `(xyz)`.
  • Tamamı aynı karakterle biten regex'lerin veya değiştirmelerin listesi, karakteri tüm öğelere dahil etmek yerine, listeyi birleştirerek oluşturulabilir. Bir Skalar'ı (string) bir Desene Birleştirme (regex / değiştirme) bir Desene zorlar.
  • Bunun yerine bitiştirme s(ve öncelik siparişi ile uğraşmak zorunda Rve .), biz sadece olabilir Osonra kelimenin ana bölümünde ıkış ve baskı sayrı.

Aralıklı ve yorumlanmış kod:

                  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 bayt:

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

Evet, yerleşik olan başka bir dil (referans eklemeniz gerekmesine rağmen System.Data.Entity.Design.dll)

Kullanmak:

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}");
}

Çıktı:

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

Siteye Hoşgeldiniz. Bu kodu nasıl çalıştırırım?
Buğday Sihirbazı,

@WheatWizard güncellendi. Bayt sayısına daha fazla ayrıntı eklemeli miydim (ifadeleri kullanarak vb.)?
RoadieRich

İlginç bilgiler, bunun tersi (Singularize) oldukça basit birkaç test durumuyla başarısız oldu. Örneğin, “kursların” tekilinin “kurs” olduğu konusunda ikna olmuş durumda.
Morgan Thrapp

Ad alanlarının bu bayt sayısına dahil edilmesi gerektiğini düşünüyorum, özellikle de 'normal' olanlardan biri olmadığı için. Fakat bence en azından bunu bir lambdaya sarmanız ve argümanı yönteme iletmeniz gerekir. Gibi bu sadece bir yöntem grubu olduğu
pinkfloydx33

@ pinkfloydx33 şimdi daha iyi?
RoadieRich

2

Python 199 187 176 Bayt

lambda s:s+'\bve'*(s[-1]=='f')+'\b\bve'*(s[-2:]=='fe')+'e'*(s[-1]in'sxz'or s[-2:]in('ch','sh')or s[-1]=='o'and s[-2]not in'aiueo')+'\bie'*(s[-1]=='y'and s[-2]not in'aiueo')+'s'

2

Raylar koşucusu, 18 bayt

$><<gets.pluralize

Örnek:

$ echo knife | rails r filename.rb
knives

Şimdi bu ezoterik bir dil.
Ven

2

Python, 296 bayt

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'nın doğrudan limanı:

Ruby , 111 bayt

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

Çevrimiçi deneyin!

İlk CLI argümanında ruby -lpeolduğu gibi bir dosyayı çağırın ve input.txtgönderin.


Muhtemelen daha 'golf' olabilir. Btw .: TIO'ya dosya eklenebilir mi?
stephanmg

0

C, 321 bayt

#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;}

Ölçek:

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;
}

Sonuçlar:

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

Öyle olmalı wolvesdeğil wolfves.
mbomb007

@ catcat "statik C r [256], / * Z =" aeiou ", i = 0, w, n;" "statik C r [256]; C / * Z =" aeiou "yerine, i = 0, w, n;"
RosLuP


-1

Java 7, 408 bayt

golfed:

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";

Temel olarak, Dize'nin sonunun ne olduğunu test etmek ve hangi duruma bağlı olarak harfleri eklemek / değiştirmek. Başlangıçta boolean ve String, yalnızca sınama durumlarındaki tekrarı kaldırmak ve kodu daha küçük yapmak içindir.

Okunabilir sürüm:

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
Bir snippet kullanamazsınız.
Okx
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.