You may be aware of the famous old rhyme, "I before E, except after C" . It is a rule taught to aid in the spelling of certain English words.
Quoting Wikipedia:
If one is not sure whether a word is spelled with the digraph ei or ie, the rhyme suggests that the correct order is ie unless the preceding letter is c, in which case it is ei.
It is well known that this rule is not always correct (e.g. weird, leisure, ancient). That is why you will be asked to write an algorithm which accurately determines the spelling of these words.
Task
The following wordlist (found here) consists of 2967 valid words, each of which contains either ei or ie as a substring.
The input is a single word \$ w \$ from the wordlist, but the ies and eis may be flipped (all occurrences of ie are replaced with ei, and vice versa). You are to output a boolean value indicating whether \$ w \$ was flipped. The values do not need to be True and False, so long as they are consistent. Your program must work correctly for all words, including their flipped counterparts (for a total of 5934 cases to consider). Here I've provided of a list of all possible test cases.
Note that you are not given this list as input. You must find a way to determine, for any word in the list, whether or not it is flipped but you cannot take the list itself as input.
Just to clarify, no word in the wordlist contains iei or eie as a substring, nor do a word and its flipped version both exist in the wordlist. As such, these ambiguous cases do not need to be considered. However, words such as friendlier or eighties which contain more than one occurrence of ei or ie do exist in the wordlist, in which case both occurrences are flipped (friendlier -> freindleir, eighties -> ieghteis).
Since this is code-golf, the shortest code in bytes wins.
As a side note, simply applying the "I before E, except after C" rule will be correct for 4954/5934 of the cases.
5 Answers 5
JavaScript (ES6), 338 bytes
A regex-based solution. This can probably be optimized some more.
Returns 0 (not flipped) or 1 (flipped).
w=>/dief|egh|etei|it?ei/.test(w)|/^(a?th0[rs]|d0st|r?0|h0r?[1s]|w0r)|b0[gt]|c0(l|t[es1]|v)|cl01|d0(f|n[1es]|ra|tie|ty)|0([aijop]|c1|[df]o|g[hln]|na?[fgor]|rlo|[rs]u|s[ahims]|tf|tm)|f0n?[at]|g0g|h0(fe|k|n|re)|ip01|k0n|n0t|no?th0|o0s|r0n1|rel01|rg0st|s0(l|ne|z)|t0n[es1]|u0n|un01|v0(l|n[1es])|yth0/.test(w.replace(/ei|ie/,0)+1)^/ei/.test(w)
(The total number of errors is reported in the Debug section of TIO, so you can collapse the Footer and Output sections if you just want to see that.)
How?
We first get rid of a few edge cases with the following regular expression:
/dief|egh|etei|it?ei/
which matches these flipped inputs (for which it's especially hard to tell that they are indeed flipped):
diefeid, diefeis, ieghteis, ieghteith, inhomogenieteis, pompiei, soceiteis,
wieghteir, wieghteist
Otherwise, we replace the first occurrence of either ei or ie in the input word with 0 and append a trailing 1:
w.replace(/ei|ie/, 0) + 1
We test whether the resulting string is matched by a large regular expression consisting of 23 patterns which are associated to words for which 0 must be ei.
Examples:
ath0stically1is matched by^(a?th0[rs]|d0st|r?0|h0r?[1s]|w0r)rec0ved1is matched byc0(l|t[1es]|v)mad0ra1is matched byd0(f|n[1ens]|ra|tie|ty)ineffic0ncy1is not matched by any expression
Python 3, (削除) 770 (削除ここまで) 642 bytes
import zlib,base64
A=zlib.decompress(base64.b85decode(b'c$_7UYjVRd2!yY)S5qWp)5uZ=uru!IySP90V_|rGMa^-E&VNdB;H1S_2f|8290;)j7yV7J%d^Wq23sMpSzu$qo;^u@D9IyHvE~Y_aZ`-##Ee}q7bO~)P3UUc!*KBGJAe35sGn4Dg*q$hg)r7k+@W(Z-3BEF?F-tdS^~S|4-B0443B>&x}e|ad5xF>_ITn*?1VMqLoI4vi7nBIZ6>m-KsG}&MdPkJnYWr$LA@PyH5$<?F;L6Jv~;{Uj}p&oDC6}95|fNJ')).decode('utf-8').split()
g=lambda i:i[:2]=='ei'or i.replace('ei','')in'dst hr hrs hst rn thr thrs thst vn wr brun lorel nucl taip'.split()or any(w in i for w in A)
f=lambda i:'eei'in i or'eii'in i or(not('eie'in i or'iei'in i)and(i.index('ei')<i.index('ie')if'ei' in i and 'ie' in i else('ie'in i)^g(i.replace('ie','ei'))))
Ungolfed
l = 'eigh ceiv eing eism eign einv reins reim feit veil seiz neit einf odu eird istic rna igl tera seil eiss reini heists tm rpr isu eip heik dece ceil feint herein fy ido eish nceit ucl rlo olt noe eio dri caf trad rote icat hein iress heife mr ji oly mad iru ifo eia egr cys alb uein reic onot nthe ndee kein isin isan inon iger code cave beig weirs veins veine seine reine deity deists atheist'.split()
def f(i):
if 'eei' in i or 'eii' in i: return True
if 'eie' in i or 'iei' in i: return False
if 'ie' in i and 'ei' in i: return i.index('ei')<i.index('ie')
# there now can't be 'ei' and 'ie' in i
if 'ei' in i:
return goodei(i)
return not goodei(j)
def goodei(i):
if i[:2] == 'ei': return True
if i in 'brunei lorelei nuclei taipei deist heir heirs heist rein their theirs theist vein weir'.split(): return True
for w in l:
if w in i: return True
return False
The basic idea is that most of the time, if 'ie' is in the word, then it's a real word. So the code first gets rid of cases where there are both ei and ie in the word, and then checks if the word (with ie's replaced with ei's) is a real word.
The way it checks if a word with ei is a real word, is it uses a big list of strings that are present in only real words.
-
\$\begingroup\$ Wow, very cool! \$\endgroup\$knosmos– knosmos2021年04月23日 19:47:21 +00:00Commented Apr 23, 2021 at 19:47
-
1
Python 3, (削除) 12,707 (削除ここまで) 12,219 bytes
(Thanks to ovs and caird coinheringaahing)
import zlib,base64
print(input()in str(zlib.decompress(base64.a85decode(b'Gar>nl]U9ZcgCa<oj+@,\'?AS1nH1b=o[Rk#ee2NMWifr*#`LJC+U"3NCT@F/s/+P^XUT5B[lgj.<d`u6:Hb_TF^sV:L\'l=S/;0*L>"WSdNO[-TSF4jrG//I)2&?mN5GuDk*e_R=A\\%t.fC[LC&pH#7g?%!p7&73\\!d/)tIu4%`Y7HlX^It/F:BMTia&e3ae-Y3celTM.]6\\TLJbPK,^(?D(X.bh5A<^KUa(%76YA)Ge/]f)J@<GsX^IT5JFBJrdM/`>?O\\s@r8]YHpbSR2r>cm]VXSSgK/Zfd@X&nGlV?=Za;Fbe`25!/?3&=j]p1R+)V1n;)E*3JF.qr[=S\'&8gq^@"Q@[FOkho\\c:Y["8!Bd3WhGrrf_@ljZA!urR#*n-Dk_NrTdje9\'sib*]PU(e+(4#jV""]]ETlM=WW*"Ch.CMkGjTT4/2.`W->F_\'mT%bif6o!R#Z3Uf&:B+Y)3]/1_;qR`U:C4X\6円a`F!SH0([s@:sK(F:WqD9-WH<X4BNZ:n_oZ8kVDYQF4/KO8`M-hXcF`91sguVcqPu6Y?"tmtm[0,s4iCjSct]$aAIm..-:5Ua7\\ic5P(@nFSX><:2WMT`H0ドルW\\Q:c7]jt_cku>!$?Npb^9)Z0;e.piJ.O),rKUfX2>`inD&g`+N4DYAKZdgXmm(7V2Z4m.D0Lp@!dD^7E4I3J0#9_=3%+okq^L.MmZ_P:r_DeM[(%<0O\\*)t%7h=3/Hr[&0NKe%]cI84G&\'t?f!^7:C*5(mc-j:.\\hntL!3F)\\Of$j@i&,V\'_J8RT!t#(LA]1@*iC!tUreuWF_(g.u#&Ick$-Q^^XH;`i7.n?jb@R)Z&(HNg\'nR=^K-B7m^:`!D3k;\'f#="T<ji_"Gj(o&>#c6>OYX;as*mHGT!bosZIKjC.:VKFk*]eo`ho@cp*B@%kZ6%6e3s@^iD&"WJ0iZ.Nh1\'`:[],ioN\'$U[pA6\'H>)"Ur.fq2OC.A_0#1HIS(Es<>pKWg1Q%he91<)E[j;WCqT?*qkkd210Dg@\\`K$n<c@d$.62f&kmPF6LknL+j+Tu0\\ME8aHfUCrC,R5LKpQjG68b%pZ4h]@0>I1rVoR9#QYpm>KgU<=5k[u7(a-sVPr8FtuUPj+OI?`$ST4@:`fhAe#&G6&0@;b[@)XAu`\6円K"7;o!ShB"P,L=\\eGCOZ7[,/#`YD4r]qM@lT3I/@I\']SFh@G`"_8phAlR>=0:%HK``NMT+!aeCWLt:m0VSGuO9-4Z:n"H+O;66\'ONYX^IA+Vd6*[email protected]`t#.e))J$n>a8)?PmQT4mb]Nq3c7\\h"c$lZtN(=:G%[9\7円aRC(u\'9&1oRP:V&iG\'Qi^Ii\'%lYO?eC"aIURS5k`UVO[$o!U/*o6J3nFOc=%bplJD\'BD=NE+@bS1j,KMFW%b\'B"VF*iX:r<:YP/RTsddE&QjCN5&6/P+4fHB*C)`"Z+a?*VIP3W0fIKgq<.`R%EAGoUSM5X_DI(D-aW()Ed\'*eS:(DE%?6Sf;/ADCianA>;WpGlZl!jYlC3()Th(t)4d"d]&9nG/]MT.&KbQdQDM0]Y6l<.\8円)am\\g87cG%QW2T,sH4Reifs#"<I>+R0-Pku_&(&uKo30PBM*/777Uj*WqKdE]4`dbsQ-XM>Sk>6O:tY6_lbFIG1=fN[dB\'_nj#[6%(K1X%AT\'85*L@AiJM>:OhL5!,P(uX%&r.6h)k&dK1U!4jCM!UMSY\\)PbWKb?6A1dn^>n;a\\E*Ud\\gh^GZaA_&J8aMi,MB/>HDm_$Aab9YD;MEN^S:nlYd\'$Gq@GZF*C<Ta$M0k`1_ZjfK-Q4LR5Pj+\\dGY%F``4i(5&nN>R/)D3\\`/k8o<h]&@\\>?p60(CFYHfYCc>6-5\\gbc_?M6nCS*oIB+CZVFEZ!oQ$Q1h^18/h()NRG_#bj\']jl?=nQ1CHeaG_;`?;@dq5XIV-rXauWBqqsQRr,/4AVi2?@>=,=&,tl[7R7XW=-2C?).&"[Af?Am:R3J.C$=sM"GF[)3PAQof&3pWnEJ!^=(DEK#AMV7dMc:Fn*`p04Q94O:`7o,J"Y`ZZDc;KS[a9K2[fE=nb*8ドルR)5[::<tLJNNsgE)fPBkXDN[_TU\\*05f-M3C3DlP$WFGe3Fb&V;c8=R$\\C(JCRPWkSE\\?"BnUOH90Ye72($T&_VNRkDqKQ&dM8ZqP@_k0T\\:[email protected];SKmBlp,boCO-opkB4\\q)1KqHbDZS(AQYEaSTH%h,VXr+.\\Q*u3)FC@LcTI`X*A07N\'\'^CcF`Y?B03B2%+1_Ea&+1^_F^%G5!O>*bQGA=bacuoSXk\\(bi[];g]<lo)i!?Z$o2KR*l>N]_V#S&LJO?R,s1TQ\'6!-NafDE@*f]kQ]m,S)aV9mCLtb:u`bOrg&+ejKM(GNu6"3SgUR6O34K^*s`fOkmpq[11JQ6RN1H.DQq%":?kIH-dF^U1%56nF.(TI$!ND`#TG_4rlS;\'_^]S-n[(PT6sBhN[Be9F*_0)mg*"s!I\'p4NUZ:8k-I68#Z,\'<1X<^VR\'COr;`r2lF4F"Rn[qT^#\'fU6^H!<ZfR]b:hN\\Lo=<l^%NCm%cVmbd49[AVpjTZi5#+<h\'1U!Mt;U(S1B[m0=dEpHT^*&X>U,7)PZ!4g*PWE97^jg.7(4M)Im/kQ4:T=aN^lt5#^P31HRTc#;!@#4,"9kpJ[iTI=:+mE<SU"KNIT;(R??MsaU^"DC+TE2]]Rl$R#ci:%iI3+%";0`ElEFYq.X#9ST^e&hH;`[H,g$p##O3fqV)GC#qQ2(],FY28Z8SHZ,%TDAPS2u4\\#K1hB_1YV^Qhj:(W=tR8X:l?lW\'`(I)`Hc$#/Gi7I#B6V8eQ2\'][Pf*:Zlq>dG6Uas1\\t-fsUY]!\'l`kdKd-\'<"C/BiWB/7#qYZ[C;ab?W>l8B\'VJ7Y<dB)o8H^=jaW#f2;97m`^RK[J?`MTG2RY\\.?;H\'Ag(j0#:qDmE\'m.R[6-grZ/l]-`7u(5KdE+?9Wo$tTQn[FK\\XoS?r=M,@6Kk!pNGVSo"1(\\L;l4IX]86od5S7WpHf]NNiZ1I+]hs;RAi0i*#1^%Hlj3XkKbkk:G>Mi"ruj5;sZNA^>kTX8ドルIc!\\J<Ed$*gf)Acmlf-0^O/Emn;0#X4q0(qgQ(LP5A`\\-br8KI5<\'BqG[s">sl]bX$Y<*e[5E=2Hia[*Fu(#1AqMLGnYe`l.BY/^/S0(Kj&UAdUrHN-J(OPt(*P\\liQ08k2D=2ドルhlUYV8W!)C_LuPBin*\'f0$#9:B"i7[M\8円nNtOm,?q&4BlCTIkDi?Dkqku6)q,M$I7pN5rC5nLO-2cR.s[]5^!a(L;gsU0a.:Xu/6?EJO&iQY%9]:Z<ZTZi-?O)EHt)tPob\\D5TR)f^Y3MfM`^;jol?M#XiXfclGJT(9got=_dcYp?@71Z,j0++8HDaHAPFSYV*i6s5Bhn\'EQ[@s(oMU$Dcf4CVanX%oqj[HMHm^IWm?RSCPclqR\'W7tHT8qY++^P@ma7Di\\;Dr\'IC:6Kpr^u!89k..b&AuISoK\'^W?k2K(WJ`mK$@%Bt%kUU#k8V8n^d3R6H0r=M4Hb`3IV+0E+Q>FqMI;j$KOn=`Ku3DJqHep7#0DTXqFJ2e?FV@6l\\X^g?mSY-q\'`6Y*Xr,qN^a?P9TR]DoLHc-m(r+i><($**i;Kms#KNK&E/2#/Jb,^,lgC3q(QSdps.u6J<@hXQTA^][a@U@6gY!QA,?/*@9A=&6,\'"4>R7Dl=,c_\\K#ON,aIp`\'Z?`Z4*Z-OP1aNN[9bk`j4JH6qRVYP+-EBq$D%CB9%QloHSO_m*O);K(Sh1M@5Co2[,A4<=D(/rC&GpZ*>Wt%OTWB*C0E_K\'b,gIt!0a1C*2rHk`UuL"Es1V9H1;f[%00NhT4n-?\\s*:iOl<&)Lu$nm<PV,Mc\'J12:dqj5i:;CU0H,o^d5Nii@fTQ8g^RZ,2:,A$E=5#!kRf5]#co\'.fUR6N?85CW`B4%;/!Xi1!*;Q1.+F1tZKs<TO9aB%O2B%[?s*St!S5&HNo(SGL9*U!pA"[)c3iS4\\#V[I]^>hC,OI-O4S&I4SFB0ドルr^n70?qD;7ドルuW7U&A`9ok_q)#ZLp^TV$-qlQ/e@!$r[g:0InNIJb$l#.;2`qaC2rJ1Mr"&JW)%80%D-1KtRYP;+RGR[O3)g#-\\LbbZX.e=igK-$.Tcu"(]e]/NIc1N_C6ZVIaf2[Un/>=(<#:HE$ZjP:lt"%ZT6\'nW5\'*^R",q5@#dH->lC,Wq7&7lZ6O6)9?2-NeD;(@W`P\'B#u?e42GAeRJ46<jm[@*N9uIWlKQK5U=l\'`MXeo]h9G3-3r:DTJ[9a]C0BLgZ`I_JVs,1ドル-><f[#uD)9HM[?.^gHY].@9W9SfsHDW-E4?)gHJ]KA9;%%5XdY5T##_]NhjS/f@uY$TqscN*\\-;@p+D56]6_+0485:>e<(YmBd[_p<59X_^)5di=5qm8Top/%K6ドルs`>:#;#"pqW&\\;YNdOk7E!I7qF!dRfqc"*]^1V\'2hfZTM>.7=^C\\L_Vr[K,B(1)2hmg#RFh@D;jL)9ドルhGMJPA784QUpCa(Y$iG1FT\'5Ap,R(pBZC=(Z0c9>NC5ドルTRh]-_;4)?EP"Jgpl`.HkIJA5$.p9]d",mrI)$=9?#=-MunVg9K!aZ,ENZE]&6R&,P9a44l8`MVt?0$o`#l(u(\\TfR/FoVBXDaiJ\'$aQLA7R@NHEiHBA<UTJ4\\)Go6ドルo4R(2_jJq/VX+oej=**:KgRXeoZeM.EK*b0>7cq^L5%pK_$me\\eK0AJiq$`Tc7B@";C,(h_63=.rOY^@/Hnk3Bj$Kje#SVflm?uNq%kWP,VSX;n=a^<T>9OTX*$!NE"F.AoZj_HfW8hM\\@!^`Wp\\bAsFL-gK3\'E]H[9s+.W<W*u\'9MT^BU,Q\\G"4U6FKB98OkPOHSf\7円/)q2uLqDk/mrf48>K2*<c7AtRL4BIK-U.\\X-p!=P@X6_2S/YDP$HKIr&<;5UJ)"T>\\%%@9<p-b=>EEl<J)X8ergVu#c:0<1hXiRL<P"fTK[\'?!5G/fXBbUoF?kfraa<ksFAoAWDKqa@Q4gqE"*,"+jqF#;[7oOsa^!4\')pOp8]c/Jg?ART(:1`tQ<RpA?Ifc@`pH0+_<E;jN6dd[aN"UFh\\[<=<\\:Xg;e(>-PeR`-!1(2raU!;E=OoW.\'bRJI,@\\fAM%N3rqufB\'Xn=h3>7G)c#cgGhO"[j2U.pr\\eY\',&RM<>fKdlQ2WZA>OX34;\\bhW:l;UCnY>t<Eq4)D(<L4J_2_9:`YV?<1*@!^Nq#)p:p\\mOJl75tHgmu5+O]&qfE&BLW:e)e*rk8@Uo_BCBI#ebQZA)&UQ:Bh\\o5b.3WDJH,Ar.L^hDVi5CH9g2[;XQ+N*oG&/PlUaP-++nikEmO_S6V5AW0L)V&i:=?9==Ktf1(lS2S`KN`M>\\PkD#.Q@X0XRXJ!7#\\\'inP!DMki3[/^BQqHLVZNQ1q^l$Mbin`_a<\9円h(65\\F\\#feI;"s)Dm*KRl;\':EUO%@=FHGmZo"*E*2*NRJ)FOt-W4Q>7OO0^(]EcLtS4I#*R)E>jLbT5g&X:>;Hh9&K/ILL6UNHR4<:0ドルrdG/.J?t?K1\\qAJ,&F7qe68tOEPj)ru09!8CIA9d+<oP+@88:lJ2gGkaA@4TI]!9*%FFBi&J,IYm$)B$L9N\\bc0UAl1iE#q*_,KJ,O.Q8@`>b0H:OjJ@58d>jaE1fFfA+]Qr4+NG3:M0+q0t`Qs)Y`nm%G_8o#_i-:q/`R-loWFeao3C.%M-c?N.:BpUau3df6[@!U55dNf7NZO>5kMMqW2>+krku0&`;@`VB_QqMfAagVcpome@%8m%>;FN](d%D,Uk[gD%*2D0cYPr\'_t-Am:^ORW\\\\^%p=9XK"Y?#gj:/%5M^ku\'9Z>Pq7A6`W`^tUk!7W+!T0X-)q"@1+(To0j4=9jI4SJU&:,K1$oAnNO0-_I>Oq/:$T4,j(oXn9Q:aF9"#HWq/(Xao4?Hi\\q2*a`;O@EMb+JV-,he&K<n\'1qH37SQ5L:p3m1ドルU8j&k)a[E6c)pF.OR[eg4#PGOc&N!WjRkH!eAK(Z4W3,POKcNMN"^S<B)"_Pq[90\'3bo.kPYDH+q@;<.1c7kQ<!?Otq.3TT3G+U/GjMh4$j*Ei$(Z0u(KGkPUYi\'-SE@V&8p\':>8&hpGC<LGa#18@3ドル*Z<[^)4)Ft%fDrAG0?08_rN48=+T.N298=k)fP8JpA,Jo;CCh?G:\\X*$Z(:4p`rJ!p0*ergAO=G\\mqU;\'Yb3$C\'>dp]kK+G>fX_+S*;$U+j:I!dbL@-)`a.0k)pg6Y_,.G8aa/o$e\\D4*6&&I8"!hVf,HAu#FOa!jH@-9iJbk$$fRd+hJ9IfZ:Y]=mgs_9,:DO!F3fgiGYU/bHX#H:d#RZG[9D4rbmW7;;l#:]c\\NSoZA;]%9G?\\]nG=7PW4.3\\i-i6L\\$]mM\\omt*"9(:HJ&#=KpCfe<8cT:(`Xl,I:YdX1;?$(8G_q0$<CRf`LSCHI,iJJM78/l3@?aM78T\\VXg&3B_=3V\\g+k4Zf[h!W3o4B9%L#fiaHYE^DGpY0a2^\\<-=+mM5:r=d3X&YRQLO#H&LY!$tLauhnUHJ:dWk^=Trel,*nbU8mT?lj>!gdZ*S3%.QHD<ra4>2O*,Z9=U-cal^f+\'uCGI23BoNDV96KoJ*/nM74a?ubdHcdt(-B*_0q6beER]qG)[W"IZ+?7tK+m=)lsb!@2,.*MY-`p8(j0qI[rL,!q3OnR"LbD8Y3_f.^oJ4d<]ameZiF$V[+i.\\.@e]qo?Ymk%%Yr`3=bW`^7HpZ^92"!&%+5BjU-J6?KRUhI5aWB?nr\9円dL%i@VZ"OI[p]b`&`/DYgBq]4I!3+@6nn0O"sHC/r-c`D"e?Xt0jlhNhdT=$I="2Tf3%%5aR^(+lO3DKg%Wd33XD[%`6i@XI_@lo(f$t-.]I3IDb5;IZ\'%Qc.G#cn7$d62^Z_PE61WB)e57RF\\F*gp@SaE\\ZcS3n#.A9-L#$hEeiJ;5e<.u#\'2iuSFDeKOT&YSC5]M4EhtB5e4G*l18@>m.?RK"r;-@/9LDh>&DnVK_<uCeDXg?\\n6F<PI@oE)\\a4dlT$"ok6cMh`J#($:s5O:V1(Db+#Mtnh(Rp)bLY[J"AFHKs`QMR:eIo"X,-Co^ss.er^Ep,U/NL:l\\l3JHld._AnAfl3Yrb<*R(8J>Q3=G\'Asl;T;ZUZ4OtN\\M.=lG[qXD48+K>GASPbqMsu66D\\%*!jCZ(a8fTWT&+XP%GPQFW3*Z5IaL^O()eANW@?q9l!`C*6P!sZ:-^+%<O>aoDQP&0O>`2AK&6W[,rdAP*h82rgAnW\'.M8rikj0T9#`C1p_8cRAS`H!BU[B`f#eh*?c7<Eob,33$`af4[!t*M-F8!N5H@\\o:.c$g>c!mnhpZA0*pH>$RHN#q@1ioON%s)7l92a@/a*<I_]`gLu1-t0%A.Sj347\'i8X;\',SXnL8.]94Nn8S;.g":`C\\KrW%<kp2`t&/Gq>)hcLRaIbql;tj4q\'Ki#RQ7Hkm3q[k1O(3@-HkB_+,Y%IgI""K<?0HHL.jFe5S$^(#_6STe0!YI-_Y74_jfX[P]d?gV/,gX$\'kZV]N<#6"J6<_pp9RZ>s/To[p.$D\'c2A@(\\Lq^3lUKbD6K>YRc9l)\\=6!Ooic/?J6,2TAcp[kZ@NRJ(!DKnFgF^P>VPfEH/Q+T^??h3mi9YW=F3sqeM8\'_//a\'78htROe&g$_&d=o)ifIA-p9<t1(>no&?k^[<KC4n\\XOY`GXceNEFYR78Xc_1+tG;8BWB4cq=QIM#L5FYV=Y<F3GqECNte0M2(\'5CX_$.Y"JVd9tc/M*gr?6b;YeC!&[(EAMsj9a4VM,Un#j#il/m&$WRduo*U!C/CYqZGEbhRX^H(D^Td5MI"H#G<In6g\'?X?g@]=]PGlSXoB7/kWLE<[cE0]Yi[\\`EkaLCKtM?_=afT-Z4K3/_a]JkpT\'LMJS6;%6=sMD7Nq?UpL&rsTt8%t5LY%r2.W:tA)R?`SL49gq]q<ILs:eVMqgK@j!u8lNRJ%Q,W8U*qQU\6円O2^<[/oKSJC6d;pI@+"fW"p3I`(kUakrp\\r&P",Y@N,o\3円J,USGu`2d=a]]\\Zn0\'L^d3RV&]P$&i%j:h-u^Gd:\'+t=6rjX)r:],Bc@-r"GTGsd)(1FE>!Of`[/h+hOgFr<3%>&r\\TBQC3ドルkn.Boq<8!3-*^kE2GO&W(%LH+76X`i#N-@$ZX04Aj"%Y^6`n*XXR5"&lVE#?X&;]1aU#@JVNR8JGY2-rW:Ho[,f/JP%\'\'%Q[AD3KK@"9rs3Wk?]Mr>SQeLRL\'<e7+o2Kre)!;7HtIPDnRIe@]H.ma3PN/i)Lo`J;%X`9:SF(E>G+D%a[7ZM*pR)+&WnG%5FMK%(=0,ni/%5MRW[bqMLWDFD(__#BPUKHe:$J(;6jZM]r%t7n>4?J,S5s/[FYk>0mec(I,?gK*?tlECubA.6*A5iNAMqV#ejDhGGF=LD7s%muZ6"C3AGg,EP\'>RLhQsB.NNeT$;8IMVhDf&G&FI\'9`1dL\0円RIF7LugZ4`0f\\p*[72D$iF4Q(Ja:=at;E"o/Oe"5i0ドルQ>H!21LaN*-o_jWc^_g.SIZrJ7&5G7>q#CD&O(siQZV\'PIN!TMOS^F*S4K;n1)#M;c<K:r\\p9A";s3Yd4_ZDfnoN_W[%14]&>A06iIg=p$+-UE9(F11B9/*%Tlq*4X8@fQYB-#>Hc0#]\',`5qPHAlX]GkV=d=g)CFO:C3"NNBr$@Ep$r.,/3tLU^8R&EAs!;Pi/_C[f]SiH70ドルFp>s"+,s!JPNkYc-0Dl34&16l+$\'.AQ/[GVFIR<#mF#;9TYTg]CG!#K(*i65@4j,>52gp`@639"l4a=Z]W8VXE*NBKag-lEd(nT/\'G]6VK!4W!"hD3O\'$tbB/<,""#\\:6+0,pq`:HnYG=@@N]%[5jlRB[B47snO9O_1VCuhA[EYq_M3Z?cgnIbG(^/$\'3\\-.fjlqEnHHT`g0!_Y<?C>;&-P&<3ZVErdH+o1t\'\'Zj7XBKLh);aa]ibl5go2!<aI]L?\'-RI\'0Pg!DB??0"YJsTN3GC^T=oACo\',q`USh*muAd.V_,WPmbm6@Cua1?qpYe`hXm9%@-t]QFn!JDI=b#;T.7;b&IK;/2k&6Z-*jlj0.-E!<s"F.=SUELNOq-_D%GC(-GDeEOOh`<@!chP\'iS^rA&>@LID;l5d?-3++R98W.u2eSRGKe?Q49@W,n0QGca5J.mtoES*Q3m@SqIJST!,_+puQ4%9A!O=K>j?+jTbW3""`;DkVCWk<eUWY\'p9A5p5bWHBDNI$L1<2)a3&2tt[1p5MC#gQLGo,sg)\\W8VXEW\'IOeh?U.]qG-6`eXZY$M;3]_"8O+sIAo(80(tbGbQnSC7,q"m?ZYlAYdeQSWp+:1Y&6gUFct<j^ugH0,K-La4bVB[hK/dZG1`lCrh;=NZ7c1NF`Mp$i%pHd4L#04!#A?P2ドルe5u:U#l#mtA._TaR[h#JlU4"n7U*b-/&$@#M71]S<\'2&i5&Mo42n:A-k:$i2+LN?S\'OnAiO]Pi6B>e`4]Su%VQB8ZMlQM_AOgDKc\'A]ke&Fcs4U1]\8円g:*Mb1rD=]gQ:G%f`"(O.5/1IA>EJ[R)H^86ife1YRO:5Z8tBEE.PWSp`RH)@FXR?m<bLjY!Dr^H>ph,HH\'K*f!@,i\'hP(C_q]0s1uO$?se,rbVbAQMk<WZNP)+5:He(5V),\\QNV7"j6@EjKLgW-&\'.Xb#nC6+@&B.3F9^3;\'KrN#&S\'jZ)M($l%gLTEcsQZ)rjm*\\"Z#53=SIiG#p3R\\cFRs"&!/N,Qo#:6Z3#;nIWK^91#eu$B:*BQ39pe?@F\\j:[_:kF/(:0150O>,o)=.XLDO`\2円[t:c)Md/L*8@:QYQf,S5NO"Ur%_#Tj*1O+RPP/$$u\\$/?C1ドルP((.ehC^pJ9[_LS?N-P6ドルFb]rHVs8FI>>LW9TnVAo4pha$"uo.5jICMh8b7UD*d?5c\'=-p7ffpX*i6JBR-CJjL*0AA+U\\Dinmb9uZ6-G92D;Aln5sT+CbY)2.VjF*^GlrX=/JHL`c$*MfLLcb0Q=..gBGrIJ5U?u:H,;<j,PGNOQaZQ.jma7,nS2nm\\>hiE%L-juGYoB@-cL!I2uj=2<n!P!&6\\"t\\l)iWcn1l@_1.5_[\'mJMPn4fB2t/;>;J\'KqDATA>@VoE;FG:c32f*KKLqp-ZloJ(#Yp9sV7\'7iM_.U5PB;$Z_DQ_!hg(RG,@ZBD"TEq<>?+77^"<,V=N$iGUce$Z^*REkIr`DIG+"O;fZ%@;hHT_>D20(Pa\'ND6(C93l(<(;.L=(G\')0i7,57fs3T!\'Lq0*,n\\G^#J=@)OJ2GZF0:WlDsZ$NX+5%H\\*n0O<o3KL&D"ug%7l@!]0X+q<l`(n0:DSitn1!5I#jq-?KV#RT5hX\\n2=4ea6#l&DQpPd#t*b)]+/_.+*q-7&Qgq\\^>L4K0gXn)BB&e3"@kFV\'9ea2;Q-:&NUs,gbi4L*Q&YsdJ_Wp-R0jBJ]Dj(c0cg\\#EIDEqfrIafXTK\'>O.Xqh^%_k\\fpNHK]KG81u353kO?Gh]QadY)Bf:KW8%6sG/Ia)mbMsA^@0aqI_C9*8tQ""Wo??UX&hPbes^q]2uHKYj6hj.S_tH:!3aB1h`9+XWec%\\C\\V>-nMb;!j3\'GtQ84d/U4upYE4J4>G+O;Vfalg%6`#J?@:a*Rao:+<#W?5A0\'er9b_[b)](>2ESQ@^?)Y3e9Z@W[Y@%@`7R$P!geM9K]X;a6:)tqAV0=ljO^Ec)XV9Z_N#KWL%qp230gWS3>K%E-g@=nVX3PU>6J?p".=p=oiQdc@b<,R9s"J[YL&@V]*i#W$_eLJ@8YOjioD:q7j&ghgn3U9ZH#8^tu+FCr1hC_tkm#6ドル_KYd_QWd1?8cU5N5Y=51a9!o-%NtT4`emN;-7)/-_jq8cWReGoTpNBLFohY7;lWPntZAVFNch%W1F/`^M4j30dkP)JIj#_Q+i]N^u5(&@H_^)<d5ドル($_,oD!,fCAP2.RFX"QSRsJ5,mQ4p%t0[#7m3\\\\k,j%l,%Zc_sPUu_$aq,]Ro-(6@mpI\'Nk4f>6BR)A\\;Y+BWIu>Z@pSg$s.q#!`?>:"[l+*?bplD(Cj]j(FTDePa0c[h?J?J_oBlB%#=8(TPGC<Z\\R"88jj!_0pCqe>:.tL>sAL:GK9"d4?SQ>?3B$sf279`?A;K==EUfW1p77?l\'TPmXIGCV%os%2qP*=;6M]*:*AcP9L3]<eYQ-FbM2deiZCe#eY]EX4QiA21JeCk,Vl9g[`H$R<\5円r0EN[k$]+m_8K#(;?Nr(j*R*)5>Zm!)6K.O)&FXtP3WLXZ\8円Z#K4r0"OBa_Pc#5_#,UZ3emN&oh,!&0Wtl87+;<R_67\'l@:pO\'0#,gM5ASq&$)hsqUOaW25ri7Aq@_UKhJeIB`X_/+=kFNaDD0\'UqX+<2`8a#pGF;p8ドル\\mdgl-"kpiU?(4X>AT_U&i*=J8OlS]Xq(H>P21;<VIe\\#EbLW?MQe_N6CP@QE[7"oX>CSYjcp:7=Ug#9jN.B9I`er^:Dc;T[;p"`_Aj>hEUZ#K@tSgb+b5ドルGsV1o^]!Y^Mn7fQGJ(iK+m<QkQs&/p\\<V2;RqZ]oFZ4dGn8juc?0\\!?Hm)o-!P9Qg0X>EleK"HLN#hWqrDlD7X5@&:;I>R(\'8#\\`H)`VE8>KD:1?5WNN[L,QHYDKKi>4Khp;\'\,円`\4円"a\\kt\\d!89R2VOme\4,円[]<0U9A#XEejmIIe<=3sMK>XGLkc<I+2;b\'SgTjT$j16pT$C.i9s-^#Q9&GNM[6!]cIr,lhX.19:ur>cdigjUUL;W0\\J;m$m]8J.Qe;p?egMoI1lcW=NdEO4YORd)S")Q+d)jW"8hSIj_2g^Nm<37m3*(rssg.bO,'))).split('\\r\\n'))
Searches for the input in a compressed string. Definitely could use some improvement.
-
\$\begingroup\$ If you're willing to switch to Python 3 the
base64module has the functionsa85encodeanda85decodewhich should encode the compressed string a little shorter. \$\endgroup\$ovs– ovs2021年04月23日 13:56:00 +00:00Commented Apr 23, 2021 at 13:56 -
\$\begingroup\$ Ooh, will definitely take a look at that. Thanks! \$\endgroup\$knosmos– knosmos2021年04月23日 13:58:34 +00:00Commented Apr 23, 2021 at 13:58
-
\$\begingroup\$ You can remove the space after
input()and you can get rid ofaentirely by moving the compressed string into thebase64.a85decode(...)\$\endgroup\$2021年04月23日 14:09:29 +00:00Commented Apr 23, 2021 at 14:09
Jelly, (削除) 439 (削除ここまで) 418 bytes
×ばつ3‘FḃØ5ịØJ)"»jⱮVŒl;"þðxiṄḂÞẹṅŻÞÑɗðṁṙGm3L(ẉṇ/yƥɠỵỊ£nżsCμ®ỵ)ọȧƇẏƑtNgŻỊ+ẈɓỤɼʂrƓėɓẓøb6^ḍḃ"vṂỴ÷ƭVṖẇƥƑ¤æⱮẆẓ6円SNḌ|¢YỤṘ(r&AμwƓTṃṭṚHẇ¶(ȮçðṁÑLẉṃı-ÆẸbCṄ¢ɲʂ§ȦS3ịẆu(ạİ*ṁ©ß¬ḌZɗẒ¦ṫṃÑ+ṬẠ1⁄2ṠȷḂðȧç)xḥẹ)ẒɗJL·ḍʋƲṚɠ_yỴ9円j6ḥḍƘḥÇ2Hƙṃ8Ụ°ṭ1Ḍṭñ9Ẏ2ẈḍyẇƇ[ṃİḅ)μỌø§}UḳỤḷCs4ṗȤ7ȦĠƲżḤ,:ṡÑjb`AOẓḷỴƲY1⁄2;ẹ5£ẈṂQ:Ṁ1ḋ4q+£Ø3ĖĊȷ#4&¶C)ÞẒƲṾı0"ɲFɠðƁḊḅ8yṪÐnŒN§i2ȧ2ẆƈUỌỤḟ\2ドルƁj3ḥ-ƤṢṆƑġ(ṫƥG_BẈṇØ_¬ñẹ)¤rl·ḍƑʂỴḞ`71ḤdƘbọzi3©E»Ḳ¤ḟ"ßGW€)×ばつɓƲ9»Ḳ¤;;€"s$$e@
A monadic link taking a string as input and outputting 0 for incorrect and 1 for correct.
Takes advantage of the dictionary in Jelly, but has to add some additional non-dictionary words as remove a few that are in the dictionary.
Slow when used repeatedly because the dictionary is generated each time. Now generates the dictionary purely using Jelly (rather than calling Python code directly)
Python 3, 3384 bytes
import re,zlib,base64
G,H=["".join(map(chr,zlib.decompress(base64.a85decode(x)))).split()for x in[b'Gar?3CQa?!%"PP@eS)db*<_:.:\\C<.o7j7C6bYeu*^[Y=?7CpeN&,$aRJ0:HPcnf*]g<auqG$d6NX]:OM9:<gI?X".<gEtbcgB8TRe!nBg,QG?+FR.jgR`H-nMCOR(e>rR["sGCjjaHAkSMe#S]7`d73cUEKGOh0hl2pKYh+5uL\\N-U_#nCoV!Dn]i(Q,eK,+?HhOW>JC)p>Tijak_Zn+`5f=0ドル;nGHbL_f=\'$`a:$T7_OX<Shd8l!7b%tP0%Ca%EsK[K.D6*G9+4ok-($\'"@GfPTLm1qq/`Ng/`he.\\W#pb1=;,UbtsJ!mMu"_#,8u-#u9"8:V\\Qg+BRUsi\\I@q0M]HZPpiFCGJ\8円FW6X:[`_+F4d&@J>(lq.H\\=*5;,hgaR[k]T2]1Rp\\a-,#+!D(]`V6ngIXVEo[b1EAp/oa9W01K?jh[PutO\,円u7I(Lf<eUumH](R80*0g:F0SJgfbLoJ&),suqDE[@b9]9JK?C2Z%JR0O&\'b_\'a*O\'`T)R$D+YcR5#ajGD90U[SdCR9ZQE=$.(<.c9J5+dXM$m7ドルO%JL1tbd/&L#7o27Y$(YOfMf0AXVu#dP^2D4>nb/VI8O3Yk5(bO->Cn[lmE@8qBRa?Q_/fgN=GT)VcCR>K7*]gh^!b:\\&rB7,?"A4TbEKfNI4D$a3Q4ドルUj;90/;t%J)prQ8.\'`JrngCEmQ#_Kc/EpPL3QC\'<)<M94XZ!jQ-Ba-7YZ5!i/mn#1PKno<nW*lQV=ej4=-#8deA%3T3b^#8itGakSRs9Zh\\oft&1CD_8!^sl]aZE@0l67;)</Z*:T!E1618bG(=\'--qUSQ9&=qU<qRoP=0o!9qXl)Zu95g#FPcp(`ObVg%fj&aD)(!W>_e;3X:NlKP=]$J]SaM2YQp_T6D3?>i]jSEW0\\n>u".42mgD$]bl/=YZ:Fc>:l$WA!cKq!H]B.m%\\JN6X_XF!A`JGDf$<*GF)W8IY,noam.PulpDVb0+g*Hc(F+CiWcM-tJEDb6AZr[3A4Mi!M03m*(eg\'R"MFi:nPN#!"ldT=B\'5[k)7h,]H^A"98l&QHYc!2PCUcodJ&F]\'c-EX]D4D^FQi^BDp^&e`!oBCWt4(#Md5)5.G!I+-;q1"CXPA1kSoG/O,.3)Cm(?MaGN:3b`Ir$#Fhb]9ocE+b&e\'SGUK875er=4`9$t88ドルIcGKKf@:T/"*fu#Y5e_H\'!@)f$H7k[\\D#(Bn-1D5""[UKP>=Pp2+t*f%p:H\'mu[<\'8Jss=&\\ruZ+A!B?8o2;)5>n(&Zk>gAShfpM%R8H%\'MdR15ij\\V\'pQ6hY;e,!\'^!EU]nLjp2279lb+!=&N+mAQr.Z*[51.mGC"H8Nd\'q/2p&36W5?%F3LA\\EG"G-uL2A_)W+"<LW11ドル\')W]`nF3j4RAp1[4\\<T-!@Y7O/%[0IqGWhGi;&\\md!P)eU_0@qG8YF[!<jk6R+92]\\!*NJiXOR\3円/1=O(SFFo4Lo8.?Y8mU.+^\\UuBD470#QK,2:O&@=TkaX@u?ThROp^b8oPYum?;&T?RIc^2##=h)G=T',b'Gar?3D3D9-%YhI0enDmc1C=o6T\'Bt]-f6WNro(SC+[AH2pk"[T&6X$/kR+0#Pp"$:<UpE8*$p5Qfd=]0r0dfJ($g\\-DoqHX"Dmq[<;qqFU@ngBcNda:nENe3ドルGbrY%W)2:T9=!BBIN+!"T]%-MA7_:,K=CuO+acF<*M:"ZRX6raW>liX.3aKVg7EY^"t8&`$]m?*_<=V?[(fJB>X0[XQ[:gm``qReR:<]Ngog&d^$?2L$afoV>6t#`I4Z[NP@q,Mg?&iT6!oT!,AK^Z=u)X#3J7i_+a:-,ZS6kpH2\'Kb[2gL\'jk70pQfK9ifD2P^$of:Ks52p-+W?q^_secPW0X`$HN2mF\\!rWld2OE45/#a7;7p%<Ut!u<^e]eH7"l:754g<@*"bj]Cm@>Od5bgGD#C^[GFL5LalMbmh16n3IYec$e\'`\'3>.01"[?[W[!.f^FjN56.R;-2V#T_1__\\*V)d<Eqg)a:Tep1Al=m0\\hEf_b\'@0HP=O*4D<>`hOgjq+/RH;6B3eUgV<_@F+MmC+jup-IB3qboF[<IZP2\'*bT4M-Bk7kE?_CC@##6S?\'Oe\'FPa[e_\\RsU_S*V>7Ni-P]*3P9:oRa,R$e*:2+XrOHsl7k;g#,;V/Tm[4kFJg#Bit21)0KW\'aL0H\\*5-+?B*d?q="@,/0Jp?u\'sm%Ep["rNEk*J\\D-7A:Pn(qTZ8YO/n8G:BJS_,c\\dFl!%L3+#Jq6>Pgj9Ef[.`=oGLddQ*<B!#%[kCZ6ft1O?I_o[\'!s:2W=qS2i3/mHKgpL@=Af"k08p\\UiG/04ESla]b5mPd]V=?_<<i.\'eP]B,a6B6g^!m3+-Mh$=F:9I=*]\\n^*N"3oNd$GV:,`&.j8h.8NK0mR[<5B>u[G)X_e.rplB3-3G,m)hfLG_[Z1ImZIr-cjI[(4jR2QpVn;6.YLPeaurGG77eTC\'Y9l1h9Mm8B9N?i3m);oe^F(N8j58&A\\HQY(OC?aHV:lhD?lGURWUg=j@&3X\'QlKp\\f=-ef*`B^Ss1R.FABA(]f!TZGpaEsc71Z*>415C_V-::HZO_K`Qn4.L!sLEF0f\'KC[h[Gb*:_FFhW"ES%IZ\'\\E-:rU<Rga0[5G4!nU:g6\7円<8XiQ!NZs)$[JjSnC5ooJd36t03XZ%;e-DiWI-_^j(TsoD1J\'=JP+7DCKNh6\3円q6BL?*bnJc=j58tH7Yq4=q+Sm^MRS12oYT&e+i]i@^P:Ag/`JW1kO]E+n3*na/(3nce,/.n[bcH21sWa4PA475XC0Y3RP9%Bd,O>^,-&lk4=XuLC/j3nGO1s>V[T)ZBRqVMm2)\'MG$QsTIN+7Soa,o*Id2sK9J65&PsLF=@##-D]);C-&&o"^VE0"E^<.U*K&J!L]t980_G&tpej2ドル_PLJ@DniaRN`P$JIE>"!C^g-s0a3.9\\ns&.!O$"AY7fQ?nl35I5BS"f:[QW!`iJ)Wj\\UaWs4Z"j?.I?X`//sE5-iYYDnn#<_0\\IXpm?Lf+*)mPq<B9b0;S""IZ3P0C(5#"$Dfh84Y:oa.p;bc5EUOFh#\\q71Dt=\\<qq]h)XF.9g1iVX2s<h*Za("A-g@ZZlNT#b/F\\.MQl9c']]
f=lambda s:s in G or(s not in H and re.search("seil|ie(?!ng|sm)|eing|eism",s))
You could probably save more bytes with a smarter regex. Basically, just a tradeoff between longer regex and shorter encoded strings.
G is the list of true cases, H is a list of false cases. s in G or makes it so if it's a true case, it gets marked as such. s not in H and makes it so if it's a false case, it gets marked as such. If neither is true, then it is checked with the regex /seil|ie(?!ng|sm)|eing|eism/. Finding a longer regex to match even just like 3-4 more words is certainly worth it, I just didn't want to spend too much time.
Explore related questions
See similar questions with these tags.
iegot5036 / 5934score?? \$\endgroup\$(?<!c)ei|cie) \$\endgroup\$eei, (e.g.agreeing) which when flipped will yieldeie, which is explicitly excluded from the cases? \$\endgroup\$