Programming in handstand

43 %
57 %
Information about Programming in handstand
Technology

Published on February 28, 2013

Author: athoshun

Source: slideshare.net

Description

My talk at PHPMeetup Budapest about doing the FizzBuzz kata with some weird constraints, such as not using loops, if statements and ternaries, and what can be learnt from such an exercise. (Slides are in Hungarian but most of them contains nothing but code.)

Programozz kézenállva! Magyar Attila (@athoshun) PHP Meetup, 2013. 02. 26.

FizzBuzz Write a program that iterates through the numbers between 1 and 100:  For multiples of 3 print "Fizz"  For multiples of 5 print "Buzz"  For numbers which are multiples of both 3 and 5 print "FizzBuzz"  For others, print the number itself

FizzBuzz Write a program that iterates through the numbers between 1 and 100:  For multiples of 3 print "Fizz"  For multiples of 5 print "Buzz"  For numbers which are multiples of both 3 and 5 print "FizzBuzz"  For others, print the number itself1, 2, Fizz, 4, Buzz, Fizz, 7, 8, Fizz, Buzz,11, Fizz, 13, 14, FizzBuzz, 16, 17, Fizz, 19,Buzz, Fizz, 22, 23, Fizz, Buzz, 26, Fizz, 28,29, FizzBuzz, ...

Triviális megoldásfor ($i = 1; $i <= 100; ++$i) {    if ($i % 3 == 0) print "Fizz";    if ($i % 5 == 0) print "Buzz";    if ($i % 3 && $i % 5) print $i;    print ", ";}

Ciklus nélkül!

Ciklus nélkül!

Ciklus nélkül!function fizzbuzz($i = 1){    if ($i > 100) return;    if ($i % 3 == 0) print "Fizz";    if ($i % 5 == 0) print "Buzz";    if ($i % 3 && $i % 5) print $i;    print ", ";    fizzbuzz($i + 1);}

Ciklus nélkül!function fizzbuzz($i = 1){    if ($i > 100) return;PHP Fatal error:  Maximumfunction nesting level    if ($i % 3 == 0) print "Fizz";of 100 Reached, aborting!    if ($i % 5 == 0) print "Buzz";    if ($i % 3 && $i % 5) print $i;    print ", ";    fizzbuzz($i + 1);}

Ciklus nélkül!

Ciklus nélkül!

Ciklus nélkül!$fizzbuzz = function ($i) {    if ($i % 3 == 0) print "Fizz";    if ($i % 5 == 0) print "Buzz";    if ($i % 3 && $i % 5) print $i;    print ", ";};array_map($fizzbuzz, range(1, 100));

Elágazás nélkül!

Elágazás nélkül!$id = function ($x) { return $x; };

Elágazás nélkül!$id = function ($x) { return $x; };$fizz = function ($x) { return "Fizz"; };$buzz = function ($x) { return "Buzz"; };$fizzbuzz = function ($x) {    return "FizzBuzz";};

Elágazás nélkül!$functions = array(   $fizzbuzz,   $id,    $id,    $fizz,  $id,    $buzz,   $fizz,  $id,    $id,    $fizz,  $buzz,   $id,    $fizz,  $id,    $id);array_map(   function ($x) use ($functions) {      print $functions[$x % 15]($x) . ", ";   },   range(1, 100));

Redundancia$id = function ($x) { return $x; };$fizz = function ($x) { return "Fizz"; };$buzz = function ($x) { return "Buzz"; };$fizzbuzz = function ($x) {    return "FizzBuzz";};

Redundancia$id = function ($x) { return $x; };$fizz = function ($x) { return "Fizz"; };$buzz = function ($x) { return "Buzz"; };$fizzbuzz = function ($x) {    return "FizzBuzz";};

Redundancia$id = function ($x) { return $x; };$fizz = function ($x) { return "Fizz"; };$buzz = function ($x) { return "Buzz"; };$fizzbuzz = function ($x) {    return "FizzBuzz";};function const_($const) {    return function ($x) use ($const) {        return $const;    };}

