การสร้างคำศัพท์ยาว ๆ


17

ความท้าทายนี้คือการค้นหาคำที่ยาวที่สุดของคำภาษาอังกฤษซึ่งอักขระ 3 ตัวแรกของคำถัดไปตรงกับอักขระ 3 ตัวสุดท้ายของคำสุดท้าย คุณจะใช้พจนานุกรมทั่วไปที่มีอยู่ในลีนุกซ์รุ่นลีนุกซ์ซึ่งสามารถดาวน์โหลดได้ที่นี่:

https://www.dropbox.com/s/8tyzf94ps37tzp7/words?dl=0

ซึ่งมีคำภาษาอังกฤษ 99171 หากโลคัล Linux ของคุณ/usr/share/dict/wordsเป็นไฟล์เดียวกัน (มี md5sum == cbbcded3dc3b61ad50c4e36f79c37084) คุณสามารถใช้มันได้

คำสามารถใช้ได้เพียงครั้งเดียวในคำตอบ

แก้ไข:ตัวอักษรต้องตรงกันทุกประการรวมถึงตัวพิมพ์ใหญ่ / ตัวพิมพ์เล็กและเครื่องหมายเน้นเสียง

ตัวอย่างของคำตอบที่ถูกต้องคือ: idea deadpan panoramic micra craftsman mantra traffic fiche ซึ่งจะได้คะแนน 8

คำตอบที่มีคำที่ถูกต้องที่สุดจะเป็นผู้ชนะ ในกรณีที่เสมอกันคำตอบที่เร็วที่สุดจะเป็นฝ่ายชนะ คำตอบของคุณควรแสดงรายการคำที่คุณพบและ (แน่นอน) โปรแกรมที่คุณเขียนให้ทำ


มีวิธีใดบ้างที่อนุญาตให้โหลดข้อมูลเหล่านี้
Hacketo

คุณควรดาวน์โหลดรายการคำจากลิงค์ดรอปบ็อกซ์ด้านบนจากนั้นประมวลผลด้วยโปรแกรมของคุณเพื่อสร้างคำตอบที่ดีที่สุด
Logic Knight

สำเนียงสำคัญหรือไม่? แล้วคำที่สั้นกว่าตัวอักษรสามตัวล่ะ?
KSFT

คำที่สั้นกว่า 3 ตัวอักษรไม่สามารถตรงกับกฎการจับคู่ 3 ตัวดังนั้นจะถูกยกเว้น ตัวอักษรต้องตรงกันรวมถึงตัวอักษรเน้นเสียงและตัวพิมพ์ใหญ่ / ตัวพิมพ์เล็ก
Logic Knight

1
การวิเคราะห์กราฟของฉันคือมีองค์ประกอบที่ไม่เชื่อมโยงกันอย่างรุนแรงเพียงส่วนประกอบเดียวและเส้นทางที่ยาวที่สุดในกราฟที่บีบอัดมีความยาว 6 โดยพิจารณาจากลำดับขั้นต่ำสำหรับแต่ละคำที่มีสามตัวอักษรของคำใน SCC โดยมีลำดับเป็น คำนำหน้าและคำต่อท้ายฉันได้ขอบเขตสูงสุด 4655 รายการในคำที่ยาวที่สุดดังนั้นอาจมีห้องมากมายที่จะต้องปรับปรุงในส่วนที่ดีที่สุดของปี 1733
ปี

คำตอบ:


9

Java ซึ่งเป็นฮิวริสติกนิยมจุดสุดยอดซึ่งก่อให้เกิดกราฟที่ใหญ่ที่สุด: 1825 1855 1873

รหัสด้านล่างนี้ทำงานภายใน 10 นาทีและค้นหาเส้นทางต่อไปนี้:

