13 svar
194 visningar
SeriousCephalopod är nöjd med hjälpen!
SeriousCephalopod 1818
Postad: 1 jun 2018

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)

Guggle 1417
Postad: 1 jun 2018

"grattis du har hittat seriouscephalopods ord"

(Jag tog mig friheten att sätta in lite mellanrum)

SeriousCephalopod 1818
Postad: 2 jun 2018

12538024700682665222940784450674945444964972656257077014573225844887

Lindehaven 206
Postad: 2 jun 2018

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)

dajamanté 5246
Postad: 2 jun 2018

OMG jag räckte öppna och läsa denna tråd och nu är jag hjärnskaddad 😂

dajamanté 5246
Postad: 2 jun 2018
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å.

Lindehaven 206
Postad: 2 jun 2018 Redigerad: 2 jun 2018

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?

Guggle 1417
Postad: 2 jun 2018 Redigerad: 2 jun 2018

Testa följande i Mathematica:

list = IntegerDigits[283945058617255390073943653594695649062516685278241224665, 29];
StringPart["abcdefghijklmnopqrstuvwxyzåäöo", list]

dajamanté 5246
Postad: 2 jun 2018

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

dajamanté 5246
Postad: 2 jun 2018

Oooooh Guggle du är en Mathematicagician!

Kan du förklara din kod?

AlvinB 3213
Postad: 2 jun 2018

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.

dajamanté 5246
Postad: 3 jun 2018
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''?

AlvinB 3213
Postad: 3 jun 2018

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 1980119801 så ser vi att siffrorna blir

23,15,23{23,15,23}

vilket betyder att

19801=23·292+15·291+23·29019801=23\cdot 29^2+15\cdot 29^1+23\cdot 29^0

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.

dajamanté 5246
Postad: 3 jun 2018

Just det. Det var vad förklarades i artikeln som Lindehaven skickade igår.

Svara Avbryt
Close