{"id":15026332,"url":"https://github.com/srush/tensor-puzzles","last_synced_at":"2025-05-14T23:02:07.633Z","repository":{"id":41138618,"uuid":"480851935","full_name":"srush/Tensor-Puzzles","owner":"srush","description":"Solve puzzles. Improve your pytorch.","archived":false,"fork":false,"pushed_at":"2024-07-15T20:11:52.000Z","size":5555,"stargazers_count":3503,"open_issues_count":17,"forks_count":317,"subscribers_count":13,"default_branch":"main","last_synced_at":"2025-04-03T08:06:37.037Z","etag":null,"topics":["machine-learning","puzzle","torch"],"latest_commit_sha":null,"homepage":"","language":"Jupyter Notebook","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/srush.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-04-12T14:45:18.000Z","updated_at":"2025-04-03T03:46:37.000Z","dependencies_parsed_at":"2023-10-16T11:34:08.465Z","dependency_job_id":"41acfb35-834a-4a9d-bbfe-7f02408556dd","html_url":"https://github.com/srush/Tensor-Puzzles","commit_stats":{"total_commits":65,"total_committers":3,"mean_commits":"21.666666666666668","dds":0.0461538461538461,"last_synced_commit":"ad5069f7ef48523f733d445a7f94e93427d64f2d"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/srush%2FTensor-Puzzles","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/srush%2FTensor-Puzzles/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/srush%2FTensor-Puzzles/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/srush%2FTensor-Puzzles/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/srush","download_url":"https://codeload.github.com/srush/Tensor-Puzzles/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248352414,"owners_count":21089443,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["machine-learning","puzzle","torch"],"created_at":"2024-09-24T20:04:17.777Z","updated_at":"2025-04-11T06:21:11.606Z","avatar_url":"https://github.com/srush.png","language":"Jupyter Notebook","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Tensor Puzzles\n- by [Sasha Rush](http://rush-nlp.com) - [srush_nlp](https://twitter.com/srush_nlp) (with Marcos Treviso)\n\n\n\n\nWhen learning a tensor programming language like PyTorch or Numpy it\nis tempting to rely on the standard library (or more honestly\nStackOverflow) to find a magic function for everything.  But in\npractice, the tensor language is extremely expressive, and you can\ndo most things from first principles and clever use of broadcasting.\n\n\nThis is a collection of 21 tensor puzzles. Like chess puzzles these are\nnot meant to simulate the complexity of a real program, but to practice\nin a simplified environment. Each puzzle asks you to reimplement one\nfunction in the NumPy standard library without magic. \n\n\nI recommend running in Colab. Click here and copy the notebook to get start.\n\n[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/srush/Tensor-Puzzles/blob/main/Tensor%20Puzzlers.ipynb)\n\nIf you are interested, there is also a youtube walkthrough of the puzzles \n\n[![Watch the video](https://img.youtube.com/vi/SiwTAyyvt5s/default.jpg)](https://youtu.be/Hafo7hIl8MU)\n\n```python\n!pip install -qqq torchtyping hypothesis pytest git+https://github.com/danoneata/chalk@srush-patch-1\n!wget -q https://github.com/srush/Tensor-Puzzles/raw/main/lib.py\n```\n\n\n```python\nfrom lib import draw_examples, make_test, run_test\nimport torch\nimport numpy as np\nfrom torchtyping import TensorType as TT\ntensor = torch.tensor\n```\n\n## Rules\n\n1. These puzzles are about *broadcasting*. Know this rule.\n\n![](https://pbs.twimg.com/media/FQywor0WYAssn7Y?format=png\u0026name=large)\n\n2. Each puzzle needs to be solved in 1 line (\u003c80 columns) of code.\n3. You are allowed @, arithmetic, comparison, `shape`, any indexing (e.g. `a[:j], a[:, None], a[arange(10)]`), and previous puzzle functions.\n4. You are *not allowed* anything else. No `view`, `sum`, `take`, `squeeze`, `tensor`.\n\n5. You can start with these two functions:\n\n\n```python\ndef arange(i: int):\n    \"Use this function to replace a for-loop.\"\n    return torch.tensor(range(i))\n\ndraw_examples(\"arange\", [{\"\" : arange(i)} for i in [5, 3, 9]])\n```\n\n\n\n\n    \n![svg](Tensor%20Puzzlers_files/Tensor%20Puzzlers_7_0.svg)\n    \n\n\n\n\n```python\n# Example of broadcasting.\nexamples = [(arange(4), arange(5)[:, None]) ,\n            (arange(3)[:, None], arange(2))]\ndraw_examples(\"broadcast\", [{\"a\": a, \"b\":b, \"ret\": a + b} for a, b in examples])\n```\n\n\n\n\n    \n![svg](Tensor%20Puzzlers_files/Tensor%20Puzzlers_8_0.svg)\n    \n\n\n\n\n```python\ndef where(q, a, b):\n    \"Use this function to replace an if-statement.\"\n    return (q * a) + (~q) * b\n\n# In diagrams, orange is positive/True, where is zero/False, and blue is negative.\n\nexamples = [(tensor([False]), tensor([10]), tensor([0])),\n            (tensor([False, True]), tensor([1, 1]), tensor([-10, 0])),\n            (tensor([False, True]), tensor([1]), tensor([-10, 0])),\n            (tensor([[False, True], [True, False]]), tensor([1]), tensor([-10, 0])),\n            (tensor([[False, True], [True, False]]), tensor([[0], [10]]), tensor([-10, 0])),\n           ]\ndraw_examples(\"where\", [{\"q\": q, \"a\":a, \"b\":b, \"ret\": where(q, a, b)} for q, a, b in examples])\n```\n\n\n\n\n    \n![svg](Tensor%20Puzzlers_files/Tensor%20Puzzlers_9_0.svg)\n    \n\n\n\n## Puzzle 1 - ones\n\nCompute [ones](https://numpy.org/doc/stable/reference/generated/numpy.ones.html) - the vector of all ones.\n\n\n```python\ndef ones_spec(out):\n    for i in range(len(out)):\n        out[i] = 1\n        \ndef ones(i: int) -\u003e TT[\"i\"]:\n    raise NotImplementedError\n\ntest_ones = make_test(\"one\", ones, ones_spec, add_sizes=[\"i\"])\n```\n\n\n    \n![svg](Tensor%20Puzzlers_files/Tensor%20Puzzlers_11_0.svg)\n    \n\n\n\n```python\n# run_test(test_ones)\n```\n\n## Puzzle 2 - sum\n\nCompute [sum](https://numpy.org/doc/stable/reference/generated/numpy.sum.html) - the sum of a vector.\n\n\n```python\ndef sum_spec(a, out):\n    out[0] = 0\n    for i in range(len(a)):\n        out[0] += a[i]\n        \ndef sum(a: TT[\"i\"]) -\u003e TT[1]:\n    raise NotImplementedError\n\n\ntest_sum = make_test(\"sum\", sum, sum_spec)\n```\n\n\n    \n![svg](Tensor%20Puzzlers_files/Tensor%20Puzzlers_14_0.svg)\n    \n\n\n\n```python\n# run_test(test_sum)\n```\n\n## Puzzle 3 - outer\n\nCompute [outer](https://numpy.org/doc/stable/reference/generated/numpy.outer.html) - the outer product of two vectors.\n\n\n```python\ndef outer_spec(a, b, out):\n    for i in range(len(out)):\n        for j in range(len(out[0])):\n            out[i][j] = a[i] * b[j]\n            \ndef outer(a: TT[\"i\"], b: TT[\"j\"]) -\u003e TT[\"i\", \"j\"]:\n    raise NotImplementedError\n    \ntest_outer = make_test(\"outer\", outer, outer_spec)\n```\n\n\n    \n![svg](Tensor%20Puzzlers_files/Tensor%20Puzzlers_17_0.svg)\n    \n\n\n\n```python\n# run_test(test_outer)\n```\n\n## Puzzle 4 - diag\n\nCompute [diag](https://numpy.org/doc/stable/reference/generated/numpy.diag.html) - the diagonal vector of a square matrix.\n\n\n```python\ndef diag_spec(a, out):\n    for i in range(len(a)):\n        out[i] = a[i][i]\n        \ndef diag(a: TT[\"i\", \"i\"]) -\u003e TT[\"i\"]:\n    raise NotImplementedError\n\n\ntest_diag = make_test(\"diag\", diag, diag_spec)\n```\n\n\n    \n![svg](Tensor%20Puzzlers_files/Tensor%20Puzzlers_20_0.svg)\n    \n\n\n\n```python\n# run_test(test_diag)\n```\n\n## Puzzle 5 - eye\n\nCompute [eye](https://numpy.org/doc/stable/reference/generated/numpy.eye.html) - the identity matrix.\n\n\n```python\ndef eye_spec(out):\n    for i in range(len(out)):\n        out[i][i] = 1\n        \ndef eye(j: int) -\u003e TT[\"j\", \"j\"]:\n    raise NotImplementedError\n    \ntest_eye = make_test(\"eye\", eye, eye_spec, add_sizes=[\"j\"])\n```\n\n\n    \n![svg](Tensor%20Puzzlers_files/Tensor%20Puzzlers_23_0.svg)\n    \n\n\n\n```python\n# run_test(test_eye)\n```\n\n## Puzzle 6 - triu\n\nCompute [triu](https://numpy.org/doc/stable/reference/generated/numpy.triu.html) - the upper triangular matrix.\n\n\n```python\ndef triu_spec(out):\n    for i in range(len(out)):\n        for j in range(len(out)):\n            if i \u003c= j:\n                out[i][j] = 1\n            else:\n                out[i][j] = 0\n                \ndef triu(j: int) -\u003e TT[\"j\", \"j\"]:\n    raise NotImplementedError\n\n\ntest_triu = make_test(\"triu\", triu, triu_spec, add_sizes=[\"j\"])\n```\n\n\n    \n![svg](Tensor%20Puzzlers_files/Tensor%20Puzzlers_26_0.svg)\n    \n\n\n\n```python\n# run_test(test_triu)\n```\n\n## Puzzle 7 - cumsum\n\nCompute [cumsum](https://numpy.org/doc/stable/reference/generated/numpy.cumsum.html) - the cumulative sum.\n\n\n```python\ndef cumsum_spec(a, out):\n    total = 0\n    for i in range(len(out)):\n        out[i] = total + a[i]\n        total += a[i]\n\ndef cumsum(a: TT[\"i\"]) -\u003e TT[\"i\"]:\n    raise NotImplementedError\n\ntest_cumsum = make_test(\"cumsum\", cumsum, cumsum_spec)\n```\n\n\n    \n![svg](Tensor%20Puzzlers_files/Tensor%20Puzzlers_29_0.svg)\n    \n\n\n\n```python\n# run_test(test_cumsum)\n```\n\n## Puzzle 8 - diff\n\nCompute [diff](https://numpy.org/doc/stable/reference/generated/numpy.diff.html) - the running difference.\n\n\n```python\ndef diff_spec(a, out):\n    out[0] = a[0]\n    for i in range(1, len(out)):\n        out[i] = a[i] - a[i - 1]\n\ndef diff(a: TT[\"i\"], i: int) -\u003e TT[\"i\"]:\n    raise NotImplementedError\n\ntest_diff = make_test(\"diff\", diff, diff_spec, add_sizes=[\"i\"])\n```\n\n\n    \n![svg](Tensor%20Puzzlers_files/Tensor%20Puzzlers_32_0.svg)\n    \n\n\n\n```python\n# run_test(test_diff)\n```\n\n## Puzzle 9 - vstack\n\nCompute [vstack](https://numpy.org/doc/stable/reference/generated/numpy.vstack.html) - the matrix of two vectors\n\n\n```python\ndef vstack_spec(a, b, out):\n    for i in range(len(out[0])):\n        out[0][i] = a[i]\n        out[1][i] = b[i]\n\ndef vstack(a: TT[\"i\"], b: TT[\"i\"]) -\u003e TT[2, \"i\"]:\n    raise NotImplementedError\n\n\ntest_vstack = make_test(\"vstack\", vstack, vstack_spec)\n```\n\n\n    \n![svg](Tensor%20Puzzlers_files/Tensor%20Puzzlers_35_0.svg)\n    \n\n\n\n```python\n# run_test(test_vstack)\n```\n\n## Puzzle 10 - roll\n\nCompute [roll](https://numpy.org/doc/stable/reference/generated/numpy.roll.html) - the vector shifted 1 circular position.\n\n\n```python\ndef roll_spec(a, out):\n    for i in range(len(out)):\n        if i + 1 \u003c len(out):\n            out[i] = a[i + 1]\n        else:\n            out[i] = a[i + 1 - len(out)]\n            \ndef roll(a: TT[\"i\"], i: int) -\u003e TT[\"i\"]:\n    raise NotImplementedError\n\n\ntest_roll = make_test(\"roll\", roll, roll_spec, add_sizes=[\"i\"])\n```\n\n\n    \n![svg](Tensor%20Puzzlers_files/Tensor%20Puzzlers_38_0.svg)\n    \n\n\n\n```python\n# run_test(test_roll)\n```\n\n## Puzzle 11 - flip\n\nCompute [flip](https://numpy.org/doc/stable/reference/generated/numpy.flip.html) - the reversed vector\n\n\n```python\ndef flip_spec(a, out):\n    for i in range(len(out)):\n        out[i] = a[len(out) - i - 1]\n        \ndef flip(a: TT[\"i\"], i: int) -\u003e TT[\"i\"]:\n    raise NotImplementedError\n\n\ntest_flip = make_test(\"flip\", flip, flip_spec, add_sizes=[\"i\"])\n```\n\n\n    \n![svg](Tensor%20Puzzlers_files/Tensor%20Puzzlers_41_0.svg)\n    \n\n\n\n```python\n# run_test(test_flip)\n```\n\n## Puzzle 12 - compress\n\n\nCompute [compress](https://numpy.org/doc/stable/reference/generated/numpy.compress.html) - keep only masked entries (left-aligned).\n\n\n```python\ndef compress_spec(g, v, out):\n    j = 0\n    for i in range(len(g)):\n        if g[i]:\n            out[j] = v[i]\n            j += 1\n            \ndef compress(g: TT[\"i\", bool], v: TT[\"i\"], i:int) -\u003e TT[\"i\"]:\n    raise NotImplementedError\n\n\ntest_compress = make_test(\"compress\", compress, compress_spec, add_sizes=[\"i\"])\n```\n\n\n    \n![svg](Tensor%20Puzzlers_files/Tensor%20Puzzlers_44_0.svg)\n    \n\n\n\n```python\n# run_test(test_compress)\n```\n\n## Puzzle 13 - pad_to\n\n\nCompute pad_to - eliminate or add 0s to change size of vector.\n\n\n```python\ndef pad_to_spec(a, out):\n    for i in range(min(len(out), len(a))):\n        out[i] = a[i]\n\n\ndef pad_to(a: TT[\"i\"], i: int, j: int) -\u003e TT[\"j\"]:\n    raise NotImplementedError\n\n\ntest_pad_to = make_test(\"pad_to\", pad_to, pad_to_spec, add_sizes=[\"i\", \"j\"])\n```\n\n\n    \n![svg](Tensor%20Puzzlers_files/Tensor%20Puzzlers_47_0.svg)\n    \n\n\n\n```python\n# run_test(test_pad_to)\n```\n\n## Puzzle 14 - sequence_mask\n\n\nCompute [sequence_mask](https://www.tensorflow.org/api_docs/python/tf/sequence_mask) - pad out to length per batch.\n\n\n```python\ndef sequence_mask_spec(values, length, out):\n    for i in range(len(out)):\n        for j in range(len(out[0])):\n            if j \u003c length[i]:\n                out[i][j] = values[i][j]\n            else:\n                out[i][j] = 0\n    \ndef sequence_mask(values: TT[\"i\", \"j\"], length: TT[\"i\", int]) -\u003e TT[\"i\", \"j\"]:\n    raise NotImplementedError\n\n\ndef constraint_set_length(d):\n    d[\"length\"] = d[\"length\"] % d[\"values\"].shape[1]\n    return d\n\n\ntest_sequence = make_test(\"sequence_mask\",\n    sequence_mask, sequence_mask_spec, constraint=constraint_set_length\n)\n```\n\n\n    \n![svg](Tensor%20Puzzlers_files/Tensor%20Puzzlers_50_0.svg)\n    \n\n\n\n```python\n# run_test(test_sequence)\n```\n\n## Puzzle 15 - bincount\n\nCompute [bincount](https://numpy.org/doc/stable/reference/generated/numpy.bincount.html) - count number of times an entry was seen.\n\n\n```python\ndef bincount_spec(a, out):\n    for i in range(len(a)):\n        out[a[i]] += 1\n        \ndef bincount(a: TT[\"i\"], j: int) -\u003e TT[\"j\"]:\n    raise NotImplementedError\n\n\ndef constraint_set_max(d):\n    d[\"a\"] = d[\"a\"] % d[\"return\"].shape[0]\n    return d\n\n\ntest_bincount = make_test(\"bincount\",\n    bincount, bincount_spec, add_sizes=[\"j\"], constraint=constraint_set_max\n)\n```\n\n\n    \n![svg](Tensor%20Puzzlers_files/Tensor%20Puzzlers_53_0.svg)\n    \n\n\n\n```python\n# run_test(test_bincount)\n```\n\n## Puzzle 16 - scatter_add\n\nCompute [scatter_add](https://pytorch-scatter.readthedocs.io/en/1.3.0/functions/add.html) - add together values that link to the same location.\n\n\n```python\ndef scatter_add_spec(values, link, out):\n    for j in range(len(values)):\n        out[link[j]] += values[j]\n        \ndef scatter_add(values: TT[\"i\"], link: TT[\"i\"], j: int) -\u003e TT[\"j\"]:\n    raise NotImplementedError\n\n\ndef constraint_set_max(d):\n    d[\"link\"] = d[\"link\"] % d[\"return\"].shape[0]\n    return d\n\n\ntest_scatter_add = make_test(\"scatter_add\",\n    scatter_add, scatter_add_spec, add_sizes=[\"j\"], constraint=constraint_set_max\n)\n```\n\n\n    \n![svg](Tensor%20Puzzlers_files/Tensor%20Puzzlers_56_0.svg)\n    \n\n\n\n```python\n# run_test(test_scatter_add)\n```\n\n## Puzzle 17 - flatten\n\nCompute [flatten](https://numpy.org/doc/stable/reference/generated/numpy.ndarray.flatten.html)\n\n\n```python\ndef flatten_spec(a, out):\n    k = 0\n    for i in range(len(a)):\n        for j in range(len(a[0])):\n            out[k] = a[i][j]\n            k += 1\n\ndef flatten(a: TT[\"i\", \"j\"], i:int, j:int) -\u003e TT[\"i * j\"]:\n    raise NotImplementedError\n\ntest_flatten = make_test(\"flatten\", flatten, flatten_spec, add_sizes=[\"i\", \"j\"])\n```\n\n\n    \n![svg](Tensor%20Puzzlers_files/Tensor%20Puzzlers_59_0.svg)\n    \n\n\n\n```python\n# run_test(test_flatten)\n```\n\n## Puzzle 18 - linspace\n\nCompute [linspace](https://numpy.org/doc/stable/reference/generated/numpy.linspace.html)\n\n\n```python\ndef linspace_spec(i, j, out):\n    for k in range(len(out)):\n        out[k] = float(i + (j - i) * k / max(1, len(out) - 1))\n\ndef linspace(i: TT[1], j: TT[1], n: int) -\u003e TT[\"n\", float]:\n    raise NotImplementedError\n\ntest_linspace = make_test(\"linspace\", linspace, linspace_spec, add_sizes=[\"n\"])\n```\n\n\n    \n![svg](Tensor%20Puzzlers_files/Tensor%20Puzzlers_62_0.svg)\n    \n\n\n\n```python\n# run_test(test_linspace)\n```\n\n## Puzzle 19 - heaviside\n\nCompute [heaviside](https://numpy.org/doc/stable/reference/generated/numpy.heaviside.html)\n\n\n```python\ndef heaviside_spec(a, b, out):\n    for k in range(len(out)):\n        if a[k] == 0:\n            out[k] = b[k]\n        else:\n            out[k] = int(a[k] \u003e 0)\n\ndef heaviside(a: TT[\"i\"], b: TT[\"i\"]) -\u003e TT[\"i\"]:\n    raise NotImplementedError\n\ntest_heaviside = make_test(\"heaviside\", heaviside, heaviside_spec)\n```\n\n\n    \n![svg](Tensor%20Puzzlers_files/Tensor%20Puzzlers_65_0.svg)\n    \n\n\n\n```python\n# run_test(test_heaviside)\n```\n\n## Puzzle 20 - repeat (1d)\n\nCompute [repeat](https://pytorch.org/docs/stable/generated/torch.Tensor.repeat.html)\n\n\n```python\ndef repeat_spec(a, d, out):\n    for i in range(d[0]):\n        for k in range(len(a)):\n            out[i][k] = a[k]\n\ndef constraint_set(d):\n    d[\"d\"][0] = d[\"return\"].shape[0]\n    return d\n\n            \ndef repeat(a: TT[\"i\"], d: TT[1]) -\u003e TT[\"d\", \"i\"]:\n    raise NotImplementedError\n\ntest_repeat = make_test(\"repeat\", repeat, repeat_spec, constraint=constraint_set)\n```\n    \n![svg](Tensor%20Puzzlers_files/Tensor%20Puzzlers_68_0.svg)\n\n## Puzzle 21 - bucketize\n\nCompute [bucketize](https://pytorch.org/docs/stable/generated/torch.bucketize.html)\n\n```python\ndef bucketize_spec(v, boundaries, out):\n    for i, val in enumerate(v):\n        out[i] = 0\n        for j in range(len(boundaries)-1):\n            if val \u003e= boundaries[j]:\n                out[i] = j + 1\n        if val \u003e= boundaries[-1]:\n            out[i] = len(boundaries)\n\n\ndef constraint_set(d):\n    d[\"boundaries\"] = np.abs(d[\"boundaries\"]).cumsum()\n    return d\n\n            \ndef bucketize(v: TT[\"i\"], boundaries: TT[\"j\"]) -\u003e TT[\"i\"]:\n    raise NotImplementedError\n\ntest_bucketize = make_test(\"bucketize\", bucketize, bucketize_spec,\n                           constraint=constraint_set)\n```\n![svg](Tensor%20Puzzlers_files/Tensor%20Puzzlers_69_0.svg)\n\n## Speed Run Mode!\nWhat is the smallest you can make each of these?\n\n```python\nimport inspect\nfns = (ones, sum, outer, diag, eye, triu, cumsum, diff, vstack, roll, flip,\n       compress, pad_to, sequence_mask, bincount, scatter_add)\n\nfor fn in fns:\n    lines = [l for l in inspect.getsource(fn).split(\"\\n\") if not l.strip().startswith(\"#\")]\n    \n    if len(lines) \u003e 3:\n        print(fn.__name__, len(lines[2]), \"(more than 1 line)\")\n    else:\n        print(fn.__name__, len(lines[1]))\n```\n\n    ones 29\n    sum 29\n    outer 29\n    diag 29\n    eye 29\n    triu 29\n    cumsum 29\n    diff 29\n    vstack 29\n    roll 29\n    flip 29\n    compress 29\n    pad_to 29\n    sequence_mask 29\n    bincount 29\n    scatter_add 29\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsrush%2Ftensor-puzzles","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsrush%2Ftensor-puzzles","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsrush%2Ftensor-puzzles/lists"}