# Square but not cube

You are encouraged to solve this task according to the task description, using any language you may know.

Show the first   30   positive integers which are squares but not cubes of such integers.

Optionally, show also the first   3   positive integers which are both squares and cubes,   and mark them as such.

## 11l

Translation of: C
```V n = 1
V count = 0

L count < 30
V sq = n * n
V cr = Int(sq ^ (1/3) + 1e-6)
I cr * cr * cr != sq
count++
print(sq)
E
print(sq‘ is square and cube’)
n++```

## 8086 Assembly

```	cpu	8086
org	100h
section	.text
mov	si,1		; Square counter
mov	di,si		; Current square
mov	bp,si		; Cube counter
mov	bx,si		; Current cube
xor	cx,cx		; Counter
loop:	cmp	di,bx		; Square > cube?
jbe	check
inc	bp		; Calculate next cube
mov	ax,bp
mul	bp
mul	bp
mov	bx,ax
jmp	loop
check:	je	next		; Square != cube?
inc	cx		; Then count it
mov	ax,di
call	print		; Print it
next:	inc	si		; Next square
mov	ax,si
mul	si
mov	di,ax
cmp	cx,30		; Done yet?
jb	loop
ret
print:	push	bx		; Print AX - save registers
push	cx
mov	cx,10
mov	bx,num		; End of number buffer
dgt:	xor	dx,dx		; Extract digit
div	cx
dec	bx		; Store digit
mov	[bx],dl
test	ax,ax		; More digits?
jnz	dgt		; If so, go get them
mov	dx,bx		; If not, print string
mov	ah,9
int	21h
pop	cx		; Restore registers
pop	bx
ret
section	.data
db	'*****'		; Placeholder for number
num:	db	' \$'
```
Output:
`4 9 16 25 36 49 81 100 121 144 169 196 225 256 289 324 361 400 441 484 529 576 625 676 784 841 900 961 1024 1089 `

## Action!

```BYTE FUNC IsCube(INT n)
INT i,c

i=1
DO
c=i*i*i
IF c=n THEN
RETURN (1)
FI
i==+1
UNTIL c>n
OD
RETURN (0)

PROC Main()
INT n,sq,count

PrintE("First 30 squares but not cubes:")
n=1 count=0
WHILE count<30
DO
sq=n*n
IF IsCube(sq)=0 THEN
PrintF("%I ",sq)
count==+1
FI
n==+1
OD

PutE() PutE()
PrintE("First 3 squares and cubes:")
n=1 count=0
WHILE count<3
DO
sq=n*n
IF IsCube(sq) THEN
PrintF("%I ",sq)
count==+1
FI
n==+1
OD
RETURN```
Output:
```First 30 squares but not cubes:
4 9 16 25 36 49 81 100 121 144 169 196 225 256 289 324 361 400 441 484 529 576 625 676 784 841 900 961 1024 1089

First 3 squares and cubes:
1 64 729
```

```with Ada.Text_IO;

procedure Square_But_Not_Cube is

function Is_Cube (N : in Positive) return Boolean is
Cube : Positive;
begin
for I in Positive loop
Cube := I**3;
if Cube = N    then  return True;
elsif Cube > N then  return False;
end if;
end loop;
raise Program_Error;
end Is_Cube;

procedure Show (Limit : in Natural) is
Count  : Natural := 0;
Square : Natural;
begin
for N in Positive loop
Square := N**2;
if not Is_Cube (Square) then
Count := Count + 1;
Put (Square'Image);
exit when Count = Limit;
end if;
end loop;
New_Line;
end Show;

begin
Show (Limit => 30);
end Square_But_Not_Cube;
```
Output:
``` 4 9 16 25 36 49 81 100 121 144 169 196 225 256 289 324 361 400 441 484 529 576 625 676 784 841 900 961 1024 1089
```

## ALGOL 68

Avoids computing cube roots.

```BEGIN
# list the first 30 numbers that are squares but not cubes and also #
# show the numbers that are both squares and cubes                  #
INT count := 0;
INT c     := 1;
INT c3    := 1;
FOR s WHILE count < 30 DO
INT sq = s * s;
WHILE c3 < sq DO
c  +:= 1;
c3  := c * c * c
OD;
print( ( whole( sq, -5 ) ) );
IF c3 = sq THEN
# the square is also a cube                                 #
print( ( " is also the cube of ", whole( c, -5 ) ) )
ELSE
# square only                                               #
count +:= 1
FI;
print( ( newline ) )
OD
END```
Output:
```    1 is also the cube of     1
4
9
16
25
36
49
64 is also the cube of     4
81
100
121
144
169
196
225
256
289
324
361
400
441
484
529
576
625
676
729 is also the cube of     9
784
841
900
961
1024
1089
```

## ALGOL-M

```begin
integer function square(x);
integer x;
square := x * x;

integer function cube(x);
integer x;
cube := x * x * x;

integer c, s, seen;
seen := 0;
while seen < 30 do
begin
while cube(c) < square(s) do
c := c + 1;
if square(s) <> cube(c) then
begin
if (seen/5 <> (seen-1)/5) then write("");
writeon(square(s));
seen := seen + 1;
end;
s := s + 1;
end;
end```
Output:
```     4     9    16    25    36
49    81   100   121   144
169   196   225   256   289
324   361   400   441   484
529   576   625   676   784
841   900   961  1024  1089```

## APL

```(×⍨∘⍳ ~ (⊢×⊢×⊢)∘⍳) 33
```
Output:
`4 9 16 25 36 49 81 100 121 144 169 196 225 256 289 324 361 400 441 484 529 576 625 676 784 841 900 961 1024 1089`

## AppleScript

```on run
script listing
on |λ|(x)
set sqr to x * x
set strSquare to sqr as text

if isCube(sqr) then
strSquare & " (also cube)"
else
strSquare
end if
end |λ|
end script

unlines(map(listing, ¬
enumFromTo(1, 33)))
end run

-- isCube :: Int -> Bool
on isCube(x)
x = (round (x ^ (1 / 3))) ^ 3
end isCube

-- GENERIC FUNCTIONS -------------------------------------------------

-- enumFromTo :: Int -> Int -> [Int]
on enumFromTo(m, n)
if m ≤ n then
set lst to {}
repeat with i from m to n
set end of lst to i
end repeat
return lst
else
return {}
end if
end enumFromTo

-- map :: (a -> b) -> [a] -> [b]
on map(f, xs)
tell mReturn(f)
set lng to length of xs
set lst to {}
repeat with i from 1 to lng
set end of lst to |λ|(item i of xs, i, xs)
end repeat
return lst
end tell
end map

-- Lift 2nd class handler function into 1st class script wrapper
-- mReturn :: First-class m => (a -> b) -> m (a -> b)
on mReturn(f)
if class of f is script then
f
else
script
property |λ| : f
end script
end if
end mReturn

-- unlines :: [String] -> String
on unlines(xs)
set {dlm, my text item delimiters} to ¬
{my text item delimiters, linefeed}
set str to xs as text
set my text item delimiters to dlm
str
end unlines
```
Output:
```1 (also cube)
4
9
16
25
36
49
64 (also cube)
81
100
121
144
169
196
225
256
289
324
361
400
441
484
529
576
625
676
729 (also cube)
784
841
900
961
1024
1089```

## Arturo

```squares: map 1..100 => [&^2]
cubes: map 1..100 => [&^3]

print "Square but not cube:"
print first.n:30 select squares => [not? in? & cubes]
print "Square and cube:"
print first.n:3 select squares => [in? & cubes]
```
Output:
```Square but not cube:
4 9 16 25 36 49 81 100 121 144 169 196 225 256 289 324 361 400 441 484 529 576 625 676 784 841 900 961 1024 1089
Square and cube:
1 64 729```

## AutoHotkey

```cube := [], counter:=0
while counter<30 {
cube[(n := A_Index)**3] := true
if !cube[n**2]
counter++, res .= n**2 " "
else
res .= "[" n**2 "] "
}
MsgBox % Trim(res, " ")
```

square and cube numbers are denoted by square brackets:

Outputs:
` 4 9 16 25 36 49  81 100 121 144 169 196 225 256 289 324 361 400 441 484 529 576 625 676  784 841 900 961 1024 1089 `

## AWK

```# syntax: GAWK -f SQUARE_BUT_NOT_CUBE.AWK
BEGIN {
while (n < 30) {
sqpow = ++square ^ 2
if (is_cube(sqpow) == 0) {
n++
printf("%4d\n",sqpow)
}
else {
printf("%4d is square and cube\n",sqpow)
}
}
exit(0)
}
function is_cube(x,  i) {
for (i=1; i<=x; i++) {
if (i ^ 3 == x) {
return(1)
}
}
return(0)
}
```
Output:
```   1 is square and cube
4
9
16
25
36
49
64 is square and cube
81
100
121
144
169
196
225
256
289
324
361
400
441
484
529
576
625
676
729 is square and cube
784
841
900
961
1024
1089
```

## BASIC

```10 DEFINT C,S,Q,R,N: C=1: S=1: Q=1: R=1: N=1
20 IF N>30 THEN END
30 S=Q*Q
40 IF S>C THEN R=R+1: C=R*R*R: GOTO 40
50 IF S<C THEN N=N+1: PRINT S;
60 Q=Q+1
70 GOTO 20
```
Output:
``` 4  9  16  25  36  49  81  100  121  144  169  196  225  256  289  324  361
400  441  484  529  576  625  676  784  841  900  961  1024  1089```

### BASIC256

```cont = 0 : n = 2
do
if is_pow(n, 2) and not is_pow(n, 3) then
print n; " ";
cont += 1
end if
n += 1
until cont = 30
print

cont = 0 : n = 2
do
if is_pow(n, 2) and is_pow(n, 3) then
print n; " ";
cont += 1
end if
n += 1
until cont = 3
end

function is_pow(n, q)
#tests if the number n is the q'th power of some other integer
r = int(n^(1.0/q))
for i = r-1 to r+1   #there might be a bit of floating point nonsense, so test adjacent numbers also
if i^q = n then return true
next i
return false
end function```
Output:
`Same as FreeBASIC entry.`