Redundancia$id = function ($x) { return $x; };$fizz = const_("Fizz");$buzz = const_("Buzz");$fizzbuzz = const_("FizzBuzz");function const_($const) {    return function ($x) use ($const) {        return $const;    };}

Redundancia$id = function ($x) { return $x; };$fizz = const_("Fizz");$buzz = const_("Buzz");$fizzbuzz = const_("FizzBuzz");DONT REPEAT YOURSELF!!!

Redundancia$id = function ($x) { return $x; };$fizz = const_("Fizz");$buzz = const_("Buzz");$fizzbuzz = const_("FizzBuzz");function concat($f, $g){    return function ($x) use ($f, $g) {        return $f($x) . $g($x);    };}

Redundancia$id = function ($x) { return $x; };$fizz = const_("Fizz");$buzz = const_("Buzz");$fizzbuzz = concat($fizz, $buzz);function concat($f, $g){    return function ($x) use ($f, $g) {        return $f($x) . $g($x);    };}

$id = function ($x) { return $x; };$fizz = const_("Fizz");$buzz = const_("Buzz");$fizzbuzz = concat($fizz, $buzz);$functions = array(    $fizzbuzz,    $id,    $id,    $fizz,  $id,    $buzz,    $fizz,  $id,    $id,    $fizz,  $buzz,    $id,    $fizz,  $id,    $id);array_map(    function ($x) use ($functions) {        print $functions[$x % 15]($x) . ", ";    },    range(1, 100));

$id = function ($x) { return $x; };$fizz = const_("Fizz");$buzz = const_("Buzz");$fizzbuzz = concat($fizz, $buzz);$functions = array(    $fizzbuzz,    $id,    $id,    $fizz,  $id,    $buzz,    $fizz,  $id,    $id,    $fizz,  $buzz,    $id,    $fizz,  $id,    $id);array_map(    function ($x) use ($functions) {        print $functions[$x % 15]($x) . ", ";    },    range(1, 100));

3 többszöröseifunction multiples_of_3(){    return array_map(        function ($x) { return $x * 3; }        range(1, 10)    );}var_dump( multiples_of_3() );// 3, 6, 9, 12, 15, 18, 21, 24, 27, 30

3 többszöröseifunction multiples_of_3(){    return array_map(        function ($x) { return $x * 3; }        range(1, 10)    );}var_dump( multiples_of_3() );// 3, 6, 9, 12, 15, 18, 21, 24, 27, 30

3 többszöröseifunction multiples_of_3(){    return array_map(        multiply_by_3(),        range(1, 10)    );}function multiply_by_3(){    return function ($x) {        return $x * 3;    }}

3 többszöröseifunction multiples_of_3(){    return array_map(        multiply_by_3(),        range(1, 10)    );}function multiply_by_3(){    return function ($x) {        return $x * 3;    }}

3 többszöröseifunction multiples_of_3(){    return array_map(        multiply_by(3),        range(1, 10)    );}function multiply_by($n){    return function ($x) use ($n) {        return $x * $n;    }}

3 többszöröseifunction multiples_of($n){    return array_map(        multiply_by($n),        range(1, 10)    );}function multiply_by($n){    return function ($x) use ($n) {        return $x * $n;    }}

3 többszöröseifunction multiples_of($n){    return array_map(        multiply_by($n),        range(1, 10)    );}var_dump( multiples_of(5) );// 5, 10, 15, 20, 25, 30, 35, 40, 45, 50

A 3 első öt többszörösefunction take($n, array $from){    return array_slice($from, 0, $n);}

A 3 első öt többszörösefunction take($n, array $from){    return array_slice($from, 0, $n);}var_dump( multiples_of(3) );// 3, 6, 9, 12, 15, 18, 21, 24, 27, 30var_dump( take(5, multiples_of(3)) );// 3, 6, 9, 12, 15

A többi számfunction subtract(array $from, array $what){    return array_diff($from, $what);}

