# Count up forever

Write a program that counts up forever, starting from one.

Rules:

• Your program must log to STDOUT or an acceptable alternative, if STDOUT is not available.
• Your program must be a full, runnable program, and not a function or snippet.
• Your program must output each number with a separating character in between (a newline, space, tab or comma), but this must be consistent for all numbers.
• You may print the numbers in decimal, in unary or in base 256 where each digit is represented by a byte value.
• Your program must count at least as far as 2128 (inclusive) without problems and without running out of memory on a reasonable desktop PC. In particular, this means if you're using unary, you cannot store a unary representation of the current number in memory.
• Unlike our usual rules, feel free to use a language (or language version) even if it's newer than this challenge. Languages specifically written to submit a 0-byte answer to this challenge are fair game but not particularly interesting.

Note that there must be an interpreter so the submission can be tested. It is allowed (and even encouraged) to write this interpreter yourself for a previously unimplemented language.

• This is not about finding the language with the shortest solution for this (there are some where the empty program does the trick) - this is about finding the shortest solution in every language. Therefore, no answer will be marked as accepted.

### Catalogue

The Stack Snippet at the bottom of this post generates the catalogue from the answers a) as a list of shortest solution per language and b) as an overall leaderboard.

## Language Name, N bytes


where N is the size of your submission. If you improve your score, you can keep old scores in the headline, by striking them through. For instance:

## Ruby, <s>104</s> <s>101</s> 96 bytes


If there you want to include multiple numbers in your header (e.g. because your score is the sum of two files or you want to list interpreter flag penalties separately), make sure that the actual score is the last number in the header:

## Perl, 43 + 2 (-p flag) = 45 bytes


You can also make the language name a link which will then show up in the snippet:

## [><>](http://esolangs.org/wiki/Fish), 121 bytes


<style>body { text-align: left !important} #answer-list { padding: 10px; width: 290px; float: left; } #language-list { padding: 10px; width: 290px; float: left; } table thead { font-weight: bold; } table td { padding: 5px; }</style><script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="language-list"> <h2>Shortest Solution by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr> </thead> <tbody id="languages"> </tbody> </table> </div> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr> </thead> <tbody id="answers"> </tbody> </table> </div> <table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table><script>var QUESTION_ID = 63834; var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe"; var COMMENT_FILTER = "!)Q2B_A2kjfAiU78X(md6BoYk"; var OVERRIDE_USER = 39069; var answers = [], answers_hash, answer_ids, answer_page = 1, more_answers = true, comment_page; function answersUrl(index) { return "//api.stackexchange.com/2.2/questions/" + QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER; } function commentUrl(index, answers) { return "//api.stackexchange.com/2.2/answers/" + answers.join(';') + "/comments?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + COMMENT_FILTER; } function getAnswers() { jQuery.ajax({ url: answersUrl(answer_page++), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { answers.push.apply(answers, data.items); answers_hash = []; answer_ids = []; data.items.forEach(function(a) { a.comments = []; var id = +a.share_link.match(/\d+/); answer_ids.push(id); answers_hash[id] = a; }); if (!data.has_more) more_answers = false; comment_page = 1; getComments(); } }); } function getComments() { jQuery.ajax({ url: commentUrl(comment_page++, answer_ids), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { data.items.forEach(function(c) { if (c.owner.user_id === OVERRIDE_USER) answers_hash[c.post_id].comments.push(c); }); if (data.has_more) getComments(); else if (more_answers) getAnswers(); else process(); } }); } getAnswers(); var SCORE_REG = /<h\d>\s*([^\n,<]*(?:<(?:[^\n>]*>[^\n<]*<\/[^\n>]*>)[^\n,<]*)*),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/; var OVERRIDE_REG = /^Override\s*header:\s*/i; function getAuthorName(a) { return a.owner.display_name; } function process() { var valid = []; answers.forEach(function(a) { var body = a.body; a.comments.forEach(function(c) { if(OVERRIDE_REG.test(c.body)) body = '<h1>' + c.body.replace(OVERRIDE_REG, '') + '</h1>'; }); var match = body.match(SCORE_REG); if (match) valid.push({ user: getAuthorName(a), size: +match[2], language: match[1], link: a.share_link, }); else console.log(body); }); valid.sort(function (a, b) { var aB = a.size, bB = b.size; return aB - bB }); var languages = {}; var place = 1; var lastSize = null; var lastPlace = 1; valid.forEach(function (a) { if (a.size != lastSize) lastPlace = place; lastSize = a.size; ++place; var answer = jQuery("#answer-template").html(); answer = answer.replace("{{PLACE}}", lastPlace + ".") .replace("{{NAME}}", a.user) .replace("{{LANGUAGE}}", a.language) .replace("{{SIZE}}", a.size) .replace("{{LINK}}", a.link); answer = jQuery(answer); jQuery("#answers").append(answer); var lang = a.language; lang = jQuery('<a>'+lang+'</a>').text(); languages[lang] = languages[lang] || {lang: a.language, lang_raw: lang.toLowerCase(42), user: a.user, size: a.size, link: a.link}; }); var langs = []; for (var lang in languages) if (languages.hasOwnProperty(lang)) langs.push(languages[lang]); langs.sort(function (a, b) { if (a.lang_raw > b.lang_raw) return 1; if (a.lang_raw < b.lang_raw) return -1; return 0; }); for (var i = 0; i < langs.length; ++i) { var language = jQuery("#language-template").html(); var lang = langs[i]; language = language.replace("{{LANGUAGE}}", lang.lang) .replace("{{NAME}}", lang.user) .replace("{{SIZE}}", lang.size) .replace("{{LINK}}", lang.link); language = jQuery(language); jQuery("#languages").append(language); } }</script>

