Praktická matematika

Milfaus

Re:Praktická matematika
« Odpověď #90 kdy: 22. 09. 2017, 22:07:15 »
Citace: Aoidhghean link=topic=16348.msg226844#msg226844  Není přece problém stáhnout si materiály třeba od lidí z MIT.[/quote

Máš pravdu, ale hodně kluků po střední tu Angličtinu nedává, já se jí na střední taky nenaučil. Tohle by mohlo fungovat, kdyby byla Angličtina oficiálním jazykem na VŠ, což bych nebyl proti, ale hodně studentům technických oborů by to znemožnilo dostudovat.


kojot4

  • ***
  • 217
    • Zobrazit profil
    • E-mail
Re:Praktická matematika
« Odpověď #91 kdy: 22. 09. 2017, 22:11:49 »
můžete nějaké kata (katu?) vybrat sám

předpokládám, že tazatel zkoušel něco v základní úrovni obtížnosti. Tam žádné úlohy vyžadující znalost VŠ matematiky nejsou. Chtěl jsem vidět, s čím měl konkrétně problém.

Tak úplně základní úlohy neřeším, je to od obtížnosti 1 (nejtěžší) - 8 (nejlehčí) a já se pohybuji na 4, kde už poměrně dost řeším operace s maticemi, otázka je do jaké míry je to SŠ a do jaké VŠ matika...
tohle https://www.codewars.com/kata/burrows-wheeler-transformation ?

viz. https://en.wikipedia.org/wiki/Burrows–Wheeler_transform

Je tam napsán způsob dekódování, implementace pak nebude zase nějaký oříšek. Ale uznávám, že vymyslet algoritmus na dekódování je opravdu jiný level, než o kterým uvažuji...
« Poslední změna: 22. 09. 2017, 22:14:08 od kojot4 »

kojot4

  • ***
  • 217
    • Zobrazit profil
    • E-mail
Re:Praktická matematika
« Odpověď #92 kdy: 22. 09. 2017, 22:16:49 »
můžete nějaké kata (katu?) vybrat sám

předpokládám, že tazatel zkoušel něco v základní úrovni obtížnosti. Tam žádné úlohy vyžadující znalost VŠ matematiky nejsou. Chtěl jsem vidět, s čím měl konkrétně problém.

Tak úplně základní úlohy neřeším, je to od obtížnosti 1 (nejtěžší) - 8 (nejlehčí) a já se pohybuji na 4, kde už poměrně dost řeším operace s maticemi, otázka je do jaké míry je to SŠ a do jaké VŠ matika...

Tím lépe. Pošlete sem odkaz na úlohu. Uvidíme zajímavá řešení.

Čistě praktická lineární algebra nejen pro programátory je Coding Matrix. http://codingthematrix.com/. Kdysi jsem ten kurz viděl na courseře, ale neabsolvoval jsem ho.

Dneska jsem řešil https://www.codewars.com/kata/validate-sudoku-with-size-nxn/python

Je to klasické Sudoku. Trošku jsem si ulehčil práci přes NumPy, takže mám kratší a čitelnější kód než hodně řešitelů...

Kód: [Vybrat]
import numpy, math

class Sudoku(object):
    def __init__(self, m):
        self.matrix = numpy.matrix(m)
    def is_valid(self):
        mysum = sum(x for x in range(1,len(self.matrix)+1))
        mylen = int(math.sqrt(len(self.matrix)))
        # iterate over submatrixes
        for x in range(0,mylen):
            for y in range(0, mylen):
                if numpy.sum(self.matrix[x*mylen:x*mylen+mylen,y*mylen:y*mylen+mylen]) != mysum:
                    return False
        for row in self.matrix.sum(axis=1).tolist():
            if row[0] != mysum:
                return False
        for column in self.matrix.sum(axis=0).tolist()[0]:
            if column != mysum:
                return False
        return True


goodSudoku = Sudoku([
  [1,4, 2,3],
  [3,2, 4,1],

  [4,1, 3,2],
  [2,3, 1,4]
])

print(goodSudoku.is_valid())

Re:Praktická matematika
« Odpověď #93 kdy: 22. 09. 2017, 22:57:26 »
Jsem zvědavý na řešení od Prýmka
Ode mě nic nečekej, já žádnej algoritmickej lumen nejsu. A už vůbec se nebudu prsit nějakým řešením tady veřejně :)

PetoJ

Re:Praktická matematika
« Odpověď #94 kdy: 22. 09. 2017, 23:48:23 »
Dneska jsem řešil https://www.codewars.com/kata/validate-sudoku-with-size-nxn/python

Je to klasické Sudoku. Trošku jsem si ulehčil práci přes NumPy, takže mám kratší a čitelnější kód než hodně řešitelů...