A többi számfunction subtract(array $from, array $what){    return array_diff($from, $what);}var_dump(    subtract(        range(1, 15),        take(5, multiples_of(3))    ));// 1, 2, 4, 5, 7, 8, 10, 11, 13, 14

4 halmaz, modulo 15$multiples_of_3 = take(4, multiples_of(3));$multiples_of_5 = take(2, multiples_of(5));$multiples_of_both = array(0);$others = subtract(    range(1, 14),    array_merge($multiples_of_3, $multiples_of_5));

4 halmaz, modulo 15$multiples_of_3 = take(4, multiples_of(3));$multiples_of_5 = take(2, multiples_of(5));$multiples_of_both = array(0);$others = subtract(    range(1, 14),    array_merge($multiples_of_3, $multiples_of_5));var_dump(    array_merge(        $multiples_of_3, $multiples_of_5,        $multiples_of_both, $others    ));// 3, 6, 9, 12, 5, 10, 0, 1, 2, 4, 7, 8, 11, 13, 14

Érték → tömbfunction repeat($value, $times){    return array_fill(0, $times, $value);}var_dump( repeat(42, 4) );// 42, 42, 42, 42

Érték → tömbfunction repeat($value, $times){    return array_fill(0, $times, $value);}var_dump( repeat(function () {}, 4) );// object(Closure)#1 (0) {},// object(Closure)#1 (0) {},// object(Closure)#1 (0) {},// object(Closure)#1 (0) {}

( Tömb, tömb ) → tömb

( Tömb, tömb ) → tömb$keys = array(42, 43, 44);$values = array(    "Forty­two",    "Forty­three",    "Forty­four");var_export(array_combine($keys, $values));// array (//   42 => Forty­two,//   43 => Forty­three,//   44 => Forty­four,// )

( Tömb, függvény ) → tömbfunction for_all(array $values, $function) {    return array_combine(        $values,        repeat($function, count($values))    );}

( Tömb, függvény ) → tömbfunction for_all(array $values, $function) {    return array_combine(        $values,        repeat($function, count($values))    );}$items = array(42, 43, 44);$do_something = function () {};var_dump( for_all($items, $do_something) );// array(3) {//     [42] => object(Closure)#1 (0) {}//     [43] => object(Closure)#1 (0) {}//     [44] => object(Closure)#1 (0) {}// }

Hol is tartunk?$id = function ($x) { return $x; };$fizz = const_("Fizz");$buzz = const_("Buzz");$fizzbuzz = concat($fizz, $buzz);$functions = array(    $fizzbuzz,    $id,    $id,    $fizz,  $id,    $buzz,    $fizz,  $id,    $id,    $fizz,  $buzz,    $id,    $fizz,  $id,    $id);array_map(    function ($x) use ($functions) {        print $functions[$x % 15]($x) . ", ";    },    range(1, 100));

Hol is tartunk?$multiples_of_3 = take(4, multiples_of(3));$multiples_of_5 = take(2, multiples_of(5));$multiples_of_both = array(0);$others = subtract(    range(1, 14),    array_merge($multiples_of_3, $multiples_of_5));$functions = for_all($multiples_of_3, $fizz)    + for_all($multiples_of_5, $buzz)    + for_all($multiples_of_both, $fizzbuzz)    + for_all($others, $id);

Függvény → kiírásfunction print_($function){    return function ($x) use ($function) {        print $function($x);    };}

Alakul...$functions = for_all($multiples_of_3, print_($fizz))    + for_all($multiples_of_5, print_($buzz))    + for_all($multiples_of_both, print_($fizzbuzz))    + for_all($others, print_($id));array_map(    function ($x) use ($functions) {        print $functions[$x % 15]($x);        print ", ";    },    range(1, 100));

Alakul...$functions = for_all($multiples_of_3, print_($fizz))    + for_all($multiples_of_5, print_($buzz))    + for_all($multiples_of_both, print_($fizzbuzz))    + for_all($others, print_($id));array_map(    function ($x) use ($functions) {        $functions[$x % 15]($x);        print ", ";    },    range(1, 100));

