Slå upp ~10^56:e ordet i ordlistan
Inspirerades till att formulera ett inte alltför originellt project-euler-artat problem av ett annat problem i en tråd även om det problemet hade en lite annan strukltur.
Låt säga att du vill skriva en ordbok som innehåller alla tänkbara ord byggda med 29 bokstäver; a,b,c,d,...,, u,v,w,x,y,z,å,ä,ö och att du sedan börjar att lista dem i din ordbok i bokstavsoordning där kortare ord kommer före längre. De första 100 orden i ordlistan kommer alltså att vara:
a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, å, ä, ö, aa, ab, ac, ad, ae, af, ag, ah, ai, aj, ak, al, am, an, ao, ap, aq, ar, as, at, au, av, aw, ax, ay, az, aå, aä, aö, ba, bb, bc, bd, be, bf, bg, bh, bi, bj, bk, bl, bm, bn, bo, bp, bq, br, bs, bt, bu, bv, bw, bx, by, bz, bå, bä, bö, ca, cb, cc, cd, ce, cf, cg, ch, ci, cj, ck, cl,
Det 1:a ordet i denna lista är 'a', det 51:a ordet är 'av', och på post 13141 finner man ordet 'ord'
Vilket är det 283945058617255390073943653594695649062516685278241224665:e ordet i denna ordlista?
(Man kan även försöka hitta ord 19801 som alternativ)
"grattis du har hittat seriouscephalopods ord"
(Jag tog mig friheten att sätta in lite mellanrum)
12538024700682665222940784450674945444964972656257077014573225844887
Guggle, du hann före!
Skrev ett Python-hack som skriver ut det n:te ordet, bl a nr 19801 som är "wow".
alphabet = "abcdefghijklmnopqrstuvwxyzåäö"
def letter(a):
a -= 1
if a>28:
letter(a//29)
print(alphabet[a%29], end="")n = 283945058617255390073943653594695649062516685278241224665
letter(n)
OMG jag räckte öppna och läsa denna tråd och nu är jag hjärnskaddad 😂
Guggle skrev:"grattis du har hittat seriouscephalopods ord"
(Jag tog mig friheten att sätta in lite mellanrum)
Jag vill ha tips om hur du gjorde!
På SeriousC. andra tråd har jag försökt följande:
QuotientRemainder[2180796798111435840484875151608, (28!)] som ger svaret 7. Så jag tänkte att om man ta bort a, vi hoppar fram 7 bokstäver, och börjar om från ''i''. och gör samma sak. Men det är uppenbarligen inte rätt sätt att gå.
Konvertera talet 283945058617255390073943653594695649062516685278241224665 i basen 10 till ett "tal" i basen 29, t ex med algoritmen i www.matteguiden.se/matte-diskret/de-hela-talen/binara-och-hexadecimala-tal/.
En rekursiv funktion liknande den jag skrev lämpar sig bra till sånt. Den kan enkelt förbättras till att hantera ett alfabet av godtycklig längd. En programmeringsövning kanske?
Testa följande i Mathematica:
list = IntegerDigits[283945058617255390073943653594695649062516685278241224665, 29];
StringPart["abcdefghijklmnopqrstuvwxyzåäöo", list]
Jag var på g. nånstans i morse (!) men mitt i min lösning glömde jag varför jag gjorde det.
Jag testar din trix i mathematica :))
Oooooh Guggle du är en Mathematicagician!
Kan du förklara din kod?
IntegerDigits[..., 29] ger siffrorna till talet i bas 29. Eftersom alfabetet är tjugonio bokstäver långt motsvarar alltså varje siffra en bokstav.
StringPart-kommandot omvandlar helt enkelt dessa siffror till bokstäver utifrån var i alfabetet de sitter. 1 omvandlas till A eftersom A är först i "abcdefghijklmnopqrstuvwxyzåäö", 2 omvandlas till B eftersom B kommer näst och så vidare.
AlvinB skrev:IntegerDigits[..., 29] ger siffrorna till talet i bas 29. Eftersom alfabetet är tjugonio bokstäver långt motsvarar alltså varje siffra en bokstav.
Hur vet IntegerDigits vars börjar och vars sluttar ett tal i uttrycket (kan det kallas uttryck?) ''283945058617255390073943653594695649062516685278241224665''?
IntegerDigits omvandlar talet till bas 29, d.v.s. man skriver talet med olika siffror mellan 0-28 så att varje siffra är faktorn till en potens av 29. Om vi tar talet så ser vi att siffrorna blir
vilket betyder att
Eftersom den här uppdelningen gör så att man får en lista med tjugonio olika siffror kan man koppla varje siffra till en bokstav i alfabetet och därefter utläsa ordet.
Just det. Det var vad förklarades i artikeln som Lindehaven skickade igår.