### Commodore BASIC

Translation of: BASIC
```100 DIM SC(2): SC = 0: REM REMEMBER SQUARE CUBES
110 PRINT "SQUARES BUT NOT CUBES:"
120  N = 0: REM NUMBER OF NON-CUBE SQUARES FOUND
130 SR = 1: REM CURRENT SQUARE ROOT
140 CR = 1: CU = 1: REM CURRENT CUBE ROOT AND CUBE
150 REM BEGIN LOOP
160 : IF N >= 30 THEN 230
170 : SQ = SR * SR
180 : IF SQ > CU THEN CR = CR + 1: CU = CR*CR*CR: GOTO 180
190 : IF SQ = CU THEN SC(SC) = SQ: SC = SC + 1
200 : IF SQ < CU THEN N = N + 1:PRINT SQ,
210 : SR = SR + 1
220 GOTO 160: REM END LOOP
230 PRINT: PRINT
240 PRINT "BOTH SQUARES AND CUBES:"
250 FOR I=0 TO SC-1: PRINT SC(I),: NEXT I
260 PRINT
```
Works with: Commodore BASIC version 3.5,7.0

This version uses the later BASIC DO ... LOOP structure:

```100 DIM SC(2): SC = 0: REM REMEMBER SQUARE CUBES
110 PRINT "SQUARES BUT NOT CUBES:"
120  N = 0: REM NUMBER OF NON-CUBE SQUARES FOUND
130 SR = 1: REM CURRENT SQUARE ROOT
140 CR = 1: CU = 1: REM CURRENT CUBE ROOT AND CUBE
150 DO WHILE N < 30
170 : SQ = SR * SR
180 : DO WHILE SQ > CU: CR = CR + 1: CU = CR*CR*CR: LOOP
190 : IF SQ = CU THEN SC(SC) = SQ: SC = SC + 1
200 : IF SQ < CU THEN N = N + 1:PRINT SQ,
210 : SR = SR + 1
220 LOOP
230 PRINT: PRINT
240 PRINT "BOTH SQUARES AND CUBES:"
250 FOR I=0 TO SC-1: PRINT SC(I),: NEXT I
260 PRINT```
Output:
```READY.
RUN
SQUARES BUT NOT CUBES:
4         9         16        25
36        49        81        100
121       144       169       196
225       256       289       324
361       400       441       484
529       576       625       676
784       841       900       961
1024      1089

BOTH SQUARES AND CUBES:
1         64        729

```

### FreeBASIC

```function is_pow(n as integer, q as integer) as boolean
'tests if the number n is the q'th power of some other integer
dim as integer r = int( n^(1.0/q) )
for i as integer = r-1 to r+1   'there might be a bit of floating point nonsense, so test adjacent numbers also
if i^q = n then return true
next i
return false

end function

dim as integer count = 0, n = 2
do
if is_pow( n, 2 ) and not is_pow( n, 3 ) then
print n;" ";
count += 1
end if
n += 1
loop until count = 30
print
count = 0
n = 2
do
if is_pow( n, 2 ) and is_pow( n, 3 ) then
print n;" ";
count += 1
end if
n += 1
loop until count = 3
print```
Output:
``` 4  9  16  25  36  49  81  100  121  144  169  196  225  256  289  324  361  400  441  484  529  576  625  676  784  841  900  961  1024  1089
64  729  4096```

### IS-BASIC

```100 PROGRAM "Square.bas"
110 LET SQNOTCB,SQANDCB,SQNUM,CBNUM,CBN,SQN,D1=0:LET SQD,D2=1
120 DO
130   LET SQN=SQN+1:LET SQNUM=SQNUM+SQD:LET SQD=SQD+2
140   IF SQNUM>CBNUM THEN
150     LET CBN=CBN+1:LET CBNUM=CBNUM+D2
160     LET D1=D1+6:LET D2=D2+D1
170   END IF
180   IF SQNUM<>CBNUM THEN
190     PRINT SQNUM:LET SQNOTCB=SQNOTCB+1
200   ELSE
210     PRINT SQNUM,SQN;"*";SQN;"=";CBN;"*";CBN;"*";CBN
220     LET SQANDCB=SQANDCB+1
230   END IF
240 LOOP UNTIL SQNOTCB>=30
250 PRINT SQANDCB;"where numbers are square and cube."```

### PureBasic

```OpenConsole()
lv=1
Repeat
s+1 : s2=s*s : Flg=#True
For i=lv To s
If s2=i*i*i
tx3\$+Space(Len(tx2\$)-Len(tx3\$))+Str(s2)
tx2\$+Space(Len(Str(s2))+1)
Flg=#False : lv=i : c-1 : Break
EndIf
Next
If Flg : tx2\$+Str(s2)+" " : EndIf
c+1
Until c>=30
PrintN("s²   : "+tx2\$) : PrintN("s²&s³: "+tx3\$)
Input()```
Output:
```s²   :   4 9 16 25 36 49    81 100 121 144 169 196 225 256 289 324 361 400 441 484 529 576 625 676     784 841 900 961 1024 1089
s²&s³: 1                 64                                                                        729```

### Visual Basic .NET

Inspired by the F# version, but no longer resembles it. Removed the recursion, multiplying (like the D and Pascal versions, only addition is used to calculate squares and cubes), match (Select Case) statement, and hard-coded limit.

```Module Module1

'  bit 0 (1) = increment square
'  bit 1 (2) = increment cube
'  bit 2 (4) = has output

Function ChkFlg(flag As Integer, ByRef mask As Integer) As Boolean
End Function

Sub SwoC(limit As Integer)
Dim count, square, delta, cube, d1, d2, flag, mask As Integer, s as string = ""
count = 1 : square = 1 : delta = 1 : cube = 1 : d1 = 1 : d2 = 0
While count <= limit
flag = {5, 7, 2}(1 + square.CompareTo(cube))
If flag = 7 Then s = String. Format("   {0} (also cube)", square)
If flag = 5 Then s = String.Format("{0,-2} {1}", count, square) : count += 1
mask = 1 : If ChkFlg(flag, mask) Then delta += 2 : square += delta
If ChkFlg(flag, mask) Then d2 += 6 : d1 += d2 : cube += d1
End While
End Sub

Sub Main()
SwoC(30)
End Sub

End Module
```
Output:
```   1 (also cube)
1  4
2  9
3  16
4  25
5  36
6  49
64 (also cube)
7  81
8  100
9  121
10 144
11 169
12 196
13 225
14 256
15 289
16 324
17 361
18 400
19 441
20 484
21 529
22 576
23 625
24 676
729 (also cube)
25 784
26 841
27 900
28 961
29 1024
30 1089```

### Yabasic

```// Rosetta Code problem: https://rosettacode.org/wiki/Square_but_not_cube
// by Jjuanhdez, 10/2022

count = 0 : n = 2
repeat
if isPow(n, 2) and not isPow(n, 3) then
print n, " ";
count = count + 1
fi
n = n + 1
until count = 30
print

count = 0 : n = 2
repeat
if isPow(n, 2) and isPow(n, 3) then
print n, " ";
count = count + 1
fi
n = n + 1
until count = 3
print
end

sub isPow(n, q)
//tests if the number n is the q'th power of some other integer
r = int(n^(1.0/q))
for i = r-1 to r+1   //there might be a bit of floating point nonsense, so test adjacent numbers also
if i^q = n  return true
next i
return false
end sub```
Output:
`Same as FreeBASIC entry.`

## BCPL

```get "libhdr"

let square(x) = x * x
let cube(x) = x * x * x

let start() be
\$(  let c, s, seen = 1, 1, 0
while seen < 30 do
\$(  while cube(c) < square(s) do c := c + 1
if square(s) ~= cube(c) then
\$(  writed(square(s), 5)
seen := seen + 1
if seen rem 5 = 0 then wrch('*N')
\$)
s := s + 1
\$)
\$)```
Output:
```    4    9   16   25   36
49   81  100  121  144
169  196  225  256  289
324  361  400  441  484
529  576  625  676  784
841  900  961 1024 1089```

## BQN

```∘‿5⥊ ((⊢⋆3˙)((¬∊)/⊢)⊢⋆2˙) ↕34
```
Output:
```┌─
╵   4   9  25   36   49
64 100 121  144  169
196 225 256  289  324
361 400 441  484  529
576 625 676  729  784
841 900 961 1024 1089
┘```

## C

```#include <stdio.h>
#include <math.h>

int main() {
int n = 1, count = 0, sq, cr;
for ( ; count < 30; ++n) {
sq = n * n;
cr = (int)cbrt((double)sq);
if (cr * cr * cr != sq) {
count++;
printf("%d\n", sq);
}
else {
printf("%d is square and cube\n", sq);
}
}
return 0;
}
```
Output:
```Same as Ring example.
```

## C#

```using System;
using System.Collections.Generic;
using static System.Console;
using static System.Linq.Enumerable;

public static class SquareButNotCube
{
public static void Main() {
var squares = from i in Integers() select i * i;
var cubes = from i in Integers() select i * i * i;

foreach (var x in Merge().Take(33)) {
WriteLine(x.isCube ? x.n + " (also cube)" : x.n + "");
}

IEnumerable<int> Integers() {
for (int i = 1; ;i++) yield return i;
}

IEnumerable<(int n, bool isCube)> Merge() {
using (var s = squares.GetEnumerator())
using (var c = cubes.GetEnumerator()) {
s.MoveNext();
c.MoveNext();
while (true) {
if (s.Current < c.Current) {
yield return (s.Current, false);
s.MoveNext();
} else if (s.Current == c.Current) {
yield return (s.Current, true);
s.MoveNext();
c.MoveNext();
} else {
c.MoveNext();
}
}
}
}

}
}
```
Output:
```1 (also cube)
4
9
16
25
36
49
64 (also cube)
81
100
121
144
169
196
225
256
289
324
361
400
441
484
529
576
625
676
729 (also cube)
784
841
900
961
1024
1089```

