Bátfai Hacker Stream

Bátf41 Haxor Str34m

Bátf41 Haxor Str34m

Szolón hackerei

2019. október 26. - nb

SOLON’s-Hackers – Esport kultúra utánpótlás és tehetséggondozó egyéni családbarát program

SOLON 2020

A Krisztus előtti hatodik évszázadban alkotó ókori bölcset, Szolónt úgy mutatja be a múlt század végén alkotó amerikai pszichológus Julian Jaynes[1], mint az első olyan „ismert” embert, akinek a mentális működése a miénkhez hasonló volt. Ő már úgy tudott írni az emberről, ahogyan az időben visszamenve mi magunk is írnánk. Mert Jaynes „két kamarás tudat” elmélete szerint a Szolón kora előtti időkben az emberek mind olyanok voltak, mint azok a mai embertársaink, akik skizofréniában szenvednek. Intuitív háttérként az „Egy csodálatos elme”[2] című filmet érdemes megnézni. Bár ebben, a jaynesi érvelésben legjellemzőbb „hallott hallucinációk” nincsenek fókuszban, de igaz történetként bemutatja a ma talán legismertebb (matematikai eredményeiért közgazdasági Nobel díjat kapó) John Nash életét, akit skizofréniával diagnosztizáltak[3].

Számunkra ebből most annyi az érdekes, hogy ha ez az elmélet igaz, akkor alig néhány ezer éve nemcsak a technológia volt más, ami nyilvánvaló, hanem az agyi „hardverünk és szoftverünk” is, ami egyáltalán nem nyilvánvaló, hanem sokkal inkább meglepő. Mindenesetre új megvilágításba helyezi Merlin Donald kognitív evolúcióról szóló vízióját, miszerint: „az elme új architektúráját építjük meg, olyat, amely hatékonyabb reprezentációs eszközökkel rendelkezik, és képes saját magát megérteni”[4]. Ennek a víziónak az értelmezése az lehet, hogy agyunk „hardverének és szoftverének” fejlődése ma is folyamatban van.

Eddig volt a tudomány. Innentől a feltételezés, miszerint a következő donaldi kognitív átmenetet az esport katalizálhatja, ezt az átmenetet nevezzük mi esport kultúrának[5]. Ez lesz az a közeg, ahol hitünk szerint a mesterséges (általános) intelligencia meg fog jelenni.

A Szolón 2020 program

Ennek tükrében értelmezzük az alábbi egyénre (tanuló vagy diák, a továbbiakban csak „hacker”) szabott, családbarát fejlesztési programunkat, mely az alábbi négy pilléren nyugszik:

  • „suli”, a mindenkori reguláris tanulás, konkrétan az iskolai teljesítmény
    • itt az a minimális elvárás, hogy a program végén a hackereknek jobb átlagot kell elérniük a program elején rögzítettnél
  • „esport”, a gépes (egy mobilos és egy számítógépes) játékokbeli teljesítmény
    • itt a cél a játékkultúra emelése, a szervezett játék, a közösségépítés, a minimális elvárás, hogy vegyen részt a hacker a mobilos és a gépes versengésben
  • „matlog”, a matematikai logika tanulása
    • itt a hackerek 2-3 hetes ciklusokban (kistreamelt anyagot[6] és) feladatsorokat kapnak, amelyek megoldásait értékelésre vissza kell küldeniük, a minimális elvárás, hogy a hacker minden feladatsort küldjön vissza és azok legalább 60%-ban jók legyenek (lehet javítani persze)
  • „prog”, a programozás tanulása
    • itt a hackerek 2-3 hetes ciklusokban (kistreamelt anyagot és) feladatot kapnak, amelyek megoldását értékelésre vissza kell küldeniük, a minimális elvárás, hogy a hacker programja fusson

A programban nincs fizikai találkozás, a hackerek otthoni környezetükből/környezetükben vesznek részt benne. Mind a négy esetben versenyben vannak: ki javít többet, ki játszik jobban, ki „matlogozik” jobban, ki programozik jobban?

A díjak

A program lezárásakor értékeljük a résztvevő tanulókat és diákokat. A program díjazást nem biztosít, hanem csak egy „igazolást” ad a programban elvégzett teljesítményről, amely alapján a szülő biztosíthat a gyermekkel előre megbeszélt díjat a saját gyermekének.[7]

A programot az a hacker teljesíti, aki mind a négy irányban teljesíti a minimális elvárást. Továbbá a programban résztvevők között összevont rangsort alakítunk ki, mind a négy irányban lesz egy rangsor, melyekből az összevont rangsor a helyezések átlagából adódik majd.

A játékok

A kiválasztott mobil és PC-s játékok ingyenesen elérhetőek:

Minden résztvevő hackernek egy mobil és egy PC-j játékban kell szerepelnie a programban. A játékbeli célok meghatározása az érdeklődő hackerek játékbeli szintjétől is függően kerül meghatározásra az érdeklődési fázis során. (De tipikusan egymással versenyeznek a program resztvevői a játékokbeli esetleges tornákra, barátságos meccsekre, kihívásokra alapozva.)

A programozás

R nyelvű bevezető programozás két példán át: az ikerprímek és a Brun tétel, illetve a Monty Hall-paradoxon. Ezekhez írott anyag és stream készül, ajánlott intuitív megalapozó filmek a „Kapcsolat”[8] és a „21 Las Vegas ostroma”[9]. „Előtanulmányként” ezeket a streameket csináltuk:

Jelentkezés