[wad, wadis, dis, dismay, may, mayfly, flywheels, elsewhere, erecting, ingratiate, ateliers, ersatzes, zest, esthetic, tickled, ledger, germicide, idealizes, zestful, fulling, ingrains, institute, uterine, ineptness, essaying, ingeniously, slyness, essences, cessations, onshore, ores, resoundingly, glycerine, inertness, essay, say, saying, ingenuous, ousted, tediously, sly, slyest, estrogen, genuflecting, ingestion, ionizer, zeros, roses, sesames, mes, meshed, hedonist, isthmuses, sesame, amending, ingredient, entrapment, enthuses, session, ionosphere, erectness, essayist, isthmus, mustaches, hesitatingly, glycogen, generation, ions, onset, settable, blew, lewder, deriding, ingratiates, testicles, lessen, sensitization, ionization, ionizing, ingratiating, ingenious, ouster, terrorizing, ingest, estranges, gesticulating, ingrates, testis, tissue, sue, suede, edelweiss, issuing, ingraining, ingrown, owner, nerdiest, estimation, ionospheres, rescue, cue, cueing, ingesting, ingot, got, gotten, tensor, sorrowing, ingratiated, tedious, ousting, ingratiatingly, glycerin, ringside, identifiable, bleariest, ester, terminological, calibrator, torrent, entraps, apse, pseudonym, nymphomania, niacin, cinema, emailed, led, ledges, gesticulates, testicle, clement, entail, ail, ailment, enter, terrains, inspires, restaurateur, euros, rosiest, estimates, tester, termite, iterator, torture, urethras, raspiest, estimator, tore, oregano, anointment, enthuse, useful, fulfil, filmstrip, riposte, stereotyped, pedicure, urea, readmits, itself, elf, elfin, finagles, lesbians, answerable, bleat, eatery, erythrocytes, testosterone, one, ones, nest, esteemed, medicine, inextricable, blessed, sediment, entry, try, tryout, outsources, cesarians, answered, redressed, seducer, cervical, calumniates, test, establishment, entombment, enthusiastic, tickles, lessens, ensemble, blemishes, hesitant, antic, tick, ickiest, estimable, blemished, hedgehog, hogan, gantlet, letdown, own, ownership, hippest, estates, testates, testiest, establishes, hes, hesitates, testable, bleakest, esthetes, testament, entice, iceberg, erg, ergonomic, microscope, operatives, vestibules, lesser, serenade, adenoidal, dales, lest, estrangement, entrap, raptures, resourceful, fulsome, omen, menswear, earthliest, established, hedges, gestates, testy, styes, yeshivot, voter, terrible, blender, derides, descent, enticed, cedillas, lass, assailable, bleacher, hermit, mite, item, temperas, rash, ashtray, rayon, yonder, dermis, mismanage, agendas, dash, ashy, shy, shyster, terrapins, insatiable, bleeder, derives, vestment, entangle, glen, lengthens, ensconced, ceded, deduced, cedars, arsenic, nice, ice, iced, cedar, daredevil, villa, llamas, masseuse, use, useable, bleach, achievable, bleached, hedonistic, tic, ticker, kerchieves, vessel, sell, ell, elliptic, ticket, kettles, lessee, seeps, epsilon, longboat, oath, atherosclerosis, sisterhood, oodles, lesson, sonatas, tassel, selvage, age, agent, entranced, cedes, descender, deranges, gestures, restraint, interment, enthused, seduced, cedilla, llama, amalgam, gamut, mutable, blend, endear, earthy, thymus, mussel, seltzer, zero, erodes, despot, potful, fulfillment, enthrall, allot, lotus, tussle, sledgehammered, redolent, entrapped, pedestal, talk, alkalis, listen, tended, deductible, bleeped, pedigree, reentered, redistribute, uterus, rustproofed, fed, fedora, oranges, gesundheit, either, herdsman, manes, nestles, lessor, sorrowful, fullback, acknowledges, gestured, redoubtable, blended, deduces, cesareans, answer, werewolves, vesper, perseveres, restructures, reside, ideogram, rammed, meddlesome, omens, ensign, ignores, restrains, insolent, entanglement, entrenchment, enticement, entomological, calligraphy, physical, calico, iconoclast, astringent, entertainment, entrant, antennas, nasty, stymie, miens, enslave, averred, redefine, inexorable, blenched, hedgerow, rowboat, oat, oaten, tend, endears, arson, songwriter, terminable, blent, entreaty, atypical, calypso, psoriasis, sister, term, ermine, ineligible, bleaker, kerosene, enema, emancipator, tormentor, torrider, derailment, entertains, instil, tildes, destine, inelegant, anthropomorphic, hiccup, cupolas, lastingly, glycerol, rollback, acknowledgment, entombed, bedridden, denser, servicewomen, menopause, used, sedatives, vesicle, clearinghouse, user, servant, antipodes, descry, crystalline, inexpedient, enthusiast, astonishment, entirety, etymological, calendared, redbreast, astronomer, merinos, nosedove, overpay, pay, paymaster, termagant, antiaircraft, aftercare, ares, resentful, fulcrum, rumpus, pushcart, artiste, stethoscopes, pesetas, taste, steadfast, astride, ides, destitute, utensil, silvan, vanguard, ardent, entryway, waysides, despair, airdrop, ropes, pestered, redder, derangement, entered, redeemed, medullas, lasagnas, nasal, salsas, sashay, hay, haymow, mow, mowed, wedder, derringer, germane, anemic, microfilmed, media, diatom, tomboys, oyster, terminator, toreador, dorsal, salespeople, pleased, sedater, terabit, bitten, tentacle, clergyman, manifesto, stomach, achoo, hoopla, plaza, azalea, leaven, vendor, dormant, antiparticle, cleared, redraft, afterword, ordains, insufficient, entitlement, entomb, ombudsmen, men, mental, tallyhos, hospice, icecap, cape, aperitif, tiffed, fedoras, rasped, pediatric, rickshaw, hawker, keratin, tinctures, reset, setback, acknowledgement, enthronement, entwine, inexact, actor, torpedos, dosed, sedan, dancer, cerebrum, rumple, plea, leach, ache, cheaper, per, periscopes, pestilent, entreat, eater, terser, serape, ape, apes, pesky, skycap, capped, pederast, astuter, terrace, acetaminophen, henchmen, menopausal, saltcellar, lard, ardor, dormice, icebound, underbrush, ushered, redrew, rewound, underclass, assassin, sinew, newscast, astrologer, gerund, undertaken, ken, kens, ensnared, redcap, cappuccinos, nostrum, rum, rumored, redraw, rawhide, identical, calcine, inertia, tiara, arabesque, queerer, reruns, unsold, oldie, diesel, selectmen, mentored, redden, dental, talon, longhand, and, androgen, genome, omelet, lethal, hallucinogenic, nickname, amen, menhaden, denudes, despaired, redevelop, lope, operas, rasp, aspired, redskin, kindergartens, ensnares, resultant, anthropological, callus, lustful, fulcra, crammed, mediocre, crepes, pesticide, ideas, eastbound, under, derrières, respired, rediscovered, redundant, antihero, erode, ode, odes, described, bedevil, villager, gerrymander, deride, ideograph, aphid, hid, hides, describes, besides, despoil, oilskin, kingdom, dominant, ant, antipasti, stiffens, ensured, redeemer, merchant, antiwar, warped, pederasty, stylus, lush, usher, her, hereafter, terrapin, pinnacle, clerical, caliber, bereave, avenger, geriatric, rickshas, haste, stereoscopes, pester, termini, initiator, tortures, restorer, reran, ransomed, medulla, llanos, nostril, rill, illogical, calif, lifer, fervor, vortex, textures, resister, termed, medieval, valor, lord, ordered, rediscover, verbatim, times, mesdames, mescal, caliper, periscope, opera, erasures, restart, artichokes, kestrel, reliant, antebellum, lumbago, agog, goggle, gleeful, fulfill, illustrator, tor, torque, questionnaires, resumed, mediator, tort, orthodoxy, oxymora, oratorio, riot, iotas, taster, terrific, fiche, checkpoint, interloper, perfumes, mesas, sassafras, rasher, heraldry, drywall, all, allergens, ensnare, area, rearm, armchair, airman, manufactures, resurface, acerbic, bicycle, cleverer, rerun, runt, untidy, idyllic, lichens, ensures, resend, endemic, microchip, hippopotamus, muscatel, telecast, astronaut, autopilot, lot, loth, other, heros, rosin, single, gleamed, mediaeval, valet, lettered, redound, underside, ideological, calliper, perihelia, liaison, sonic, nicknames, messenger, germicides, descendant, antigen, genital, tall, allergen, gentleman, mangos, gossipped, pedicures, resistant, antlered, redeveloped, pedagogical, calligrapher, heroins, inside, idea, deafen, fen, fencer, cerebra, bravuras, rascal, calculus, lusher, herbivores, resins, instill, illicit, citric, ricochet, heterodoxy, oxygen, generic, rice, icebox, box, boxcar, cartography, physique, quell, ellipsis, sis, sisal, sallow, lowbrow, rowel, well, elliptical, calf, alfresco, scow, cow, cowboy, boy, boyfriend, end, endeared, red, redesign, ignoramus, musket, kettledrum, rump, umped, pedlar, larvas, vassal, salmonellas, last, astronomical, calfskin, kingfisher, hereupon, ponchos, hospital, talisman, mantel, telethon, honcho, chomped, pedant, antitoxins, instant, antipastos, tossup, superintend, endangered, redskins, instigator, torpor, portico, icon, conquistador, dormer, merganser, seraphic, hiccuped, pedagogue, guerrillas, laser, sera, eraser, seraph, aphasic, sickbed, bed, bedsores, resign, ignorant, anthropocentric, richer, herdsmen, menu, enures, resuscitator, tornado, ado, adobe, obeisant, anthill, illegal, gallon, longshoremen, menace, ace, acetylene, enemas, mas, mascot, cot, cotton, tonsures, restores, result, ultraviolet, letterbox, boxer, xerography, physiological, calmer, merchantmen, mentor, torus, russet, settee, teenager, gerbil, billfold, old, olden, denatures, resubmit, mitten, ten, tenon, nonchalant, antique, queasy, asymmetric, ricksha, shanghai, haircut, cutups, upsides, descriptor, torpid, pidgin, gins, instep, tepee, peeper, perturb, urbane, anemia, miasmas, mascaras, raspy, spy, spyglass, assures, resonator, tortilla, llano, anon, nontechnical, calabash, ashram, rampart, arthropod, podia, diagram, ramp, amp, amphitheatres, resistor, tortillas, lasagna, gnat, natal, talc, alcoholic, licensee, seemed, medical, calm, almanac, nacho, choreography, phylum, lumbar, barman, mannequins, insures, respires, resound, underarm, armatures, resides, desideratum, tumult, ultrasound, underdog, dogcatcher, herald, alderwoman, mandarins, insecticides, desires, respirator, torrid, rid, rides, descant, anticlimax, maximum, mum, mummer, meringue, guesser, sermon, monogram, ramrod, rodeo, deodorant, antelopes, peso, esophagus, gusset, setups, upshot, hotel, telescope, open, penicillin, lingos, gossip, sip, siphon, honor, normal, maltreat, eaten, tenet, nether, herpes, pesticides, descend, endow, downfall, alleyway, way, waylay, layman, manicures, reshuffle, flea, lea, leash, ashen, henchman, mandolin, linchpins, inscribes, bestow, townspeople, plectrum, rumbas, baste, sternum, numb, umbilici, icicle, cleaver, vertebra, brains, insouciant, antidepressant, anthem, hemoglobin, binocular, largos, gossamer, mermaid, aid, aides, desperado, adopt, opt, optima, imam, mambos, bosun, sun, sunspot, potpourris, risky, sky, skyscraper, perturbed, bedraggle, glee, lee, leech, echo, choreographer, heraldic, dictum, tumid, midday, day, daybed, bedsides, desktop, topknot, notepaper, periodical, calendar, dare, areas, easel, selfsame, amebas, basins, ins, insulin, linnet, nettlesome, omegas, gasp, aspartame, amend, endures, researcher, herbal, balsas, sass, assault, ultimatum, tumor, mortgagor, gores, resort, orthopaedic, dictatorship, hipper, person, sonar, narc, arc, archduke, ukelele, elegant, anther, hereabout, outfox, fox, foxtrot, rotogravures, restaurant, antechamber, beret, retriever, verbena, enamor, morsel, sellout, outmaneuver, vertical, call, allergenic, niche, chessman, mandolins, insipid, pidgins, install, allures, rescind, indignant, antithetical, calicos, cosmonaut, auto, utopia, piano, another, heretical, calk, alkali, alibi, ibis, bistro, troupe, upend, endorser, serviceman, mandarin, rind, inductee, teepee, pee, peekaboo, bootstrap, rape, apertures, resin, singular, larval, valiant, antiperspirant, antipasto, stop, topical, calisthenic, nicer, cervix, vixen, xenophobic, bicep, cephalic, licit, citizenship, hippopotami, amigos, gospel, pellet, letups, upstart, artificer, cerebellum, lumberman, manic, nicknamed, medic, dickie, kielbasas, sash, ash, ashcan, cannon, nonskid, kid, kidnaper, perjures, resolver, vernacular, larkspur, puree, reefer, ferret, retains, insofar, far, fart, artisan, sandbag, bagel, gelatin, tinsel, selectman, manacle, clever, versus, sustains, inscribed, bedpan, pandemic, microprocessor, sorbet, bet, betcha, char, harem, remodel, deli, elicit, citadel, deliver, verandas, dashikis, kisser, servicemen, menthol, holiday, daydreamer, merchantman, manikins, insane, anew, newsprint, interwove, overreach, achieve, even, venom, nomad, mad, madrigal, gala, alarm, armpit, pitchman, manor, northbound, underbid, bidet, detox, toxemia, miasma, smarten, tenderloins, insult, ultra, travel, velvet, veteran, random, domino, inopportune, uneconomic, microbes, bestir, tiro, ironware, arena, enamel, melodramas, mastodon, don, donut, nut, nutmeg, meg, megalopolis, lissom, sombre, breathe, therefrom, romper, performer, merman, mangrove, overshadow, downcast, astir, tiros, rostra, trachea, heaven, ventricle, clergywoman, maneuver, verbal, ballad, ladyship, hippie, pie, piebald, alderman, manatee, teethe, thereupon, poncho, choicer, ceramic, microscopic, picayune, uneaten, tendon, donor, northeast, astound, underpass, assessor, sorghum, hum, human, mantra, trainee, needlepoint, interplay, laywoman, mannikin, kinsman, mantillas, lassie, sieve, ever, verdigris, risen, sensor, sorrel, relabel, belabor, borsch, schlep, leprechauns, unsnap, nap, napkin, kin, kingpin, pinkeye, eyeglass, assemblyman, manikin, kingship, hip, hippos, postpartum, tumbrel, relic, lichee, heehaw, haw, hawser, servicewoman, many, anyhow, howsoever, vertex, text, extra, trap, rap, rapper, periwig, wigwag, wag, wagon, gonorrhea, heave, aver, vermin, minesweeper, perplex, lexicon, congas, gastronomic, microfiche, cheapen, pentathlon, longhair, air, aircraft, aft, aftertaste, stem, tempos, postwar, war, wart, article, clear, earshot, hotshot, hotbed, bedlam, lam, lambkin, kindergarten, tenser, serum, rumor, mortar, tarmac, macabre, breech, echos, hostel, telescopic, pickerel, relay, laypeople, pleas, east, astronomic, micra, crackpot, pot, potato, atom, tombed, bedbug, bugaboo, bootleg, leg, legato, atop, topple, plethora, orangutang, angora, orangutan, tan, tandem, democrat, rat, rattan, tang, angry, gryphon, honeybee, bee, beeswax, waxen, xenon, nonplus, lustre, trellis, lisle, sleepwear, earwig, wig, wigwam, wampum, pummel, melanomas, massacre, cretin, tin, tint, interviewee, wee, weeper, persimmon, monsignori, origin, gingham, ham, hamper, pericardia, diarrhea, heartthrob, rob, robes, besom, sombreros, rosebud, bud, budgerigar, garret, retrodden, denim, nimbus, bus, bushel, helmet, metaphor, horsefly, flypaper, peritonea, near, ear, earlobes, bestowal, wall, allay, layout, outlast, astrakhan, handicapper, perusal, saltpetre, tremor, moribund, undercut, cut, cutoff, off, offal, falcon, con, consul, sultan, tannin, ninepin, pinball, allegro, grommet, metro, trot, rot, rotten, tenpin, pineapple, plectra, transit, sitar, tar, taro, arousal, salmon, moneybag, bagpipe, ipecac, cache, checkout, outrun, runaround, undersea, sea, sear, earache, cherub, rub, rubicund, underpin, pin, pint, intagli, glib, lib, libel, bellyache, cherubim, bimbos, bosuns, unsound, undertow, tow, towel, wellington, ton, tonsil, silicon, concoct, octet, tetrahedra, drachmae, maestri, tripos, possum, sum, sumac, macro, crocus, custom, tom, tomcat, catsup, sup, superstar, tarpaulin, linchpin, pinpoint, intercom, comet, met, metacarpus, pussycat, catastrophe, phenomenon, nonverbal, ballpoint, interurban, bani, animal, malt, altar, tartar, tarot, rotund, undergrad, radio, diocesan, sandbar, bar, barren, renewal, walkout, outstrip, ripen, pen, pencil, cilantro, trout, outran, rancor, corncob, cob, cobra, bra, brag, rag, ragas, gas, gasohol, holdout, output, put, putsch, schwas, was, waste, stereo, reoccur, cur, curb, urban, ban, bantam, tam, tamp, ampul, pullout, outwit, wit, withal, halo, alohas, hasp, asparagus, gusto, stove, overlap, lapel, pelvis, visit, sit, sitcom, compendia, diadem, demigod, god, goddam, dam, dampen, pennon, non, noncom, compel, pelican, cancan, can, cancel, celesta, starlit, lit, litmus, muscat, cat, catnap, naphtha, than, handcar, carpel, pellagra, grammar, mar, mariachi, chichi, chi, chimp, imp, impel, pelvic, vicar, car, caribou, bourgeoisie, siesta, stab, tab, tabu, abut, but, butterfat, fat, fathom, homespun, pun, puns, unsheathe, the, theorem, remove, overtax, tax, taxicab, cab, cabal, balsam, sambas, basal, salamis, missal, salt, altho, tho, thou, housebound, underground, underclassman, man, mannikins, insectivores, resonant, antelope, operator, torn, ornamental, tallow, low, lowered, reddens, enshrine, inefficient, entertainer, nerves, vestiges, gesturing, ingested, tediousness, essentials]

แนวคิดหลัก

ในการประมาณเส้นทางที่ยาวที่สุดและรอบ Bjorklund, Husfeldt และคันนา, บันทึกการบรรยายในวิทยาการคอมพิวเตอร์ (2004), 222-233, ผู้เขียนเสนอว่าในกราฟแผ่ขยายเบาบางเส้นทางยาวสามารถพบได้โดยการค้นหาโลภที่เลือกในแต่ละ ก้าวเพื่อนบ้านของหางปัจจุบันของเส้นทางซึ่งครอบคลุม subgraph ที่ใหญ่ที่สุดใน G 'โดยที่ G' เป็นกราฟดั้งเดิมที่มีจุดยอดในเส้นทางปัจจุบันถูกลบ ฉันไม่แน่ใจเกี่ยวกับวิธีที่ดีในการทดสอบว่ากราฟเป็นกราฟที่ขยายได้หรือไม่ แต่เราต้องจัดการกับกราฟที่กระจัดกระจายและแกนกลางมีจุดยอดประมาณ 20,000 จุดและมีเส้นผ่านศูนย์กลางเพียง 15 เท่านั้นจึงต้องมี คุณสมบัติการขยาย ดังนั้นฉันจึงเลือกใช้ฮิวริสติกแบบโลภนี้

รับกราฟG(V, E)เราสามารถหาจำนวนจุดยอดที่สามารถเข้าถึงได้จากแต่ละจุดยอดโดยใช้Floyd-WarshallในTheta(V^3)เวลาหรือใช้อัลกอริทึมของจอห์นสันในTheta(V^2 lg V + VE)เวลา อย่างไรก็ตามฉันรู้ว่าเรากำลังจัดการกับกราฟที่มีส่วนประกอบที่เชื่อมต่ออย่างยิ่งใหญ่ (SCC) ดังนั้นฉันจึงใช้แนวทางที่แตกต่าง หากเราระบุ SCC โดยใช้อัลกอริธึมของ Tarjanเราก็จะได้โทโพโลยีแบบเรียงลำดับสำหรับกราฟG_c(V_c, E_c)ที่ถูกบีบอัดซึ่งจะมีขนาดเล็กลงO(E)ตามเวลา ตั้งแต่G_cเป็น DAG เราสามารถคำนวณการเชื่อมในG_cในO(V_c^2 + E_c)เวลา (ฉันได้ค้นพบในภายหลังว่านี่เป็นนัยในการออกกำลังกาย 26-2.8 ของCLR )

