Python factorial

Python factorial
« kdy: 13. 01. 2021, 17:43:41 »
Zdravim ako by ste v python-e riesily taketo zadanie. Cisto pre zaujimavost.\
Vstup je cislo napriklad 3
a pozadovany vysledok by mal vyzerat
1
12
123
12
1


Idris

  • *****
  • 1 050
    • Zobrazit profil
    • E-mail
Re:Python factorial
« Odpověď #1 kdy: 13. 01. 2021, 18:40:47 »
To je dost zajímavý “faktoriál” :)

Řešením jsou dva vnořené cykly.

Re:Python factorial
« Odpověď #2 kdy: 13. 01. 2021, 21:27:34 »
tady máš domácák hotovej  ;D ;D ;) ;)

Kód: [Vybrat]
#!/usr/bin/env python3
cislo = 9
for i in range(1,cislo*2):
    for j in range(1,i+1 if i<cislo else cislo*2 - i+1):
        print(j,end='')
    print()

Re:Python factorial
« Odpověď #3 kdy: 14. 01. 2021, 12:42:34 »
Co třeba takhle?
Kód: [Vybrat]
cislo = 9
rada = [*range(1, cislo+1), *reversed(range(1, cislo))]
for pozice in rada:
   print(*rada[:pozice], sep="")

Re:Python factorial
« Odpověď #4 kdy: 14. 01. 2021, 17:41:53 »
Co třeba takhle?
Kód: [Vybrat]
cislo = 9
rada = [*range(1, cislo+1), *reversed(range(1, cislo))]
for pozice in rada:
   print(*rada[:pozice], sep="")
hezký  :D


Re:Python factorial
« Odpověď #5 kdy: 14. 01. 2021, 17:51:53 »
I když to není tak elegantní, podle reference na faktoriál předpokládám, že domácí úkol je na procvičení rekurze.

Tedy třeba něco jako
Kód: [Vybrat]
def f(max_depth, prefix = '', cur_depth = 1):
  msg = prefix + str(cur_depth)
  print(msg)
  if cur_depth < max_depth:
      f(max_depth, msg, cur_depth + 1)
      print(msg)

f(3)

Re:Python factorial
« Odpověď #6 kdy: 14. 01. 2021, 17:56:40 »
si myslim že 'wangaradův faktoriál' by jako měl mit nějakou tamtu matematickou definici  ;D ;D ;D ;D

Kód: [Vybrat]
#!/usr/bin/env python3
import math
cislo = 9

'''

██╗    ██╗ █████╗ ███╗   ██╗ ██████╗  █████╗ ██████╗  █████╗ ██████╗ ██╗   ██╗██╗   ██╗
██║    ██║██╔══██╗████╗  ██║██╔════╝ ██╔══██╗██╔══██╗██╔══██╗██╔══██╗██║   ██║██║   ██║
██║ █╗ ██║███████║██╔██╗ ██║██║  ███╗███████║██████╔╝███████║██║  ██║██║   ██║██║   ██║
██║███╗██║██╔══██║██║╚██╗██║██║   ██║██╔══██║██╔══██╗██╔══██║██║  ██║██║   ██║╚██╗ ██╔╝
╚███╔███╔╝██║  ██║██║ ╚████║╚██████╔╝██║  ██║██║  ██║██║  ██║██████╔╝╚██████╔╝ ╚████╔╝
 ╚══╝╚══╝ ╚═╝  ╚═╝╚═╝  ╚═══╝ ╚═════╝ ╚═╝  ╚═╝╚═╝  ╚═╝╚═╝  ╚═╝╚═════╝  ╚═════╝   ╚═══╝ 
                                                                                       
███████╗ █████╗ ██╗  ██╗████████╗ ██████╗ ██████╗ ██╗ █████╗ ██╗                       
██╔════╝██╔══██╗██║ ██╔╝╚══██╔══╝██╔═══██╗██╔══██╗██║██╔══██╗██║                       
█████╗  ███████║█████╔╝    ██║   ██║   ██║██████╔╝██║███████║██║                       
██╔══╝  ██╔══██║██╔═██╗    ██║   ██║   ██║██╔══██╗██║██╔══██║██║                       
██║     ██║  ██║██║  ██╗   ██║   ╚██████╔╝██║  ██║██║██║  ██║███████╗                 
╚═╝     ╚═╝  ╚═╝╚═╝  ╚═╝   ╚═╝    ╚═════╝ ╚═╝  ╚═╝╚═╝╚═╝  ╚═╝╚══════╝                 
                                                                                       

je definovanej pouze pro celý čísla z intervalu 1-17

votázka jestli by jako měl mit i víc než jakoby jenom 'jednocifernej' výstup
zbuzuje vášně napříč vědeckou společností eště dneska :D :D ;D ;D
'''