## C++

Translation of: C
```#include <iostream>
#include <cmath>

int main() {
int n = 1;
int count = 0;
int sq;
int cr;

for (; count < 30; ++n) {
sq = n * n;
cr = cbrt(sq);
if (cr * cr * cr != sq) {
count++;
std::cout << sq << '\n';
} else {
std::cout << sq << " is square and cube\n";
}
}

return 0;
}
```
Output:
```1 is square and cube
4
9
16
25
36
49
64 is square and cube
81
100
121
144
169
196
225
256
289
324
361
400
441
484
529
576
625
676
729 is square and cube
784
841
900
961
1024
1089```

## Clojure

Translation of: Raku
```(def squares (map #(* % %) (drop 1 (range))))
(def square-cubes (map #(int (. Math pow % 6)) (drop 1 (range))))

(def squares-not-cubes (filter #(not (= % (first (drop-while (fn [n] (< n %)) square-cubes)))) squares))

(println "Squares but not cubes:")
(println (take 30 squares-not-cubes))
(println "Both squares and cubes:")
(println (take 15 square-cubes))
```
Output:
```Squares but not cubes:
(4 9 16 25 36 49 81 100 121 144 169 196 225 256 289 324 361 400 441 484 529 576 625 676 784 841 900 961 1024 1089)
Both squares and cubes:
(1 64 729 4096 15625 46656 117649 262144 531441 1000000 1771561 2985984 4826809 7529536 11390625)```

## CLU

```square_not_cube = iter () yields (int)
cube_root: int := 1
square_root: int := 1

while true do
while cube_root ** 3 < square_root ** 2 do
cube_root := cube_root + 1
end
if square_root ** 2 ~= cube_root ** 3 then
yield(square_root ** 2)
end
square_root := square_root + 1
end
end square_not_cube

start_up = proc ()
amount = 30
po: stream := stream\$primary_output()
n: int := 0

for i: int in square_not_cube() do
stream\$putright(po, int\$unparse(i), 5)
n := n + 1
if n // 10 = 0 then stream\$putl(po, "") end
if n = amount then break end
end
end start_up```
Output:
```    4    9   16   25   36   49   81  100  121  144
169  196  225  256  289  324  361  400  441  484
529  576  625  676  784  841  900  961 1024 1089```

## COBOL

```        IDENTIFICATION DIVISION.
PROGRAM-ID. SQUARE-NOT-CUBE.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 COMPUTATION.
02 SQ-ROOT       PIC 9999 COMP VALUE 1.
02 CUBE-ROOT     PIC 9999 COMP VALUE 1.
02 SQUARE        PIC 9999 COMP VALUE 1.
02 CUBE          PIC 9999 COMP VALUE 1.
02 SEEN          PIC 99   COMP VALUE 0.
01 OUTPUT-FORMAT.
02 OUT-NUM       PIC ZZZ9.

PROCEDURE DIVISION.
SQUARE-STEP.
COMPUTE SQUARE = SQ-ROOT ** 2.
CUBE-STEP.
IF SQUARE IS GREATER THAN CUBE
COMPUTE CUBE = CUBE-ROOT ** 3
GO TO CUBE-STEP.
IF SQUARE IS NOT EQUAL TO CUBE
MOVE SQUARE TO OUT-NUM
DISPLAY OUT-NUM.
IF SEEN IS LESS THAN 30 GO TO SQUARE-STEP.
STOP RUN.
```
Output:
```   4
9
16
25
36
49
81
100
121
144
169
196
225
256
289
324
361
400
441
484
529
576
625
676
784
841
900
961
1024
1089```

## Comal

```0010 ZONE 5
0020 cube_n#:=0;square_n#:=0;seen#:=0
0030 WHILE seen#<30 DO
0040   WHILE cube_n#^3<square_n#^2 DO cube_n#:+1
0050   IF cube_n#^3<>square_n#^2 THEN
0060     PRINT square_n#^2,
0070     seen#:+1
0080     IF seen# MOD 5=0 THEN PRINT
0090   ENDIF
0100   square_n#:+1
0110 ENDWHILE
0120 END
```
Output:
```4    9    16   25   36
49   81   100  121  144
169  196  225  256  289
324  361  400  441  484
529  576  625  676  784
841  900  961  1024 1089```

## Common Lisp

```(defun cubep (n)
(loop for i from 1
for c = (* i i i)
while (<= c n)
when (= c n) do (return t)
finally (return nil)))

(defparameter squares (let ((n 0)) (lambda () (incf n) (* n n))))

(destructuring-bind (noncubes cubes)
(loop for s = (funcall squares) then (funcall squares)
while (< (length noncubes) 30)
if (cubep s) collect s into cubes
if (not (cubep s)) collect s into noncubes
finally (return (list noncubes cubes)))
(format t "Squares but not cubes:~%~A~%~%" noncubes)
(format t "Both squares and cubes:~%~A~%~%" cubes))
```
Output:
```Squares but not cubes:
(4 9 16 25 36 49 81 100 121 144 169 196 225 256 289 324 361 400 441 484 529 576 625 676 784 841 900 961 1024 1089)

Both squares and cubes:
(1 64 729)```

## Cowgol

```include "cowgol.coh";

var cube: uint16 := 1;
var ncube: uint16 := 1;
var sqr: uint16 := 1;
var nsqr: uint16 := 1;

var seen: uint8 := 0;
while seen < 30 loop
sqr := nsqr * nsqr;
while sqr > cube loop
ncube := ncube + 1;
cube := ncube * ncube * ncube;
end loop;
if sqr != cube then
seen := seen + 1;
print_i16(sqr);
print_char(' ');
end if;
nsqr := nsqr + 1;
end loop;
print_nl();```
Output:
`4 9 16 25 36 49 81 100 121 144 169 196 225 256 289 324 361 400 441 484 529 576 625 676 784 841 900 961 1024 1089`

## D

Translation of: C#
```import std.algorithm;
import std.range;
import std.stdio;

auto squareGen() {
struct Gen {
private int curr = 1;

bool empty() {
return curr < 0;
}

auto front() {
return curr;
}

void popFront() {
}
}

return Gen();
}

auto cubeGen() {
struct Gen {
private int curr = 1;

bool empty() {
return curr < 0;
}

auto front() {
return curr;
}

void popFront() {
}
}

return Gen();
}

auto merge() {
struct Gen {
private auto sg = squareGen();
private auto cg = cubeGen();

bool empty() {
return sg.empty || cg.empty;
}

auto front() {
import std.typecons;
if (sg.front == cg.front) {
return tuple!("num", "isCube")(sg.front, true);
} else {
return tuple!("num", "isCube")(sg.front, false);
}
}

void popFront() {
while (true) {
if (sg.front < cg.front) {
sg.popFront();
return;
} else if (sg.front == cg.front) {
sg.popFront();
cg.popFront();
return;
} else {
cg.popFront();
}
}
}
}

return Gen();
}

void main() {
foreach (p; merge.take(33)) {
if (p.isCube) {
writeln(p.num, " (also cube)");
} else {
writeln(p.num);
}
}
}
```
Output:
```1 (also cube)
4
9
16
25
36
49
64 (also cube)
81
100
121
144
169
196
225
256
289
324
361
400
441
484
529
576
625
676
729 (also cube)
784
841
900
961
1024
1089```

## dc

Translation of: BASIC
```[n = # of non-cube squares found; we stop when it hits 30]sz
[b = # found that are both squares and cubes]sz
0 d sn sb

[c = current cube,      s = current square,
r = current cube root, q = current square root,
f = "first" flag, to control comma delimiting]sz
1 d sc d ss d sq d sr sf

[M = main loop]sz
[
lq d * d ss  [square q into s]sz
lc r >I      [if s > c then call Increment]sz
lc ls <F     [if s < c then s is a non-cube square; call Found]sz
lc ls =R     [if s = c then s is a cubic square; call Remember]sz
lq 1 + sq    [increment q]sz
ln 30 >M     [loop if n is still < 30]sz
]sM

[I = Increment. Bump r and c=r^3 until c >= s]sz
[
lr 1 + d sr
d d * * d sc
ls >I
]sI

[C = Comma. Print a comma and a space]sz
[
44P 32P
]sC

[F = Found. Print s and increment n]sz
[
ln 1 + sn
lf 0 =C 0 sf [print ", " if f is not set; clear f]sz
ls n
]sF

[R = Remember. Save s in array l for later.]sz
[
lb d ls r :l
1 + sb
]sR

[B = print Both. Print out the values saved in array l.]sz
[
lf 0 =C 0 sf [print ", " if f is not set; clear f]sz
li d ;l n
1 + d si
lb r <B
]sB

[Print label and newline]sz
[Squares but not cubes:]n 10P

[Run main loop]sz
lMx

[Print two more newlines]sz
10 d P P

[Print second label and newline]sz
[Both squares and cubes:]n 10P

[initialize i to 0, set f again, and call B to print out the values in l]sz
0 si 1 sf lBx 10P```
Output:
```Squares but not cubes:
4, 9, 16, 25, 36, 49, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361, 400, 441, 484, 529, 576, 625, 676, 784, 841, 900, 961, 1024, 1089

Both squares and cubes:
1, 64, 729```

## Delphi

Library: System.Math
Translation of: Go
```program Square_but_not_cube;

{\$APPTYPE CONSOLE}

uses
System.SysUtils,
System.Math;

begin
var count := 0;
var n := 1;
while count < 30 do
begin
var sq := n * n;
var cr := Trunc(Power(sq, 1 / 3));
if cr * cr * cr <> sq then
begin
inc(count);
writeln(sq);
end
else
Writeln(sq, ' is square and cube');
inc(n);
end;

end.
```

## Draco

```proc main() void:
word sqrt, cbrt, sq, cb, seen;
sqrt := 1;
cbrt := 1;
seen := 0;
while seen < 30 do
sq := sqrt * sqrt;
while
cb := cbrt * cbrt * cbrt;
sq > cb
do
cbrt := cbrt + 1
od;
if sq /= cb then
seen := seen + 1;
write(sq:5);
if seen % 10 = 0 then writeln() fi
fi;
sqrt := sqrt + 1
od
corp```
Output:
```    4    9   16   25   36   49   81  100  121  144
169  196  225  256  289  324  361  400  441  484
529  576  625  676  784  841  900  961 1024 1089```