เนื่องจากปัจจัยหลักในเวลาทำงานคือEฉันปรับให้เหมาะสมโดยการแทรกโหนดดัมมีสำหรับคำนำหน้า / คำต่อท้าย ดังนั้นแทนที่จะ 151 * 64 = 9664 ขอบจากคำที่ลงท้าย-resคำเริ่มต้นres-ฉันมี 151 ขอบจากคำที่ลงท้าย-resไป# # ละเอียดและ 64 ขอบจาก# # ละเอียดคำเริ่มต้นres- res-

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

รหัส

org/cheddarmonk/math/graph/Graph.java:

package org.cheddarmonk.math.graph;

import java.util.Set;

public interface Graph<V> {
    public Set<V> getAdjacent(V node);
    public double getWeight(V from, V to);
}

org/cheddarmonk/math/graph/MutableGraph.java:

package org.cheddarmonk.math.graph;

import java.util.*;

public class MutableGraph<V> implements Graph<V> {
    private Map<V, Map<V, Double>> edgesBySource = new HashMap<V, Map<V, Double>>();

    public void addEdge(V from, V to, double weight) {
        if (!edgesBySource.containsKey(to)) edgesBySource.put(to, new HashMap<V, Double>());
        Map<V, Double> e = edgesBySource.get(from);
        if (e == null) edgesBySource.put(from, e = new HashMap<V, Double>());
        if (e.containsKey(to)) throw new IllegalArgumentException("There is already an edge between the vertices");
        e.put(to, weight);
    }

    @Override
    public Set<V> getAdjacent(V node) {
        Map<V, Double> e = edgesBySource.get(node);
        if (e == null) throw new IllegalArgumentException("node doesn't appear to be in the graph");
        return Collections.unmodifiableSet(e.keySet());
    }

    @Override
    public double getWeight(V from, V to) {
        Map<V, Double> e = edgesBySource.get(from);
        if (e == null) throw new IllegalArgumentException("from doesn't appear to be in the graph");
        if (!edgesBySource.containsKey(to)) throw new IllegalArgumentException("to doesn't appear to be in the graph");

        Double c = e.get(to);
        return c == null ? 0 : c.doubleValue();
    }
}

org/cheddarmonk/math/graph/StronglyConnectedComponents.java:

package org.cheddarmonk.math.graph;

import java.util.*;

/**
* A helper class for finding the strongly connected components of a graph using Tarjan's algorithm.
* http://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm
*/
public class StronglyConnectedComponents<V> {
    private final Graph<V> g;
    private List<Set<V>> topologicallySortedSccs = new ArrayList<Set<V>>();

    private final LinkedList<V> S = new LinkedList<V>();
    private final Set<V> S2 = new HashSet<V>();
    private final Map<V, Integer> index = new HashMap<V, Integer>();
    private final Map<V, Integer> lowlink = new HashMap<V, Integer>();

    private StronglyConnectedComponents(Graph<V> g) {
        this.g = g;
    }

    private void strongConnect(V v) {
        int idx = index.size();
        index.put(v, idx);
        lowlink.put(v, idx);

        S.push(v);
        S2.add(v);

        for (V w : g.getAdjacent(v)) {
            if (!index.containsKey(w)) {
                strongConnect(w);
                if (lowlink.get(w) < lowlink.get(v)) {
                    lowlink.put(v, lowlink.get(w));
                }
            }
            else if (S2.contains(w)) {
                if (index.get(w) < lowlink.get(v)) {
                    lowlink.put(v, index.get(w));
                }
            }
        }

        if (lowlink.get(v).equals(index.get(v))) {
            Set<V> scc = new HashSet<V>();
            V w;
            do {
                w = S.pop();
                S2.remove(w);
                scc.add(w);
            } while (!w.equals(v));

            topologicallySortedSccs.add(scc);
        }
    }

    public static <V> List<Set<V>> analyse(Graph<V> g, Set<V> sources) {
        if (g == null) throw new IllegalArgumentException("g");

        StronglyConnectedComponents<V> scc = new StronglyConnectedComponents<V>(g);
        for (V v : sources) {
            if (!scc.index.containsKey(v)) {
                scc.strongConnect(v);
            }
        }

        return scc.topologicallySortedSccs;
    }
}

org/cheddarmonk/ppcg/PPCG.java:

package org.cheddarmonk.ppcg;

import java.io.*;
import java.util.*;
import org.cheddarmonk.math.graph.*;

public class PPCG44922 {
    private static final String path = "/usr/share/dict/words";
    private static Set<String> allWords;
    private static Graph<String> fullGraph;

    public static void main(String[] args) {
        loadGraph();

        Random rnd = new Random();
        rnd.setSeed(8104951619088972997L);
        List<String> a = search(rnd);
        rnd.setSeed(-265860022884114241L);
        List<String> b = search(rnd);
        List<String> chain = spliceChains(a, b);
        System.out.println(chain.size());
        System.out.println(chain);
    }

    private static List<String> search(Random rnd) {
        List<String> chain = new ArrayList<String>();
        chain.add(selectOptimalReachabilityCount(fullGraph, allWords, rnd));
        while (true) {
            String tail = chain.get(chain.size() - 1);
            FilteredGraph g = new FilteredGraph(chain);

            // We know that tail only has one successor, so skip ahead.
            Set<String> candidates = new HashSet<String>(fullGraph.getAdjacent(suffix(tail)));
            candidates.removeAll(chain);
            if (candidates.isEmpty()) break;

            chain.add(selectOptimalReachabilityCount(g, candidates, rnd));
        }

        Iterator<String> it = chain.iterator();
        while (it.hasNext()) {
            if (it.next().charAt(0) == '#') it.remove();
        }
        return chain;
    }

    private static List<String> spliceChains(List<String> a, List<String> b) {
        Set<String> intersect = new HashSet<String>(b);
        intersect.retainAll(a);
        if (intersect.isEmpty()) return null;

        // Splice the longest bits. To avoid cycles, we look for intersection points which have the same set of reached intersection points.
        // Thus to get from one to the next we can take either route without violating the unique occurrence of each element in the spliced chain.
        Set<String> left = new HashSet<String>();
        Set<String> right = new HashSet<String>();
        List<String> newChain = new ArrayList<String>();

        // NB We assume that either a(0) and b(0) are the same or neither is in intersect.
        // This is a safe assumption in practice because they're both "wad".
        int idxA = 0, idxB = 0, nextA = 0, nextB = 0;
        while (idxA < a.size()) {
            nextA++;
            while (nextA < a.size() && !intersect.contains(a.get(nextA))) nextA++;
            String tailA = nextA < a.size() ? a.get(nextA) : "";
            left.add(tailA);

            nextB++;
            while (nextB < b.size() && !intersect.contains(b.get(nextB))) nextB++;
            String tailB = nextB < b.size() ? b.get(nextB) : "";
            right.add(tailB);

            if (left.equals(right) && tailA.equals(tailB)) {
                // We take the longer of idxA to nextA-1 or idxB to nextB - 1.
                if (nextA - idxA > nextB - idxB) newChain.addAll(a.subList(idxA, nextA));
                else newChain.addAll(b.subList(idxB, nextB));

                idxA = nextA;
                idxB = nextB;
            }
        }

        if (new HashSet<String>(newChain).size() == newChain.size()) return newChain;
        throw new IllegalStateException();
    }

    private static void loadGraph() {
        Set<String> words = new HashSet<String>();
        Set<String> prefixes = new HashSet<String>();
        Set<String> suffixes = new HashSet<String>();
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(path), "UTF-8"));
            String line;
            while ((line = br.readLine()) != null) {
                if (line.length() >= 3) {
                    words.add(line);
                    prefixes.add(prefix(line));
                    suffixes.add(suffix(line));
                }
            }
            br.close();
        }
        catch (IOException ioe) {
            throw new RuntimeException(ioe);
        }

        // Filter down to a core with decent reachability.
        prefixes.retainAll(suffixes);
        MutableGraph<String> g = new MutableGraph<String>();
        Iterator<String> it = words.iterator();
        while (it.hasNext()) {
            String line = it.next();
            if (prefixes.contains(prefix(line)) && prefixes.contains(suffix(line))) {
                // In the interests of keeping the number of edges down, I insert fake vertices.
                g.addEdge(prefix(line), line, 1);
                g.addEdge(line, suffix(line), 1);
            }
            else it.remove();
        }

        fullGraph = g;
        allWords = Collections.unmodifiableSet(words);
    }

    private static String prefix(String word) {
        return "#" + word.substring(0, 3) + "#";
    }

    private static String suffix(String word) {
        return "#" + word.substring(word.length() - 3, word.length()) + "#";
    }

    private static <V> Map<V, Integer> reachabilityCount(Graph<V> g, Set<V> sources) {
        List<Set<V>> sccs = StronglyConnectedComponents.analyse(g, sources);
        int n = sccs.size();

        // Within a strongly connected component, each vertex can reach each other vertex.
        // Then we need to also take into account the other SCCs which they can reach.
        // We can exploit the fact that we already have a topological sort of the DAG of SCCs to do this efficiently.
        Map<V, Integer> index = new HashMap<V, Integer>();
        for (int i = 0; i < n; i++) {
            for (V v : sccs.get(i)) index.put(v, i);
        }

        BitSet[] reachableSccs = new BitSet[n];
        Map<V, Integer> reachabilityCounts = new HashMap<V, Integer>();
        for (int i = 0; i < n; i++) {
            Set<V> scc = sccs.get(i);
            reachableSccs[i] = new BitSet(n);
            reachableSccs[i].set(i);
            for (V v : scc) {
                for (V w : g.getAdjacent(v)) {
                    int j = index.get(w);
                    if (j < i) reachableSccs[i].or(reachableSccs[j]);
                }
            }

            int count = 0;
            for (int j = reachableSccs[i].nextSetBit(0); j >= 0; j = reachableSccs[i].nextSetBit(j+1)) {
                count += sccs.get(j).size();
            }
            for (V v : scc) {
                reachabilityCounts.put(v, count);
            }
        }

        return reachabilityCounts;
    }

    private static <V extends Comparable<? super V>> V selectOptimalReachabilityCount(Graph<V> g, Set<V> candidates, Random rnd) {
        Map<V, Integer> r = reachabilityCount(g, candidates);

        int max = 0;
        List<V> attaining = new ArrayList<V>();
        for (V candidate : candidates) {
            int score = r.get(candidate);
            if (score > max) {
                max = score;
                attaining.clear();
            }
            if (score == max) attaining.add(candidate);
        }

        return selectRandom(attaining, rnd);
    }

    private static <T extends Comparable<? super T>> T selectRandom(Collection<T> elts, Random rnd) {
        List<T> deterministic = new ArrayList<T>(elts);
        Collections.sort(deterministic);
        Collections.shuffle(deterministic, rnd);
        return deterministic.get(0);
    }

    private static class FilteredGraph implements Graph<String> {
        private final Set<String> filteredVertices;

        public FilteredGraph(Collection<String> filteredVertices) {
            this.filteredVertices = new HashSet<String>(filteredVertices);
        }

        @Override
        public Set<String> getAdjacent(String node) {
            if (filteredVertices.contains(node)) return Collections.emptySet();

            Set<String> adj = new HashSet<String>(fullGraph.getAdjacent(node));
            adj.removeAll(filteredVertices);
            return adj;
        }

        @Override
        public double getWeight(String from, String to) {
            throw new RuntimeException("Not used");
        }
    }
}

"erecting" hmm ..
Matthew Roh

6

ทับทิม, 1701

"Del" -> "ersatz's"( ลำดับเต็ม )

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

สิ่งแรกHashคือสร้างขึ้นที่แผนที่คำนำหน้ากับโลกเต็มรูปแบบเริ่มต้นด้วยคำนำหน้านั้น (เช่น"the" => ["the", "them", "their", ...]) จากนั้นสำหรับทุกคำในรายการวิธีการที่sequenceเรียกว่า มันได้คำที่อาจเป็นไปได้จากHashตัวอย่าง100และเรียกตัวเองซ้ำ ๆ ระยะเวลาที่ยาวที่สุดถูกถ่ายและแสดงอย่างภาคภูมิ เมล็ดพันธุ์สำหรับ RNG (Random::DEFAULT ) และความยาวของลำดับจะปรากฏขึ้นเช่นกัน