10-18 éves korig várjuk az érdeklődő tanulók, diákok szüleinek visszajelzését a következő email címen: batfai.norbert@inf.unideb.hu, vagy ebben a Facebook csoportban:  https://www.facebook.com/groups/SOLONHackers

A program ütemezése

A program jelen, első verziója a megfelelő számú (10-20) jelentkező érkezésével indulna és a 2019/2020 tanév első félévével zárulna.

Figyelmeztetés

Fontos, hogy a programot lelkesedésből, társadalmi munkában csináljuk[10] és az is megeshet, hogy nem tudjuk megvalósítani, hanem menet közben egyszerűen leáll a program… nyilván ezt azért próbáljuk elkerülni, de mégiscsak megnyugtató, hogy leírtuk ezt a figyelmeztetést.

Debrecen, 2019. 10. 24. Dr. Bátfai Norbert

https://www.clashofstats.com/players/norbertbatfai-929R0LGVU
https://royaleapi.com/player/9YY0QQQCQ

 

[1] Jaynes, J. (1986) Consciousness and the voices of the mind, Canadian Psychology/Psychologie canadienne, 27(2), 128-148. doi: 10.1037/h0080053

[2] https://www.imdb.com/title/tt0268978

[3] Davies H (2002) Hearing Voices Past and Present: A User’s Perspective, In: Harris N., Williams S., Bradshaw T. (eds) Psychosocial Interventions for People with Schizophrenia. Palgrave, London. doi: 10.1007/978-1-4039-3759-9_2

[4] Donald, M. (2001) Az emberi gondolkodás eredete, Osiris Kiadó, 328. oldal.

[5] Bátfai N. (2019) Esport kultúra: a mesterséges intelligencia kognitív evolúciós értelmezése, https://gitlab.com/nbatfai/pasigraphy-rhapsody/blob/master/para/docs/hungarian_mitel.pdf