## F#

```let rec fN n g φ=if φ<31 then match compare(n*n)(g*g*g) with | -1->printfn "%d"(n*n);fN(n+1) g (φ+1)
|  0->printfn "%d cube and square"(n*n);fN(n+1)(g+1)φ
|  1->fN n (g+1) φ
fN 1 1 1
```
Output:
```1 cube and square
4
9
16
25
36
49
64 cube and square
81
100
121
144
169
196
225
256
289
324
361
400
441
484
529
576
625
676
729 cube and square
784
841
900
961
1024
1089
```

## Factor

Translation of: F#
```USING: combinators interpolate io kernel prettyprint math
math.functions math.order pair-rocket ;
IN: rosetta-code.square-but-not-cube

: fn ( s c n -- s' c' n' )
dup 31 < [
2over [ sq ] [ 3 ^ ] bi* <=> {
+lt+ => [ [ dup sq . 1 + ] 2dip 1 + fn ]
+eq+ => [ [ dup sq [I \${} cube and squareI] nl 1 + ] [ 1 + ] [ ] tri* fn ]
+gt+ => [ [ 1 + ] dip fn ]
} case
] when ;

1 1 1 fn 3drop
```
Output:
```1 cube and square
4
9
16
25
36
49
64 cube and square
81
100
121
144
169
196
225
256
289
324
361
400
441
484
529
576
625
676
729 cube and square
784
841
900
961
1024
1089
```

## FALSE

```1 1 1
[2O30>~][
[\$\$*2O\$\$**>][\1+\]#
1O\$\$**1O\$*>[\$\$*.@1+@@" "]?
1+
]#
%%%
10,```
Output:
`4 9 16 25 36 49 81 100 121 144 169 196 225 256 289 324 361 400 441 484 529 576 625 676 784 841 900 961 1024 1089`

## FOCAL

```01.10 S C=1;S S=1;S Q=1;S R=1;S N=1
01.20 I (N-30)1.3,1.3,1.8
01.30 S S=Q*Q
01.40 I (S-C)1.6,1.7,1.5
01.50 S R=R+1;S C=R*R*R;G 1.4
01.60 S N=N+1;T %4,S,!
01.70 S Q=Q+1;G 1.2
01.80 Q```
Output:
```=    4
=    9
=   16
=   25
=   36
=   49
=   81
=  100
=  121
=  144
=  169
=  196
=  225
=  256
=  289
=  324
=  361
=  400
=  441
=  484
=  529
=  576
=  625
=  676
=  784
=  841
=  900
=  961
= 1024
= 1089```

## Forth

```: square dup * ;
: cube dup dup * * ;
: 30-non-cube-squares
0 1 1
begin 2 pick 30 < while
begin over over square swap cube > while
swap 1+ swap
repeat
over over square swap cube <> if
dup square . rot 1+ -rot
then
1+
repeat
2drop drop
;

30-non-cube-squares cr bye
```
Output:
`4 9 16 25 36 49 81 100 121 144 169 196 225 256 289 324 361 400 441 484 529 576 625 676 784 841 900 961 1024 1089`

## Go

```package main

import (
"fmt"
"math"
)

func main() {
for n, count := 1, 0; count < 30; n++ {
sq := n * n
cr := int(math.Cbrt(float64(sq)))
if cr*cr*cr != sq {
count++
fmt.Println(sq)
} else {
fmt.Println(sq, "is square and cube")
}
}
}
```
Output:
```1 is square and cube
4
9
16
25
36
49
64 is square and cube
81
100
121
144
169
196
225
256
289
324
361
400
441
484
529
576
625
676
729 is square and cube
784
841
900
961
1024
1089
```

```{-# LANGUAGE TupleSections #-}

import Data.List (partition, sortOn)
import Data.Ord (comparing)

------------------- SQUARE BUT NOT CUBE ------------------

isCube :: Int -> Bool
isCube n = n == round (fromIntegral n ** (1 / 3)) ^ 3

both, only :: [Int]
(both, only) = partition isCube \$ join (*) <\$> [1 ..]

--------------------------- TEST -------------------------
main :: IO ()
main =
(putStrLn . unlines) \$
uncurry ((<>) . show)
<\$> sortOn
fst
( ((," (also cube)") <\$> take 3 both)
<> ((,"") <\$> take 30 only)
)
```

Or simply

```import Control.Monad (join)

------------------- SQUARE BUT NOT CUBE ------------------

cubeRoot :: Int -> Int
cubeRoot = round . (** (1 / 3)) . fromIntegral

isCube :: Int -> Bool
isCube = (==) <*> ((^ 3) . cubeRoot)

--------------------------- TEST -------------------------
main :: IO ()
main =
(putStrLn . unlines) \$
((<>) . show <*> cubeNote)
<\$> take 33 (join (*) <\$> [1 ..])

cubeNote :: Int -> String
cubeNote x
| isCube x = " (also cube of " <> show (cubeRoot x) <> ")"
| otherwise = []
```

Or, if we prefer a finite series to an infinite one

```isCube :: Int -> Bool
isCube =
(==)
<*> ((^ 3) . round . (** (1 / 3)) . fromIntegral)

squares :: Int -> Int -> [Int]
squares m n = (>>= id) (*) <\$> [m .. n]

--------------------------- TEST -------------------------
main :: IO ()
main =
(putStrLn . unlines) \$
(<>) . show <*> label <\$> squares 1 33

label :: Int -> String
label n
| isCube n = " (also cube)"
| otherwise = ""
```
Output:
```1 (also cube)
4
9
16
25
36
49
64 (also cube)
81
100
121
144
169
196
225
256
289
324
361
400
441
484
529
576
625
676
729 (also cube)
784
841
900
961
1024
1089```

## J

Solution:

```isSqrNotCubeofInt=: (*. -.)/@(= <.)@(2 3 %:/ ])
getN_Indicies=: adverb def '[ ({. I.) [ (] , [: u (i.200) + #@])^:(> +/)^:_ u@]'
```

Example Use:

```   I. isSqrNotCubeofInt i.1090           NB. If we know the upper limit required to get first 30
4 9 16 25 36 49 81 100 121 144 169 196 225 256 289 324 361 400 441 484 529 576 625 676 784 841 900 961 1024 1089
30 isSqrNotCubeofInt getN_Indicies 0  NB. otherwise iteratively build list until first 30 found
4 9 16 25 36 49 81 100 121 144 169 196 225 256 289 324 361 400 441 484 529 576 625 676 784 841 900 961 1024 1089
```

Alternative Solution:

Breaking up the solution above into smaller chunks with comments...

```isInt=: = <.                                     NB. are numbers integers?
sqrcube=: 2 3 %:/ ]                              NB. table of 2nd and 3rd roots of y
isSqrNotCubeofInt=: (*. -.)/@isInt@sqrcube       NB. is y the square but not cube of an integer?

getIdx=: {. I.                                   NB. get indicies of first x ones in boolean y

process_more=: adverb def '] , [: u (i.200) + #@]'  NB. process the next 200 indicies with u and append to y
notEnough=: > +/                                 NB. is left arg greater than sum of right arg
while=: conjunction def 'u^:v^:_'                NB. repeat u while v is true

process_until_enough=: adverb def 'u process_more while notEnough u'
```

Example Use:

```   30 ([ getIdx isSqrNotCubeofInt process_until_enough) 0
4 9 16 25 36 49 81 100 121 144 169 196 225 256 289 324 361 400 441 484 529 576 625 676 784 841
900 961 1024 1089
```

## Java

```public class SquaresCubes {
public static boolean isPerfectCube(long n) {
long c = (long)Math.cbrt((double)n);
return ((c * c * c) == n);
}

public static void main(String... args) {
long n = 1;
int squareOnlyCount = 0;
int squareCubeCount = 0;
while ((squareOnlyCount < 30) || (squareCubeCount < 3)) {
long sq = n * n;
if (isPerfectCube(sq)) {
squareCubeCount++;
System.out.println("Square and cube: " + sq);
}
else {
squareOnlyCount++;
System.out.println("Square: " + sq);
}
n++;
}
}
}
```
Output:
```Square and cube: 1
Square: 4
Square: 9
Square: 16
Square: 25
Square: 36
Square: 49
Square and cube: 64
Square: 81
Square: 100
Square: 121
Square: 144
Square: 169
Square: 196
Square: 225
Square: 256
Square: 289
Square: 324
Square: 361
Square: 400
Square: 441
Square: 484
Square: 529
Square: 576
Square: 625
Square: 676
Square and cube: 729
Square: 784
Square: 841
Square: 900
Square: 961
Square: 1024
Square: 1089```

## JavaScript

```(() => {
'use strict';

const main = () =>
unlines(map(
x => x.toString() + (
isCube(x) ? (
` (cube of \${cubeRootInt(x)} and square of \${
Math.pow(x, 1/2)
})`
) : ''
),
map(x => x * x, enumFromTo(1, 33))
));

// isCube :: Int -> Bool
const isCube = n =>
n === Math.pow(cubeRootInt(n), 3);

// cubeRootInt :: Int -> Int
const cubeRootInt = n => Math.round(Math.pow(n, 1 / 3));

// GENERIC FUNCTIONS ----------------------------------

// enumFromTo :: Int -> Int -> [Int]
const enumFromTo = (m, n) =>
m <= n ? iterateUntil(
x => n <= x,
x => 1 + x,
m
) : [];

// iterateUntil :: (a -> Bool) -> (a -> a) -> a -> [a]
const iterateUntil = (p, f, x) => {
const vs = [x];
let h = x;
while (!p(h))(h = f(h), vs.push(h));
return vs;
};

// map :: (a -> b) -> [a] -> [b]
const map = (f, xs) => xs.map(f);

// unlines :: [String] -> String
const unlines = xs => xs.join('\n');

// MAIN ---
return main();
})();
```
Output:
```1 (cube of 1 and square of 1)
4
9
16
25
36
49
64 (cube of 4 and square of 8)
81
100
121
144
169
196
225
256
289
324
361
400
441
484
529
576
625
676
729 (cube of 9 and square of 27)
784
841
900
961
1024
1089```

