Portál AbcLinuxu, 24. dubna 2024 02:50

Číslo účtu na prianie

31.7.2020 23:23 | Přečteno: 1400× | Linux | poslední úprava: 31.7.2020 23:27

Niektoré banky umožňujú voľbu vlastného čísla účtu, lenže nie každé číslo bude fungovať, tak som spravil malý skript, ktorý takéto čísla vyhľadá.

Číslo účtu má 10 cifier a splňovať formát "modulo 11", čiže počíta sa tak, že každá cifra sa vynásobí jej váhou: 2^n mod 11, tie sčítame a vysledok musí byť deliteľný 11. Tieto pravidlá fungujú minimálne v CZ a SK

Chcel som nejaké jednoducho zapamatateľné čísla účtov a tak som spravil v hadovi skript, ktorý vyhľadá všetky čísla podľa zadaných pravidiel:

import sys
import string


WEIGHT = (6, 3, 7, 9, 10, 5, 8, 4, 2, 1)


def get_digits(number):
    return [int(digit) for digit in number]


def validate_number(number):
    chk = sum([w * i for w, i in zip(WEIGHT, get_digits(number))])
    return chk % 11 == 0


def search_numbers(number):
    if len(number) != 10:
        return None
    letters = set()
    for letter in string.ascii_lowercase:
        if letter in number:
            letters.add(letter)
    numbers = []
    for i in range(10 ** len(letters)):
        tested = number
        for letter, num in zip(letters, get_digits(f'{i:0{len(letters)}d}')):
            tested = tested.replace(letter, str(num))
        if validate_number(tested):
            numbers.append(tested)
    return sorted(numbers)


def _main(number):
    numbers = search_numbers(number)
    if numbers is None:
        print("account number must have 10 characters")
    for num in numbers:
        print(num)


if __name__ == '__main__':
    _main(sys.argv[1])
vstup môže byť napríklad 1234abcdaa a to bude za pismenka doplňovať rôzne kombinácie a vypíše ktoré sú vyhovujú, napr:
$ python3 search.py 1234aaabbb
1234000999
1234111111
1234222444
1234333777
1234555222
1234666555
1234777888
1234888000
1234999333

$ python3 search.py 00aaaabbbb
0000000000
0011116666
0022221111
0033337777
0044442222
0055558888
0066663333
0077779999
0088884444

$ python3 number_search.py 00abababab
0000000000
0019191919
0027272727
0035353535
0043434343
0051515151
0078787878
0086868686
0094949494

takto sa dajú nájsť rôzne kombinácie ľahko zapamatateľných čísel.        

Hodnocení: 86 %

        špatnédobré        

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

Komentáře

Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře. , Tisk

Vložit další komentář

1.8.2020 15:40 Bhezret | skóre: 1 | blog: Bherzetův blog
Rozbalit Rozbalit vše Re: Číslo účtu na prianie
Odpovědět | Sbalit | Link | Blokovat | Admin
Škoda toho Pythonu, v Javě by to bylo rychlejší a bezpečnější, jinak pěkná práce.
1.8.2020 16:01 rajcze | skóre: 6 | blog: rajcze | kus od Brna
Rozbalit Rozbalit vše Re: Číslo účtu na prianie
Asi nemel pul tera RAM na to aby to v Jave spustil :)
Rules of Optimization: Rule 1: Don't do it. Rule 2 (for experts only): Don't do it yet.
1.8.2020 16:48 bugme | skóre: 16 | blog: bugme
Rozbalit Rozbalit vše Re: Číslo účtu na prianie
+1 (případně v Rustu)
1.8.2020 17:06 hm
Rozbalit Rozbalit vše Re: Číslo účtu na prianie
+1 Javascript je budoucnost.
vlk avatar 2.8.2020 10:00 vlk | skóre: 23 | blog: u_vlka
Rozbalit Rozbalit vše Re: Číslo účtu na prianie
napis si to v com chces, program som mal hotovy ani ne za 10 minut (preto aj tak vyzera), predpokladam ze v Jave to das za 3 minuty.
You don't exist, Go away !
1.8.2020 16:49 bugme | skóre: 16 | blog: bugme
Rozbalit Rozbalit vše Re: Číslo účtu na prianie
Odpovědět | Sbalit | Link | Blokovat | Admin
Taky si můžeš vygenerovat bitcoinovou nebo třeba torovou adresu...
3.8.2020 10:55 pavell
Rozbalit Rozbalit vše Re: Číslo účtu na prianie
Odpovědět | Sbalit | Link | Blokovat | Admin
Proč to nedáš na gist?
Gréta avatar 3.8.2020 18:09 Gréta | skóre: 36 | blog: Grétin blogísek | 🇮🇱==❤️ , 🇵🇸==💩 , 🇪🇺==☭
Rozbalit Rozbalit vše Re: Číslo účtu na prianie
Odpovědět | Sbalit | Link | Blokovat | Admin

