Count in octal: Difference between revisions
→{{header|Groovy}}: new solution |
add link to Delphi for pascal |
||
Line 580: | Line 580: | ||
{{works with|PARI/GP|2.4.3 and above}} |
{{works with|PARI/GP|2.4.3 and above}} |
||
<lang parigp>n=0;while(1,printf("%o\n",n);n++)</lang> |
<lang parigp>n=0;while(1,printf("%o\n",n);n++)</lang> |
||
=={{header|Pascal}}== |
|||
See [[Count_in_octal#Delphi | Delphi]] |
|||
=={{header|Perl}}== |
=={{header|Perl}}== |
||
Line 589: | Line 592: | ||
my $i = 0; |
my $i = 0; |
||
printf "%o\n", $i++ while 1</lang> |
printf "%o\n", $i++ while 1</lang> |
||
=={{header|Perl 6}}== |
=={{header|Perl 6}}== |
||
<lang perl6>say .fmt: '%o' for 0 .. *;</lang> |
<lang perl6>say .fmt: '%o' for 0 .. *;</lang> |
Revision as of 22:18, 23 October 2011
![Task](http://static.miraheze.org/rosettacodewiki/thumb/b/ba/Rcode-button-task-crushed.png/64px-Rcode-button-task-crushed.png)
You are encouraged to solve this task according to the task description, using any language you may know.
The task is to produce a sequential count in octal, starting at zero, and using an increment of a one for each consecutive number. Each number should appear on a single line, and the program should count until terminated, or until the maximum value of the numeric type in use is reached.
- Integer sequence is a similar task without the use of octal numbers.
Ada
<lang Ada>with Ada.Text_IO;
procedure Octal is
package IIO is new Ada.Text_IO.Integer_IO(Integer);
begin
for I in 0 .. Integer'Last loop IIO.Put(I, Base => 8); Ada.Text_IO.New_Line; end loop;
end Octal;</lang> First few lines of Output:
8#0# 8#1# 8#2# 8#3# 8#4# 8#5# 8#6# 8#7# 8#10# 8#11# 8#12# 8#13# 8#14# 8#15# 8#16# 8#17# 8#20#
ALGOL 68
<lang algol68>#!/usr/local/bin/a68g --script #
INT oct width = (bits width-1) OVER 3 + 1; main: (
FOR i TO 17 # max int # DO printf(($"8r"8r n(oct width)dl$, BIN i)) OD
)</lang> Output:
8r00000000001 8r00000000002 8r00000000003 8r00000000004 8r00000000005 8r00000000006 8r00000000007 8r00000000010 8r00000000011 8r00000000012 8r00000000013 8r00000000014 8r00000000015 8r00000000016 8r00000000017 8r00000000020 8r00000000021
AutoHotkey
<lang AHK>DllCall("AllocConsole") Octal(int){ While int out := Mod(int, 8) . out, int := int//8 return out } Loop { FileAppend, % Octal(A_Index) "`n", CONOUT$ Sleep 200 }</lang>
AWK
The awk extraction and reporting language uses the underlying C library to provide support for the printf command. This enables us to use that function to output the counter value as octal:
<lang awk>BEGIN {
for (l = 0; l <= 2147483647; l++) { printf("%o\n", l); }
}</lang>
bc
<lang bc>obase = 8 /* Output base is octal. */ for (num = 0; 1; num++) num /* Loop forever, printing counter. */</lang>
The loop never stops at a maximum value, because bc uses arbitrary-precision integers.
C
<lang C>#include <stdio.h>
int main() {
unsigned int i = 0; do { printf("%o\n", i++); } while(i); return 0;
}</lang>
C#
<lang csharp>using System;
class Program {
static void Main() { var number = 0; do { Console.WriteLine(Convert.ToString(number, 8)); } while (++number > 0); }
}</lang>
C++
This prevents an infinite loop by counting until the counter overflows and produces a 0 again. This could also be done with a for or while loop, but you'd have to print 0 (or the last number) outside the loop.
<lang cpp>#include <iostream>
- include <iomanip>
using namespace std;
int main() {
unsigned i = 0; do { cout << setbase(8) << i << endl; ++i; } while(i != 0);
}</lang>
Common Lisp
<lang lisp>(loop for i from 0 do (format t "~o~%" i))</lang>
D
<lang d>import std.stdio;
void main() {
ubyte i; do writefln("%o", i++); while(i);
}</lang>
Delphi
<lang Delphi>program CountingInOctal;
{$APPTYPE CONSOLE}
uses SysUtils;
function DecToOct(aValue: Integer): string; var
lRemainder: Integer;
begin
Result := ; while aValue > 0 do begin lRemainder := aValue mod 8; Result := IntToStr(lRemainder) + Result; aValue := aValue div 8; end;
end;
var
i: Integer;
begin
for i := 1 to 20 do WriteLn(DecToOct(i));
end.</lang>
Euphoria
<lang euphoria>integer i i = 0 while 1 do
printf(1,"%o\n",i) i += 1
end while</lang>
Output:
... 6326 6327 6330 6331 6332 6333 6334 6335 6336 6337
Forth
Using INTS from Integer sequence#Forth <lang forth>: octal ( -- ) 8 base ! ; \ where unavailable
octal ints</lang>
Fortran
<lang fortran>program Octal
implicit none integer, parameter :: i64 = selected_int_kind(18) integer(i64) :: n = 0
! Will stop when n overflows from ! 9223372036854775807 to -92233720368547758078 (1000000000000000000000 octal)
do while(n >= 0) write(*, "(o0)") n n = n + 1 end do
end program</lang>
Go
<lang go>package main
import (
"fmt" "math"
)
func main() {
for i := int8(0); ; i++ { fmt.Printf("%o\n", i) if i == math.MaxInt8 { break } }
}</lang> Output:
0 1 2 3 4 5 6 7 10 11 12 ... 175 176 177
Note that to use a different integer type, code must be changed in two places. Go has no way to query a type for its maximum value. Example: <lang go>func main() {
for i := uint16(0); ; i++ { // type specified here fmt.Printf("%o\n", i) if i == math.MaxUint16 { // maximum value for type specified here break } }
}</lang> Output:
... 177775 177776 177777
Note also that if floating point types are used for the counter, loss of precision will prevent the program from from ever reaching the maximum value. If you stretch interpretation of the task wording "maximum value" to mean "maximum value of contiguous integers" then the following will work: <lang go>import "fmt"
func main() {
for i := 0.; ; { fmt.Printf("%o\n", int64(i)) /* uncomment to produce example output if i == 3 { i = float64(1<<53 - 4) // skip to near the end fmt.Println("...") } */ next := i + 1 if next == i { break } i = next }
}</lang> Output, with skip uncommented:
0 1 2 3 ... 377777777777777775 377777777777777776 377777777777777777 400000000000000000
Big integers have no maximum value, but the Go runtime will panic when memory allocation fails. The deferred recover here allows the program to terminate silently should the program run until this happens. <lang go>import (
"big" "fmt"
)
func main() {
defer func() { recover() }() one := big.NewInt(1) for i := big.NewInt(0); ; i.Add(i, one) { fmt.Printf("%o\n", i) }
}</lang> Output:
0 1 2 3 4 5 6 7 10 11 12 13 14 ...
Groovy
Size-limited solution: <lang groovy>println 'decimal octal' for (def i = 0; i <= Integer.MAX_VALUE; i++) {
printf ('%7d %#5o\n', i, i)
}</lang>
Unbounded solution: <lang groovy>println 'decimal octal' for (def i = 0g; true; i += 1g) {
printf ('%7d %#5o\n', i, i)
}</lang>
Output:
decimal octal 0 00 1 01 2 02 3 03 4 04 5 05 6 06 7 07 8 010 9 011 10 012 11 013 12 014 13 015 14 016 15 017 16 020 17 021 ...
Haskell
<lang haskell>import Numeric
main = mapM_ (print . flip showOct "") [1..]</lang>
Icon and Unicon
<lang unicon>link convert # To get exbase10 method
procedure main()
limit := 8r37777777777 every write(exbase10(seq(0)\limit, 8))
end</lang>
J
Solution: <lang J> disp=.[:smoutput [:,@:(":"0) 8&#.^:_1
(>:[disp)^:_ ]0</lang>
The full result is not displayable, by design. This could be considered a bug, but is an essential part of this task. Here's how it starts:
<lang j> (>:[disp)^:_ ]0 0 1 2 3 4 5 6 7 10 11 ...</lang>
Java
<lang java>public class Count{
public static void main(String[] args){ for(int i = 0;i <= Integer.MAX_VALUE;i++){ System.out.println(Integer.toOctalString(i)); //optionally use "Integer.toString(i, 8)" } }
}</lang>
Liberty BASIC
Terminate these ( essentially, practically) infinite loops by hitting <CTRL<BRK> <lang lb>
'the method used here uses the base-conversion from RC Non-decimal radices/Convert 'to terminate hit <CTRL<BRK>
global alphanum$ alphanum$ ="01234567"
i =0
while 1 print toBase$( 8, i) i =i +1 wend
end
function toBase$( base, number) ' Convert decimal variable to number string. maxIntegerBitSize =len( str$( number)) toBase$ ="" for i =10 to 1 step -1 remainder =number mod base toBase$ =mid$( alphanum$, remainder +1, 1) +toBase$ number =int( number /base) if number <1 then exit for next i toBase$ =right$( " " +toBase$, 10) end function
</lang> As suggested in LOGO, it is easy to work on a string representation too. <lang lb>
op$ = "00000000000000000000"
L =len( op$)
while 1
started =0
for i =1 to L m$ =mid$( op$, i, 1) if started =0 and m$ ="0" then print " "; else print m$;: started =1 next i print
for i =L to 1 step -1 p$ =mid$( op$, i, 1) if p$ =" " then v =0 else v =val( p$) incDigit = v +carry if i =L then incDigit =incDigit +1 if incDigit >=8 then replDigit =incDigit -8 carry =1 else replDigit =incDigit carry =0 end if op$ =left$( op$, i -1) +chr$( 48 +replDigit) +right$( op$, L -i) next i
wend
end </lang> Or use a recursive listing of permutations with the exception that the first digit is not 0 (unless listing single-digit numbers). For each digit-place, list numbers with 0-7 in the next digit-place.
<lang lb> i = 0
while 1
call CountOctal 0, i, i > 0 i = i + 1
wend
sub CountOctal value, depth, startValue
value = value * 10 for i = startValue to 7 if depth > 0 then call CountOctal value + i, depth - 1, 0 else print value + i end if next i
end sub </lang>
Logo
No built-in octal-formatting, so it's probably more efficient to just manually increment a string than to increment a number and then convert the whole thing to octal every time we print. This also lets us keep counting as long as we have room for the string.
<lang logo>to increment_octal :n
ifelse [empty? :n] [ output 1 ] [ local "last make "last last :n local "butlast make "butlast butlast :n make "last sum :last 1 ifelse [:last < 8] [ output word :butlast :last ] [ output word (increment_octal :butlast) 0 ] ]
end
make "oct 0 while ["true] [
print :oct make "oct increment_octal :oct
]</lang>
Lua
<lang lua>for l=1,2147483647 do
print(string.format("%o",l))
end</lang>
Mathematica
<lang Mathematica>x=0; While[True,Print[BaseForm[x,8];x++]</lang>
Modula-2
<lang modula2>MODULE octal;
IMPORT InOut;
VAR num : CARDINAL;
BEGIN
num := 0; REPEAT InOut.WriteOct (num, 12); InOut.WriteLn; INC (num) UNTIL num = 0
END octal.</lang>
OCaml
<lang ocaml>let () =
for i = 0 to max_int do Printf.printf "%o\n" i done</lang>
Output:
0 1 2 3 4 5 6 7 10 11 12 ... 7777777775 7777777776 7777777777
PARI/GP
Both versions will count essentially forever; the universe will succumb to proton decay long before the counter rolls over even in the 32-bit version.
Manual: <lang parigp>oct(n)=n=binary(n);if(#n%3,n=concat([[0,0],[0]][#n%3],n));forstep(i=1,#n,3,print1(4*n[i]+2*n[i+1]+n[i+2]));print; n=0;while(1,oct(n);n++)</lang>
Automatic:
<lang parigp>n=0;while(1,printf("%o\n",n);n++)</lang>
Pascal
See Delphi
Perl
Since task says "system register", I take it to mean "no larger than machine native integer limit": <lang perl>use POSIX; printf "%o\n", $_ for (0 .. POSIX::UINT_MAX);</lang> Otherwise: <lang perl>use bigint; my $i = 0; printf "%o\n", $i++ while 1</lang>
Perl 6
<lang perl6>say .fmt: '%o' for 0 .. *;</lang>
PicoLisp
<lang PicoLisp>(for (N 0 T (inc N))
(prinl (oct N)) )</lang>
Python
<lang Python>import sys for n in xrange(sys.maxint):
print oct(n)</lang>
Retro
Integers in Retro are signed.
<lang Retro>octal 17777777777 [ putn cr ] iter</lang>
Scala
<lang scala>0 until Int.MaxValue foreach(i=> println(i toOctalString))</lang>
Seed7
<lang seed7>$ include "seed7_05.s7i";
const proc: main is func
local var integer: i is 0; begin repeat writeln(str(i, 8)); incr(i); until FALSE; end func;</lang>
Ruby
From the documentation: "A Fixnum holds Integer values that can be represented in a native machine word (minus 1 bit). If any operation on a Fixnum exceeds this range, the value is automatically converted to a Bignum."
<lang ruby>n = 0 loop do
puts "%o" % n n = n + 1
end</lang>
Tcl
<lang tcl>package require Tcl 8.5; # arbitrary precision integers; we can count until we run out of memory! while 1 {
puts [format "%llo" [incr counter]]
}</lang>
UNIX Shell
We use the bc calculator to increment our octal counter:
<lang sh>#!/bin/sh num=0 while true; do
echo $num num=`echo "obase=8;ibase=8;$num+1"|bc`
done</lang>
If the shell has $(( ... ))
arithmetic, then we can increment a decimal counter and use printf(1)
to print it in octal. Our loop stops when the counter overflows to negative.
<lang sh>num=0 while test 0 -le $num; do
printf '%o\n' $num num=$((num + 1))
done</lang>
- Programming Tasks
- Solutions by Programming Task
- Ada
- ALGOL 68
- AutoHotkey
- AWK
- Bc
- C
- C sharp
- C++
- Common Lisp
- D
- Delphi
- Euphoria
- Forth
- Fortran
- Go
- Groovy
- Haskell
- Icon
- Unicon
- J
- Java
- Liberty BASIC
- Logo
- Lua
- Mathematica
- Modula-2
- OCaml
- PARI/GP
- Pascal
- Perl
- Perl 6
- PicoLisp
- Python
- Retro
- Scala
- Seed7
- Ruby
- Tcl
- UNIX Shell
- Basic language learning
- Radices
- Iteration