## jq

Works with: jq

Works with gojq, the Go implementation of jq

```# Emit an unbounded stream
def squares_not_cubes:
def icbrt: pow(10; log10/3) | round;
range(1; infinite)
| (.*.)
| icbrt as \$c
| select( (\$c*\$c*\$c) != .);

limit(30; squares_not_cubes)```
Output:
```4
9
16
25
...
900
961
1024
1089
```

## Julia

```iscube(n) = n == round(Int, cbrt(n))^3

println(collect(Iterators.take((n^2 for n in 1:10^6 if !iscube(n^2)), 30)))
```
Output:

[4, 9, 16, 25, 36, 49, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361, 400, 441, 484, 529, 576, 625, 676, 784, 841, 900, 961, 1024, 1089]

## Kotlin

```// Version 1.2.60

fun main(args: Array<String>) {
var n = 1
var count = 0
while (count < 30) {
val sq = n * n
val cr = Math.cbrt(sq.toDouble()).toInt()
if (cr * cr * cr != sq) {
count++
println(sq)
}
else {
println("\$sq is square and cube")
}
n++
}
}
```
Output:
```Same as Ring example.
```

## Ksh

```#!/bin/ksh

# First 30 positive integers which are squares but not cubes
# also, the first 3 positive integers which are both squares and cubes

######
# main #
######

integer n sq cr cnt=0

for (( n=1; cnt<30; n++ )); do
(( sq = n * n ))
(( cr = cbrt(sq) ))
if (( (cr * cr * cr) != sq )); then
(( cnt++ ))
print \${sq}
else
print "\${sq} is square and cube"
fi
done
```
Output:
```
1 is square and cube
4
9
16
25
36
49
64 is square and cube
81
100
121
144
169
196
225
256
289
324
361
400
441
484
529
576
625
676
729 is square and cube
784
841
900
961
1024

1089```

## LOLCODE

Translation of: Commodore BASIC
```HAI 1.2

I HAS A SkwareKyoobs ITZ A BUKKIT
I HAS A NumbarSkwareKyoobs ITZ 0
I HAS A NotKyoobs ITZ 0

I HAS A Index ITZ 1
I HAS A Skware ITZ 1
I HAS A Kyoob ITZ 1
I HAS A Root ITZ 1

VISIBLE "Skwares but not kyoobs::"

IM IN YR Outer UPPIN YR Dummy WILE DIFFRINT NotKyoobs AN 30

Skware R PRODUKT OF Index AN Index

IM IN YR Inner UPPIN YR OtherDummy WILE DIFFRINT Kyoob AN BIGGR OF Skware AN Kyoob
Root R SUM OF Root AN 1
Kyoob R PRODUKT OF PRODUKT OF Root AN Root AN Root
IM OUTTA YR Inner

BOTH SAEM Skware AN Kyoob, O RLY?
YA RLY
SkwareKyoobs HAS A SRS NumbarSkwareKyoobs ITZ Skware
NumbarSkwareKyoobs R SUM OF NumbarSkwareKyoobs AN 1
NO WAI
BOTH SAEM Kyoob AN BIGGR OF Skware AN Kyoob, O RLY?
YA RLY
VISIBLE SMOOSH Skware " " MKAY !
NotKyoobs R SUM OF NotKyoobs AN 1
OIC
OIC

Index R SUM OF Index AN 1
IM OUTTA YR Outer

VISIBLE ""
VISIBLE ""
VISIBLE "Both skwares and kyoobs::"
IM IN YR Output UPPIN YR Index WILE DIFFRINT Index AN NumbarSkwareKyoobs
VISIBLE SMOOSH SkwareKyoobs'Z SRS Index " " MKAY !
IM OUTTA YR Output
VISIBLE ""

KTHXBYE```
Output:
```Skwares but not kyoobs:
4 9 16 25 36 49 81 100 121 144 169 196 225 256 289 324 361 400 441 484 529 576 625 676 784 841 900 961 1024 1089

Both skwares and kyoobs:
1 64 729```

## Lua

Calculating cube roots with x^(1/3) caused problems with floating-point 'dust' so the Newton-Raphson method is used instead.

```function nthroot (x, n)
local r = 1
for i = 1, 16 do
r = (((n - 1) * r) + x / (r ^ (n - 1))) / n
end
return r
end

local i, count, sq, cbrt = 0, 0
while count < 30 do
i = i + 1
sq = i * i
-- The next line should say nthroot(sq, 3), right? But this works. Maths, eh?
cbrt = nthroot(i, 3)
if cbrt == math.floor(cbrt) then
print(sq .. " is square and cube")
else
print(sq)
count = count + 1
end
end
```
Output:
```1 is square and cube
4
9
16
25
36
49
64 is square and cube
81
100
121
144
169
196
225
256
289
324
361
400
441
484
529
576
625
676
729 is square and cube
784
841
900
961
1024
1089```

```            NORMAL MODE IS INTEGER

CUBE=1
NCUBE=1
SQR=1
NSQR=1
SEEN=0

SQRLP       SQR = NSQR*NSQR
CUBELP      WHENEVER SQR.G.CUBE
NCUBE = NCUBE+1
CUBE = NCUBE*NCUBE*NCUBE
TRANSFER TO CUBELP
END OF CONDITIONAL
WHENEVER SQR.NE.CUBE
SEEN = SEEN+1
PRINT FORMAT FMT,SQR
END OF CONDITIONAL
NSQR = NSQR+1
WHENEVER SEEN.L.30, TRANSFER TO SQRLP

VECTOR VALUES FMT = \$I4*\$
END OF PROGRAM```
Output:
```   4
9
16
25
36
49
81
100
121
144
169
196
225
256
289
324
361
400
441
484
529
576
625
676
784
841
900
961
1024
1089```

## Mathematica / Wolfram Language

```s = Range^2;
c = Range[1, Ceiling[Surd[Max[s], 3]]]^3;
Take[Complement[s, c], 30]
Intersection[s, c]
```
Output:
```{4, 9, 16, 25, 36, 49, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361, 400, 441, 484, 529, 576, 625, 676, 784, 841, 900, 961, 1024, 1089}
{1, 64, 729}```

## Miranda

```main :: [sys_message]
main = [Stdout (lay (map show squarenotcube))]
where squarenotcube = take 30 (squares \$notin cubes)

squares :: [num]
squares = map (^ 2) [1..]

cubes :: [num]
cubes = map (^ 3) [1..]

|| Values in as not in bs, assuming as and bs are sorted
notin :: [num] -> [num] -> [num]
notin as     []     = as
notin (a:as) (b:bs) = a:notin as (b:bs), if a < b
= notin as bs,       if a = b
= notin (a:as) bs,   if a > b```
Output:
```4
9
16
25
36
49
81
100
121
144
169
196
225
256
289
324
361
400
441
484
529
576
625
676
784
841
900
961
1024
1089```

## MiniScript

```squares = []
tris = []
both = []
for i in range(1, 100)
tris.push i*i*i
if tris.indexOf(i*i) == null then
squares.push i*i
else
both.push i*i
end if
end for

print "Square but not cube:"
print squares[:30]
print "Both square and cube:"
print both[:3]
```
Output:
```Square but not cube:
[4, 9, 16, 25, 36, 49, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361, 400, 441, 484, 529, 576, 625, 676, 784, 841, 900, 961, 1024, 1089]
Both square and cube:
[1, 64, 729]```

## Modula-2

```MODULE SquareNotCube;
FROM InOut IMPORT WriteString, WriteCard, WriteLn;

CONST
Amount = 30;
VAR
CubeRoot, SquareRoot,
Cube, Square,
Seen: CARDINAL;

BEGIN
Seen := 0;
SquareRoot := 1;
CubeRoot := 1;
Square := 1;
Cube := 1;

REPEAT
SquareRoot := SquareRoot + 1;
Square := SquareRoot * SquareRoot;
WHILE Square > Cube DO
CubeRoot := CubeRoot + 1;
Cube := CubeRoot * CubeRoot * CubeRoot;
END;
IF Square # Cube THEN
Seen := Seen + 1;
WriteCard(Square, 4);
WriteLn();
END;
UNTIL Seen = Amount
END SquareNotCube.
```
Output:
```   4
9
16
25
36
49
81
100
121
144
169
196
225
256
289
324
361
400
441
484
529
576
625
676
784
841
900
961
1024
1089```

## Nim

```var count = 0
var n, c, c3 = 1

while count < 30:
var sq = n * n
while c3 < sq:
inc c
c3 = c * c * c
if c3 == sq:
echo sq, " is square and cube"
else:
echo sq
inc count
inc n
```
```1 is square and cube
4
9
16
25
36
49
64 is square and cube
81
100
121
144
169
196
225
256
289
324
361
400
441
484
529
576
625
676
729 is square and cube
784
841
900
961
1024
1089
```

## OCaml

Translation of: F#
```let rec fN n g phi =
if phi < 31 then
match compare (n*n) (g*g*g) with
| -1 -> Printf.printf "%d\n" (n*n); fN (n+1) g (phi+1)
|  0 -> Printf.printf "%d cube and square\n" (n*n); fN (n+1) (g+1) phi
|  1 -> fN n (g+1) phi
| _ -> assert false
;;

fN 1 1 1
```

## Pascal

```program SquareButNotCube;
var
sqN,
sqDelta,
SqNum,

cbN,
cbDelta1,
cbDelta2,
CbNum,

CountSqNotCb,
CountSqAndCb : NativeUint;

begin
CountSqNotCb := 0;
CountSqAndCb := 0;
SqNum := 0;
CbNum := 0;
cbN := 0;
sqN := 0;
sqDelta := 1;
cbDelta1 := 0;
cbDelta2 := 1;
repeat
inc(sqN);
inc(sqNum,sqDelta);
inc(sqDelta,2);
IF sqNum>cbNum then
Begin
inc(cbN);
cbNum := cbNum+cbDelta2;
inc(cbDelta1,6);// 0,6,12,18...
inc(cbDelta2,cbDelta1);//1,7,19,35...
end;
IF sqNum <> cbNUm then
Begin
writeln(sqNum :25);
inc(CountSqNotCb);
end
else
Begin
writeln(sqNum:25,sqN:10,'*',sqN,' = ',cbN,'*',cbN,'*',cbN);
inc(CountSqANDCb);
end;
until CountSqNotCb >= 30;//sqrt(High(NativeUint));
writeln(CountSqANDCb,' where numbers are square and cube ');
end.
```
Output:
```                        1         1*1 = 1*1*1
4
9
16
25
36
49
64         8*8 = 4*4*4
81
100
121
144
169
196
225
256
289
324
361
400
441
484
529
576
625
676
729        27*27 = 9*9*9
784
841
900
961
1024
1089
3 where numbers are square and cube

// there are 1625 numbers which are square and cube < High(Uint64)
//18412815093994140625  4291015625*4291015625 = 2640625*2640625*2640625
```

## Perl

#### Hash

Use a hash to track state (and avoid floating-point math).

```while (\$cnt < 30) {
\$n++;
\$h{\$n**2}++;
\$h{\$n**3}--;
\$cnt++ if \$h{\$n**2} > 0;
}

print "First 30 positive integers that are a square but not a cube:\n";
print "\$_ " for sort { \$a <=> \$b } grep { \$h{\$_} == 1 } keys %h;

print "\n\nFirst 3 positive integers that are both a square and a cube:\n";
print "\$_ " for sort { \$a <=> \$b } grep { \$h{\$_} == 0 } keys %h;
```
Output:
```First 30 positive integers that are a square but not a cube:
4 9 16 25 36 49 81 100 121 144 169 196 225 256 289 324 361 400 441 484 529 576 625 676 784 841 900 961 1024 1089

First 3 positive integers that are both a square and a cube:
1 64 729```

#### Generators

A more general approach involving generators/closures to implement 'lazy' lists as in the Raku example. Using ideas and code from the very similar Generator exponential task. Output is the same as previous.

```# return an anonymous subroutine that generates stream of specified powers
sub gen_pow {
my \$m = shift;
my \$e = 1;
return sub { return \$e++ ** \$m; };
}

# return an anonymous subroutine generator that filters output from supplied generators g1 and g2
sub gen_filter {
my(\$g1, \$g2) = @_;
my \$v1;
my \$v2 = \$g2->();
return sub {
while (1) {
\$v1 = \$g1->();
\$v2 = \$g2->() while \$v1 > \$v2;
return \$v1 unless \$v1 == \$v2;
}
};
}

my \$pow2 = gen_pow(2);
my \$pow3 = gen_pow(3);
my \$squares_without_cubes = gen_filter(\$pow2, \$pow3);
print "First 30 positive integers that are a square but not a cube:\n";
print \$squares_without_cubes->() . ' ' for 1..30;

my \$pow6 = gen_pow(6);
print "\n\nFirst 3 positive integers that are both a square and a cube:\n";
print \$pow6->() . ' ' for 1..3;
```

## Phix

```integer square = 1, squared = 1*1,
cube   = 1, cubed = 1*1*1,
count  = 0

while count<30 do
squared = square*square
while squared>cubed do cube += 1; cubed = cube*cube*cube end while
if squared=cubed then
printf(1,"%d: %d == %d^3\n",{square,squared,cube})
else
count += 1
printf(1,"%d: %d\n",{square,squared})
end if
square += 1
end while

printf(1,"\nThe first 15 positive integers that are both a square and a cube: \n")
?sq_power(tagset(15),6)
```
Output:
```1: 1 == 1^3
2: 4
3: 9
4: 16
5: 25
6: 36
7: 49
8: 64 == 4^3
9: 81
10: 100
11: 121
12: 144
13: 169
14: 196
15: 225
16: 256
17: 289
18: 324
19: 361
20: 400
21: 441
22: 484
23: 529
24: 576
25: 625
26: 676
27: 729 == 9^3
28: 784
29: 841
30: 900
31: 961
32: 1024
33: 1089

The first 15 positive integers that are both a square and a cube:
{1,64,729,4096,15625,46656,117649,262144,531441,1000000,1771561,2985984,4826809,7529536,11390625}
```

## PILOT

```C :sqr=1
C :cbr=1
C :sq=1
C :cb=1
C :n=0

*square
U (sq>cb):*cube
C (sq<cb):n=n+1
T (sq<cb):#sq
C :sqr=sqr+1
C :sq=sqr*#sqr
J (n<30):*square
E :

*cube
C :cbr=cbr+1
C :cb=(cbr*#cbr)*#cbr
J (sq>cb):*cube
E :```
Output:
```4
9
16
25
36
49
81
100
121
144
169
196
225
256
289
324
361
400
441
484
529
576
625
676
784
841
900
961
1024
1089```

## PL/I

```squareNotCube: procedure options(main);

square: procedure(n) returns(fixed);
declare n fixed;
return(n * n);
end square;

cube: procedure(n) returns(fixed);
declare n fixed;
return(n * n * n);
end cube;

declare (ci, si, seen) fixed;

ci = 1;
do si = 1 repeat(si + 1) while(seen < 30);
do while(cube(ci) < square(si));
ci = ci + 1;
end;
if square(si) ^= cube(ci) then do;
put edit(square(si)) (F(5));
seen = seen + 1;
if mod(seen,10) = 0 then put skip;
end;
end;
end squareNotCube;```
Output:
```    4    9   16   25   36   49   81  100  121  144
169  196  225  256  289  324  361  400  441  484
529  576  625  676  784  841  900  961 1024 1089```

## PL/M

```100H: /* CP/M OUTPUT */
BDOS: PROCEDURE (FN, ARG);
GO TO 5;
END BDOS;

PRINT\$NUMBER: PROCEDURE (N);
DECLARE S (7) BYTE INITIAL ('..... \$');
DECLARE (N, P) ADDRESS, C BASED P BYTE;
P = .S(5);
DIGIT:
P = P-1;
C = N MOD 10 + '0';
N = N/10;
IF N > 0 THEN GO TO DIGIT;
CALL BDOS(9, P);
END PRINT\$NUMBER;

/* SQUARES */
RETURN N * N;
END SQUARE;

/* CUBES */
RETURN N * N * N;
END CUBE;

DECLARE (CI, SI) ADDRESS INITIAL (1, 1), SEEN BYTE INITIAL (0);
DO WHILE SEEN < 30;
DO WHILE CUBE(CI) < SQUARE(SI);
CI = CI + 1;
END;
IF SQUARE(SI) <> CUBE(CI) THEN DO;
CALL PRINT\$NUMBER(SQUARE(SI));
SEEN = SEEN + 1;
END;
SI = SI + 1;
END;

CALL BDOS(0,0);
EOF```
Output:
`4 9 16 25 36 49 81 100 121 144 169 196 225 256 289 324 361 400 441 484 529 576 625 676 784 841 900 961 1024 1089`

## Python

```# nonCubeSquares :: Int -> [(Int, Bool)]
def nonCubeSquares(n):
upto = enumFromTo(1)
ns = upto(n)
setCubes = set(x ** 3 for x in ns)
ms = upto(n + len(set(x * x for x in ns).intersection(
setCubes
)))
return list(tuple([x * x, x in setCubes]) for x in ms)

# squareListing :: [(Int, Bool)] -> [String]
def squareListing(xs):
justifyIdx = justifyRight(len(str(1 + len(xs))))(' ')
justifySqr = justifyRight(1 + len(str(xs[-1])))(' ')
return list(
'(' + str(1 + idx) + '^2 = ' + str(n) +
' = ' + str(round(n ** (1 / 3))) + '^3)' if bln else (
justifyIdx(1 + idx) + ' ->' +
justifySqr(n)
)
for idx, (n, bln) in enumerate(xs)
)

def main():
print(
unlines(
squareListing(
nonCubeSquares(30)
)
)
)

# GENERIC ------------------------------------------------------------------

# enumFromTo :: Int -> Int -> [Int]
def enumFromTo(m):
return lambda n: list(range(m, 1 + n))

# justifyRight :: Int -> Char -> String -> String
def justifyRight(n):
return lambda cFiller: lambda a: (
((n * cFiller) + str(a))[-n:]
)

# unlines :: [String] -> String
def unlines(xs):
return '\n'.join(xs)

main()
```
Output:
```(1^2 = 1 = 1^3)
2 ->    4
3 ->    9
4 ->   16
5 ->   25
6 ->   36
7 ->   49
(8^2 = 64 = 4^3)
9 ->   81
10 ->  100
11 ->  121
12 ->  144
13 ->  169
14 ->  196
15 ->  225
16 ->  256
17 ->  289
18 ->  324
19 ->  361
20 ->  400
21 ->  441
22 ->  484
23 ->  529
24 ->  576
25 ->  625
26 ->  676
(27^2 = 729 = 9^3)
28 ->  784
29 ->  841
30 ->  900
31 ->  961
32 -> 1024
33 -> 1089```

## Quackery

```  [ swap - -1 1 clamp 1+ ]       is <=>       ( n n --> n )

[ dup * ]                      is squared   (   n --> n )

[ dup squared * ]              is cubed     (   n --> n )

0 0 []
[ unrot
over squared
over cubed <=>
[ table
1+
[ 1+ dip 1+ ]
[ dip
[ tuck squared
join swap 1+ ] ] ]
do
rot dup size 30 = until ]
dip 2drop
echo```
Output:
`[ 4 9 16 25 36 49 81 100 121 144 169 196 225 256 289 324 361 400 441 484 529 576 625 676 784 841 900 961 1024 1089 ]`

## Racket

Using a generator it _is_ possible to print the cubes in-line, but I've chosen to show reusing the generator / for / sequence interaction:

```#lang racket
(require racket/generator)

;; generates values:
;;  next square
;;  cube-root if cube, #f otherwise
(define (make-^2-but-not-^3-generator)
(generator
()
(let loop ((s 1) (c 1))
(let ((s^2 (sqr s)) (c^3 (* c c c)))
(yield s^2 (and (= s^2 c^3) c))
(loop (add1 s) (+ c (if (>= s^2 c^3) 1 0)))))))

(for/list ((x (in-range 1 31))
((s^2 _) (sequence-filter (λ (_ c) (not c)) (in-producer (make-^2-but-not-^3-generator)))))
s^2)

(for ((x (in-range 1 4))
((s^2 c) (sequence-filter (λ (s^2 c) c) (in-producer (make-^2-but-not-^3-generator)))))
(printf "~a: ~a is also ~a^3~%" x s^2 c))
```
Output:
```'(4 9 16 25 36 49 81 100 121 144 169 196 225 256 289 324 361 400 441 484 529 576 625 676 784 841 900 961 1024 1089)
1: 1 is also 1^3
2: 64 is also 4^3
3: 729 is also 9^3```

## Raku

(formerly Perl 6)

```my @square-and-cube = map { .⁶ }, 1..Inf;

my @square-but-not-cube = (1..Inf).map({ .² }).grep({ \$_ ∉ @square-and-cube[^@square-and-cube.first: * > \$_, :k]});

put "First 30 positive integers that are a square but not a cube: \n",  @square-but-not-cube[^30];

put "\nFirst 15 positive integers that are both a square and a cube: \n", @square-and-cube[^15];
```
Output:
```First 30 positive integers that are a square but not a cube:
4 9 16 25 36 49 81 100 121 144 169 196 225 256 289 324 361 400 441 484 529 576 625 676 784 841 900 961 1024 1089

First 15 positive integers that are both a square and a cube:
1 64 729 4096 15625 46656 117649 262144 531441 1000000 1771561 2985984 4826809 7529536 11390625```

## REXX

Programming note:   extra code was added to support an additional output format   (see the 2nd output section).

```/*REXX pgm shows N ints>0 that are squares and not cubes, & which are squares and cubes.*/
numeric digits 20                                /*ensure handling of larger numbers.   */
parse arg N .                                    /*obtain optional argument from the CL.*/
if N=='' | N==","  then N= 30                    /*Not specified?  Then use the default.*/
sqcb= N<0                                        /*N negative? Then show squares & cubes*/
N = abs(N)                                       /*define  N  to be the absolute value. */
w= (length(N) + 3)  *  3                         /*W:  used for aligning output columns.*/
say '   count   '                                /*display the  1st  line of the title. */
say '  ───────  '                                /*   "     "   2nd    "   "  "    "    */
@.= 0                                            /*@:  stemmed array for computed cubes.*/
#= 0;  ##= 0                  /*count (integer): squares & not cubes.*/
do j=1  until #==N | ##==N                  /*loop 'til enough    "    "  "    "   */
sq= j*j;          cube= sq*j;    @.cube= 1  /*compute the square of J and the cube.*/
if @.sq  then do
##= ## + 1                    /*bump the counter of squares & cubes. */
if \sqcb  then counter=   left('', 12)     /*don't show this counter.*/
else counter= center(##, 12)     /*  do    "    "     "    */
say counter        right(commas(sq), w)  'is a square and       a cube'
end
else do
if sqcb  then  iterate
#= # + 1                      /*bump the counter of squares & ¬ cubes*/
say center(#, 12)  right(commas(sq), w)  'is a square and  not  a cube'
end
end   /*j*/
exit 0                                           /*stick a fork in it,  we're all done. */
/*──────────────────────────────────────────────────────────────────────────────────────*/
commas: parse arg ?;  do jc=length(?)-3  to 1  by -3; ?=insert(',', ?, jc); end;  return ?
```
output   when using the default input:
```   count
───────
1 is a square and       a cube
1                     4 is a square and  not  a cube
2                     9 is a square and  not  a cube
3                    16 is a square and  not  a cube
4                    25 is a square and  not  a cube
5                    36 is a square and  not  a cube
6                    49 is a square and  not  a cube
64 is a square and       a cube
7                    81 is a square and  not  a cube
8                   100 is a square and  not  a cube
9                   121 is a square and  not  a cube
10                  144 is a square and  not  a cube
11                  169 is a square and  not  a cube
12                  196 is a square and  not  a cube
13                  225 is a square and  not  a cube
14                  256 is a square and  not  a cube
15                  289 is a square and  not  a cube
16                  324 is a square and  not  a cube
17                  361 is a square and  not  a cube
18                  400 is a square and  not  a cube
19                  441 is a square and  not  a cube
20                  484 is a square and  not  a cube
21                  529 is a square and  not  a cube
22                  576 is a square and  not  a cube
23                  625 is a square and  not  a cube
24                  676 is a square and  not  a cube
729 is a square and       a cube
25                  784 is a square and  not  a cube
26                  841 is a square and  not  a cube
27                  900 is a square and  not  a cube
28                  961 is a square and  not  a cube
29                1,024 is a square and  not  a cube
30                1,089 is a square and  not  a cube
```
output   when using the input of:     -55
```   count
───────
1                     1 is a square and       a cube
2                    64 is a square and       a cube
3                   729 is a square and       a cube
4                 4,096 is a square and       a cube
5                15,625 is a square and       a cube
6                46,656 is a square and       a cube
7               117,649 is a square and       a cube
8               262,144 is a square and       a cube
9               531,441 is a square and       a cube
10            1,000,000 is a square and       a cube
11            1,771,561 is a square and       a cube
12            2,985,984 is a square and       a cube
13            4,826,809 is a square and       a cube
14            7,529,536 is a square and       a cube
15           11,390,625 is a square and       a cube
16           16,777,216 is a square and       a cube
17           24,137,569 is a square and       a cube
18           34,012,224 is a square and       a cube
19           47,045,881 is a square and       a cube
20           64,000,000 is a square and       a cube
21           85,766,121 is a square and       a cube
22          113,379,904 is a square and       a cube
23          148,035,889 is a square and       a cube
24          191,102,976 is a square and       a cube
25          244,140,625 is a square and       a cube
26          308,915,776 is a square and       a cube
27          387,420,489 is a square and       a cube
28          481,890,304 is a square and       a cube
29          594,823,321 is a square and       a cube
30          729,000,000 is a square and       a cube
31          887,503,681 is a square and       a cube
32        1,073,741,824 is a square and       a cube
33        1,291,467,969 is a square and       a cube
34        1,544,804,416 is a square and       a cube
35        1,838,265,625 is a square and       a cube
36        2,176,782,336 is a square and       a cube
37        2,565,726,409 is a square and       a cube
38        3,010,936,384 is a square and       a cube
39        3,518,743,761 is a square and       a cube
40        4,096,000,000 is a square and       a cube
41        4,750,104,241 is a square and       a cube
42        5,489,031,744 is a square and       a cube
43        6,321,363,049 is a square and       a cube
44        7,256,313,856 is a square and       a cube
45        8,303,765,625 is a square and       a cube
46        9,474,296,896 is a square and       a cube
47       10,779,215,329 is a square and       a cube
48       12,230,590,464 is a square and       a cube
49       13,841,287,201 is a square and       a cube
50       15,625,000,000 is a square and       a cube
51       17,596,287,801 is a square and       a cube
52       19,770,609,664 is a square and       a cube
53       22,164,361,129 is a square and       a cube
54       24,794,911,296 is a square and       a cube
55       27,680,640,625 is a square and       a cube
```

## Ring

```# Project : Square but not cube

limit = 30
num = 0
sq = 0
while num < limit
sq = sq + 1
sqpow = pow(sq,2)
flag = iscube(sqpow)
if flag = 0
num = num + 1
see sqpow + nl
else
see "" + sqpow + " is square and cube" + nl
ok
end

func iscube(cube)
for n = 1 to cube
if pow(n,3) = cube
return 1
ok
next
return 0```

Output:

```1 is square and cube
4
9
16
25
36
49
64 is square and cube
81
100
121
144
169
196
225
256
289
324
361
400
441
484
529
576
625
676
729 is square and cube
784
841
900
961
1024
1089
```

## RPL

Translation of: 11l
```≪ → eq n
≪ { } 1
WHILE OVER SIZE n < REPEAT
DUP SQ DUP 3 INV ^ 1E-6 + FLOOR 3 ^
IF eq EVAL THEN SWAP OVER SQ + SWAP END
1 + END
DROP
```
Input:
```≪ ≠ ≫ 30 TASK
```
Output:
```2: { 4 9 16 25 36 49 81 100 121 144 169 196 225 256 289 324 361 400 441 484 529 576 625 676 784 841 900 961 1024 1089 }
1: { 1 64 729 }
```

## Ruby

#### Class based

```#!/usr/bin/env ruby

class PowIt
:next

def initialize
@next = 1;
end
end

class SquareIt < PowIt
def next
result = @next ** 2
@next += 1
return result
end
end

class CubeIt < PowIt
def next
result = @next ** 3
@next += 1
return result
end
end

squares = []
hexponents = []

squit = SquareIt.new
cuit = CubeIt.new

s = squit.next
c = cuit.next

while (squares.length < 30 || hexponents.length < 3)
if s < c
squares.push(s) if squares.length < 30
s = squit.next
elsif s == c
hexponents.push(s) if hexponents.length < 3
s = squit.next
c = cuit.next
else
c = cuit.next
end
end

puts "Squares:"
puts squares.join(" ")

puts "Square-and-cubes:"
puts hexponents.join(" ")
```
Output:
```Squares:
4 9 16 25 36 49 81 100 121 144 169 196 225 256 289 324 361 400 441 484 529 576 625 676 784 841 900 961 1024 1089
Square-and-cubes:
1 64 729```

#### Enumerator