ฉันต้องรันโปรแกรมสองสามครั้งเพื่อให้ได้ผลลัพธ์ที่ดี ผลลัพธ์นี้ถูกสร้างขึ้นพร้อมเมล็ด328678850348335483228838046308296635426328678850348335483228838046308296635426ผลที่ได้นี้โดยเฉพาะอย่างยิ่งได้รับการสร้างขึ้นด้วยเมล็ด

ต้นฉบับ

require "json"

def prefix(word); word[0, 3];  end
def suffix(word); word[-3, 3]; end

def sequence(word, prefixes, skip)
  if SUBS.key?(word) && (SUBS[word] - skip) == SUBS[word]
    return SUBS[word]
  end

  skip         += [word] 
  suffix        = suffix(word)
  possibilities = (prefixes[suffix] ||= []) - skip

  if possibilities.empty?
    return [word]
  else
    sequences = possibilities.sample(100).map do |possibility|
      sequence(possibility, prefixes, skip)
    end

    return SUBS[word] = [word] + sequences.max_by(&:size)
  end
end

def correct?(sequence)
  once_only = sequence.all? { |y| sequence.count(y) == 1 }
  following = sequence.each_cons(2).all? { |a,b| a[-3,3] == b[0,3] }

  return once_only && following
end

words = open("words.txt", "r", &:read).split.select { |word| word.size >= 3 }

SUBS     = {}
PREFIXES = {}

# Built a Hash that maps prefixes to an Array of words starting with the prefix.
words.each do |word|
  prefix = prefix(word)

  PREFIXES[prefix] ||= []
  PREFIXES[prefix] << word
end

longest = [1]

words.each do |word|
  PREFIXES[prefix(word)].delete(word)

  sequence = sequence(word, PREFIXES, [word])

  if sequence.size > longest.size
    longest = sequence
  end
end

puts longest.inspect
puts 
puts "Generated with seed: #{Random::DEFAULT.seed}"
puts "Length: #{longest.size}"
puts "Correct: #{correct?(longest)}"

ฉันไม่คิดว่าจะสุ่มตัวอย่างความเป็นไปได้สำหรับคำถัดไป! ฉันใช้ความคิดนั้น!
KSFT

การดำเนินการนี้ใช้เวลานานเท่าใด
KSFT

ฉันไม่ได้เวลา แต่ฉันประมาณประมาณ 15-20 นาที (ฉันปล่อยให้มันไหลผ่านอาหารเย็น)
britishtea

Python ของฉันยังคงสร้าง dict (แฮช) ...
KSFT

การสร้างพจนานุกรมควรจะรวดเร็ว (คำเดียวซ้ำทุกคำ) Ruby รายงาน0.0996วินาที
britishtea

5

คะแนน: 1631 1662 คำ

['Aachen', 'hen', 'henceforward', 'ardor', 'dorsal', 'salmon', 'monolog', 'log', 'logjam', 
'jam', 'jamb', 'ambassador', 'dormouse', 'useable', 'bleeding', 'ingenious', 'ouster', 
'terminable', 'bleakness', 'essay', 'say', 'saying', 'ingress', 'essences', 'cession', 
....
....
'ionosphere', 'ere', 'erecting', 'ingratiating', 'ingrate', 'ate', 'ateliers', "ersatz's"]

คุณสามารถค้นหาลำดับทั้งหมดได้ที่นี่: http://pastebin.com/TfAvhP9X

ฉันไม่มีซอร์สโค้ดที่สมบูรณ์ ฉันลองใช้วิธีอื่น แต่นี่คือตัวอย่างข้อมูลโค้ดที่ควรจะสามารถสร้างลำดับของความยาวเท่ากันได้ ขออภัยมันไม่สวยงามมาก

รหัส (Python):

ขั้นแรกให้ประมวลผลข้อมูลก่อน

from collections import defaultdict

with open('words') as f:
    words = [line.strip() for line in f]
words = [word for word in words if len(word)>=3 and word[-2:]!="'s"]

word_connections = defaultdict(list)
for word in words:
    word_connections[word[:3]].append(word)

จากนั้นฉันกำหนดฟังก์ชันแบบเรียกซ้ำ (การค้นหาความลึกครั้งแรก)

global m
m=0
def find_chain(chain):
    s = set(word_connections[chain[-1][-3:]])-set(chain)
    if len(s)== 0:
        global m
        if len(chain) > m:
            m=len(chain)
            print(len(chain), chain)
    else:
        for w in s:
            if w not in chain:
                find_chain(chain + [w])

for word in words:
    find_chain([word])

แน่นอนว่าใช้เวลานานเกินไป แต่หลังจากนั้นไม่นานมันก็พบว่ามีลำดับด้วย 1,090 องค์ประกอบและฉันก็หยุด

สิ่งต่อไปที่ต้องทำคือการค้นหาในท้องถิ่น สำหรับเพื่อนบ้านสองคน n1, n2 ตามลำดับฉันพยายามค้นหาลำดับที่เริ่มต้นที่ n1 และสิ้นสุดที่ n2 หากมีลำดับดังกล่าวอยู่ฉันจะใส่มันเข้าไป

def tryimpove(chain, length, startvalue=0):
    s=set(chain)
    for i in range(startvalue,len(chain)-1):
        print(i)
        for sub in sorted(short_sequences([chain[i]],length,chain[i+1]),key=len,reverse=True):

            if len(s & set(sub))==1:
                chain[i:i+1]=sub
                print(i,'improved:',len(chain))
                return tryimpove(chain,length,i)
    return chain

def short_sequences(chain,length,end):
    if 2 <= len(chain):
        if chain[-1][-3:]==end[:3]:
            yield chain
    if len(chain) < length:
        s = set(word_connections[chain[-1][-3:]])-set(chain)
        for w in s:
            for i in short_sequences(chain + [w],length,end):
                yield i

for m in range(5, 100):
    seq = tryimpove(seq,m)

แน่นอนฉันต้องหยุดโปรแกรมด้วยตนเอง


ใช้เวลานานเท่าไหร่จึงจะได้ผล
Hacketo

ประมาณหนึ่งชั่วโมงในการสร้างลำดับ 1,090 และอีกหนึ่งชั่วโมงเพื่อทำการค้นหาในท้องถิ่น
Jakube

5

PHP, 1742 1795

ฉันสับสนกับ PHP ในเรื่องนี้ เคล็ดลับคือการกำจัดรายการถึงประมาณ 20k ที่ใช้งานได้จริงและทิ้งส่วนที่เหลือทิ้งไป โปรแกรมของฉันทำสิ่งนี้ซ้ำ (บางคำที่ทิ้งไปในการทำซ้ำครั้งแรกหมายความว่าคนอื่นไม่สามารถใช้งานได้) ในตอนเริ่มต้น

รหัสของฉันแย่มากใช้ตัวแปรทั่วโลกจำนวนมากใช้หน่วยความจำมากเกินไป (มันเก็บสำเนาของตารางคำนำหน้าทั้งหมดสำหรับการวนซ้ำทุกครั้ง) และใช้เวลาหลายวันกว่าจะดีที่สุดในปัจจุบัน แต่ก็ยังจัดการได้ ที่จะชนะ - ตอนนี้ มันเริ่มต้นค่อนข้างเร็ว แต่ช้าลงและช้าลงเมื่อเวลาผ่านไป

<?php

  function show_list($list)
  {
      $st="";
      foreach ($list as $item => $blah)
      $st.="$item ";
      return rtrim($st);
  }

  function mysort($a,$b)
  {
      global $parts;
      $a_count=isset($parts[substr($a,-3,3)])?count($parts[substr($a,-3,3)]):0;
      $b_count=isset($parts[substr($b,-3,3)])?count($parts[substr($b,-3,3)]):0;
      return $b_count-$a_count;
  }  

  function recurse($line,$list,$parts)
  {
    global $lines; 
    global $max;
    global $finished;
    global $best;
    $end=substr($line,-3,3);
    $count=0;
    if ($finished)
        return;
    if (isset($parts[$end]))
    {
        $maxp=count($parts[$end])-1;
        if ($maxp<0)
            return;
        $randa=array();
        for ($a=1;$a<3;$a++)
        {
            $randa[mt_rand(0,$maxp)]=1;
        }
        $n=mt_rand(0,$maxp);

        foreach ($parts[$end] as $key => $endpart)
        {

            if (!isset($list[$endpart]))
            {
                $this_part=$parts[$end];
                unset($this_part[$key]);
                $new_parts=$parts;
                unset($new_parts[$end][$key]);
                $list[$endpart]=1;
                recurse($endpart,$list,$new_parts);
                unset($list[$endpart]);
            }
        }

    }
    $count=count($list);
    if ($count>$max)
    {
        //echo "current best: $count\n";
        file_put_contents('best.txt',show_list($list) . "\n",FILE_APPEND);
        $max=$count;
        $best=$list;
    }
  }

  function cull_lines(&$lines)
  {
      global $parts;
      do 
      {    
          $wordcount=count($lines);
          $parts=array();$end_parts=array();
          foreach ($lines as $line)
          {
              if (strlen($line)<3)
                continue;
              $parts[substr($line,0,3)][]=$line;
              if (strlen($line)>3)
                $end_parts[substr($line,-3,3)][]=$line;
          }
          foreach ($lines as $key => $line)
          {
              $end=substr($line,-3,3);
              if (strlen($line)<3 || !isset($parts[$end]) || !isset($end_parts[substr($line,0,3)] ) )
                unset($lines[$key]);
          }
          foreach ($parts as $part)
          {
            if (count($part)==1)
            {
                $source_part=mt_rand(0,count($part)-1);
                $this_part = substr($part[0],0,3);
                $this_min = 10000;
                $this_key = 0;
                if (strlen($part[$source_part])==3)
                {
                    foreach ($lines as $key => $line)
                    if ($line == $part[$source_part])
                    {
                            unset($lines[$key]);
                            break;
                    }
                }
                elseif (isset($end_parts[$this_part]))
                {
                    foreach ($end_parts[$this_part] as $key => $end_part)
                    {
                        if (isset($parts[substr($end_part,0,3)]))
                        {
                            $n=count($parts[substr($end_part,0,3)]);
                            if ($n<$this_min)
                            {
                                $this_min=$n;
                                $this_key=$key;    
                            }
                        }
                    }

                    foreach ($lines as $key => $line)
                    if ($line == $part[$source_part])
                    {
                            unset($lines[$key]);

                    }
                    elseif ($line == $end_parts[$this_part][$this_key])
                    {
                        $lines[$key].=' ' . $part[$source_part];
                    }
                }

            }
          }
          echo "$wordcount words left\n";
      }
      while ($wordcount!=count($lines));
  }

  ini_set('xdebug.max_nesting_level',10000);
  ini_set('memory_limit','1024M');
  $lines = explode("\n",file_get_contents('words.txt'));
  cull_lines($lines);
  $max=0;
  foreach ($parts as $key=>$part)
    usort($parts[$key],'mysort');    

  $n=count($lines);
  foreach ($lines as $rand => $blah)
  {
      if (mt_rand(0,$n)==1)
        break;
  }
  $rand=$lines[$rand];
  $line[$rand]=1;
  echo "Starting with $rand...\n";
  recurse($rand,$line,$parts);
  unset($line[$rand]);

?>

การปรับปรุงที่ชัดเจนจะใช้คำเด็กกำพร้าสำหรับการเริ่มต้นและเสร็จสิ้น

อย่างไรก็ตามฉันไม่รู้จริงๆว่าทำไมรายการของ Pastebin จึงถูกย้ายไปที่ความคิดเห็นที่นี่มันกลับเป็นลิงก์ไปยัง Pastebin เพราะตอนนี้ฉันรวมรหัสของฉันแล้ว

http://pastebin.com/Mzs0XwjV


ฉันรวมรหัสจาก Pastebin ในคำตอบของคุณแล้วเราไม่จำเป็นต้องพึ่งพาโดเมนภายนอก ในกรณีที่ Pastebin หยุดทำงานเรายังคงเห็นรหัสของคุณที่นี่
ProgramFOX

