zeitgeist Skrevet 6. september 2005 Del Skrevet 6. september 2005 Jeg har hjulpet en person med å automatisere den temmelig bisarre sysselen numerologi. Det dreier seg f.eks om å finne "Skjebnetallet" ved å legge sammen og redusere sifrene i fødselsdatoen til et enkelt siffer, som må være 1-9, 11, 22 eller 33. F.eks blir 6.sept i år til "skjebnetallet" 4: 0 + 6 + 0 + 9 + 2 + 5 = 22 => 2 + 2 = 4. Jeg har denne funksjonen for å finne tallet: valid_numbers = [1,2,3,4,5,6,7,8,9,11,22,33] def reduce_number(n): n = str(n) if len(n) > 1: while True: num = sum((int(x) for x in n)) if num in valid_numbers: return str(num) n = str(num) return str(n) Den gjør jobben, men virker litt omstendelig. Finnes det en smartere, mer matematisk måte å gjøre det på? Ser for meg et-eller annet med reduce() og divmod(), men det blir bare rot Lenke til kommentar
kingkong Skrevet 6. september 2005 Del Skrevet 6. september 2005 Her har du en i Ruby, for litt variasjon (tar en streng inn). def numb(s) return s.length == 1 ? s : numb(s.split(//).inject(0){|i,j| i+j.to_i}.to_s) end Meget mulig jeg misforstod hele oppgaven, dog... Lenke til kommentar
zeitgeist Skrevet 6. september 2005 Forfatter Del Skrevet 6. september 2005 (endret) Den funker den, men innenfor numerologien er det slik at 11, 22 og 33 er spesielle tall, så 8,3, blir f.eks 11, ikke 1+1=2. Utrolig ekspressivt, Ruby! Edit: Kikket på det på nytt. Beskar istedet for å lete etter en fancy løsning: def reduce_number(num, valid_numbers = (1,2,3,4,5,6,7,8,9,11,22,33)): if str(num) == '0': return num while True: num = sum((int(x) for x in str(num))) if num in valid_numbers: return str(num) Endret 7. september 2005 av zeitgeist Lenke til kommentar
Torbjørn Skrevet 14. september 2005 Del Skrevet 14. september 2005 Hva med: def numb(tall): while tall not in range(1,9)+[11,22,33]: tall=sum([int(i) for i in str(tall)]) return tall Lenke til kommentar
zeitgeist Skrevet 14. september 2005 Forfatter Del Skrevet 14. september 2005 Hva med: def numb(tall): while tall not in range(1,9)+[11,22,33]: tall=sum([int(i) for i in str(tall)]) return tall Ja den er fin! Må ha range(1,10), men ellers lekker. Lenke til kommentar
Torbjørn Skrevet 14. september 2005 Del Skrevet 14. september 2005 ah, 10 ja, selvsagt Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå