---
# System prepended metadata

title: DGM Interview with Vito

---

# DGM Interview with Vito

### Fix the bugs in this function to count reachable nodes in a directed graph.

```typescript
type Node<T> = {
    value: T,
    children: Node<T>[],
}

a === b // the same node in javascript


const countNodes<T> = (seen: Node<T>[]) => (root: Node<T>): number =>
    root.children
        .filter(x => x not in seen)
        .map(countNodes([...seen, root]))
        .reduce((sum, x) => sum + x, 1);
        
A -> B; A -> C
B -> D; C -> D

a -> b; a -> c
b -> d; c -> d

```

```haskell
countNodes :: [Node t] -> Node t -> Int
```

```php
class Node {
    public $value;
    public $children;
    
    // count how many nodes are reachable from this node including this node
    public countNodes($seen=[]) {
        $n = 0;
        $seen[] = $this;
        foreach($this->children as $child) {
            $n += $child->countNodes($seen);
        }
        return $n;
    }
}
```
#### Test cases

```typescript
const singleton: Node<null> = {value: null, children: []};
countNodes(singleton) === 1;
```

```typescript
const pair: Node<null> = {value: null, children: [singleton]};
countNodes(pair) === 2;
```

```typescript
const singleton_loop: Node<null> = {value: null, children: [singleton_loop]};
countNodes(singleton_loop) === 1;
```
### Why doesn't 0.4 + 0.8 == 1.2? (in javascript, Java, PHP, C, etc.)

```haskell
```

## What and What Languages

liftA2 (+) x y
x :: Applicative f => f Float
((+) <$> x <*> y) >>= (\a -> if a > 0 then pure a else empty)

do
  clamp <- getdefalutclamp
  glassclamp <- getdefaultglassclamp

Backend   - Java, PHP, Haskell
Frontends - Javascript and Typescript