```squares = Enumerator.new {|y| 1.step{|n| y << n*n} }

puts "Square cubes: %p
Square non-cubes: %p" % squares.take(33).partition{|sq| Math.cbrt(sq).to_i ** 3 == sq }
```
Output:
```Square cubes: [1, 64, 729]
Square non-cubes: [4, 9, 16, 25, 36, 49, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361, 400, 441, 484, 529, 576, 625, 676, 784, 841, 900, 961, 1024, 1089]
```

## Rust

```fn main() {
let mut s = 1;
let mut c = 1;
let mut cube = 1;
let mut n = 0;
while n < 30 {
let square = s * s;
while cube < square {
c += 1;
cube = c * c * c;
}
if cube == square {
println!("{} is a square and a cube.", square);
} else {
println!("{}", square);
n += 1;
}
s += 1;
}
}
```
Output:
```1 is a square and a cube.
4
9
16
25
36
49
64 is a square and a cube.
81
100
121
144
169
196
225
256
289
324
361
400
441
484
529
576
625
676
729 is a square and a cube.
784
841
900
961
1024
1089
```

## Scala

This example uses Spire's SafeLongs for both removing any size limitation and making exponentiation/roots cleaner, at the expense of initializing lists with an iteration vs the simpler .from(n). Both the non-cube-squares and square-cubes are lazily evaluated lists, the former is constructed by making lists of square numbers between each pair of cubes and flattening them into one list, the latter is formed by filtering non-squares out of a list of cubes.

```import spire.math.SafeLong
import spire.implicits._

def ncs: LazyList[SafeLong] = LazyList.iterate(SafeLong(1))(_ + 1).flatMap(n => Iterator.iterate(n.pow(3).sqrt + 1)(_ + 1).map(i => i*i).takeWhile(_ < (n + 1).pow(3)))
def scs: LazyList[SafeLong] = LazyList.iterate(SafeLong(1))(_ + 1).map(_.pow(3)).filter(n => n.sqrt.pow(2) == n)
```
Output:
```scala> println(ncs.take(30).mkString(", "))
4, 9, 16, 25, 36, 49, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361, 400, 441, 484, 529, 576, 625, 676, 784, 841, 900, 961, 1024, 1089

scala> println(scs.take(3).mkString(", "))
1, 64, 729```

## Sidef

Translation of: Raku
```var square_and_cube = Enumerator({|f|
1..Inf -> each {|n| f(n**6) }
})

var square_but_not_cube = Enumerator({|f|
1..Inf -> lazy.map {|n| n**2 }.grep {|n| !n.is_power(3) }.each {|n| f(n) }
})

say "First 30 positive integers that are a square but not a cube:"
say square_but_not_cube.first(30).join(' ')

say "First 15 positive integers that are both a square and a cube:"
say square_and_cube.first(15).join(' ')
```
Output:
```First 30 positive integers that are a square but not a cube:
4 9 16 25 36 49 81 100 121 144 169 196 225 256 289 324 361 400 441 484 529 576 625 676 784 841 900 961 1024 1089
First 15 positive integers that are both a square and a cube:
1 64 729 4096 15625 46656 117649 262144 531441 1000000 1771561 2985984 4826809 7529536 11390625
```

## Swift

```var s = 1, c = 1, cube = 1, n = 0
while n < 30 {
let square = s * s
while cube < square {
c += 1
cube = c * c * c
}
if cube == square {
print("\(square) is a square and a cube.")
} else {
print(square)
n += 1
}
s += 1
}
```
Output:
```1 is a square and a cube.
4
9
16
25
36
49
64 is a square and a cube.
81
100
121
144
169
196
225
256
289
324
361
400
441
484
529
576
625
676
729 is a square and a cube.
784
841
900
961
1024
1089
```

## Tcl

Translation of: Common Lisp
```proc squaregen {{i 0}} {
proc squaregen "{i [incr i]}" [info body squaregen]
expr \$i * \$i
}

proc is_cube {n} {
for {set i 1} {(\$i * \$i * \$i) < \$n} {incr i} { }
expr (\$i * \$i * \$i) == \$n
}

set cubes {}
set noncubes {}
for {set s [squaregen]} {[llength \$noncubes] < 30} {set s [squaregen]} {
if [is_cube \$s] {
lappend cubes \$s
} else {
lappend noncubes \$s
}
}
puts "Squares but not cubes:"
puts \$noncubes
puts {}
puts "Both squares and cubes:"
puts \$cubes
```
Output:
```Squares but not cubes:
4 9 16 25 36 49 81 100 121 144 169 196 225 256 289 324 361 400 441 484 529 576 625 676 784 841 900 961 1024 1089

Both squares and cubes:
1 64 729```

## UNIX Shell

Works with: Korn Shell

Ksh has a built-in cube root function, making this a little simpler:

```# First 30 positive integers which are squares but not cubes
# also, the first 3 positive integers which are both squares and cubes

######
# main #
######

integer n sq cr cnt=0

for (( n=1; cnt<30; n++ )); do
(( sq = n * n ))
(( cr = cbrt(sq) ))
if (( (cr * cr * cr) != sq )); then
(( cnt++ ))
print \${sq}
else
print "\${sq} is square and cube"
fi
done
```
Output:
```1 is square and cube
4
9
16
25
36
49
64 is square and cube
81
100
121
144
169
196
225
256
289
324
361
400
441
484
529
576
625
676
729 is square and cube
784
841
900
961
1024
1089```
Works with: Bourne Again Shell

Since Bash lacks a built-in `cbrt` function, here we adopted the BASIC algorithm.

```main() {
local non_cubes=()
local cubes=()
local cr=1 cube=1 i square
for (( i=1; \${#non_cubes[@]} < 30; ++i )); do
(( square = i * i ))
while (( square > cube )); do
(( cr+=1, cube=cr*cr*cr ))
done
if (( square == cube )); then
cubes+=(\$square)
else
non_cubes+=(\$square)
fi
done
printf 'Squares but not cubes:\n'
printf \${non_cubes}
printf ', %d' "\${non_cubes[@]:1}"

printf '\n\nBoth squares and cubes:\n'
printf \${cubes}
printf ', %d' "\${cubes[@]:1}"
printf '\n'
}

main "\$@"```
Works with: Zsh

The Zsh solution is virtually identical to the Bash one, the main difference being the array syntax and base index.

```#!/usr/bin/env bash

main() {
local non_cubes=()
local cubes=()
local cr=1 cube=1 i square
for (( i=1; \$#non_cubes < 30; ++i )); do
(( square = i * i ))
while (( square > cube )); do
(( cr+=1, cube=cr*cr*cr ))
done
if (( square == cube )); then
cubes+=(\$square)
else
non_cubes+=(\$square)
fi
done
printf 'Squares but not cubes:\n'
printf \$non_cubes
printf ', %d' "\${(@)non_cubes[2,-1]}"

printf '\n\nBoth squares and cubes:\n'
printf \$cubes
printf ', %d' "\${(@)cubes[2,-1]}"
printf '\n'
}

main "\$@"
```
Output:

Both the bash and zsh versions have the same output:

```Squares but not cubes:
4, 9, 16, 25, 36, 49, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361, 400, 441, 484, 529, 576, 625, 676, 784, 841, 900, 961, 1024, 1089

Both squares and cubes:
1, 64, 729```

## VTL-2

```10 N=0
20 S=1
30 C=1
40 #=60
50 C=C+1
60 #=C*C*C<(S*S)*50
70 #=C*C*C=(S*S)*110
80 N=N+1
90 ?=S*S
100 \$=32
110 S=S+1
120 #=N<30*60```
Output:
`4 9 16 25 36 49 81 100 121 144 169 196 225 256 289 324 361 400 441 484 529 576 625 676 784 841 900 961 1024 1089`

## Wren

```import "/math" for Math
import "/fmt" for Fmt

var i = 1
var sqnc = []  // squares not cubes
var sqcb = []  // squares and cubes
while (sqnc.count < 30 || sqcb.count < 3) {
var sq = i * i
var cb = Math.cbrt(sq).round
if (cb*cb*cb != sq) {
} else {
}
i = i + 1
}
System.print("The first 30 positive integers which are squares but not cubes are:")
System.print(sqnc.take(30).toList)
System.print("\nThe first 3 positive integers which are both squares and cubes are:")
System.print(sqcb.take(3).toList)```
Output:
```The first 30 positive integers which are squares but not cubes are:
[4, 9, 16, 25, 36, 49, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361, 400, 441, 484, 529, 576, 625, 676, 784, 841, 900, 961, 1024, 1089]

The first 3 positive integers which are both squares and cubes are:
[1, 64, 729]
```

## XPL0

```int  C, N, N2, T;
[C:= 0;  N:= 1;
loop    [N2:= N*N;
IntOut(0, N2);
T:= fix(Pow(float(N2), 1./3.));
if T*T*T # N2 then
[ChOut(0, ^ );
C:= C+1;
if C >= 30 then quit;
]
else    Text(0, "* ");
N:= N+1;
];
Text(0, "^m^j* are both squares and cubes.^m^j");
]```
Output:
```1* 4 9 16 25 36 49 64* 81 100 121 144 169 196 225 256 289 324 361 400 441 484 529 576 625 676 729* 784 841 900 961 1024 1089
* are both squares and cubes.
```

## zkl

```println("First 30 positive integers that are a square but not a cube:");
squareButNotCube:=(1).walker(*).tweak(fcn(n){
sq,cr := n*n, sq.toFloat().pow(1.0/3).round(); // cube root(64)<4
if(sq==cr*cr*cr) Void.Skip else sq
});
squareButNotCube.walk(30).concat(",").println("\n");

println("First 15 positive integers that are both a square and a cube:");
println((1).walker(*).tweak((1).pow.unbind().fp1(6)).walk(15));```
Output:
```First 30 positive integers that are a square but not a cube:
4,9,16,25,36,49,81,100,121,144,169,196,225,256,289,324,361,400,441,484,529,576,625,676,784,841,900,961,1024,1089

First 15 positive integers that are both a square and a cube:
L(1,64,729,4096,15625,46656,117649,262144,531441,1000000,1771561,2985984,4826809,7529536,11390625
```