• I'm not sure how to combine must output each number with a separating character in between with may print the numbers [...] in base 256. Nov 14 '15 at 14:25
• For future challenges, may I recommend the sandbox such that all these details could be sorted out before people start posting answers? :) Nov 14 '15 at 14:32
• @IlmariKaronen I interpret that as being a memory limit, not a time limit. possibly a time limit on per-increment. just set the counter to 2**128-10 and see how long it takes to take those last ten steps. Nov 15 '15 at 7:41
• Can we have leading zeroes in the output? Nov 15 '15 at 11:43
• Ugh!!! I have an answer for TI-89 (56b), but I can't post b/c I'm new to the site and don't have Rep 10+! Nov 15 '15 at 20:45

# APL (Dyalog), 9 bytes

{∇1+⎕←⍵}1


Try it online!

# Aceto, 5 bytes

IkpnO


### Explanation:

Aceto follows a Hilbert Curve on a square program. If the program is not square, spaces are added to the top and right. (spaces do nothing) I

I - pops a value, increments it, and pushes it back on
k - makes the stack 'sticky', meaning that when popping a number, instead of removing the value it copies it
p - prints the top value
n - prints a newline
O - Returns the program back to the beginning


Also, can anyone explain to me why 'k' is needed? Shouldn't 'I' do the job just fine? When I omit 'k', it prints out lines and lines of '1's.

Try it online!

• Because p pops the value off the stack. Dec 12 '17 at 13:55
• Glad to see people using it! Dec 12 '17 at 18:28

# Alumin, 6 bytes

hqhanp


Alumin is a new language, made by @Conor O'Brien.

Explanation:

hqhanp
h      # Push 1
q   p # Begin/end loop
ha   # Push 1, add top two stack elements together (increments top)
n  # Prints the top of stack as a number


## Wumpus, 5 bytes

)=O
N


Try it online!

### Explanation

The program runs )=ON in an infinite loop (see the "cat" answer for why that is).

)   Increment the top of the stack. Initially, this turns an implicit zero
into an explicit one.
=   Duplicate.
O   Print as a decimal integer.
N   Print a linefeed.


# c + GMP library, 90

Score includes +4 for passing -lgmp to the compiler. You'll need GMP installed to build and run this.

Here's how we do arbitrary precision in c:

#include<gmp.h>


Compile with:

cc forever.c -o forever -lgmp

• I don't understand... what's wrong with double long unsigned long i; for(i=0;1>0;i++){printf("v%\n",i)} ?
– cat
Dec 29 '15 at 16:04
• @cat I'm not familiar with the double long unsigned long type - which compiler are you using? GCC doesn't like it. Dec 29 '15 at 16:55
• GCC compiled it for me but I didn't realise it segfaulted, never mind ¯_(ツ)_/¯
– cat
Dec 29 '15 at 17:04
• You can remove first include and replace stdout with 1. Feb 13 '18 at 17:37
• @KrzysztofSzewczyk How would that work? stdout the stream associated with the STDOUT fd (commonly numerical 1), but is itself a FILE * pointer. mpz_out_str() needs a FILE * and not an int 1. Feb 13 '18 at 19:15

# Brachylog, 4 bytes

ℕ₁ẉᶠ


## Explanation

ℕ₁      --  Get a integer which is at least 1
ẉᶠ    --      and print all possible values (ordered from 1 to inf)


Try it online!

# Deoxyribose, 35 29 bytes

ATGCCAGAAAAACATAACGGTTTAAATCC

Explanation:

ATG
CCA     (*) Divide (null/null yields 1)
GAA     Dupe
AAA     Pop
CAT     Push
AAC     1
GGT     Move
TTA     Plus
AAT     Loop
CC      *


I feel like this can get shorter.

Edit: Saved 6 bytes by making creative use of division of two empty stacks.

# CJam, 7 bytes

X{_p)}h


Really feels like there should be a way to take off one or two bytes, but oh well.

X           Initialize the stack with 1
{          Begin loop
_p        Duplicate top of stack and print
}h     Loop while top of stack is truthy (non-consuming)


# Arn, 4 bytes

ëçJx


# Explanation