Kód: [Vybrat]
import numpy, math

class Sudoku(object):
    def __init__(self, m):
        self.matrix = numpy.matrix(m)
    def is_valid(self):
        mysum = sum(x for x in range(1,len(self.matrix)+1))
        mylen = int(math.sqrt(len(self.matrix)))
        # iterate over submatrixes
        for x in range(0,mylen):
            for y in range(0, mylen):
                if numpy.sum(self.matrix[x*mylen:x*mylen+mylen,y*mylen:y*mylen+mylen]) != mysum:
                    return False
        for row in self.matrix.sum(axis=1).tolist():
            if row[0] != mysum:
                return False
        for column in self.matrix.sum(axis=0).tolist()[0]:
            if column != mysum:
                return False
        return True


goodSudoku = Sudoku([
  [1,4, 2,3],
  [3,2, 4,1],

  [4,1, 3,2],
  [2,3, 1,4]
])

print(goodSudoku.is_valid())
Kod je mozno kratsi, ale nefunguje. Skus vstup:
Kód: [Vybrat]
  [1,4, 2,3],
  [4,1, 4,1],

  [3,2, 3,2],
  [2,3, 1,4]
to zrejme nie je dobre sudoku (druhy a treti riadok, lave dva stvorce) a program pise aj tak "True".


gll

Re:Praktická matematika
« Odpověď #95 kdy: 23. 09. 2017, 00:29:14 »
Jsem zvědavý na řešení od Prýmka
Ode mě nic nečekej, já žádnej algoritmickej lumen nejsu. A už vůbec se nebudu prsit nějakým řešením tady veřejně :)

škoda, mohli bychom se přiučit. O algoritmus nejde. Jde o styl.

Kód: [Vybrat]
import math

def sets(l):
    return map(set, [[]] * l)

class Sudoku(object):
    def __init__(self, lol):
        self.lol = lol

    def is_valid(self):
        l = len(self.lol)
        size = int(math.sqrt(l))
        cols, rows, sq = sets(l), sets(l), sets(l)
        for i, row in enumerate(self.lol):
            rows[i] = set(row)
            for j, col in enumerate(row):
                if type(col) is int and col > 0 and col <= l:
                    cols[j].add(col)
                    sq[i/size * size + j/size].add(col)
        return all([map(len, i).count(l) == l for i in [cols, rows, sq]])

nástřel bez numpy, v pythonu 2. asi by to šlo zkrátit vyhozeněmí některtých testů a spojením těch třech polí do jednoho.

Re:Praktická matematika
« Odpověď #96 kdy: 23. 09. 2017, 00:30:58 »
O algoritmus nejde. Jde o styl.
Pochybuju o tom, že na jakýmkoli kódu pod deset tisíc řádek můž být něco zásadního poznat.

kojot4

  • ***
  • 217
    • Zobrazit profil
    • E-mail
Re:Praktická matematika
« Odpověď #97 kdy: 23. 09. 2017, 00:42:34 »
to zrejme nie je dobre sudoku (druhy a treti riadok, lave dva stvorce) a program pise aj tak "True".

Dobrá připomínka, bohužel Codewars při parsování vyhodil nějakou šílenou systémovou chybu a testy jsem nepsal, takže to není moc dobře otestované...

No snad takhle to bude dobré

Kód: [Vybrat]
import numpy, math

class Sudoku(object):
    def __init__(self, m):
        self.matrix = numpy.matrix(m)
    def is_valid(self):
        self.mysum = sum(x for x in range(1,len(self.matrix)+1))
        self.mylen = int(math.sqrt(len(self.matrix)))
        # iterate over submatrixes
        for x in range(0,self.mylen):
            for y in range(0, self.mylen):
                submatrix = self.matrix[x*self.mylen:x*self.mylen+self.mylen,y*self.mylen:y*self.mylen+self.mylen]
                for i in range(1,self.mylen):
                    if i not in submatrix.A1.tolist():
                        return False
                if numpy.sum(submatrix) != self.mysum:
                    return False
        results = self.numpy_lines(1) + self.numpy_lines(0) # rows + columns parsing
        for result in results:
            if not result:
                return False
        return True

    def line_sudoku(self, line):
        line = line.tolist()[0]
        if sum(line) != self.mysum:
            return False
        for i in range(1, self.mylen):
            if i not in line:
                return False
        return True

    def numpy_lines(self,axis):
        return numpy.apply_along_axis(self.line_sudoku, axis = axis, arr = self.matrix).tolist()

goodSudoku = Sudoku([
  [1,4, 2,3],
  [3,2, 4,1],

  [4,1, 3,2],
  [2,3, 1,4]
])