ฉันมีความสุขที่ได้คำตอบที่ได้รับในระยะเวลาสั้น ๆ การทำงานที่ดี Peter Taylor ...
สุดยอดมาก

โอ้ตอนนี้ฉันเห็นว่าฉันไม่ควรเพิ่มรายการลงในคำตอบของคุณ ฉันสับสนเล็กน้อยและฉันรวมรายการรหัสและคำศัพท์เข้าด้วยกันและรวมรายการไว้ในคำตอบของคุณ ฉันขอโทษสำหรับสิ่งนั้น
ProgramFOX

4

Python: 1702 - 1704 - 1733 คำ

ฉันใช้ Dict เพื่อแมปคำนำหน้าทั้งหมดกับคำทั้งหมดตาม

{
    "AOL" : [
        "AOL", "AOL's"
    ],...
    "oct" : [
         "octet","octets","octette's"
    ],...
}

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

จากนั้นนำคำในรายการและเรียกดูแผนที่คำนำหน้าเช่น Tree Node

import sys, fileinput
def p(w):return w[:3]

class Computing:
    def __init__(_):
        _.wordData = []; _.prefixes = {}
        _.seq = []; _.bestAttempt = []
        _.stop = False
        for l in fileinput.input():
            word = l.strip()
            if len(word) > 2:_.wordData.append(_.addPfx(word, p(word)))
        _.rmUseless();_.rmUseless()
        _.fromI = 0; _.toI = len(_.wordData)

    def rmUseless(_):
        for w in _.wordData:
            if not w[-3:] in _.prefixes: _.wordData.remove(_.rmPfx(w,p(w)))

    def addPfx(_, w, px):
        if not px in _.prefixes:_.prefixes[px] = []
        _.prefixes[px].append(w)
        return w
    def rmPfx(_,w,px):
        _.prefixes[px].remove(w)
        if len(_.prefixes[px]) == 0:del _.prefixes[px];
        return w

    def findBestSequence(_):
        def pickItem():
            r = None
            if _.fromI < _.toI:r = _.wordData[_.toI-1];_.toI -= 1;
            return r
        while not _.stop:
            w = pickItem()
            if not w:break;
            _.seq = [_.rmPfx(w,p(w))]
            _.checkForNextWord()
            _.addPfx(w, p(w))

        print " ".join(_.bestAttempt)

    def checkForNextWord(_):
        _.stop = len(_.seq) >= 1733
        cw = _.seq[-1]
        if not _.stop:
            if cw[-3:] in _.prefixes:
                lW = []
                for word in _.prefixes[cw[-3:]]:
                    if not word[-3:] in lW:
                        _.seq.append(_.rmPfx(word,p(word)))
                        _.checkForNextWord()
                        if _.stop :break;
                        _.addPfx(_.seq.pop(), p(word))
                        lW.append(word[-3:])
                    if _.stop :break;
        if len(_.bestAttempt) < len(_.seq):_.bestAttempt = _.seq[:];

sys.setrecursionlimit(6000)
Computing().findBestSequence()

โปรแกรมต้องการคำศัพท์จำนวนหนึ่งเพื่อทราบเมื่อหยุดสามารถค้นหาได้1733ในวิธีการcheckForNextWord̀

โปรแกรมต้องการพา ธ ไฟล์เป็นอาร์กิวเมนต์

ไม่ได้เป็น pythonic มาก แต่ฉันพยายาม

ใช้เวลาน้อยกว่า 2 นาทีในการคำนวณลำดับนี้: เอาต์พุตเต็ม :

études desalinate กิน ateliers ... แสดงความเคารพอย่างสุดความสามารถ ousters


4

คะแนน: 249 500 1001

Aachen -> hen -> ต่อไปนี้ -> ardent -> entail -> ail -> ailed -> led -> ledger -> gerbil -> ทวิภาคี -> การชุมนุม -> อัจฉริยะ - - -> ousted -> น่าเบื่อ -> ouster -> terabit -> bit -> bitched -> hedgehog -> หมู -> hogan -> hogan -> gander -> derail -> ailerons -> onset -> set -> setback -> กิตติกรรมประกาศ -> entailed -> ledgers -> ersatzes -> zest -> จัดตั้ง -> hedgerow -> แถว -> rowboat -> oat - -> oaten -> ten -> tenable -> bleach -> ache -> cheapen -> pen -> ลงโทษ -> zestful -> fulcra -> ปู -> rabbinical -> calabash -> เถ้า -> ละอายใจ -> เหรียญ -> เดล -> เบียร์ -> เตือน -> น่าเบื่อ -> เจ้าเล่ห์ ->slyest -> define -> hes -> hesitant -> ant -> antacid -> ไซเดอร์ -> derailed -> ledges -> gestated -> tediousness -> เรียงความ -> พูด - -> พูด -> อย่างชาญฉลาด -> ความเจ้าเล่ห์ -> เรียงความ -> ความเฉลียวฉลาด -> ousting -> ความฉลาดเฉลียว -> ผู้เขียนเรียงความ -> คอคอด -> มัสกัต -> แมว -> ความหายนะ -> หนู -> ice -> iceberg -> erg -> ergonomic -> micra -> crabbed -> bed -> bedazzles -> เลสเบี้ยน -> คำตอบ -> was -> ere - -> erecting -> ingest -> การสร้าง -> ingesting -> ingestion -> ไอออน -> ionization -> ionizer -> zero -> erode -> ode -> ode -> desalinates -> ทดสอบ -> การจัดตั้ง - -> entailing -> ingot -> got -> gotten ->ผู้เช่า -> ศัตรู -> isthmuses -> งา -> amebas -> basal -> salaamed -> medallion -> ionizing -> ingraining -> ingrains -> insr -> insane - -> ประวัติความเป็นมา -> แป้ง -> แอลกอฮอล์ -> ถือ -> เก่า -> เก่า -> เดน -> denature -> ยูเรีย -> ถึง -> ached -> พุ่มไม้ -> gestates -> testable -> bleached -> hedging -> ingrates -> testament -> entangle -> gleamed -> medallions -> onshore -> ore -> oregano -> anodes - -> desalinating -> ingratiates -> testates -> tester -> terabits -> มัน -> ตัวเอง -> elf -> elfin -> elfin -> fin -> finagle -> gleaming -> ingratiating -> ingratiatingly -> กลีเซอรีน -> เปลือก -> indebtedness -> แก่นสาร ->cesareans -> ที่ตอบได้ -> อัฒจันทร์ -> เธอ -> เฮรัลด์ -> ออลเดอร์ -> การตกราง -> ส่วนผสม -> พัวพัน -> พัวพัน -> พุง -> แผล -> บรรยากาศ -> การสร้าง - -> ionospheres -> จำหน่าย -> การแจ้งเตือน -> ingresses -> งา -> mes -> mesas -> sash -> ashcan -> cancan -> canard -> ardor -> dorkiest -> estates -> testes -> testicle -> cleaner -> nerdiest -> esteemed -> meddles -> lessee -> lessee -> see -> seeded -> dedicates -> อัณฑะ - -> ลดขนาด -> สมาชิกวุฒิสภา -> testiest -> ความภาคภูมิใจ -> คุด -> เจ้าของ -> เจ้าของ -> ประสาท -> ตุ่ม -> สะอาด -> เอสเทอร์ -> เทราไบต์ -> testis -> เนื้อเยื่อ -> sue -> suede -> edema -> emaciates ->ฮอร์โมนเพศชาย -> หนึ่ง -> คน -> รัง -> esthetes -> testy -> กุ้งยิง -> styes -> ใช่ -> yeshivas -> หลอดเลือด -> larches -> ลังเล - - -> กลีเซอรีน -> กินไม่ได้ -> สารฟอกขาว -> ลังเล -> การเป็นพยาน -> ingrate -> ate -> ateliers

นี่คือรหัสของฉัน:

import sys
sys.setrecursionlimit(10000)
w=[i for i in open("words.txt").read().split("\n") if len(i)>=3 and "'" not in i]
b=[i[:3] for i in w]
e=[i[-3:] for i in w]
a=[i for i in zip(*(w,b,e))]
def pathfrom(i,a,l):
    longpath=[]
    for j in a:
        if j[1]==i[2]:
            r=pathfrom(j,[m for m in a if m!=j],l+1)
            path=[i]+r[0]
            if r[1]:
                return path,r[1]
            if len(path)>len(longpath):
                longpath=path
    if l>=250:
        return longpath,True
        sys.exit()
    return longpath,False
for i in a[:2]:
    print i
    p=pathfrom(i,[j for j in a if i!=j],1)
    if len(p)>len(chain_):
        chain_=p
        print p
    print p

แก้ไข: 1001:

http://pastebin.com/yN0eXKZm

แก้ไข: 500:

