g | x | w | all
Bytes Lang Time Link
24205AB1E250326T133123ZKevin Cr
272JavaScript ES11250319T201131ZArnauld
244Charcoal250321T140201ZNeil
427Retina 0.8.2250319T234216ZNeil

05AB1E, 242 bytes

«.•8›ĆвÄXÀÅœ“à«„Ω-›¿ιDΉ‡§e,“Õεõ0rsúõηeвñ‚øj™üº∊$ŒÄL¹</gþkeµåΘ∍CôÆζ₁[’ùΛŽ{4u†ΔNÒв¥ÆмvδTº69-5'õí]¾)@Lø1λт”ù˜)j¶i~»ë¥ζÑтöÚNz≠µæιåK‚∊…ì´dŸÐ°&G†ãoáÅÕ&/-/
ºržŒγ¿’©ýIÒ6 é sÄðø<{šä—¢<ìʒ“®d₆O‰Œï¾PÉη–7ý=«¡ðÌÂVγøζ³$UºÙ´¯γ‡¢üÓĆàOûð³αηεÎΩn„Γ6ÒOнćζÅ•#åà

Uses the same substrings as @Neil's Charcoal answer (but in a different order), so make sure to upvote that answer as well.

Input as a lowercase pair.

Try it online or verify all possible input-pairs, and output the truthy ones.

Explanation:

J                # Join the (implicit) input-pair together to a single string
 .•8›Ć...ćζÅ•    # Push compressed string "agpol araspa atarat batgolb belectr byki degole degra dlebee dlekak easead elde enseak fwi geypid hearc hurai idra iebut iemet ingweez itemagn kesl keypr kgoldu lderclo lygen lyha mermu natveno nderchar nemar nsarb olten opmac owfe pixnin raal rakad rannid rewsa rnrh rpgy rycle shgl shvil thpe tlebl tlewa ttdu uodo uri urvenu uteex utokab utvic utweep veefl veejo veeva ytarap yteom yust zeehy"
             #   # Split it on spaces into a list
              å  # Check for each whether it's a substring of the joined input
               à # Check if any is truthy by taking the maximum
                 # (which is output implicitly as result)

See this 05AB1E tip of mine (section How to compress strings not part of the dictionary?) to understand why .•8›ĆвÄXÀÅœ“à«„Ω-›¿ιDΉ‡§e,“Õεõ0rsúõηeвñ‚øj™üº∊$ŒÄL¹</gþkeµåΘ∍CôÆζ₁[’ùΛŽ{4u†ΔNÒв¥ÆмvδTº69-5'õí]¾)@Lø1λт”ù˜)j¶i~»ë¥ζÑтöÚNz≠µæιåK‚∊…ì´dŸÐ°&G†ãoáÅÕ&/-/\nºržŒγ¿’©ýIÒ6 é sÄðø<{šä—¢<ìʒ“®d₆O‰Œï¾PÉη–7ý=«¡ðÌÂVγøζ³$UºÙ´¯γ‡¢üÓĆàOûð³αηεÎΩn„Γ6ÒOнćζÅ• is "agpol araspa atarat batgolb belectr byki degole degra dlebee dlekak easead elde enseak fwi geypid hearc hurai idra iebut iemet ingweez itemagn kesl keypr kgoldu lderclo lygen lyha mermu natveno nderchar nemar nsarb olten opmac owfe pixnin raal rakad rannid rewsa rnrh rpgy rycle shgl shvil thpe tlebl tlewa ttdu uodo uri urvenu uteex utokab utvic utweep veefl veejo veeva ytarap yteom yust zeehy".

JavaScript (ES11), 272 bytes

Expects (basic_name)(other_name) in any case and returns a Boolean value.

a=>b=>![..."9j3d3j691h49rr7gdabrugya26tc5d1791sq33wik08owshl8nhmbop5kke8192vn0dh0eg1"].every((c,i)=>t-=P(0x1EDADE626F3F245CFED654A58CBEFn.toString(3)[i]+c+"kxg6q0uyou5kuyhgqaqaoi9nb81ntr78epq33wxx9p2wtze18rqhuyu6hu1xuq3a97ypfrdb"[i]),P=n=>parseInt(n,36),t=P(a)*P(b)%86629)

Try it online!

Encoding

This version stores the delta values of the ordered products of basic and evolution names interpreted as base-36 strings and reduced modulo \$86629\$ (a brute-forced constant).

The delta values are encoded in base-36 as well. Because the first character is always 0, 1 or 2, we can save a few bytes by re-encoding them in base-3.


JavaScript (ES6), 357 bytes

Expects [ basic_name, other_name ] in any case and returns a Boolean value.

a=>"yhifg9It2a25Loab1uBo7v7tK69z5aTeie4kLzc7QhobOxkjX8jpPn59Eoeab66h1eYl92D86aBfacDv7lWvrb26Su38Cr4xGi5iNjedFo24SraeJrgaNeiw3tV8uq5pTqoooiVq8p2xFb6tQf8i7eEwccYmc0Gs0yTn9yU84sG29tKci4Gbau8qLt6yTuapDs10G64nWcegR85xZkfaEyakXp1oJv17U916Megm410vSmk1WxgcXg3n2v".split(/(?=[A-Z])/).some(s=>a.every(x=>s.match(/../g).some(v=>P(x,36)%3226%1289==P(v,36))),P=parseInt)

Try it online!

NB: This actually tests whether all the names passed in the array belong in the same line, regardless of whether one of them is basic or not, which exceeds the requirements of the challenge.

Encoding

Each name is reduced to two base-36 characters by applying the following formula:

parseInt(name, 36) % 3226 % 1289

Example:

parseInt("Bulbasaur", 36) % 3226 % 1289 --> 1241 --> "yh"

Pokemons with no evolution are taken into account (to avoid collisions) but are not included at all in the final lookup string.

The modulo values were chosen by brute force so that:

  1. all results are distinct
  2. all results are less than \$36^2\$ (no more than two base-36 characters)
  3. at least one value in each line starts with a letter once converted to base-36 (i.e. is greater than or equal to \$360\$)

The 3rd condition allows us to start each group with an uppercase letter and use this as an implicit separator. We can split the lookup string with a look-ahead assertion:

"abcdEfgh".split(/(?=[A-Z])/) // --> [ "abcd", "Efgh" ]

JavaScript (ES6), 434 bytes

Expects (basic_name)(other_name) in title case and returns a Boolean value.

Much of this has been hand-optimized, so it's probably not optimal.

a=>b=>((A="BlsIVnar/Ca../SuWrBa/CtMtBt/WKkBe/Pd/Rt/SeoFaw/EaAb/PkRi/Sn/Nd/Ce/VlxNn/JgWg/ZbGlt/OdGo$Vll/Pr$Pre/VnVno/Dg/MoPra/PyGlc/MnPi/GoiAc/Pl/Ar$KdAa/Mc/BlWeneVc/Tnc/GoGalGl$/PnaRp/So[or]/MgmMgt/Dd/Se$Dw/GiMk/SeCo/GsHuGn/DoHp/KaKne/VlEer/Ee[cu]/CbMr/KfWen$/Ry/HrSaa/GlSan/SaSai/MgaGad/EvVpJlFao/Oa/Kb/Da".split`/`.map(s=>s.match(/.[^A-Z]*/g)).find(c=>(g=e=>(a[0]+a[2]+[a[5]]+[a[7]]).match(e))(c[0]))||[]).slice(!!A[1])).some(g,a=b)

Try it online!

Charcoal, 244 bytes

⊙⪪”}∨¿Dê»∧³S⦄OZ⁶05ÞMs⭆Wm‹⊗4↔|ês⟲Π*³↧7↙μ″W↥6‽YkλOGQ↧ξU≡⮌5e2Ys&ψêb_�Iρ*;NXι↖9x≕;kiΦ▶WνNb⁸T8ψ↨JE)⟦″k;⬤﹪*d⧴↓⊟⊟ⅈd⁺~V⊞sV⎚γ⁹uR⊕Tη∨↷8νT§o×μ→h⍘V&βtκ"k-↘…O_aN⎇χw¿_ω⬤▶ⅈB±·u▶⁼wu⊕αx_v↓T⪫Lφ↖¤✳?‹G«O1P⦄‖RΣ≕↥S$✂S⌈X÷≦jG‖{C¬'ω~-×…I↔8§E…σq∧Nβ⊗i№⊘⟦Z<&Ic6⊘ξC↷”¶№⁺θηι

Try it online! Link is to verbose version of code. Takes input in lower case. Explanation: Simply checks through a list of the minimal substrings which only appear when you concatenate a valid pair. The list has been reordered slightly from my Retina 0.8.2 answer as this reduces the length of the resulting compressed string. (There may be an even more optimal reordering but I wasn't going to check every one of them.)

  ”...”         Compressed list of substrings
 ⪪     ¶        Split on newlines
⊙               Any substring satisfies
         ⁺θη    Concatenation of inputs
        №       Contains
            ι   Current substring

Retina 0.8.2, 427 bytes

ea,Sead|ra,(Kad|Al)|ata,Rat|yta,Rap|b,E.*d|de,G(ra|ole)|vee,(Va|Jo|Fl)|zee,Hy|he,Arc|ie,(Met|But)|ke,Sl|dle,(Kak|Bee)|tle,(Wa|Bl)|ne,Mar|ite,Magn|ute,Ex|yte,Om|f,Wi|ag,Pol|ing,Weez|sh,(Gl|Vil)|th,Pe|i,Dra|k,G.*k|el,De|ol,Te|ran,Nid|en,Seak|rn,Rh|uto,Kab|uo,Do|op,Mac|rp,Gy|lder,Clo|nder,Char|mer,Mu|ur,.*sa|aras,Pa|ns,Arb|bat,Golb|nat,Veno|tt,Du|ut,.*be|hu,Rai|yu,St|rew,Sa|ow,Fe|pix,Nin|by,Ki|gey,Pid|key,Pr|ly,(Ha|Gen)|ry,Cle

Try it online! Link includes test cases. Explanation: Matches the end of each basic stage against the beginning of its evolution(s), except for Voltorb (matches Electrode using E.*d), Psyduck (matches Golduck using G.*k), Bulbasaur (matches Ivysaur and Venusaur using .*sa) and Bellsprout (matches Weepinbell and Victreebel using .*be).