def wangaraduv_faktorial(x, stred=cislo):
    return round(0.123456789 * math.exp( 2.3025850935108427 * (stred - abs(x - stred)) ) - 0.6089270610980823)

for i in range(1,cislo * 2):
    print(wangaraduv_faktorial(i))

_Jenda

  • *****
  • 606
    • Zobrazit profil
    • https://jenda.hrach.eu/
    • E-mail
Re:Python factorial
« Odpověď #7 kdy: 14. 01. 2021, 19:26:25 »

Re:Python factorial
« Odpověď #8 kdy: 14. 01. 2021, 19:35:42 »
Kód: [Vybrat]
def f(max_depth, prefix = '', cur_depth = 1):
  msg = prefix + str(cur_depth)
  print(msg)
  if cur_depth < max_depth:
      f(max_depth, msg, cur_depth + 1)
      print(msg)

f(3)

Šlo by to zjednodušit na práci čiste s čísly, kdyby to bylo potřeba:
Kód: [Vybrat]
def f(max_depth, num = 0, cur_depth = 1):
    num = num*10 + cur_depth
    print(num)
    if cur_depth < max_depth:
       f(max_depth, num, cur_depth + 1)
       print(num)

f(3)

qelurg

  • ****
  • 301
    • Zobrazit profil
    • E-mail
Re:Python factorial
« Odpověď #9 kdy: 15. 01. 2021, 08:13:17 »
Jeste trochu jiny zpusob:

Kód: [Vybrat]
cislo = 5
b = -cislo + 1
for y in range(b, cislo):
    m = cislo - abs(y)
    for x in range(1, m+1):
        print(x, end='')
    print()

qelurg

  • ****
  • 301
    • Zobrazit profil
    • E-mail
Re:Python factorial
« Odpověď #10 kdy: 15. 01. 2021, 08:31:41 »
Nebo takto:
Kód: [Vybrat]
cislo = 5
b = -cislo + 1
for y in range(b, cislo):
    m = cislo - abs(y)
    print(''.join([str(x) for x in range(1, m+1)]))


A z toho krypticky takto:
Kód: [Vybrat]
c = 5
for y in range(-c+1,c):print(''.join([str(x)for x in range(1,c-abs(y)+1)]))

Ma to 75 znaku, jde to jeste kratsi?
« Poslední změna: 15. 01. 2021, 08:37:25 od qelurg »

Re:Python factorial
« Odpověď #11 kdy: 15. 01. 2021, 08:46:38 »
Šlo by to zjednodušit na práci čiste s čísly, kdyby to bylo potřeba:
Kód: [Vybrat]
def f(max_depth, num = 0, cur_depth = 1):
    num = num*10 + cur_depth
    print(num)
    if cur_depth < max_depth:
       f(max_depth, num, cur_depth + 1)
       print(num)

f(3)

... to ale funguje jen do 9  ;)

Hamparle

  • ****
  • 302
  • junior developer ucho
    • Zobrazit profil
    • E-mail
Re:Python factorial
« Odpověď #12 kdy: 15. 01. 2021, 11:41:29 »
FUN FACT:
Slovo factorial se objevuje pouze v titulku dotazu.

Re:Python factorial
« Odpověď #13 kdy: 15. 01. 2021, 12:26:12 »
Ježišikriste.

To je brutus.
;D ;D

todle je hezčí pro čísla do desítky
Kód: [Vybrat]
math.floor(123456789 / (10 ** (10-x)) )
alekdyž by se to jako chtělo rožšířit na víc jak 9 tak to začne blbnout protože nepřesnosti s float počitáním :-\ ;)
Kód: [Vybrat]
cislo = 20
znaky = ''.join([str(x) for x in range(1, cislo+1)])
wangaradovo_cislo = int(znaky) / (10**len(znaky) )

print(znaky)
print(int( wangaradovo_cislo * (10**len(znaky)) ))

#vypise:
#1234567891011121314151617181920
#1234567891011121261512757346304

Re:Python factorial
« Odpověď #14 kdy: 15. 01. 2021, 14:45:35 »
... to ale funguje jen do 9  ;)

Dík, to jsem zbabral. Lze opravit takto, ale to už je škaredé:

Kód: [Vybrat]
def f(max_depth, num = 0, cur_depth = 1):
     num = num*(10**len(str(cur_depth))) + cur_depth
     print(num)
     if cur_depth < max_depth:
        f(max_depth, num, cur_depth + 1)
        print(num)

 f(11)