todleto bytě jako mohlo zajímat pane vlk hele :O :O ;D ;D

ten zoreček jak ho tam maj popsanej asi jako nefunguje ale se zahrnutím tý váhy druhý číslice zprava snad jakoby jo. je tam jediná vyjímka ato když je zbytek po dělení dvojka. řešim to hejbáním uplně nejposlednější cifričkou napravo v čísle. pokud bysme vybrali jako tamtu modulo pozici poslední cifričku s váhou 1 tak zase nenajdem řešení pro zbytek 1 protože desítku na pozici jedný cifry nenacpem stejně jako u tý předposlední u zbytku 2 :O :O :D ;D

si teda jako myslim že nám stačí mit závislý jenom nějaký dvě zvolený cifry v tom čísle abysme z uplně jakýhokoliv zbytku mohli jakoby udělat něco dělitelnýho bezezbytku jedenáctma noa s vostatníma ciframa čísla si mužem moct dělat uplně co chcem a nebudem muset dělat řešení hrubou silou :D :D ;D ;D

#!/usr/bin/python3

WEIGHT = (6, 3, 7, 9, 10, 5, 8, 4, 2, 1)

def validate_number(number):
    chk = sum([w * i for w, i in zip(WEIGHT, number)])
    return chk % 11 == 0


# kontrolni pozice je předposlední číslice v čísle účtu
def dopocitej_kontrolni_pozici(number):
    chk = sum([w * i for w, i in zip(WEIGHT, number)])
    
    zbytek = chk % 11
    
    # zbytek plus co je dělitelný bezezbytku jedenácti?? :O ;D
    # předposlední pozice má váhu 2 takže budem skákat po dvojkách od nuly po 18
    # mužem najít pro všecky hodnoty zbytku kromě dvojky protože desítku (abysme měli 22) do jedný
    # jediný cifričky prostě nenacpem ikdbyby sme jakoby děsně moc chtěli :/ :/
    # asi to maj v tom popisu blbě ale nevim
    if zbytek != 2:
        for x in range(0,10):
            if (zbytek + x*2) % 11 == 0:
                number[-2] = x
                return True

    # když máme zbytek 2 uděláme úpravu nejposlednější čísličky napravo co má váhu jedna
    # takže hejbnem celým zbytkem o jedna
    # lepší řešení mě nenapadlo :/ :/
    else:
        
        if number[-1] < 9:
            number[-1] += 1
            number[-2] = 4
            return True
        else:
            number[-1] = 8
            number[-2] = 5
            return True
    
    # funguje to jakoby ždycky???? :O :O :O :O
    # nóóó mělo by že :O :O ale projistotu :D :D ;D ;D
    return False

# na kontrolní pozici nechávám nuličku by nám to tuhletu hodnotu jakoby přeskočilo
# při dělání sumy
cisla = []
cisla.append([1,2,3,4,5,6,7,8,0,9])
cisla.append([7,7,7,7,7,7,7,7,0,7])
cisla.append([1,2,4,8,6,2,4,8,0,2])
cisla.append([3,1,4,1,5,9,2,6,0,3])
cisla.append([1,1,2,3,5,8,3,1,0,1])
cisla.append([4,1,8,3,5,8,3,4,0,4])

for num in cisla:
    dopocitej_kontrolni_pozici(num)
    print(num)

    if validate_number(num):
        print('cislo je validni')
    else:
        print('cislo neni validni')
oslavná píseň na pana soudruha generalisima prezidentčíka Petra Pavla Pávka 🎶🫡🦚🎶

Založit nové vláknoNahoru

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.