print(goodSudoku.is_valid())

kojot4

  • ***
  • 217
    • Zobrazit profil
    • E-mail
Re:Praktická matematika
« Odpověď #98 kdy: 23. 09. 2017, 00:48:00 »
Jsem zvědavý na řešení od Prýmka
Ode mě nic nečekej, já žádnej algoritmickej lumen nejsu. A už vůbec se nebudu prsit nějakým řešením tady veřejně :)

škoda, mohli bychom se přiučit. O algoritmus nejde. Jde o styl.

Kód: [Vybrat]
import math

def sets(l):
    return map(set, [[]] * l)

class Sudoku(object):
    def __init__(self, lol):
        self.lol = lol

    def is_valid(self):
        l = len(self.lol)
        size = int(math.sqrt(l))
        cols, rows, sq = sets(l), sets(l), sets(l)
        for i, row in enumerate(self.lol):
            rows[i] = set(row)
            for j, col in enumerate(row):
                if type(col) is int and col > 0 and col <= l:
                    cols[j].add(col)
                    sq[i/size * size + j/size].add(col)
        return all([map(len, i).count(l) == l for i in [cols, rows, sq]])

nástřel bez numpy, v pythonu 2. asi by to šlo zkrátit vyhozeněmí některtých testů a spojením těch třech polí do jednoho.

To je nějaký blackbox, ne :)

kojot4

  • ***
  • 217
    • Zobrazit profil
    • E-mail
Re:Praktická matematika
« Odpověď #99 kdy: 23. 09. 2017, 00:50:09 »
Kód: [Vybrat]
import math

def sets(l):
    return map(set, [[]] * l)

class Sudoku(object):
    def __init__(self, lol):
        self.lol = lol

    def is_valid(self):
        l = len(self.lol)
        size = int(math.sqrt(l))
        cols, rows, sq = sets(l), sets(l), sets(l)
        for i, row in enumerate(self.lol):
            rows[i] = set(row)
            for j, col in enumerate(row):
                if type(col) is int and col > 0 and col <= l:
                    cols[j].add(col)
                    sq[i/size * size + j/size].add(col)
        return all([map(len, i).count(l) == l for i in [cols, rows, sq]])

goodSudoku = Sudoku([
  [1,4, 2,3],
  [3,2, 4,1],

  [4,1, 3,2],
  [2,3, 1,4]
])

print(goodSudoku.is_valid())

Navíc to nějak nefunguje...

Kód: [Vybrat]
Traceback (most recent call last):
  File "C:/Users/koss4/PycharmProjects/untitled/test.py", line 30, in <module>
    print(goodSudoku.is_valid())
  File "C:/Users/koss4/PycharmProjects/untitled/test.py", line 15, in is_valid
    rows[i] = set(row)
TypeError: 'map' object does not support item assignment

Process finished with exit code 1

gll

Re:Praktická matematika
« Odpověď #100 kdy: 23. 09. 2017, 01:13:06 »
Kód: [Vybrat]
import math

def sets(l):
    return map(set, [[]] * l)

class Sudoku(object):
    def __init__(self, lol):
        self.lol = lol

    def is_valid(self):
        l = len(self.lol)
        size = int(math.sqrt(l))
        cols, rows, sq = sets(l), sets(l), sets(l)
        for i, row in enumerate(self.lol):
            rows[i] = set(row)
            for j, col in enumerate(row):
                if type(col) is int and col > 0 and col <= l:
                    cols[j].add(col)
                    sq[i/size * size + j/size].add(col)
        return all([map(len, i).count(l) == l for i in [cols, rows, sq]])

goodSudoku = Sudoku([
  [1,4, 2,3],
  [3,2, 4,1],

  [4,1, 3,2],
  [2,3, 1,4]
])

print(goodSudoku.is_valid())

Navíc to nějak nefunguje...

Kód: [Vybrat]
Traceback (most recent call last):
  File "C:/Users/koss4/PycharmProjects/untitled/test.py", line 30, in <module>
    print(goodSudoku.is_valid())
  File "C:/Users/koss4/PycharmProjects/untitled/test.py", line 15, in is_valid
    rows[i] = set(row)
TypeError: 'map' object does not support item assignment

Process finished with exit code 1

jsem psal, že je to python 2. Nahoře se dá vybrat verze.

Aoidhghean

