ARC Prize — Complete Guide
The world's most prestigious AI/AGI competition. ARC-AGI tests whether AI can reason the way humans do on abstract visual tasks. Winning requires genuine AI break…
Open on arcprize now
Connected to the competition feed. Verify dates, eligibility and prizes on the official page.
ARC Prize 2026
$2M pool, hardest ML comp. Portfolio gold even without winning.
ARC Prize — Complete Guide
What Is ARC Prize?
The world's most prestigious AI/AGI competition. ARC-AGI tests whether AI can reason the way humans do on abstract visual tasks. Winning requires genuine AI breakthroughs — not just engineering tricks.
2026 Prize Pool: $2,000,000
- Hosted on Kaggle
- URL: arcprize.org/competitions/2026
Two Tracks in 2026
ARC-AGI-2
- Prize: $1,000,000
- Goal: Open source a solution that achieves a breakthrough on ARC-AGI-2 benchmark
- 1st prize: $425K (requires open-source + interview + solution review)
- Requirement: Must open-source your solution BEFORE receiving official scores
ARC-AGI-3
- Prize pool: $75,000 in milestone prizes
- New format: Build AI agents that PLAY ARC-AGI-3 games
- Milestone 1 (Jun 30 2026): 1st $25K, 2nd $10K, 3rd $2.5K
- Milestone 2 (Sep 30 2026): 1st $25K, 2nd $10K, 3rd $2.5K
- Final submission: Nov 2 2026
- Results: Dec 4 2026
Key Dates 2026
| Date | Event |
|---|---|
| Mar 25 2026 | Competition opens |
| Jun 30 2026 | ARC-AGI-3 Milestone 1 |
| Sep 30 2026 | ARC-AGI-3 Milestone 2 |
| Nov 2 2026 | Final submissions due |
| Nov 8 2026 | Papers due |
| Dec 4 2026 | Results announced |
What ARC Tasks Look Like
Each task has a grid-based input/output pattern. The model must infer the RULE from 2–5 examples and apply it to a test grid.
Training example 1:
Input: Output:
[[0,0,2], [[0,0,0],
[0,2,0], [0,0,2],
[2,0,0]] [0,2,0]]
Test: → Your model must predict this output
Input:
[[1,0,0],
[0,1,0],
[0,0,1]]
The task above might encode "shift all colored cells down by one". Your model must generalize the rule from examples — not memorize.
What Approaches Actually Work
Approach 1: Program Synthesis (Top Method)
Treat ARC as a programming puzzle — search for a program that transforms input → output.
Domain-Specific Language (DSL) approach:
- Define a set of primitive operations (rotate, mirror, recolor, crop, tile, etc.)
- Compose operations to generate candidate programs
- Search for the combination that produces correct outputs for all training pairs
- Apply winning program to test input
# Example DSL primitives
def rotate_90(grid): return [list(row) for row in zip(*grid[::-1])]
def flip_h(grid): return [row[::-1] for row in grid]
def recolor(grid, from_color, to_color):
return [[to_color if c == from_color else c for c in row] for row in grid]
# Composition search (brute force for 1-2 operations)
from itertools import product
PRIMITIVES = [rotate_90, flip_h, lambda g: flip_h(rotate_90(g))]
def search_program(train_pairs):
"""Find single operation that works on all training pairs."""
for fn in PRIMITIVES:
if all(fn(inp) == out for inp, out in train_pairs):
return fn
return None
Why it works: 80%+ of ARC tasks can be solved with 3–5 chained primitive operations. DSL approaches won the 2024 competition.
Approach 2: LLM with Few-Shot Reasoning (o3, Gemini 2.5)
Use frontier LLMs with in-context examples. Describe the grid transformation in text and ask the model to infer the rule.
Key finding from 2024: OpenAI's o3 achieved 75.7% on ARC-AGI-1 (previously only 4% with GPT-4). This was a breakthrough moment showing chain-of-thought reasoning helps significantly.
# Prompt template for LLM approach
PROMPT_TEMPLATE = """
You are solving an ARC (Abstraction and Reasoning Corpus) task.
Study the training examples carefully to identify the transformation rule,
then apply it to the test input.
Training Examples:
{training_examples}
Test Input:
{test_input}
First, describe the transformation rule you observe in the training examples.
Then apply this rule step-by-step to the test input.
Output ONLY the final grid as a Python list of lists.
"""
def arc_with_llm(task, model_client):
training_str = "\n".join([
f"Example {i+1}:\nInput: {pair['input']}\nOutput: {pair['output']}"
for i, pair in enumerate(task['train'])
])
prompt = PROMPT_TEMPLATE.format(
training_examples=training_str,
test_input=task['test'][0]['input']
)
return model_client.generate(prompt)
Approach 3: Neural + Symbolic Hybrid (Best 2024 Open Source)
Combine neural network perception with symbolic rule search:
- Neural net encodes the grid structure (color patterns, object positions)
- Symbolic search finds the transformation rule over the encoded representation
- Apply rule to test input
Approach 4: Test-Time Training (TTT) for Vision Models
Fine-tune a pretrained vision model on each individual task at test time:
- Create synthetic variants of the training pairs (augmentations, rotations)
- Fine-tune the model on this tiny per-task dataset during inference
- Generate prediction
Documented result: TTT improved accuracy by 12–18% on ARC tasks vs static inference.
Practical Code: ARC Task Loader
import json
from pathlib import Path
def load_arc_tasks(data_dir: str):
"""Load all ARC tasks from the standard directory structure."""
tasks = {}
for path in Path(data_dir).glob("*.json"):
with open(path) as f:
task = json.load(f)
tasks[path.stem] = task # key = task ID
return tasks
def display_task(task):
"""Print a task for visual inspection."""
print("=== TRAINING PAIRS ===")
for i, pair in enumerate(task['train']):
print(f"\nPair {i+1}:")
print("Input:")
for row in pair['input']:
print(' '.join(str(c) for c in row))
print("Output:")
for row in pair['output']:
print(' '.join(str(c) for c in row))
print("\n=== TEST INPUT ===")
for row in task['test'][0]['input']:
print(' '.join(str(c) for c in row))
def grid_to_tensor(grid):
"""Convert grid to one-hot tensor for neural approaches."""
import torch
import numpy as np
n_colors = 10 # ARC uses colors 0–9
grid_np = np.array(grid)
H, W = grid_np.shape
one_hot = torch.zeros(n_colors, H, W)
for c in range(n_colors):
one_hot[c] = torch.tensor(grid_np == c, dtype=torch.float)
return one_hot
DSL Primitive Library (Start Here)
import numpy as np
def to_np(grid): return np.array(grid)
def to_list(arr): return arr.tolist()
# Geometric transforms
def rot90(g): return to_list(np.rot90(to_np(g)))
def rot180(g): return to_list(np.rot90(to_np(g), 2))
def rot270(g): return to_list(np.rot90(to_np(g), 3))
def flip_h(g): return to_list(np.fliplr(to_np(g)))
def flip_v(g): return to_list(np.flipud(to_np(g)))
def transpose(g): return to_list(np.transpose(to_np(g)))
# Color operations
def recolor(g, from_c, to_c):
a = to_np(g).copy()
a[a == from_c] = to_c
return to_list(a)
def swap_colors(g, c1, c2):
a = to_np(g).copy()
mask1, mask2 = a == c1, a == c2
a[mask1] = c2
a[mask2] = c1
return to_list(a)
# Object extraction
def get_objects(g, background=0):
"""Find connected components (objects) in the grid."""
from scipy import ndimage
a = to_np(g)
labeled, n = ndimage.label(a != background)
objects = []
for i in range(1, n + 1):
mask = labeled == i
rows, cols = np.where(mask)
objects.append({
'color': int(a[rows[0], cols[0]]),
'cells': list(zip(rows.tolist(), cols.tolist())),
'bbox': (rows.min(), cols.min(), rows.max(), cols.max()),
'size': int(mask.sum())
})
return objects
# Grid operations
def crop_to_content(g, background=0):
"""Remove padding rows/columns that are all background."""
a = to_np(g)
rows = np.any(a != background, axis=1)
cols = np.any(a != background, axis=0)
return to_list(a[rows][:, cols])
def tile(g, reps_h, reps_w):
"""Tile the grid reps_h × reps_w times."""
return to_list(np.tile(to_np(g), (reps_h, reps_w)))
def pad(g, top=1, bottom=1, left=1, right=1, fill=0):
return to_list(np.pad(to_np(g), ((top, bottom), (left, right)), constant_values=fill))
Scoring and Evaluation
def evaluate(prediction, ground_truth):
"""ARC scoring: exact match only (no partial credit)."""
return int(prediction == ground_truth)
def batch_evaluate(predictions, ground_truths):
"""Score a batch — returns fraction correct."""
return sum(evaluate(p, gt) for p, gt in zip(predictions, ground_truths)) / len(predictions)
ARC is binary: you either solve the task or you don't. Partial matches don't count. This makes ensembling different:
Ensembling for ARC: Generate multiple candidate outputs from different approaches and take the most common prediction (plurality vote). If all disagree, submit your best single approach.
What Did NOT Work (Save Time Here)
- Pure CNN/vision models without task-specific fine-tuning: ~4% accuracy (no better than random for most tasks)
- Large LLMs with standard prompting (GPT-4, Claude 2): 5–10% (reasoning chain helps; standard prompting doesn't)
- Overfitting to the public validation set: ARC has a private test set with harder tasks
- No test-time compute: Static models fail — the real wins come from test-time search or TTT
Why Enter Even If You Don't Win
- Partial progress = conference paper (NeurIPS, ICML, ICLR)
- Global recognition in the AI research community
- Proves genuine AI research capability to employers
- Previous solutions published here: arcprize.org/blog
Resources
| Resource | URL |
|---|---|
| Original ARC paper | arxiv.org/abs/1911.01547 |
| ARC Prize website | arcprize.org |
| 2024 winning solution (Ryan Greenblatt) | arcprize.org/blog/oai-o3-pub-breakthrough |
| MinARC — smallest ARC DSL solver | github.com/michaelhodel/arc-dsl |
| RE-ARC — data augmentation for ARC | github.com/michaelhodel/re-arc |
| ARC Dataset | github.com/fchollet/ARC-AGI |
| Kaggle competition page | kaggle.com/competitions/arc-prize-2025 |
| Top 2024 solutions | kaggle.com/competitions/arc-prize-2024/discussion |