Alakul...$them = $id;$functions = for_all($multiples_of_3, print_($fizz))    + for_all($multiples_of_5, print_($buzz))    + for_all($multiples_of_both, print_($fizzbuzz))    + for_all($others, print_($them));array_map(    function ($x) use ($functions) {        $functions[$x % 15]($x);        print ", ";    },    range(1, 100));

A végeredményfor_all($multiples_of_3, print_($fizz)) + for_all($multiples_of_5, print_($buzz)) + for_all($multiples_of_both, print_($fizzbuzz)) + for_all($others, print_($them));

A végeredményfor_all($multiples_of_3, print_($fizz)) + for_all($multiples_of_5, print_($buzz)) + for_all($multiples_of_both, print_($fizzbuzz)) + for_all($others, print_($them));

A végeredményfor all  multiples of 3  print   fizz   for all  multiples of 5  print   buzz   for all  multiples of both  print   fizzbuzz   for all  others, print   them

DONT TRY THIS AT HOME! Memória pazarló Lassú

TRY THIS AT HOME! Más szemlélet Mellékhatások nélkül → determinisztikus Trükkök:  Lazy evaluation (lazy iterators)  Cache-elés  Tail call optimization Többszálúság? (Párhuzamos algoritmusok, skálázás)

Köszönöm a figyelmet!

Másik változat :-)function fizzbuzz(){    $functions = array(        const_("FizzBuzz"), const_("Buzz"),        const_("Fizz"), id()    );    array_map(        function ($x) use ($functions) {            print $functions[                      !!($x % 3)                + 2 * !!($x % 5)            ]($x) . ", ";        },        range(1, 100)    );}

Harmadik változat :-)function fizzbuzz(){  array_map(    function ($x) {      print array_reduce(        array(          when(divisable_by(3), append(const_("Fizz"))),          when(divisable_by(5), append(const_("Buzz"))),          when(neither(), append(id())),        ),        apply_filter_with($x), ””      ) . ", ";    },    range(1, 100)  );}

Add a comment

Related presentations

Presentación que realice en el Evento Nacional de Gobierno Abierto, realizado los ...

In this presentation we will describe our experience developing with a highly dyna...

Presentation to the LITA Forum 7th November 2014 Albuquerque, NM

Un recorrido por los cambios que nos generará el wearabletech en el futuro

Um paralelo entre as novidades & mercado em Wearable Computing e Tecnologias Assis...

Microsoft finally joins the smartwatch and fitness tracker game by introducing the...

Related pages

Programming in handstand - Engineering - documents

Programming in handstand PHP Meetup, 2014. 04. 23. ... Descriptive Programming in QTP Carrier in Python Programming Programming in Java -Poster
Read more

Handstand Push-Up Tutorial - GMB Fitness

The handstand push-up is an advanced skill, but these progressions will get you strong and ready to work up to the full movement.
Read more

How to Do a Handstand - GMB Fitness

Here's everything you need to know about training for a handstand - preparations, progressions, and programming.
Read more

Programming in handstand - Engineering - docslide.us

Search; Home; Engineering; Programming in handstand
Read more

My 4-Week Program for Achieving Handstand Happiness ...

Click on a week to go directly to any of the four weeks of programming: Week 1: Balance, Handstand, and Core Week 2: Walking and Core
Read more

How to Become a Handstand Beast - A Beginner and Advanced ...

How to Become a Handstand Beast – A Beginner and Advanced Guide. ... HS can be done daily, provided your programming structure is in check.
Read more

Handstand Drills: Lunges and Levers - YouTube

Some very basic drills for improving the handstand. The closer these basic actions are mastered to perfection, the better the handstand will be.
Read more

Handstands, Etc. - Gymnastics Skills Coaching Handbook

Handstands, etc. Technique & drills. Spotting. ¾ cross handstand Begin in a lunge, good foot in front, arms up & close to the ears, weight evenly ...
Read more

Handstand | LinkedIn

View 352 Handstand posts, presentations, experts, and more. Get the professional knowledge you need on LinkedIn.
Read more