Aachen -> hen -> ต่อไปนี้ -> ardent -> entail -> ail -> ailed -> led -> ledger -> gerbil -> ทวิภาคี -> การชุมนุม -> อัจฉริยะ - - -> ousted -> น่าเบื่อ -> ouster -> terabit -> bit -> bitched -> hedgehog -> หมู -> hogan -> hogan -> gander -> derail -> ailerons -> onset -> set -> setback -> กิตติกรรมประกาศ -> entailed -> ledgers -> ersatzes -> zest -> จัดตั้ง -> hedgerow -> แถว -> rowboat -> oat - -> oaten -> ten -> tenable -> bleach -> ache -> cheapen -> pen -> ลงโทษ -> zestful -> fulcra -> ปู -> rabbinical -> calabash -> เถ้า -> ละอายใจ -> เหรียญ -> เดล -> เบียร์ -> เตือน -> น่าเบื่อ -> เจ้าเล่ห์ ->slyest -> define -> hes -> hesitant -> ant -> antacid -> ไซเดอร์ -> derailed -> ledges -> gestated -> tediousness -> เรียงความ -> พูด - -> พูด -> อย่างชาญฉลาด -> ความเจ้าเล่ห์ -> เรียงความ -> ความเฉลียวฉลาด -> ousting -> ความฉลาดเฉลียว -> ผู้เขียนเรียงความ -> คอคอด -> มัสกัต -> แมว -> ความหายนะ -> หนู -> ice -> iceberg -> erg -> ergonomic -> micra -> crabbed -> bed -> bedazzles -> เลสเบี้ยน -> คำตอบ -> was -> ere - -> erecting -> ingest -> การสร้าง -> ingesting -> ingestion -> ไอออน -> ionization -> ionizer -> zero -> erode -> ode -> ode -> desalinates -> ทดสอบ -> การจัดตั้ง - -> entailing -> ingot -> got -> gotten ->ผู้เช่า -> ศัตรู -> isthmuses -> งา -> amebas -> basal -> salaamed -> medallion -> ionizing -> ingraining -> ingrains -> insr -> insane - -> ประวัติความเป็นมา -> แป้ง -> แอลกอฮอล์ -> ถือ -> เก่า -> เก่า -> เดน -> denature -> ยูเรีย -> ถึง -> ached -> พุ่มไม้ -> gestates -> testable -> bleached -> hedging -> ingrates -> testament -> entangle -> gleamed -> medallions -> onshore -> ore -> oregano -> anodes - -> desalinating -> ingratiates -> testates -> tester -> terabits -> มัน -> มันเอง -> elf -> elfin -> elfin -> fin -> finagle -> gleaming -> ingratiating -> ingratiatingly -> กลีเซอรีน -> เปลือก -> indebtedness -> แก่นสาร ->cesareans -> ที่ตอบได้ -> อัฒจันทร์ -> เธอ -> เฮรัลด์ -> ออลเดอร์ -> การตกราง -> ส่วนผสม -> พัวพัน -> พัวพัน -> พุง -> แผล -> บรรยากาศ -> การสร้าง - -> ionospheres -> จำหน่าย -> การแจ้งเตือน -> ingresses -> งา -> mes -> mesas -> sash -> ashcan -> cancan -> canard -> ardor -> dorkiest -> estates -> testes -> testicle -> cleaner -> nerdiest -> esteemed -> meddles -> lessee -> lessee -> see -> seeded -> dedicates -> อัณฑะ - -> ลดขนาด -> สมาชิกวุฒิสภา -> testiest -> ความภาคภูมิใจ -> คุด -> เจ้าของ -> เจ้าของ -> ประสาท -> ตุ่ม -> สะอาด -> เอสเทอร์ -> เทราไบต์ -> testis -> เนื้อเยื่อ -> sue -> suede -> edema -> emaciates ->ฮอร์โมนเพศชาย -> หนึ่ง -> คน -> รัง -> esthetes -> testy -> กุ้งยิง -> styes -> ใช่ -> yeshivas -> หลอดเลือด -> larches -> ลังเล - - -> glycerine -> inedible -> bleaker -> keratin -> tin -> tincture -> ท่อปัสสาวะ -> rascal -> calamine -> ineducable -> bleakest -> esthetic -> tic -> tick -> ickiest -> ประมาณได้ -> bleariest -> ตัวประมาณ -> tor -> เผา -> hedonistic -> ticker -> kerchieves -> ถุง -> lessens - -> ensconced -> cedar -> dare -> are -> area -> accessable -> bleat -> eat -> eatable -> bleed -> ตกเลือด -> derailment -> enter -> ภาคเรียน -> ermine -> สุดจะพรรณนา -> bleeped -> pedagog -> goggle -> gleans ->ตอบ -> แดง -> redbreast -> aster -> termagant -> ศัตรู -> ตั๋ว -> kettledrum -> เหล้ารัม -> รัม -> rumbas -> บะซอลต์ -> แท่นบูชา -> tar - -> tarantulas -> lasagna -> gnarliest -> estrangement -> ถูกป้อน -> redcap -> cap -> สามารถ -> bleeps -> epsilon -> loneliest -> estranges -> ท่าทาง -> redcaps -> apse -> นามแฝง -> nymphomania -> ไนอาซิน -> cinchonas -> จมูก -> จมูก -> ขายดี -> ผสมผสาน -> ท้าย -> endanger -> ผู้สูงอายุ -> -> ข้าว -> icebound -> undeceives -> vesper -> per -> perambulator -> tore -> ores -> resales -> lesser -> sera -> era -> eras -> rash -> ashen -> henchman -> man -> manacle -> cleaniest ->สโตรเจน -> gendarmes -> mescal -> calcine -> ไม่มีประสิทธิภาพ -> สนุกสนาน -> กลีเซอรอล -> บทบาท -> ยี่โถ -> ผู้ก่อจลาจล -> derangement -> ความบันเทิง -> บันเทิง -> ไม่รู้จักพอ - -> blended -> deduced -> cedars -> arsenic -> nice -> icebox -> box -> boxcar -> รถยนต์ -> caracul -> cullender -> deranges -> ท่าทาง -> กำหนดเวลา -> บทเรียน -> ลูกชาย -> โซนาร์ -> narc -> arc -> อาร์เคด -> adenoidal -> dales -> ผู้ให้เช่า -> ผู้ให้เช่า -> sorbet -> เดิมพัน - -> betaken -> ken -> kens -> ensemble -> blender -> deride -> ความคิด -> deacon -> con -> conave -> เว้า -> ล้างแค้น -> germane -> anemia -> miaowed -> wed -> wedded -> deducible -> blent - -> enthrall ->ทั้งหมด -> allay -> lay -> layaway -> way -> wayfarer -> reran -> ran -> rancher -> heralded -> หักลดหย่อน -> ได้รับพร -> เซอแดง -> -> danced -> cedes -> descant -> anteater -> termed -> meddlesome -> omegas -> gas -> gash -> อาศรม -> ram -> ramble -> ramble -> Blew -> lewder -> derides -> descend -> ใกล้สูญพันธุ์ -> redcoat -> สาบาน -> หลอดเลือด -> sis -> sis s - -> sisal - -> สลัด -> เด็กอ่อน -> บันได - -> อนุพันธ์ -> เรือ -> ไม่ค่อย -> โดเมน -> จารึกไว้ -> เรือด -> แมลง -> แมลง -> boo -> boobed -> boobed -> bedder -> มา -> ร่องรอย -> gesundheit -> ทั้ง -> heraldic -> ลูกเต๋า -> icebreaker -> น้ำมันก๊าด -> สวน -> สวน -> อีเมล ->ailment -> enthronement -> enthuse -> use -> used -> sedater -> terminator -> toreador -> dormant -> antebellum -> lumbago -> ago -> agonizingly - -> ไกลโคเจน -> เพศ -> หนังแท้ -> misadventures -> rescind -> อนาจาร -> กระตือรือร้น -> ยาระงับประสาท -> ยาระงับประสาท -> เสื้อคลุม -> ผู้ที่กระตือรือร้น -> astir -> tirades -> ผู้สืบทอด -> antecedent -> entice -> icecap -> ตัวเก็บประจุ -> การทรมาน -> ล่อลวง -> cedilla -> llama -> amalgam -> กลเม็ด -> ผู้หญิง -> ลังเล - - -> การเป็นพยาน -> ingrate -> ate -> ateliersเพศ -> หนังแท้ -> misadventures -> rescind -> อนาจาร -> enthused -> ยาระงับประสาท -> เสื้อคลุม -> ผู้ที่กระตือรือร้น -> astir -> tirades -> ทายาท -> ทายาท -> antecedent - -> ดึงดูด -> icecap -> ตัวเก็บประจุ -> ทรมาน -> ล่อลวง -> cedilla -> ลามะ -> อะมัลกัม -> กลเม็ด -> ผู้หญิง -> แสบ -> ลังเล -> เป็นพยาน -> ingrate -> ate -> ateliersเพศ -> หนังแท้ -> misadventures -> rescind -> อนาจาร -> enthused -> ยาระงับประสาท -> เสื้อคลุม -> ผู้ที่กระตือรือร้น -> astir -> tirades -> ทายาท -> ทายาท -> antecedent - -> ดึงดูด -> icecap -> ตัวเก็บประจุ -> ทรมาน -> ล่อลวง -> cedilla -> ลามะ -> อะมัลกัม -> กลเม็ด -> ผู้หญิง -> แสบ -> ลังเล -> เป็นพยาน -> ingrate -> ate -> ateliers


2

Mathematica 1482 1655

บางสิ่งบางอย่างในการเริ่มต้น ...