Re:Praktická matematika
« Odpověď #101 kdy: 23. 09. 2017, 13:04:03 »
Myslím, že diskuse trochu ujela a je už o ničem. Nicméně někdy je dobré vědět, co se děje na pozadí,
Zásadní otázka ale je, jestli mi tenhle pohled něco konkrétního přináší.
Mám pro tebe čerstvou osobní zkušenost, právě jsem jednomu studentovi vysvětloval “a monad is a monoid in the category of endofunctors”. Nezasvěcenému to nic neřekne a v tomto případě je nutné znát aspoň dvacet různých konceptů (definic), ale jakmile tu větu člověk opravdu pochopí, ví o čistě funkcionálním programování vše podstatné. S příklady sice vysvětlování zabere víc jak půl hodiny, ale furt lepší než číst milion podřadných webů a nepochopit nic. Myslím, že jsem v sobě objevil talent vysvětlovat složité věci jednoduše  ;D

Ivan Nový

Re:Praktická matematika
« Odpověď #102 kdy: 23. 09. 2017, 13:25:06 »
Myslím, že diskuse trochu ujela a je už o ničem. Nicméně někdy je dobré vědět, co se děje na pozadí,
Zásadní otázka ale je, jestli mi tenhle pohled něco konkrétního přináší.
Mám pro tebe čerstvou osobní zkušenost, právě jsem jednomu studentovi vysvětloval “a monad is a monoid in the category of endofunctors”. Nezasvěcenému to nic neřekne a v tomto případě je nutné znát aspoň dvacet různých konceptů (definic), ale jakmile tu větu člověk opravdu pochopí, ví o čistě funkcionálním programování vše podstatné. S příklady sice vysvětlování zabere víc jak půl hodiny, ale furt lepší než číst milion podřadných webů a nepochopit nic. Myslím, že jsem v sobě objevil talent vysvětlovat složité věci jednoduše  ;D

Teorie kategorií v matematice je něco jako symfonie v hudbě. Vrchol, který už nebude nikdy předstižen, protože vývoj se bude ubírat jinudy. Směrem k ML a strojové imaginaci.

Re:Praktická matematika
« Odpověď #103 kdy: 23. 09. 2017, 14:37:10 »
Zásadní otázka ale je, jestli mi tenhle pohled něco konkrétního přináší.
Mám pro tebe čerstvou osobní zkušenost, právě jsem jednomu studentovi vysvětloval “a monad is a monoid in the category of endofunctors”. Nezasvěcenému to nic neřekne a v tomto případě je nutné znát aspoň dvacet různých konceptů (definic), ale jakmile tu větu člověk opravdu pochopí, ví o čistě funkcionálním programování vše podstatné. S příklady sice vysvětlování zabere víc jak půl hodiny, ale furt lepší než číst milion podřadných webů a nepochopit nic. Myslím, že jsem v sobě objevil talent vysvětlovat složité věci jednoduše  ;D
Tím ale vůbec neodpovídáš na tu citovanou otázku :) Ta otázka zní, jestli když budeš mít dva studenty na stejné startovací čáře, jednomu to vysvětlíš a druhému ne, tak budou mít potom v praxi nějak měřitelně odlišný výkon.

(O tomhle nechci diskutovat, už jsme to tady dělali několikrát a nikam to nevede. Bylo to jenom konstatování, že taková otázka existuje, je legitimní a zásadní.)

Aoidhghean

Re:Praktická matematika
« Odpověď #104 kdy: 23. 09. 2017, 14:57:33 »
Zásadní otázka ale je, jestli mi tenhle pohled něco konkrétního přináší.
Mám pro tebe čerstvou osobní zkušenost, právě jsem jednomu studentovi vysvětloval “a monad is a monoid in the category of endofunctors”. Nezasvěcenému to nic neřekne a v tomto případě je nutné znát aspoň dvacet různých konceptů (definic), ale jakmile tu větu člověk opravdu pochopí, ví o čistě funkcionálním programování vše podstatné. S příklady sice vysvětlování zabere víc jak půl hodiny, ale furt lepší než číst milion podřadných webů a nepochopit nic. Myslím, že jsem v sobě objevil talent vysvětlovat složité věci jednoduše  ;D
Tím ale vůbec neodpovídáš na tu citovanou otázku :) Ta otázka zní, jestli když budeš mít dva studenty na stejné startovací čáře, jednomu to vysvětlíš a druhému ne, tak budou mít potom v praxi nějak měřitelně odlišný výkon.

(O tomhle nechci diskutovat, už jsme to tady dělali několikrát a nikam to nevede. Bylo to jenom konstatování, že taková otázka existuje, je legitimní a zásadní.)
V tomto konkrétním případě bude ten první pochopitelně lepší - ovšem nestačí mu to vysvětlit, musí to hlavně zevrubně pochopit. BTW nechtěl jsem se vracet k diskusi, ale když tě ta zmíněná citace o monádách tak irituje, je užitečné uvědomit si, kde je problém (a že snaha o pochopení má smysl).