[6] Linkek, Twitch (https://www.twitch.tv/nbatfai) vagy YB (https://www.youtube.com/c/nbatfai) videókra.

[7] Illetve magunk is megpróbálunk támogatókat szerezni a programhoz, például egy könyvtár könyvjutalommal támogathatná az első három helyezettet stb. - de csak az ilyenek leszervezésének megpróbálását tudjuk ígérni, mást, azaz semmi biztosat nem.

[8] https://www.imdb.com/title/tt0118884/

[9] https://www.imdb.com/title/tt0478087/

[10] A szerző és gyermekei. Illetve a szerző (gyermekei) hackerei szervezők és a program hacker résztvevői is egyben.

Az esport kultúra, avagy a magyar lehet-e a mesterséges intelligencia nyelve?

A nyelvről, mint mentális eszközrendszerről azt gondoljuk, hogy valami nagyon kifinomult, (csak) a mi fajunkra egyedien jellemző mentális svájci bicska, lenyűgöző intellektusunk egyértelmű bizonyítéka. Pedig meglehet, hogy bonyolultsága nem is kifinomultságából, hanem sokkal inkább esetlegességéből (véletlenszerűségéből) fakad. Ezt támasztja alá, hogy a népszerű „annyi ember vagy” mondásokat azért az árnyalja, hogy 4 éves korára (mire megszokja) mindenki erőfeszítés nélkül birtokolja. Illetve hogy maga a nyelv a donaldi (Donald 2001) második átmenet jellemzője (tehát nem egy mai „fejlesztés”, hanem vagy pár 100.000 éves). Konkrétan és leegyszerűsítve a donaldi mimetikus kultúrából szemlélve ugyan valóban lenyűgöző lehet a kifejezőereje, de az elméleti kultúrából annak látszik, ami: egy ellentmondásokat is megengedő, így a körben forgó okoskodásokat is éltető rendszer, nyilván nem véletlen a mitikus jelzője (ebben az irányba tovább lépve magam önkéntelenül is, de persze pontatlanul, sokszor előfordul, hogy misztikusnak is aposztrofálom).

Mégis eddig úgy gondoltuk, hogy az elméleti kultúra gyermekeit, a számítógépeket meg kell tanítanunk bírni az emberi retorika (ami a nyelv hagyományos értelmében szerintem fából vaskarika, amennyiben a retorikát az elméleti kultúra igényének tekintjük) szintjét. Ám ez meglehet hosszabb távon zsákutca. Ugyan nincs kétségem afelől, hogy a gépek a beszélt emberi nyelveket is megtanulják majd, mint ahogyan napjaink MI áttörése (lásd például a Google DeepMind Nature folyóiratbeli cikkeit) az, hogy elláttuk őket olyan képességekkel (például mélytanulásos neurális hálózatok és bigdata), hogy a donaldi koncepcionális szinten már sikeresek lehetnek, ez be fog következni a mimetikus és a mitikus kultúra esetében is, persze itt az MI tél hosszabb.

Azért (persze szükségszerű és fontos) zsákutca, mert ezzel szemben a gépek beszéljék csak a teoretikus kultúra „bináris” nyelvét, s jöjjön a következő donaldi átmenet, s az hasson vissza az emberre, azaz mi tanuljuk meg a gépek nyelvét! Pontosítva ezt a fogalomkört: a teoretikus kultúrában, azaz „nekünk” megadott az a lehetőség, hogy megfigyeljük a donaldi vízió esetleges beteljesülését: „az elme új architektúráját építjük meg, olyat, amely hatékonyabb reprezentációs eszközökkel rendelkezik, és képes saját magát megérteni” (Donald, 2001, 328). Sőt nemcsak megfigyelhetjük, hanem nekünk kell kifejlesztenünk! Egy neumanni harmadlagos nyelvként megalkotni a mesterséges homunkulusz mesterséges nyelvét (Bátfai 2019i). Erről szól a Paszigráfia Rapszódia (röviden PaRa) (Bátfai 2019ii).

Paszigráfia Rapszódia – az esport kultúra nyelve

A vizionált elkövetkező donaldi szintet azért nevezzük esport kultúrának (Bátfai 2019i), (Bátfai 2019iv), mert szervezett oktatási formájának Paszigráfia Rapszódia alapú, fejlesztendő elektronikus játékok lehetnek ígéretesek.

pr3.png

Egy elképzelt PaRa nyelvi elem (Bátfai 2019iii).

További praktikus részletek ebben a doksiban találhatóak: (Bátfai 2019v).

Önkritika és kritika

A „Magyar Nemzeti Mesterséges Intelligencia”-val kapcsolatos eddigi minden törekvésünk a konferencia előadásoktól kezdve a szakdolgozatokon át az esport kurzusig zsákutca volt. A PaRa viszont már olyan megfelelő közegnek ígérkezik, amelyben erőfeszítés nélkül lehet értelmezni. Kritika: mire jó ez? Fogalmam sincs, de izgalmas csinálni! Ha annyit elérünk, hogy lesz egyetlen PaRa játék, amelyben a 10-18 éves ebbe belépő korú korosztály napi szinten ír át valamely fejlesztendő játék mentén természetes nyelvi állításokat elsőrendű logikai nyelvbeli állításokká, akkor a donaldi fentebb idézett vízió megvalósítása felé a meghatározó lépést már megtettük (legalább a Sapir–Whorf hipotézis nyomán változni fog a gondolkozásuk) onnan pedig minden más esetleges eredmény már ajándék.

Hivatkozások

Donald, M. (2001). Az emberi gondolkodás eredete. Osiris Kiadó.

Bátfai, N. (2019i). Esport culture: a cognitive evolutionary interpretation of artificial intelligence (Esport kultúra: a mesterséges intelligencia kognitív evolúciós értelmezése). (Unpublished Manuscript, Original paper in Hungarian)

Bátfai, N. (2019ii). Pasigraphy rhapsody. https://gitlab.com/nbatfai/pasigraphy-rhapsody. GitLab.

Bátfai, N. (2019iii). Visualization of the language of the esports culture: A preliminary study (Az esport kultúra nyelvének vizualizációja: egy előtanulmány). (Bilingual Hungarian and English documentation https://gitlab.com/nbatfai/pasigraphy-rhapsody/blob/master/para/docs/vis_prel_para.tex)

Bátfai, N., Papp, D., Bogacsovics, G., Szabó, M., Simkó, V. S., Bersenszki, M., ... Varga, E. S. (2019iv). On the notion of number in humans and machines. CoRR, abs/1906.12213. Retrieved from http://arxiv.org/abs/1906.12213

Bátfai, N. (2019v). Construction of the language of the esports culture: A preliminary study (Az esport kultúra nyelvének megalkotása: egy előtanulmány). (Bilingual Hungarian and English documentation https://gitlab.com/nbatfai/pasigraphy-rhapsody/blob/master/para/docs/con_prel_para.tex)

The Semantic "MNIST" - Counting the Number of Dots in an Image

SMNIST

Have you seen the movie, Rain Man? Do you remember the scene when Dustin Hoffman can count the exact number of toothpicks on the floor in the blink of an eye. This scene gave the idea to implement it as a machine learning example. We don't count toothpicks but points in an image.

In the classic MNIST task, a typical classifier program takes images of handwritten digits and recognize these digits.

sajat8a.png The MNIST classifier says it's 8

The "SMNIST" program doesn't take images of digits but images that contain less than 10 points.

sajat8p.png The "SMNIST" classifier should say it's 8

Experiment 1, the generator program

We have write a program (called smnistg.cpp) that generates images that contains less than 10 points. Its output are binary compatible with the format of the original MNIST training and test data so we can immediately start the first experiments using the former MNIST programs.

smnist.png

-rw-r--r-- 1 batfai batfai 146931 márc 10 16:10 t10k-images-idx3-ubyte.gz
-rw-r--r-- 1 batfai batfai 785756 márc 10 16:11 t10k-images-rgb-png.tgz
-rw-r--r-- 1 batfai batfai 5120 márc 10 16:10 t10k-labels-idx1-ubyte.gz
-rw-r--r-- 1 batfai batfai 876709 márc 10 16:07 train-images-idx3-ubyte.gz
-rw-r--r-- 1 batfai batfai 4677440 márc 10 16:10 train-images-rgb-png.tgz
-rw-r--r-- 1 batfai batfai 29480 márc 10 16:07 train-labels-idx1-ubyte.gz 

These files can be downloaded at http://smartcity.inf.unideb.hu/~norbi/SMNIST/

The sources can be found at https://gitlab.com/nbatfai/smnist

Introductory video

 (TF/softmax MNIST acc~.6, Keras/MNIST CNN~.8, epoch 50, batch 256 ~.9)

There was a mistake in our previous video: we printed the labels instead of classifications of the 10 selected test images... here comes the correction: 

 

SMNIST for Humans

 

Iterated Twin Prime conjecture*

*At @GerryMyerson's suggestion, I have changed the title to "Iterated Twin Prime conjecture". 

The sum of a twin prime pair

Egy ikerprím pár összege

Conjecture. The sum of a twin prime pair greater than or equal to 24 can be expressed as the sum of two twin prime pairs.

Sejtés. Egy 24-nél nagyobb egyenlő ikerprím pár összeg kifejezhető két ikerprím pár összegeként.

 

Example.

Példa.

24 = 12 + 12

36 = 12 + 24

60 = 24 + 36

84 = 24 + 60

120 = 36 + 84 = 60 + 60

144 = 24 + 120 = 60 + 84

204 = 60 + 144 = 84 + 120

...

 

To be more precise:

Precízebben:

(11+13) = 24 = 12 + 12 = (5+7) + (5+7)
(17+19) = 36 = 12 + 24 = (5+7) + (11+13)
(29+31) = 60 = 24 + 36 = (11+13) + (17+19)
(41+43) = 84 = 24 + 60 = (11+13) + (29+31)
(59+61) = 120 = 36 + 84 = (17+19) + (41+43) = 60 + 60 = (29+31) + (29+31)

...

 

All sum of twin prime pairs less than 19.999.944 are verified by the following R program.

 

bhax-stpp-c-v.png

#
# BHAX-stpp-c
# Copyright (C) 2019 Norbert Batfai, batfai.norbert@inf.unideb.hu
#
#  This program is free software: you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation, either version 3 of the License, or
#  (at your option) any later version.
#
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#
#  You should have received a copy of the GNU General Public License
#  along with this program.  If not, see <https://www.gnu.org/licenses/>.
#
# Version history
#
# See also https://bhaxor.blog.hu/2018/12/31/100_eves_a_brun_tetel
#

library(matlab)
library(R.utils)

stp <- function(x)
{
    primes = primes(x)
    diff = primes[2:length(primes)]-primes[1:length(primes)-1]
    idx = which(diff==2)
    t1primes = primes[idx]
    t2primes = primes[idx]+2
    t1plust2 = t1primes+t2primes
    return(t1plust2)
}

spp=stp(10000000)

failures = 0
for (i in 3:length(spp)) 
{
    printf("%d-th %d\n", i, spp[i])
    partitions = 0
    for (k in 1:i) 
    {
        for (j in k:i) 
        {
            if(spp[i]==spp[k]+spp[j])
            {
                printf(" %d=%d+%d\n", spp[i], spp[k], spp[j])
                partitions = partitions + 1
            }
        }
    }
    printf("partitions: %d\n", partitions)
    if(partitions == 0)
    {
        failures = failures + 1
        printf("%d, conjecture failed...\n", i)
    }
}
printf("failures: %d\n", failures)

 

A BHAX csatorna bemutatkozik

Ne menjen a tanulás a játék és a programozás rovására!

Sziasztok Hackerek!

A csatorna célja a szervezett számítógépes játék és a programozás népszerűsítése, tanítása, különös tekintettel a mesterséges intelligenciára! Hosszabb távon utánpótlás esport csapatok szervezésének tartalmi támogatása. Ennek megfelelően adásaink a következő négy-öt nagyobb csoportba oszthatóak:

  • olyan programozási példák, melyek megmutatják/felmérik, hogy mi érdekel bennünket, illetve a nézőket
    (C-től a LIsp-ig, hangya szimulációtól a saját Androidos mobil alkalmazás fejlesztéséig, lásd tételesen lejebb)
  • az iménti példák után a kialakuló témára tematikus programozás bevezetés
    (jelen pillanatban ilyen adásunk még nincs, még csak az előző pontban exponálunk)
  • szervezett játék
    (ide az olyan játszás adásaink sorolhatóak, ahol adott játékban már van valamilyen "rangunk", tapasztalatunk)
  • játékok kipróbálása
  • könyv olvasás, film élmény feldolgozása

Streamereink

bhax9.png

 

Setup - mivel nyomjuk

setup2gep.jpg
  • OS: GNU/Linux Ubuntu 18.04.1 és Windows 10 duál boot
  • MOBO: ASUS Intel LGA1151 Z370-P II Prime ATX
  • CPU: Intel LGA1151 Core i7 8700 3.2GHz 12MB
  • GPU: NVIDIA GTX 1060 3G
  • MEM: 16G
  • HDD: WD Blue 2 TB 5400rpm SATA3 64MB
  • SDD: Patriot M.2 NVMe 2280 Scorch 250GB
  • WEBC: Genius 720p 30fps, A4Tech FullHD 30 fps
  • MOUSE: A4Tech Bloody
  • MIC: Tracer

Programozási példák

Nyelv és platform vonatkozásában:

  • C  (csak Linux alatt)
  • C++, C++11, C++14, Qt (csak Linux alatt)
  • Java SE, Android Java (Linux, Windows alatt)
  • R (Linux, Windows alatt, s duálban is nyomjuk eleve) 
  • Lisp, Scheme  (Linux, Windows alatt, s duálban is nyomjuk eleve)
    GIMP TinyScheme 
  • Python, Tensorflow (csak Linux alatt)
  • TeX, LaTeX (Linux, Windows alatt, s duálban is nyomjuk eleve) 
    miktex Win alatt
  • UML

az eddigi posztokat (van amelyik csak egyetlen adást ágyaz be, van amelyik vagy 10-et és forráskódokkal díszített stb.) ezek alá tételesen be is sorolva:

 

Tartalmi bontásban:

  • Mesterséges Intelligencia/Minecraft MALMÖ
    - A Microsoft a mesterséges általános intelligencia kutatásához a Minecraft világát választotta, ez a Minecraft MALMÖ projekt: https://github.com/Microsoft/malmo.
  • Mandelbrot halmaz
    - Kihagyhatatlan élmény, csináljuk Javában, C-ben, C++-ban, sőt CUDA-n is számoljuk! Plusz bevezetjük a komplex számokat!
  • Conway-féle Életjáték
    - Alapismeret, Qt C++-ban dolgozzuk fel és persze papíron is.
  • C 
    - memóriakezelés: szinte minden C-s stream része, mutatók és a memóriakezelés, papíron is feldolgozva.
  • C++
    - alapfogalmak megismerése: ref. típus, másoló és mozgató ctor, assign, olyan fontos, mint C-ben a memóriakezelés, pointerek.
  • Mobil alkalmazás fejlesztése
    Androidos telefonjára mindenkinek kell írni egy saját játékot!
  • Szoftver használat
    - GIMP, GIMP kalandok - a képerőforrások szerkesztése, https://bhaxor.blog.hu/2018/09/11/gimp_kalandok_a_keperoforrasok_szerkesztese
    -

Szervezett játék

Szervezett játszást CoC-ban (ilyen sorozat például a Legenda vagyok vagy a Családi CoC sorozatok) és LoL-ban (ilyen sorozat például a Családi LoL, ahol normál, vagy ranked meccseket játszunk) folytatunk rendszeresen, ezeket nyomjuk a csatornára, utólag a YTB csatornán elérhetőek: https://www.youtube.com/user/nbatfai/videos.

Játékok kipróbálása

Például:

  • Fortnite Solo/Duo
  • Scamp: High Hat Havoc
  • World of Guns: Gun Disassembly
  • La Rana
  • DOTA2
  • War Robots
  • Path of Exile
  • Team Fortress 2
  • March of Empires
  • Cuisine Royale
  • Fishing Planet
  • Subnautica
  • Unreal Tournament
  • Robocraft
  • Paladins
  • Sakk

és még sorolhatnánk... ezeket nyomjuk a Twitch csatornára, utólag pedig a YTB csatornán elérhetőek: https://www.youtube.com/user/nbatfai/videos.

Könyv  olvasás, film élmények

Nézz szét a csatornánkon és ha megtetszik kövess minket, sőt, mivel bekerültünk a Twitch érdekelti programjába, immát támogathatsz is minket: https://www.twitch.tv/nbatfai
 

Világlátásunk a csatornán

Mindez kistreamelve:

2019.1.13 szokásos 18.30-as adásban lesz élő: https://www.twitch.tv/nbatfa 

A GIMP Lisp hackelése - a Scheme programozási nyelv

A poszt programjai ugyanúgy használhatók GNU/Linux és Windows rendszereken is!

A GIMP-be épített TinyScheme kipróbálása során villantottuk fel a Lisp programozási nyelvet, mint az eddigiektől merőben más programozói gondolkodásmódot, legalábbis, mint az eddigi BHAX-os C, C++, Java, Python és R példáink szemléletétől távolit. Ha nem tudod, hogy a(z infix, középen a + jel) 2+2 hogy fest fordított lengyel jelölésben, vagy nem tudsz felírni egy rekurzív képletet a faktoriális kiszámításra, akkor Neked is ezzel kell kezdened:

Az eddigi imperatív megközelítésben a faktoriálist úgy csináltuk volna, hogy ciklus a számig és a ciklusváltozóval szorozgatunk egy 1-ről induló változót. A funkcionális gondolkodásban a faktoriális rekurzív definíciója maga a kiszámítás algoritmusa is egyben. (Persze imperatívban is írhatunk rekurzív függvényt, meg funkcionálisban is iteratívat, de utóbbi nem olyan elegáns...)

Ha ezzel a VOD-al megvagy, ráfordulunk egy konkrét példára: mandalát rajzolunk a GIMP-ben! Konkrétan a Tin Tran Pat625_Mandala_With_Your_Name.py Python kódjának eredményét szeretnénk megírni Scheme-ben. A direkt átírás nem látszik jó 5letnek, mert a GIMP változatok 2.4, 2.8 most 2.10 könnyen elveszik a kezdők kedvét, mivel sok példa nem megy pöccintésre... ezért a tutoriál alapján először megcsináljuk a mandalár a GIMP-el, majd ezeket a lépéseket automatizáljuk, hogy egy Scheme program csinálja. Közben persze a Python kód megléte nyilván sokat segít, pédlául abban, hogy a hívandó GIMP függvényeket milyen néven találjuk az API doksiban.

Szóval ilyesmi képeket fogunk rajzolni:

m5.png

Első lépésben a szöveg forgatását valósítsuk meg! A tutoriál számos lépését gépesítsük, sőt tegyük be a GIMP menüjébe, hogy egy kattintásra egyszerűsítsük a használatát, íme ez lesz a végeredmény, mármint nem a mandala, hanem a programozásunké:

gimpm.png

Mandala - első lépés

Mire figyeljünk a következő streamen:

  • valódi API programozásról van szó, hogy használjuk a GIMP Scheme API-ját
  • milyen a program szerkezete, logikája
  • hogyan kell kipróbálni, végül installálni a szkriptet

Második nekifutás

Teljesen befejezzük a tutoriál példáját, itt teljesen eltérünk a Python szkript kódjától és egy sokkal szimplább megoldással keretezzük az elforgatott szövegek rétegét.

A Lisp forráskód olvasása

; bhax_mandala9.scm
;
; BHAX-Mandala creates a mandala from a text box.
; Copyright (C) 2019  Norbert Bátfai, batfai.norbert@inf.unideb.hu
;
;    This program is free software: you can redistribute it and/or modify
;    it under the terms of the GNU General Public License as published by
;    the Free Software Foundation, either version 3 of the License, or
;    (at your option) any later version.
;
;    This program is distributed in the hope that it will be useful,
;    but WITHOUT ANY WARRANTY; without even the implied warranty of
;    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;    GNU General Public License for more details.
;
;    You should have received a copy of the GNU General Public License
;    along with this program.  If not, see <https://www.gnu.org/licenses/>.
;
; Version history
;
;  This Scheme code is partially based on the Python code 
;  Pat625_Mandala_With_Your_Name.py by Tin Tran, which is released under the GNU GPL v3, see 
;  https://gimplearn.net/viewtopic.php/Pat625-Mandala-With-Your-Name-Script-for-GIMP?t=269&p=976
;
;  https://bhaxor.blog.hu/2019/01/10/a_gimp_lisp_hackelese_a_scheme_programozasi_nyelv
; 

(define (elem x lista)

    (if (= x 1) (car lista) (elem (- x 1) ( cdr lista ) ) )

)

(define (text-width text font fontsize)
(let*
    (
        (text-width 1)
    )
    (set! text-width (car (gimp-text-get-extents-fontname text fontsize PIXELS font)))    

    text-width
    )
)

(define (text-wh text font fontsize)
(let*
    (
        (text-width 1)
        (text-height 1)
    )
    ;;;
    (set! text-width (car (gimp-text-get-extents-fontname text fontsize PIXELS font)))    
    ;;; ved ki a lista 2. elemét
    (set! text-height (elem 2  (gimp-text-get-extents-fontname text fontsize PIXELS font)))    
    ;;;    
    
    (list text-width text-height)
    )
)


;(text-width "alma" "Sans" 100)

(define (script-fu-bhax-mandala text text2 font fontsize width height color gradient)
(let*
    (
        (image (car (gimp-image-new width height 0)))
        (layer (car (gimp-layer-new image width height RGB-IMAGE "bg" 100 LAYER-MODE-NORMAL-LEGACY)))
        (textfs)
        (text-layer)
        (text-width (text-width text font fontsize))
        ;;;
        (text2-width (car (text-wh text2 font fontsize)))
        (text2-height (elem 2 (text-wh text2 font fontsize)))
        ;;;
        (textfs-width)
        (textfs-height)
        (gradient-layer)
    )

    (gimp-image-insert-layer image layer 0 0)

    (gimp-context-set-foreground '(0 255 0))
    (gimp-drawable-fill layer FILL-FOREGROUND)
    (gimp-image-undo-disable image) 

    (gimp-context-set-foreground color)

    (set! textfs (car (gimp-text-layer-new image text font fontsize PIXELS)))
    (gimp-image-insert-layer image textfs 0 -1)
    (gimp-layer-set-offsets textfs (- (/ width 2) (/ text-width 2))  (/ height 2))
    (gimp-layer-resize-to-image-size textfs)

    (set! text-layer (car (gimp-layer-new-from-drawable textfs image)))
    (gimp-image-insert-layer image text-layer 0 -1)
    (gimp-item-transform-rotate-simple text-layer ROTATE-180 TRUE 0 0)
    (set! textfs (car(gimp-image-merge-down image text-layer CLIP-TO-BOTTOM-LAYER)))

    (set! text-layer (car (gimp-layer-new-from-drawable textfs image)))
    (gimp-image-insert-layer image text-layer 0 -1)
    (gimp-item-transform-rotate text-layer (/ *pi* 2) TRUE 0 0)
    (set! textfs (car(gimp-image-merge-down image text-layer CLIP-TO-BOTTOM-LAYER)))

    (set! text-layer (car (gimp-layer-new-from-drawable textfs image)))
    (gimp-image-insert-layer image text-layer 0 -1)
    (gimp-item-transform-rotate text-layer (/ *pi* 4) TRUE 0 0)
    (set! textfs (car(gimp-image-merge-down image text-layer CLIP-TO-BOTTOM-LAYER)))
    
    (set! text-layer (car (gimp-layer-new-from-drawable textfs image)))
    (gimp-image-insert-layer image text-layer 0 -1)
    (gimp-item-transform-rotate text-layer (/ *pi* 6) TRUE 0 0)
    (set! textfs (car(gimp-image-merge-down image text-layer CLIP-TO-BOTTOM-LAYER)))    
    
    (plug-in-autocrop-layer RUN-NONINTERACTIVE image textfs)
    (set! textfs-width (+ (car(gimp-drawable-width textfs)) 100))
    (set! textfs-height (+ (car(gimp-drawable-height textfs)) 100))
        
	(gimp-layer-resize-to-image-size textfs)
    
    (gimp-image-select-ellipse image CHANNEL-OP-REPLACE (- (- (/ width 2) (/ textfs-width 2)) 18) 
        (- (- (/ height 2) (/ textfs-height 2)) 18) (+ textfs-width 36) (+ textfs-height 36))
	(plug-in-sel2path RUN-NONINTERACTIVE image textfs)
        
    (gimp-context-set-brush-size 22)
    (gimp-edit-stroke textfs)
    
    (set! textfs-width (- textfs-width 70))
    (set! textfs-height (- textfs-height 70))
    
    (gimp-image-select-ellipse image CHANNEL-OP-REPLACE (- (- (/ width 2) (/ textfs-width 2)) 18) 
        (- (- (/ height 2) (/ textfs-height 2)) 18) (+ textfs-width 36) (+ textfs-height 36))
	(plug-in-sel2path RUN-NONINTERACTIVE image textfs)
        
    (gimp-context-set-brush-size 8)
    (gimp-edit-stroke textfs)
        
    (set! gradient-layer (car (gimp-layer-new image width height RGB-IMAGE "gradient" 100 LAYER-MODE-NORMAL-LEGACY)))
    
    (gimp-image-insert-layer image gradient-layer 0 -1)
	(gimp-image-select-item image CHANNEL-OP-REPLACE textfs)
	(gimp-context-set-gradient gradient) 
	(gimp-edit-blend gradient-layer BLEND-CUSTOM LAYER-MODE-NORMAL-LEGACY GRADIENT-RADIAL 100 0 REPEAT-NONE FALSE TRUE 5 .1 TRUE 500 500 (+ (+ 500 (/ textfs-width 2)) 8) 500)
	
	(plug-in-sel2path RUN-NONINTERACTIVE image textfs)

    (set! textfs (car (gimp-text-layer-new image text2 font fontsize PIXELS)))
    (gimp-image-insert-layer image textfs 0 -1)
    (gimp-message (number->string text2-height))
    (gimp-layer-set-offsets textfs (- (/ width 2) (/ text2-width 2)) (- (/ height 2) (/ text2-height 2)))
		
    ;(gimp-selection-none image)
    ;(gimp-image-flatten image)
    
    (gimp-display-new image)
    (gimp-image-clean-all image)
    )
)

;(script-fu-bhax-mandala "Bátfai Norbert" "BHAX" "Sans" 100 1000 1000 '(255 0 0) "Deep Sea")

(script-fu-register "script-fu-bhax-mandala"
    "Mandala9"
    "Creates a mandala from a text box."
    "Norbert Bátfai"
    "Copyright 2019, Norbert Bátfai"
    "January 9, 2019"
    ""
    SF-STRING       "Text"      "Bátf41 Haxor"
    SF-STRING       "Text2"     "BHAX"
    SF-FONT         "Font"      "Sans"
    SF-ADJUSTMENT   "Font size" '(100 1 1000 1 10 0 1)
    SF-VALUE        "Width"     "1000"
    SF-VALUE        "Height"    "1000"
    SF-COLOR        "Color"     '(255 0 0)
    SF-GRADIENT     "Gradient"  "Deep Sea"
)
(script-fu-menu-register "script-fu-bhax-mandala" 
    "<Image>/File/Create/BHAX"
)

 

A program végső változata

Eltávolítjuk a kódból azokat a behuzalozott részeket, melyek próbálkozásainkból maradtak meg, vagy kérdések alapjául szolgáltak, de a program logikájába nem illenek, illetve pár behuzalozott (melyek előbújhatnak már akkor is, ha a szkript indító paramétereit variálod) hibát javítunk.

A különböző változatokat lásd a repóban: https://gitlab.com/nbatfai/bhax/tree/master/attention_raising/GIMP_Lisp/Mandala

Erdős Pál mit keresett a Nagykönyvben a Monty Hall-paradoxon kapcsán?

Nem értem, mert programozóként a "szimulációs" program megírása után elég szimplának vélhető a valószínűségi modell (de persze amikor így érzek, nem felejthetem el, hogy rám is jellemző a wigneri észrevétel az általános emberi tulajdonságról).

Magával a Monty Hall problémával idén nyáron találkoztam a gyerekekkel egy ebéd közben, amikor is a 21 Las Vegas ostroma filmet néztük, melyben az MIT matek profja az ígéretes "számolónak" szegezi a kérdést, hogy van három ajtó, az egyik mögött egy értékes ajándék, a másik kettő mögött semmi. Melyiket választja? 1/3 valséggel az egyiket, okés. Aztán a riporter a három ajtó közül kinyit egy olyat, mely mögött semmi nincs és a játékosnak szegezi a kérdést, hogy fenntartja az eredeti választását, avagy megváltoztatja?

Ezen rész után megállítottam a filmet (amit éppen azért tettem be, hogy a gyerekek matek iránti vonzalmát növeljem).

A gyerekek - szerintem - elfogadva a filmben a "narrátor" sugallatát, a főhős változtat döntését intuítíven elfogadták és nem értették én mit agyalok rajta... miért nem nézzük már tovább... a film után aztán magam is beláttam, ha nem is mély meggyőződésből, de annyival lezárva, hogy ha nem találja el elsőre, akkor előnyösebb helyzetbe kerül a kinyitott második ablak infóval, mert ekkor a műsorvezetőnek nincs választása, csak egyet nyithat, a játékos meg ezt "tudva" ugyanúgy "ismeri" a nyeremény helyét és mivel rosszul dönteni elsőre 2/3-ad, így változtatni a "nyerő strat" valóban.

Aztán a tegnap felütöttem a Paul Hoffman Erdősről szóló könyvét, amelyben részletesen lesztorizza, hogy Erdős Pál hogyan reagált a problémára: engem megnyugtatott, hogy elsőre az ő intuíciója is mást súgott! A könyvbeli leírás alapján viszont meglepő, hogy a szimulációs program kimenetének tanulmányozása után is elégedetlen volt és sürgette a Nagykönyvi belátás szükségességét...

Ez adta az inspirációt, hogy a Bátf41 Haxor Stream tűzze műsorra a program megírását (mert ugye Chaitin után valljuk, hogy "csak azt értjük igazán, amit be tudunk programozni").

Ma, 2019.1.3 a szokásos időpontban 18:30-kor élőben jön a csatornán a téma feldolgozása: https://www.twitch.tv/nbatfai, íratkozz fel, hogy ne maradj le!

Az R szimulációs kód

 

#   An illustration written in R for the Monty Hall Problem 
#   Copyright (C) 2019  Dr. Norbert Bátfai, nbatfai@gmail.com
#
#   This program is free software: you can redistribute it and/or modify
#   it under the terms of the GNU General Public License as published by
#   the Free Software Foundation, either version 3 of the License, or
#   (at your option) any later version.
#
#   This program is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#   GNU General Public License for more details.
#
#   You should have received a copy of the GNU General Public License
#   along with this program.  If not, see <http://www.gnu.org/licenses/>

kiserletek_szama=10000000
kiserlet = sample(1:3, kiserletek_szama, replace=T)
jatekos = sample(1:3, kiserletek_szama, replace=T)
musorvezeto=vector(length = kiserletek_szama)

for (i in 1:kiserletek_szama) {

    if(kiserlet[i]==jatekos[i]){
    
        mibol=setdiff(c(1,2,3), kiserlet[i])
    
    }else{
    
        mibol=setdiff(c(1,2,3), c(kiserlet[i], jatekos[i]))
    
    }

    musorvezeto[i] = mibol[sample(1:length(mibol),1)]

}

nemvaltoztatesnyer= which(kiserlet==jatekos)
valtoztat=vector(length = kiserletek_szama)

for (i in 1:kiserletek_szama) {

    holvalt = setdiff(c(1,2,3), c(musorvezeto[i], jatekos[i]))
    valtoztat[i] = holvalt[sample(1:length(holvalt),1)]
    
}

valtoztatesnyer = which(kiserlet==valtoztat)


sprintf("Kiserletek szama: %i", kiserletek_szama)
length(nemvaltoztatesnyer)
length(valtoztatesnyer)
length(nemvaltoztatesnyer)/length(valtoztatesnyer)
length(nemvaltoztatesnyer)+length(valtoztatesnyer)


Az R kód futtatása

 montyhall.png

Az R átgondolása
montyhall2.png

 

100 éves a Brun tétel!

Mit kérdezne Erdős Jézustól*

Brun tétele azt mondja, hogy az ikerprímek reciprok összegéből alkotott sor konvergens, magyarul: az emberiség tudása ahhoz ugyan ma még kevés, hogy választ tudjon adni, hogy végtelen sok, vagy csak véges sok ikerprím van-e (de még az is benne van a pakliban, hogy ez a kérdés eldönthetetlen... ,mint Erdős Jézusi kérdésének tárgya) viszont Brun tétele nyomán tudjuk, hogy ha egy egész tortát elosztunk 3 felé, majd az egész tortát 5 felé, majd megint az egészet 5 felé és ennek párja, a 7 felé, majd 11 és 13 felé, majd 17 és 19 felé és így tovább és ezeket a felosztogatott tortaszeleteket összeadogatjuk, akkor az összeg nem nő minden határon túl, hanem egy konkrét számhoz, a Brun konstanshoz tart.

Ezzel a példával kezdjük meg a Bátf41 Haxor Stream|Programozás R nyelv tanuló szemináriumát, íme:

stp <- function(x){

    primes = primes(x)
    diff = primes[2:length(primes)]-primes[1:length(primes)-1]
    idx = which(diff==2)
    t1primes = primes[idx]
    t2primes = primes[idx]+2
    rt1plust2 = 1/t1primes+1/t2primes
    return(sum(rt1plust2))
}

x=seq(10, 1000000, by=10000)
y=sapply(x, FUN = stp)
plot(x,y,type="b")



indulás Linux alól:

ugyanez Windows-on:

Folytatjuk!

Feladat

Attól függően, hogy milyen (Linux vagy Windows) rendszeretek van, ismételjétek meg a fenti streamet a saját gépeteken!

JÖN: STREAM LINK

TeX

Irjuk le a Brun tételt, avagy ismerjük meg a matamatikai írott nyelvet a TeX-et! Tegyük ezt a szöveges nandi.tex nevű fájlba:

\documentclass{article}

\usepackage{amsmath}

\title{100 \'eves a Brun t\'etel}
\date{\today}
\author{N\'andi B\'atfai}

\begin{document}

\maketitle

$B_2$ a Brun konstans.

\begin{align*}
  B_2 &= \sum_{p, p+2\in P} \left( \frac{1}{p}+\frac{1}{p+2} \right) =\\
   &= \frac{1}{3}+\frac{1}{5} + \frac{1}{5}+\frac{1}{7} + \frac{1}{11}+\frac{1}{13}
\dots < \infty
\end{align*}

 
\end{document}

majd fordítsuk és nyissuk ki a pdf-et:

batfai@entropy:~$ pdflatex nandi.tex

batfai@entropy:~$ evince nandi.pdf

s ezt kapjuk: 

brun1.png

Feladat

Irjuk le a matematika (TeX) nyelvén Euler tételét, miszerint a négyzetszámok reciprokösszege a pí négyzetének hatoda.


*: lásd https://www.scolar.hu/az_ember_aki_csak_a_matematikat_szerette_2039

Eddig "csaltunk", de innentől MI

Eddig csaltunk, de itt már nem: az eddigi Minecraft MALMO témájú programozás streamekben

nem azt a képet dolgoztuk fel, amit mi magunk is látunk a kijelzőn, hanem az API-t felhasználva lekértük például a "megfigyelt blokk téglát"

<ObservationFromGrid>
<Grid name="nbr3x3">
<min x="-1" y="-1" z="-1"/>
<max x="1" y="1" z="1"/>
</Grid>
</ObservationFromGrid>

 

vagy akinek képekben beszédesebb, ez ennek a kódcsipetnek (jobb oldali zöld-kék, piros közepű) megfegfelelő 3x3x3 méretű blokk téglát:

3d1.png

A fenti streramen viszont már azt a példát kezdtük feldolgozni, ahol a mesterséges intelligencia kezdődik: az ágens maga építi fel majd a látott képből a látott blokk téglát, vagy legalábbis megpróbálja :) Hajrá!

süti beállítások módosítása