dict=Import["words.txt"];
words=Union@Select[StringSplit[dict],(StringFreeQ[#,"'s"])\[And]StringLength[#]>2
  \[And]LowerCaseQ@StringTake[#,1]&]

ลิงก์คือส่วนนำหน้าจุดตัดและส่วนต่อท้ายสำหรับคำ

prefixes=Union[StringTake[#,3]&/@words];
suffixes=Union[StringTake[#,-3]&/@words];
links=Intersection[prefixes,suffixes];
linkableWords=(wds=RandomSample@Select[words,MemberQ[links,StringTake[#,3]]\[And]MemberQ[links,StringTake[#,-3]]& ])/.
w_String:> {w,StringTake[w,3],StringTake[w,-3]}

ขอบทั้งหมดเชื่อมโยงโดยตรงจากคำไปยังคำอื่น ๆ :

edges[{w_,fr_,fin_}]:= Cases[linkableWords,{w1_,fin,_}:> (w\[DirectedEdge]w1)]
allEdges=Flatten[edges/@linkableWords];
g=Graph@allEdges;

ค้นหาเส้นทางระหว่าง "ซ่อม" และ "zest"

FindPath[g, "begin", "end", {1480, 3000}, 1][[1]]

ผลลัพธ์ (1655 คำ)

{"mend", "endorser", "server", "vertebral", "rallying", "ingrains", 
"insurrectionist", "isthmus", "mussels", "elsewhere", "erection", 
"ionizes", "zestful", "fullness", "essaying", "ingeniously", 
"slyest", "estimator", "tornados", "doses", "sesame", "amebic", 
"bicycled", "ledges", "gestation", "ionizing", "ingratiates", 
"testifying", "ingesting", "inglorious", "ouster", "terminated", 
"tediousness", "essayist", "isthmuses", "session", "ion", 
"ionization", "ionospheres", "resubmitted", "tedious", "ousting", 
"ingest", "ester", "terminates", "testicle", "cleanliness", "essay", 
"say", "saying", "ingratiating", "ingratiatingly", "glycerine", 
"inefficient", "entrances", "cesarians", "answering", "ingenious", 
"ousted", "tediously", "sly", "slyness", "essences", "cesareans", 
"answer", "were", "erecting", "ingredient", "enterprises", 
"sessions", "onshore", "oregano", "anorak", "raking", "ingraining", 
"ingrown", "owner", "nerdiest", "estranging", "ingot", "gotten", 
"tendonitis", "tissue", "suede", "edelweiss", "issuing", "ingestion", 
"ionosphere", "erections", "onset", "settles", "lesion", "ionizer", 
"zeroing", "ingresses", "sesames", "mesmerizing", "ingrates", 
"testes", "testiest", "estrangement", "entail", "ail", "ailment", 
"entice", "icecap", "captivates", "testy", "sty", "stylistic", 
"tickles", "lessee", "seeded", "deductibles", "lesser", 
"servicewoman", "many", "anymore", "ores", "resourceful", "fullback", 
"acknowledgment", "entertainer", "nerves", "vest", "esteemed", 
"mediates", "testament", "entered", "redbreast", "astonishes", 
"hesitatingly", "glycogen", "genera", "eras", "rashes", "hesitates", 
"testicles", "lest", "establishment", "entwines", "nest", "estates", 
"testates", "testosterone", "oneself", "elf", "elfin", "fingered", 
"redcaps", "apse", "pseudonym", "nymphomania", "niacin", "cinemas", 
"masochistic", "tickled", "led", "ledger", "geriatric", "rice", 
"icebreaker", "kerosine", "inexperienced", "ceded", "deductible", 
"blew", "lewder", "derivable", "blemished", "hedgerow", "rowel", 
"welfare", "arena", "enamel", "melded", "dedicates", "tester", 
"terabit", "bitmap", "mapped", "pedicures", "restored", "redeemer", 
"merchantman", "manipulator", "torpedos", "dosed", "seduced", 
"cedilla", "llano", "another", "heretic", "tic", "ticker", "keratin", 
"tinctures", "restaurateur", "euros", "rosettes", "testable", 
"bleaker", "kerosene", "energizer", "zero", "eroded", "deduced", 
"cedar", "dare", "ares", "respondent", "entranced", "cedillas", 
"lasagnas", "nastiest", "esthetic", "ticket", "ketches", "hes", 
"hesitant", "antipasto", "stoppered", "redounded", "deducible", 
"bleeped", "pedant", "antimatter", "terminable", "blent", "enthuse", 
"user", "serenade", "adenoidal", "dales", "lessen", "sentimental", 
"talker", "kerchieves", "vestry", "try", "tryout", "outdone", "ones", 
"nestles", "lesson", "songwriter", "terrapin", "pinched", 
"hedonistic", "tick", "ickiest", "established", "hedgehog", "hogan", 
"gander", "derringer", "gerbil", "billboard", "ardor", "dorkiest", 
"estrogen", "gent", "entirety", "etymological", "calk", "alkalis", 
"lissome", "omegas", "gasolene", "enema", "emaciates", "test", 
"estranges", "gestured", "redeemed", "medic", "diced", "cedars", 
"arsenic", "nice", "iceberg", "erg", "ergonomic", "microcomputer", 
"terser", "sergeant", "antipastos", "tost", "osteopathy", "thy", 
"thymus", "mussiest", "estimable", "blend", "endeavored", "redound", 
"undercover", "verbal", "balk", "alkali", "alibi", "ibis", "bison", 
"sonar", "narcosis", "sister", "terraced", "cede", "edema", 
"emancipator", "torpor", "portraiture", "urea", "reassign", 
"ignoble", "blenched", "hedges", "gesture", "urethras", "raspy", 
"spyglass", "ass", "assailant", "antiquarians", "answered", 
"reduced", "cedes", "despair", "airfares", "resumed", "medicine", 
"ineffable", "bleacher", "herdsmen", "menhaden", "dent", 
"entitlement", "enticement", "entangle", "gleamed", "medullas", 
"lassie", "sieve", "even", "vender", "derivatives", "vessel", 
"selectmen", "mentor", "toreador", "dormer", "meringue", "guerrilla", 
"llanos", "nosedove", "overact", "actionable", "bleeps", "epsilon", 
"longhorn", "ornament", "entreaty", "atypical", "calendar", "dares", 
"resurgent", "entreat", "eater", "term", "ermine", "inedible", 
"bleeder", "derrières", "resentful", "fulcra", "crabbed", 
"bedevilment", "entwine", "inelegant", "antitoxins", "inspired", 
"redder", "derides", "descendant", "antihistamine", "inequitable", 
"bleat", "eaten", "tenured", "redcap", "capstans", "answerable", 
"blender", "deranges", "gestures", "restart", "arteriosclerosis", 
"sis", "sisal", "saltpeter", "terrifyingly", "glycerin", "rink", 
"inkwell", "ellipsis", "sisterhood", "oodles", "lessor", "sorrowed", 
"wedges", "gesundheit", "either", "hereafter", "termite", "iterator", 
"tornado", "adobes", "bespoken", "ken", "kens", "ensnare", "area", 
"rear", "earful", "fulfil", "fillet", "letdown", "ownership", 
"hipped", "pediatric", "richer", "heretical", "calculus", "lusher", 
"heraldic", "dice", "icebound", "underscored", "redskins", "instant", 
"antiperspirant", "anthropomorphic", "hiccup", "cup", "cups", 
"upstage", "agendas", "dashingly", "glycerol", "role", "oleo", 
"leonine", "ineluctable", "blessed", "sedatives", "vesicles", 
"lessens", "ensured", "redefine", "inextinguishable", "bleach", 
"achoo", "hooch", "ocher", "hero", "erode", "ode", "odes", "desktop", 
"topple", "pleasured", "redeveloped", "pediment", "entrapped", 
"pederasty", "stylus", "lush", "usher", "hermaphrodite", "item", 
"tempos", "postpaid", "aide", "ideogram", "rampart", "artisan", 
"sandhog", "hog", "hogwash", "ash", "ashram", "rammed", "mediocre", 
"crestfallen", "lend", "endow", "downcast", "astronomer", 
"merriment", "entrant", "antiwar", "warden", "dentures", "restful", 
"fulfillment", "entrapment", "enthrall", "allay", "layout", 
"outbound", "underclassman", "manhole", "oleander", "dermis", 
"misused", "sedater", "terrific", "fiche", "cheapens", "ensnares", 
"restrains", "insolent", "entombed", "bedraggle", "gleeful", 
"fulfilment", "entrenchment", "entrap", "rapper", "persistent", 
"enthronement", "enthusiast", "astute", "uterus", "rustproofed", 
"fedora", "orangeades", "despised", "seducer", "ceramic", 
"microscopic", "picnic", "nicotine", "inexpedient", "entomb", 
"ombudsman", "mantel", "teletypewriter", "terminological", "calif", 
"lifetimes", "mescaline", "inertia", "tiaras", "raster", "terrace", 
"acetaminophen", "henchmen", "menhadens", "enslaves", "vesper", 
"peroxide", "ideograph", "aphid", "hides", "desideratum", "tumor", 
"mortgagee", "geegaw", "gawk", "awkward", "ardent", "enthused", 
"sediment", "enter", "termed", "mediaeval", "valentine", "inexact", 
"actives", "vestment", "entourage", "agent", "entryway", "wayside", 
"idea", "dear", "earache", "checkups", "upsides", "descent", 
"entertainment", "entomological", "calicos", "cosign", "ignored", 
"redcoat", "oaten", "tensed", "sedan", "dank", "anklet", "lettered", 
"redskin", "kingpin", "pinups", "ups", "upshot", "hotbed", 
"bedtimes", "mes", "messenger", "germicides", "destitute", "utensil", 
"silencer", "cervix", "vixens", "ensign", "ignorant", "antipasti", 
"stimulus", "lusty", "stymie", "miens", "enslave", "averred", 
"redrew", "rewritten", "tenpins", "instructor", "torrent", 
"entertains", "insult", "ultrasound", "undersides", "despoil", 
"oilcloth", "other", "hereupon", "pondered", "redundant", "anthill", 
"ill", "illicit", "citizens", "ensnared", "rediscovered", "redesign", 
"ignoramus", "muskmelon", "longer", "gerrymander", "deride", "ideas", 
"easy", "asylum", "lumbermen", "mendicant", "antlered", "redevelop", 
"lopes", "pester", "terrapins", "instil", "tildes", "deserves", 
"vesicle", "cleave", "avenger", "germane", "anemia", "miasmas", 
"mash", "ashy", "shy", "shyster", "termagant", "antiaircraft", 
"afterglow", "lowland", "and", "androgen", "genitalia", "liars", 
"arson", "sonatas", "taste", "stepsister", "termini", "initiator", 
"tor", "torn", "ornamental", "tallow", "lowered", "red", "redraft", 
"aft", "aftertaste", "stereotypes", "pesky", "skyrocket", 
"kettledrum", "rummer", "merciful", "fulsome", "omens", "ensures", 
"resultant", "antennas", "nasal", "saleswoman", "mane", "anemometer", 
"terrains", "insightful", "fulcrum", "rumbas", "baseman", 
"mannikins", "insures", "resound", "underpass", "assassins", "inset", 
"settee", "teethe", "theological", "calf", "alfresco", "scornful", 
"fulfill", "illustrator", "torpid", "pidgin", "gins", "instal", 
"talc", "alcove", "overtakes", "kestrel", "relabel", "beleaguered", 
"redraw", "rawhide", "identical", "caliber", "beret", "retrace", 
"acetylene", "enemas", "massacred", "redeploys", "oyster", 
"terminator", "tortillas", "last", "astronomical", "calliope", 
"operator", "tort", "orthographic", "hiccups", "upstart", 
"artificer", "cervical", "callus", "lustre", "trend", "endeavor", 
"vortex", "textures", "researcher", "heroins", "instill", "illegal", 
"galloped", "pedagogical", "callipered", "rediscover", "vertebra", 
"brasher", "herbicides", "descry", "cryptogram", "ramrod", "rodeo", 
"deodorizer", "zeros", "rosebush", "ushered", "redden", "denatures", 
"reset", "setups", "upside", "ides", "describes", "besides", 
"desperado", "adores", "reshuffle", "flea", "leaflet", "lethal", 
"halibut", "but", "button", "tonic", "niche", "cherubim", "bimbos", 
"bosun", "sunk", "unkind", "indentures", "resend", "endures", 
"restorer", "reran", "rang", "anger", "germicide", "ideological", 
"calabash", "ashamed", "medical", "caloric", "rickshas", "hasten", 
"tendon", "donkey", "keyword", "ordains", "insecticides", "desires", 
"resin", "sins", "inspector", "torrid", "rid", "rides", "despot", 
"potpie", "piebald", "aldermen", "menace", "ace", "acerbic", "bicep", 
"cephalic", "lichen", "hennas", "nasty", "styes", "yesterday", "day", 
"daybed", "bedridden", "dental", "talisman", "mankind", "indignant", 
"antique", "questionnaires", "resubmit", "mitten", "tenfold", "old", 
"olden", "denudes", "design", "ignores", "resumes", "mesdames", 
"mesas", "sass", "assemblywoman", "mangle", "glee", "leeway", 
"waylay", "laywomen", "menswear", "ear", "earldom", "domains", "ins", 
"instrumental", "tall", "all", "allegorical", "calm", "almanac", 
"nacre", "credit", "dittos", "tossup", "superman", "mandolin", 
"linesman", "manacle", "cleverer", "rerun", "runaway", "way", 
"wayfarer", "reruns", "unshaven", "ventures", "resell", "elliptical", 
"calmer", "mercuric", "ricochet", "heterodoxy", "oxymora", 
"orangutang", "angina", "inapt", "apt", "aptitudes", "descend", 
"endear", "earlobes", "bestowal", "walleyes", "yes", "yeshivas", 
"vassal", "saltcellar", "larval", "valiant", "anthropological", 
"calfskin", "kind", "inductee", "tee", "teenager", "gerund", 
"underclass", "assemblyman", "manservant", "antelopes", "peso", 
"esoteric", "rickshaw", "hawser", "servicewomen", "mental", 
"tallyhos", "hospital", "talon", "longshoremen", "men", "menthol", 
"holography", "phylum", "lumberman", "manikin", "kingpins", 
"install", "allures", "resuscitator", "tortilla", "llamas", 
"massacres", "resistor", "tormentor", "torque", "queasy", 
"asymmetric", "ricksha", "sharped", "pedlar", "largos", "gossamer", 
"merganser", "service", "icebox", "boxer", "xerography", "physical", 
"calculator", "tortures", "resonant", "anticlimax", "maxima", "imam", 
"mammon", "monograph", "aphelia", "liaison", "sonic", "nicknamed", 
"media", "diametrical", "calliper", "performed", "medulla", "llama", 
"amalgam", "gamins", "insulin", "lineman", "mantra", "transplant", 
"antigen", "genres", "respires", "resold", "oldie", "diesel", 
"seldom", "domed", "medieval", "valor", "lordship", "hipper", "per", 
"perspires", "restores", "restructures", "resort", "orthodoxy", 
"oxygen", "gentlemen", "menopausal", "saltpetre", "treacle", 
"cleaver", "verdigris", "risen", "send", "end", "endemic", 
"microfiche", "checkout", "outclass", "assault", "ultraviolet", 
"let", "letterbox", "boxcar", "carom", "roman", "manifesto", 
"stovepipes", "pesticides", "described", "bedsides", "descant", 
"anthem", "hempen", "penguins", "insignificant", "antebellum", 
"lumbar", "barracudas", "dash", "ashcan", "cannonball", "allover", 
"verbena", "enamor", "morgue", "guerrillas", "lash", "ashen", 
"henchman", "mandolins", "inspires", "resistant", "antechamber", 
"bereave", "aver", "vermin", "minim", "nimbus", "bus", "businessman", 
"mantras", "rasp", "asphalt", "altogether", "her", "hereabout", 
"outcast", "astrological", "calisthenic", "nicknames", "mescal", 
"calliopes", "pesetas", "tassel", "selectman", "mannikin", 
"kinswoman", "man", "manic", "nicer", "cerebra", "bravado", "adobe", 
"obeisant", "antiparticle", "clever", "versus", "sushi", "shirr", 
"irrelevant", "antelope", "open", "pentagon", "gonad", "nadir", 
"directorship", "hippopotami", "amid", "midwifed", "fedoras", 
"rasher", "herbal", "ball", "allot", "lot", "lotus", "tussle", 
"sledgehammer", "merchant", "ant", "antidepressant", "anther", 
"heraldry", "drywall", "allegros", "rosebud", "budgerigar", 
"garbageman", "manikins", "inscribes", "bestow", "townsmen", "menu", 
"enures", "restaurant", "antithetical", "calico", "icon", "confound", 
"underbid", "bidden", "denser", "seraphic", "hiccuped", "pedigree", 
"reeve", "ever", "vertical", "caliper", "perusal", "salami", "amir", 
"mires", "restraint", "interstellar", "larkspur", "puritanical", 
"calligrapher", "herdsman", "manatee", "teepee", "peeve", "everyday", 
"daydreamer", "meres", "result", "ultimatum", "tumbril", "rill", 
"illogical", "calligraphy", "physic", "sickbed", "bedsores", 
"resolver", "vertebras", "rascal", "call", "allergenic", "nickname", 
"amebas", "baste", "stepson", "son", "sonnet", "net", "nether", 
"heros", "rosins", "insular", "larvas", "vast", "astrakhan", 
"handyman", "manicures", "resins", "instep", "tepid", "pidgins", 
"inscribed", "bedbug", "bug", "bugbear", "earwax", "waxen", 
"xenophobia", "biathlon", "longhair", "airstrip", "ripple", "pleas", 
"eastbound", "underachiever", "verbatim", "timbre", "brew", 
"rewound", "underplay", "laywoman", "mandarins", "insofar", "farm", 
"armpit", "pitcher", "herald", "alderman", "mangos", "gossip", 
"sipped", "pedagogue", "guerillas", "laser", "serape", "aped", 
"pederast", "astound", "underground", "underpins", "insane", 
"anemic", "micra", "crane", "anew", "new", "newscast", "astir", 
"tiro", "ironware", "are", "areas", "east", "astronomic", 
"microchip", "hippopotamus", "mustache", "chervil", "villas", "lass", 
"assassin", "sinew", "newsman", "mangrove", "overtax", "taxicab", 
"cabana", "anathemas", "mast", "astronaut", "author", "horoscope", 
"opera", "eraser", "serfdom", "dominos", "nostrum", "rumpus", "pus", 
"pushcart", "arthropod", "podia", "diatom", "tomboy", "boycott", 
"ottoman", "manhunt", "untidy", "idyllic", "licensee", "seethe", 
"thereabout", "outplay", "layoff", "officer", "cerebrum", "rum", 
"rumple", "plethora", "oracle", "clergyman", "maneuver", "verandas", 
"dashikis", "kisser", "serum", "rumor", "morbid", "bidet", "detach", 
"achiever", "vertex", "text", "extremer", "merino", "inopportune", 
"uneaten", "tensor", "sort", "orthopedic", "dickie", "kielbasas", 
"sashay", "hayloft", "often", "ten", "tenpin", "pinkeye", "eyeball", 
"allegro", "grout", "outfox", "fox", "foxtrot", "rot", "rotund", 
"underwear", "earshot", "hot", "hotshot", "hotel", "telex", 
"lexicon", "congresswoman", "manor", "northbound", "undertow", 
"township", "hippos", "possessor", "sorbet", "betcha", "chart", 
"art", "article", "clear", "earwig", "wigwam", "wampum", "pummel", 
"melodic", "dictum", "tumbrel", "relic", "licit", "citadel", "delay", 
"lay", "laypeople", "plectra", "traumas", "mascot", "cotyledon", 
"donor", "nor", "normal", "malt", "altar", "tart", "artiste", 
"stencil", "cilantro", "trouper", "pericardia", "diadem", "democrat", 
"rattan", "tang", "angstrom", "romper", "perturb", "urban", "bang", 
"angel", "gelatin", "tint", "intros", "rostra", "trapper", 
"persimmon", "monsignori", "origin", "ginkgos", "gospel", "pelvis", 
"visor", "sorghum", "humid", "midair", "air", "airfoil", "oil", 
"oilskin", "kin", "kindergarten", "tentacle", "cleanser", "sermon", 
"monolog", "logarithmic", "microbes", "bestir", "tiros", "rosin", 
"sin", "singleton", "tonsil", "silicon", "con", "constraint", 
"intagli", "glint", "interwove", "overshadow", "downtrodden", 
"dentin", "tin", "tinsel", "sellout", "out", "output", "put", 
"putsch", "schoolmarm", "arm", "armor", "moribund", "underpin", 
"pint", "interloper", "periwig", "wig", "wigwag", "wagon", 
"gonorrhea", "hearten", "tenon", "nonverbal", "balsam", "samovar", 
"varmint", "interviewee", "weeper", "perturbed", "bed", "bedpan", 
"panache", "chestnut", "nut", "nutmeg", "meg", "megalopolis", 
"lissom", "somersault", "ultra", "tram", "ramp", "amputee", "teeth", 
"ethos", "hos", "hostel", "telescopic", "picayune", "uneven", 
"vendor", "dorsal", "salad", "ladybug", "bugaboo", "boomerang", 
"angora", "orangutan", "tandem", "demagogry", "gryphon", 
"honeycombed", "bedlam", "lamb", "ambergris", "risky", "sky", 
"skycap", "capstan", "tannin", "ninepin", "pinpoint", "interpret", 
"retiree", "reefer", "fer", "ferret", "returnee", "needlepoint", 
"interurban", "bantam", "tamp", "ampul", "pullout", "outrun", 
"runabout", "outstrip", "rip", "ripen", "pennon", "nonfat", "fathom", 
"homespun", "puns", "unsubscribes", "besom", "sombre", "breathe", 
"theatre", "tremor", "mortar", "tarpaulin", "lintel", "telethon", 
"honeydew", "dewlap", "lap", "lapel", "pelvic", "victim", "timpani", 
"animus", "muscat", "cat", "catsup", "sup", "superstar", "taro", 
"arousal", "salamis", "misprint", "interwoven", "venom", "nomad", 
"madam", "dam", "dampen", "penicillin", "lint", "intercom", 
"compound", "underpay", "pay", "payoff", "off", "offal", "fallout", 
"outwit", "withal", "halt", "altho", "tho", "thou", "housebound", 
"undergrad", "radio", "diocesan", "sanserif", "riffraff", 
"affidavit", "vitamin", "minicam", "campus", "pussycat", "catamaran", 
"rancor", "cornucopia", "piano", "anon", "non", "nonpartisan", 
"sandbar", "bar", "barren", "renewal", "walkout", "outruns", 
"unsnap", "naphtha", "thalamus", "musky", "skydove", "overrun", 
"run", "runs", "unsheathe", "the", "theorem", "remove", "overreach", 
"ache", "cherub", "rubes", "beseech", "echo", "chosen", "sensor", 
"sorrel", "relay", "layman", "mantillas", "lasagna", "gnat", 
"natures", "resonator", "torus", "russet", "set", "setback", 
"acknowledgement", "entanglement", "entombment", "entourages", 
"gestates", "testing", "ingratiate", "ate", "ateliers", "ersatzes", 
"zest"}

1

Python 90

deductibles upended ผู้เช่ากระดานหกแต่งงาน wed ฉงนสนเท่ห์ cesarians ตอบคำถาม sesames meshes ลังเล ionesthere การติดตั้งการตั้งค่า osclerated เต็มไปด้วยความสนุกสนาน oscillator oscillator oscillator oscillator entertain term song song song song song song song song song song song song song song song song song song song ยอมรับท่าทางท่อปัสสาวะผื่นลังเลใจ maxima จินตนาการจินตนาการผู้ติดเชื้อที่ทดสอบน่าเบื่อ slyness เอสเซ้นส์เซสชั่นเซสชั่นการตัดสินบน werewolves เสื้อกั๊กคำตอบมนุษย์หมาป่าเสื้อกั๊กนับถือ meddlesome ไข่เจียว lettuces cion ไอออนไนซ์การกลืนไอออน

ก่อนอื่นฉันต้องล้างรายการด้วยตนเองโดยลบทั้งหมด

  • คำด้วยอักษรตัวใหญ่
  • คำที่มีเครื่องหมายวรรคตอนของ
  • คำที่มีéêèáâàö
  • คำ 1- และ 2 ตัวอักษร

ค่าใช้จ่ายฉันมากที่สุด 2 คะแนนเพราะคำเหล่านั้นสามารถอยู่ในจุดเริ่มต้นหรือจุดสิ้นสุดของห่วงโซ่ แต่จะลด wordlist โดย 1/3 และฉันไม่ต้องจัดการกับ Unicode

ต่อไปฉันสร้างรายการของคำนำหน้าและคำต่อท้ายทั้งหมดค้นหาการทับซ้อนและยกเลิกคำทั้งหมดยกเว้นว่าทั้งคำนำหน้าและคำต่อท้ายอยู่ในชุดการทับซ้อน อีกครั้งนี่เป็นการปัดคะแนนออกมากที่สุด 2 คะแนนของฉัน แต่ก็ช่วยลด wordlist ให้เหลือเพียงหนึ่งในสามของขนาดดั้งเดิม (ลองใช้อัลกอริทึมของคุณบนshort_listเพื่อการเร่งความเร็วที่เป็นไปได้) และคำอื่น ๆ คำตัวอักษรที่เชื่อมต่อกับตัวเองเท่านั้น) ในความเป็นจริงเกือบทุกคำสามารถเข้าถึงได้จากคำอื่น ๆ ผ่านเส้นทางที่มีค่าเฉลี่ย 4 ขอบ

ฉันเก็บจำนวนลิงก์ในเมทริกซ์คำคุณศัพท์ที่ทำให้การดำเนินการทั้งหมดง่ายขึ้นและช่วยให้ฉันทำสิ่งที่เจ๋ง ๆ เช่นดูขั้นตอนต่อไปหรือนับวงจร ... อย่างน้อยก็ในทางทฤษฎีเพราะอย่างน้อยมันใช้เวลาประมาณ 15 วินาที ในระหว่างการค้นหา แต่ฉันเริ่มต้นที่คำนำหน้าแบบสุ่มและเดินไปรอบ ๆ แบบสุ่มไม่ว่าจะเลือกจุดจบที่เหมือนกันโดยนิยมสิ่งที่เกิดขึ้นบ่อยครั้ง (เช่น '-ing') หรือสิ่งที่เกิดขึ้นน้อยกว่า
ทั้งสามสายพันธุ์ดูดเท่า ๆ กันและผลิตโซ่ในช่วง 20-40 แต่อย่างน้อยก็เร็ว เดาว่าฉันต้องเพิ่มการสอบถามซ้ำหลังจากทั้งหมด

from numpy import *
f = open('words_short.txt')
words = f.read().split() # 62896
f.close()

prefix = [w[:3] for w in words]     # 2292
suffix = [w[-3:] for w in words]    # 2262
common = set(prefix) & set(suffix)  # 1265

PSW = [(p,s,w) for (p,s,w) in zip(prefix, suffix, words) if p in common and s in common] # 28673
common = list(common)
mapping = dict(zip(common, range(len(common)))) # enumerate trigrams

M = zeros((len(common), len(common)), dtype=int) # for fast processing
W = [[[] for i in range(len(common))] for j in range(len(common))] # for reconstruction
for p,s,w in PSW: # build adjacency matrix
    M[mapping[p], mapping[s]] += 1
    W[mapping[p]][mapping[s]].append(w)

def chain(A, rho=0):
    B = array(A)
    links = []
    start = random.randint(len(B))
    links.append(start)
    while 1:
        nextpos = where(B[links[-1],:]>0)[0]
        if len(nextpos)==0: return links
        nextnum = B[links[-1],nextpos]

        p = ones(len(nextnum))/len(nextnum) # pick uniformly
        if rho>0: p = nextnum*1./sum(nextnum) # prioritize many links
        if rho>1: p = 1/p; p = p/sum(p) # prioritize few links

        chosen = random.choice(nextpos, p=p)
        B[links[-1], chosen] -= 1
        links.append(chosen)

def chain2words(L):
    # can only be used once because of .pop()
    z = zip(L[:-1],L[1:])
    res = []
    for p,s in z:
        res.append(W[p][s].pop())
    return res

chains = [chain(M) for i in range(100)]
bestchain = chains[argmax(map(len, chains))]
print ' '.join(chain2words(bestchain))

เดิมผมอยากจะลองสิ่งที่คล้ายกับนี้แต่ตั้งแต่นี้เป็นกราฟที่มีรอบไม่มีขั้นตอนวิธีการมาตรฐานสำหรับการทอพอโลยีการเรียงลำดับที่ยาวที่สุดเส้นทางเส้นทาง Eulerian ที่ใหญ่ที่สุดหรือปัญหา Postman จีนทำงานหนักโดยไม่ต้องแก้ไข

และเนื่องจากมันดูดีนี่คือรูปภาพของเมทริกซ์ adjacency M, M ^ 2 และ M ^ infinity (infinity = 32, มันไม่เปลี่ยนหลังจากนั้น) ด้วย white = nonzero
ป้อนคำอธิบายรูปภาพที่นี่


ดังนั้นคะแนนของคุณคือ 90 ในขณะที่เรามีรายการมากกว่า 1,700 รายการ .. มีอะไรที่ขาดหายไปบ้าง
เครื่องมือเพิ่มประสิทธิภาพ

1
ก่อนอื่นฉันยังคงทำงานต่อไป แต่นอกเหนือจากนั้น - ดูเหมือนความคิดที่ดีฉันลองแล้วก็ล้มเหลว หากมีสิ่งใดสิ่งนี้จะหยุดผู้คนไม่ให้เสียเวลาโดยใช้วิธีการเดียวกัน
DenDenDo

Heh :) ติดตามทัศนคติเชิงบวก :) หวังว่าจะได้ผลลัพธ์ที่ดีกว่านี้
เครื่องมือเพิ่มประสิทธิภาพ

2
" คำเหล่านั้นสามารถอยู่ในจุดเริ่มต้นหรือจุดสิ้นสุดของห่วงโซ่ " ไม่ถูกต้อง ส่วนประกอบที่เชื่อมต่อที่ใหญ่ที่สุดในกราฟรวมถึงคำเช่นboutonnièresซึ่งมีอักขระเน้นเสียง แต่ไม่ได้อยู่ในคำนำหน้าหรือคำต่อท้าย มันมีผลกับคำเพียงโหลหรือมากกว่านั้น แต่หนึ่งในนั้นอาจเป็นลิงค์สำคัญ
Peter Taylor
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.