Unpacked: [1{+1 A sequence in arn is defined within [..]. A sequence is made up of hard-coded digits, a block determining how future entries are calculated, and (possibly) an array pointing towards the length of the sequence.

In this case, it is simply defining a sequence where the first entry is 1, and every future entry is 1 higher. Because of Arn's implied closings, the final }] can be removed. Arn uses BigInts.

# 05AB1E, 3 bytes

∞€,


Try it online!

tio.run truncates the input, but in theory this would count forever. Also on tio.run, there's a [ at the beginning which I don't know how to get rid of.

## Explanation

∞    # push infinite list ([1, 2, …, ∞])
€   # pop a; apply next command for each in a
,  # pop a; print(a) (with newline)

• You can get rid of the [ in the output by using the argument-flag --no-lazy. Has something to do with printing within a map with lazy-loading in Elixir, where 05AB1E is built in. But the --no-lazy will disable this lazy-loading, so you won't have this in the output. :) Jan 3 '20 at 8:54
• @KevinCruijssen oh, thanks! does it still count with the [? Jan 4 '20 at 23:24

# JavaScript (ES6), 22 21 bytes

for(i=0n;;)alert(++i)


This uses BigInts, which can go to high integers without losing accuracy. Per earlier submissions, I'm assuming that using alert, with its automatic separation between popups, means that outputting an extra character is not necessary.

• You can save a byte by doing the ++ in the alert call, so it becomes: for(i=0n;;)alert(++i) Mar 16 at 20:11
• @Luca_Scorpion Done, thanks. Apr 8 at 0:40

# ABC, 4 bytes

acal


a increments the accumulator at start, c outputs it, then a increments again, and l loops to beginning.

Try it online!

# PHP, 31 bytes

<?for(;;)echo$i=bcadd($i,1),~õ;


I assume default settings, as they are without an .ini (you may disable your local .ini with the -n option).

Sample Usage

\$ php -n countup.php

• You can save 2 bytes by saying they should run it using php -r '...', Nov 15 '15 at 2:24
• @Kenney r'' should cost three. It also seems to violate the constraint, "Your program must be a full, runnable program, and not a function or snippet." Nov 15 '15 at 8:07
• As far as I am concerned, <? is at the templating level, and your code only really starts at for. It doesn't really say how the program is to be fed into the interpreter. But you're probably right! Nov 15 '15 at 15:50
• @Kenney the problem with that interpretation, is solutions that have anything outside the code tags, and also the use of <?=, e.g. codegolf.stackexchange.com/a/12569 Nov 16 '15 at 0:53
• @DougMcLean bcadd is necessary, because when the value exceeds PHP_MAX_INT, or the exactly representable floating point range (2^56), whichever comes first, it would fail to display an integer. Nov 18 '15 at 2:29

# Julia, 35 bytes

i=big(0);while 1>0 println(i+=1)end


This uses Julia's GMP-based arbitrary precision integers.

# C++, 104 bytes

#include<cstdio>
int a,c[50]={-38};int main(){for(a=49;++c[a]>9;c[a--]=0);for(b:c)putchar(b+48);main();}


A translation of my C answer. This uses a terse range-based for loop, which is a C++1z feature briefly added to some compilers but later voted out of C++17. clang++ 3.5.2 compiles my code fine, but I'm not sure if it counts as "C++". I can change it to for(int b:c) if it's deemed invalid.

# Go, 10499 95 bytes

package main
import."math/big"
func main(){a:=&Int{}


Not terribly golfed yet, I might take the time to refine it later.

Note that this will not run on the playground since it runs forever.

## VB.NET, 113 99 bytes

Well, pretty straightforward for .NET Framework 4. Needs a reference to System.Numeric.dll:

Module m
Sub Main
Dim i As Numerics.BigInteger
do
i+=1
Console.WriteLine(i)
loop
end sub
End Module


Not exactly original, but hey, even not that much longer than the C# answer ;-)

Thanks Berend for making me dig a little deeper into the compilation process, saving 14 bytes in the process.

• You can remove System. (twice), for an extra 14 bytes. Nov 16 '15 at 10:28
• @Berend No I can't. It may work when compiled in Visual Studio due to automatic namespace imports, but I consider that cheating ;-) Here I would need to add Imports System to the code, which adds the 14 bytes right back in
– Jens
Nov 16 '15 at 12:51
• How do you compile then? Both Visual Studio (2013) and MSBuild don't care about the missing system. Nov 16 '15 at 12:59
• I plug the code above directly into the codedom compiler. Figured it is the most "raw" form of compiling vb.net. Sounds like a meta discussion in all honesty :)
– Jens
Nov 16 '15 at 13:05
• Maybe a silly question, but as requirements are at least 2^128 ; does BigInteger really required ? if not, you could gain an extra 22 bytes by declaring i with Dim i# (using double identifier type character) Nov 18 '15 at 2:49

# Python 2, 24 bytes

Same method as the Python 3 answer.

i=1
while 1:print i;i+=1


# Mouse-2002, 17 bytes

aa:(a.!"!"a.b+a:)


It seems there's a flaw in the interpreter which messes up using the stack for while loops, I dunno, so we use a variable instead.

# Forth, 67 71 bytes

Forth doesn't have a builtin word for exponentiation, so we need to define one, because loops in Forth, which are frowned upon, need clearly defined bounds.

According to the language's original spec, this will segfault or run out of memory when it gets to 32,767 but that's not the case for mighty gforth! Instead, this runs out of memory whenever it's unable to continue storing numbers, as the stack's allocation is not dynamic like the heap's is, and do's operands (the limit and index) are put on the heap, not the stack, else they would interfere with the stack.

Essentially, it will stop at the same point every other answer here will.

The loop construct normally looks like 10 0 do ... loop where 10 is the limit and 0 is the index, i.e starting point.

In this example, we need to add one to the upper bound before counting there.

Edit: apparently do is a "compile-only" word, and it can only be found inside macro definitions.

: p over swap 1 ?do over * loop nip ;
: c 2 128 p 1 + 0 do i . loop ;
c


## Matlab, 95 bytes

   for n=1:128;sym(sym(2^n)-1),for i=1:n sym(2^n+sym(sum(power(2,nchoosek(1:n,i)-1),2)-1)),end,end


• This program can count over 2^128 just try with these parameters if you have doubts.

for n=200:200;sym(sym(2^n)-1),for i=1:n sym(2^n+sym(sum(power(2,nchoosek(1:n,i)-1),2)-1)),end,end

• This can be golfed more if I could figure out a way to combine two loops in one single executive loop, thats because the code skips one integer per 2^k the case of one loop.

# Y, 9 bytes

0C:' gghX


Simple three-link program. 0C initializes the stack with a 0 and moves to the next link, : duplicates the current value ' pushes a space for a separator, gg prints twice, and h increments it. X is an unconditional wrap-around, so we go to the beginning of the link. Try it here!

# D, 56 57 bytes

import std.stdio;void main(){for(real i;;writeln(i++)){}}


Pretty straightforward. D != Python.

The shortest while-loop version I can think of is longer, at 59 bytes:

import std.stdio;void main(){real i;while(++i){writeln(i);}}


# ForceLang, 35 bytes

label l
io.writeln set a 1+a
goto l


ForceLang uses BigRationals as the default number type.

Also, in the latest revision, 1+nil yields 1, which is what allows this version to work (previously it would have yielded the string "1<nil>".)

nil+1, however, still triggers a null pointer exception.

## UberGenes, 33 30 bytes

I'm giving two versions here, just to demonstrate the lang. Integers and memory in UberGenes are bounded only by computer memory, so both versions meet the "forever" requirement. This first one is for score:

=ii+a1=pa=q5=bi-p1=oQ:bp=oI=i0


It prints numbers in unary separated by '=' characters. Explanation (indents indicate a loop start):

=ii                                  NOP
+a1                               INC a (initially 0)
=pa                               COPY a INTO p
=q5                               SET q=5 so it points to '1'
=bi                               SET b to this location (15)
-p1                            DEC p
=oQ                            OUTPUT '1'
=oI                               OUTPUT the contents of this location ('=')


The second version is more interesting (66 bytes):

=ii+a1=l0-l2=pa=z8*z6=t5*t2=bi=qp%qt+qz=Lq-l1/pt:bp=bi=oL+l1:bL=i0


It prints the numbers in decimal separated by NULLs.

How it works (indents indicate a loop start):

=ii                                  NOP
+a1                               INC a (initially 0)
=l0-l2                            SET l=-2
=pa                               COPY a INTO p
=z8*z6                            SET z=48 ('0')
=t5*t2                            SET t=10
=bi                               SET b to this location (27)
=qp                            COPY p INTO q
%qt                            MOD q BY 10
+qz                            ADD 48 to q (turn it into character)
=Lq                            PUT q AT MEM[l]
-l1                            DEC l
/pt                            DIVIDE p by 10
:bp                            JUMP back to b's location if p>0
=bi                               SET b to this location (51)
=oL                            OUTPUT the character in MEM[l]
+l1                            INC l
:bL                            JUMP back to b's location if MEM[l]>0
=i0                               JUMP back to beginning of main loop


# Molecule, 7 bytes (6 chars)

0(1+~)


Explanation:

0(1+~)
(     begin while statement
~  print
) goto the beginning of while statement.


## AutoHotKey, 34 bytes

Golfed and Ungolfed is the same.

### Golfed:

c:=0
Loop {
c:=c+1
tooltip %c%
}


### Ungolfed:

c:=0
Loop {
c:=c+1
tooltip %c%
}

• not that it's a problem, but if golfed and ungolfed are the same why would you bother with both of them Apr 25 '16 at 15:12
• also does ahk really enforce indentation like that? it's been a long time since i used it, i don't remember Apr 25 '16 at 15:13
• It does, and the golfed and unfolded are just a universal format I use (I save each of my entries). Apr 25 '16 at 17:05

# Node.js + Big.js, 63 bytes

Use npm install big.js before running.

c=new require("big.js")(0);while(1)console.log(c+""),c=c.add(1)


Simple enough, and has arbitrary precision. Each number is seperated by newlines.

# Tellurium, 6 bytes

[i|+^]


Pretty simple.

The program adds one to the selected cell (+), and then outputs it (^). Using i as a loop's value makes it run the code forever.

• Does tellurium have arbitrary length integers? May 20 '16 at 14:13
• @vrwim I'm not sure, I think it counts up to Python's maxint, which is 2147483647.
– m654
May 20 '16 at 15:33

## Lua, 27 Bytes

i=1::a::i=i+1print(i)goto a