Cantor set: Difference between revisions

m
→‎{{header|Wren}}: Changed to Wren S/H
(Add COBOL)
m (→‎{{header|Wren}}: Changed to Wren S/H)
(30 intermediate revisions by 15 users not shown)
Line 7:
See details at this Wikipedia webpage:   [https://en.wikipedia.org/wiki/Cantor_set Cantor set]
<br><br>
 
=={{header|11l}}==
{{trans|Python}}
<langsyntaxhighlight lang="11l">V WIDTH = 81
V HEIGHT = 5
 
Line 31 ⟶ 30:
L(i) 0 .< HEIGHT
V beg = WIDTH * i
print((lines[beg .< beg + WIDTH]).join(‘’))</langsyntaxhighlight>
{{out}}
<pre>
Line 40 ⟶ 39:
* * * * * * * * * * * * * * * *
</pre>
 
=={{header|Action!}}==
<langsyntaxhighlight Actionlang="action!">PROC FillRect(INT x,y,w,h)
INT i
 
Line 93 ⟶ 91:
DO UNTIL CH#$FF OD
CH=$FF
RETURN</langsyntaxhighlight>
{{out}}
[https://gitlab.com/amarok8bit/action-rosetta-code/-/raw/master/images/Cantor_set.png Screenshot from Atari 8-bit computer]
 
=={{header|Ada}}==
<langsyntaxhighlight Adalang="ada">with Ada.Text_IO;
 
procedure Cantor_Set is
Line 121 ⟶ 118:
Ada.Text_IO.Put_Line (Image (L));
end loop;
end Cantor_Set;</langsyntaxhighlight>
{{out}}
<pre>*********************************************************************************
Line 128 ⟶ 125:
*** *** *** *** *** *** *** ***
* * * * * * * * * * * * * * * *</pre>
 
=={{header|ALGOL 68}}==
<langsyntaxhighlight lang="algol68">BEGIN
# draw a Cantor Set using ASCII #
INT lines = 5; # number of lines for the set #
Line 156 ⟶ 152:
segment width OVERAB 3
OD
END</langsyntaxhighlight>
{{out}}
<pre>
Line 165 ⟶ 161:
# # # # # # # # # # # # # # # #
</pre>
 
=={{header|ALGOL W}}==
Based on the Algol 68 sample.
<langsyntaxhighlight lang="algolw">begin
% draw a Cantor Set using ASCII %
integer LINES; % number of lines for the set %
Line 201 ⟶ 196:
end for_l
end
end.</langsyntaxhighlight>
{{out}}
<pre>
#################################################################################
########################### ###########################
######### ######### ######### #########
### ### ### ### ### ### ### ###
# # # # # # # # # # # # # # # #
</pre>
 
=={{header|Amazing Hopper}}==
{{Trans|C}}
VERSION 1:
<syntaxhighlight lang="c">
#include <basico.h>
 
#define WIDTH 81
#define HEIGHT 5
 
#proto cantor(_X_,_Y_,_Z_)
 
algoritmo
 
decimales '0'
dimensionar(HEIGHT,WIDTH) matriz rellena("#",líneas)
 
_cantor(1, WIDTH, 2)
fijar separador 'NULO', imprimir( líneas, NL)
 
terminar
 
subrutinas
 
cantor(inicio, largo, índice)
seg=0
#( seg:=(int(largo/3))), no es cero?, entonces{
#basic{
líneas[índice:HEIGHT, (inicio+seg):((inicio+seg*2)-1)] = " ")
cantor( inicio, seg, índice+1 ) )
cantor( (inicio+(seg*2)), seg, índice+1 ) )
}
}
retornar
</syntaxhighlight>
{{out}}
<pre>
#################################################################################
########################### ###########################
######### ######### ######### #########
### ### ### ### ### ### ### ###
# # # # # # # # # # # # # # # #
</pre>
{{Trans|Ruby}}
VERSION 2:
<syntaxhighlight lang="c">
#include <basico.h>
 
#define HEIGHT 5
 
algoritmo
 
decimales '0'
cantor="", j=0
iterar
i=0
cadenas 's,v'
iterar grupo ( ++i, #(i< (3^j)),\
#( v = occurs("1", dectobase(i,3)) ? " " : "#"; )\
#( s = s $ replicate(v, 3^(HEIGHT-j-1) )) )
#(cantor = cantor $ s $ NL)
mientras ' #(j<=HEIGHT); ++j '
imprimir(cantor)
 
terminar
</syntaxhighlight>
{{out}}
<pre>
Line 214 ⟶ 284:
 
Using composable library functions whenever possible, for better productivity:
<langsyntaxhighlight lang="applescript">------------------------- CANTOR SET -----------------------
 
-- cantor :: [String] -> [String]
Line 376 ⟶ 446:
set my text item delimiters to dlm
str
end unlines</langsyntaxhighlight>
{{Out}}
<pre>█████████████████████████████████████████████████████████████████████████████████
Line 383 ⟶ 453:
███ ███ ███ ███ ███ ███ ███ ███
█ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █</pre>
 
=={{header|Arturo}}==
 
<langsyntaxhighlight lang="rebol">width: 81
height: 5
 
Line 406 ⟶ 475:
 
loop lines 'line
-> print join line</langsyntaxhighlight>
 
{{out}}
Line 415 ⟶ 484:
*** *** *** *** *** *** *** ***
* * * * * * * * * * * * * * * *</pre>
 
=={{header|AWK}}==
<syntaxhighlight lang="awk">
<lang AWK>
# syntax: GAWK -f CANTOR_SET.AWK
# converted from C
Line 448 ⟶ 516:
cantor(start+seg*2,seg,indx+1)
}
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 459 ⟶ 527:
 
=={{header|BASIC}}==
{{works with|QBasic}}
<lang gwbasic>10 DEFINT A-Z
{{works with|GW-BASIC}}
{{works with|MSX BASIC}}
<syntaxhighlight lang="gwbasic">10 DEFINT A-Z
20 N = 4
30 W = 3^(N-1)
Line 472 ⟶ 543:
120 MID$(L$,P,S) = SPACE$(S)
130 P = P+S
140 GOTO 100</langsyntaxhighlight>
{{out}}
<pre>###########################
Line 479 ⟶ 550:
# # # # # # # #</pre>
 
==={{header|BASIC256}}===
{{trans|FreeBASIC}}
<syntaxhighlight lang="vb">global ancho, alto, intervalo
<lang BASIC256>
global ancho, alto, intervalo
ancho = 81 : alto = 5
dim intervalo(alto, ancho)
Line 514 ⟶ 584:
print
next i
end</syntaxhighlight>
End
 
</lang>
==={{header|Chipmunk Basic}}===
{{out}}
{{trans|FreeBASIC}}
<pre>
{{works with|Chipmunk Basic|3.6.4}}
Igual que la entrada de FreeBASIC.
<syntaxhighlight lang="qbasic">100 cls
</pre>
110 ancho = 81
120 alto = 5
130 dim intervalo$(alto,ancho)
140 '
150 sub cantor()
160 for i = 0 to alto-1
170 for j = 0 to ancho-1
180 intervalo$(i,j) = chr$(254)
190 next j
200 next i
210 end sub
220 '
230 sub conjcantor(inicio,longitud,indice)
240 segmento = longitud/3
250 if segmento = 0 then exit sub
260 for i = indice to alto-1
270 for j = inicio+segmento to inicio+segmento*2-1
280 intervalo$(i,j) = chr$(32)
290 next j
300 next i
310 conjcantor(inicio,segmento,indice+1)
320 conjcantor(inicio+segmento*2,segmento,indice+1)
330 end sub
340 '
350 cantor()
360 conjcantor(0,ancho,1)
370 for i = 0 to alto-1
380 for j = 0 to ancho-1
390 print intervalo$(i,j);
400 next j
410 print
420 next i
430 end</syntaxhighlight>
 
==={{header|GW-BASIC}}===
{{works with|PC-BASIC|any}}
{{works with|BASICA}}
The [[#BASIC|BASIC]] solution works without any changes.
 
==={{header|MSX Basic}}===
{{works with|MSX BASIC|any}}
The [[#BASIC|BASIC]] solution works without any changes.
 
==={{header|QBasic}}===
{{trans|FreeBASIC}}
{{works with|QBasic|1.1}}
{{works with|QuickBasic|4.5}}
<syntaxhighlight lang="qbasic">SUB Cantor
FOR i = 0 TO alto - 1
FOR j = 0 TO ancho - 1
intervalo$(i, j) = CHR$(254) '"#"
NEXT j
NEXT i
END SUB
 
SUB ConjCantor (inicio, longitud, indice)
segmento = INT(longitud / 3)
IF segmento = 0 THEN EXIT SUB
FOR i = indice TO alto - 1
FOR j = inicio + segmento TO inicio + segmento * 2 - 1
intervalo$(i, j) = CHR$(32) '" "
NEXT j
NEXT i
CALL ConjCantor(inicio, segmento, indice + 1)
CALL ConjCantor(inicio + segmento * 2, segmento, indice + 1)
END SUB
 
CONST ancho = 81
CONST alto = 5
DIM SHARED intervalo$(alto, ancho)
 
CLS
CALL Cantor
CALL ConjCantor(0, ancho, 1)
FOR i = 0 TO alto - 1
FOR j = 0 TO ancho - 1
PRINT intervalo$(i, j);
NEXT j
PRINT
NEXT i
END</syntaxhighlight>
 
==={{header|True BASIC}}===
{{trans|QBasic}}
<syntaxhighlight lang="qbasic">LET ancho = 81
LET alto = 5
DIM intervalo$(0,0)
MAT REDIM intervalo$(0 TO alto, 0 TO ancho)
 
SUB cantor
FOR i = 0 TO alto-1
FOR j = 0 TO ancho-1
LET intervalo$(i, j) = "#" !CHR$(254)
NEXT j
NEXT i
END SUB
 
SUB conjcantor (inicio,longitud,indice)
LET segmento = INT(longitud/3)
IF segmento = 0 THEN EXIT SUB
FOR i = indice TO alto-1
FOR j = inicio+segmento TO inicio+segmento*2-1
LET intervalo$(i, j) = CHR$(32) !" "
NEXT j
NEXT i
CALL conjcantor (inicio, segmento, indice+1)
CALL conjcantor (inicio+segmento*2, segmento, indice+1)
END SUB
 
CALL cantor
CALL conjcantor (0, ancho, 1)
FOR i = 0 TO alto-1
FOR j = 0 TO ancho-1
PRINT intervalo$(i, j);
NEXT j
PRINT
NEXT i
END</syntaxhighlight>
 
==={{header|Yabasic}}===
{{trans|FreeBASIC}}
<syntaxhighlight lang="vb">ancho = 81
alto = 5
dim intervalo$(alto, ancho)
 
Cantor()
ConjCantor(0, ancho, 1)
for i = 0 to alto - 1
for j = 0 to ancho - 1
print intervalo$(i, j);
next j
print
next i
end
 
sub Cantor()
for i = 0 to alto - 1
for j = 0 to ancho - 1
intervalo$(i, j) = chr$(254) //"#"
next j
next i
end sub
 
sub ConjCantor(inicio, longitud, indice)
segmento = longitud / 3
if segmento = 0 return
for i = indice to alto - 1
for j = inicio + segmento to inicio + segmento * 2 - 1
intervalo$(i, j) = " "
next j
next i
ConjCantor(inicio, segmento, indice + 1)
ConjCantor(inicio + segmento * 2, segmento, indice + 1)
end sub</syntaxhighlight>
 
=={{header|BQN}}==
<langsyntaxhighlight lang="bqn">Cantor ← {" •" ⊏˜ >⥊¨(¯1⊸⊏⊢¨¨⊢)1‿0‿1∧⌜⍟(↕𝕩)1}</langsyntaxhighlight>
 
{{out}}
Line 536 ⟶ 760:
</pre>
 
=={{header|C}}==
{{trans|Kotlin}}
<langsyntaxhighlight lang="c">#include <stdio.h>
 
#define WIDTH 81
Line 576 ⟶ 799:
print();
return 0;
}</langsyntaxhighlight>
 
{{output}}
Line 586 ⟶ 809:
* * * * * * * * * * * * * * * *
</pre>
 
=={{header|C sharp|C#}}==
{{trans|Java}}
<langsyntaxhighlight lang="csharp">using System;
 
namespace CantorSet {
Line 627 ⟶ 849:
}
}
}</langsyntaxhighlight>
{{out}}
<pre>*********************************************************************************
Line 634 ⟶ 856:
*** *** *** *** *** *** *** ***
* * * * * * * * * * * * * * * *</pre>
 
=={{header|C++}}==
{{trans|D}}
<langsyntaxhighlight lang="cpp">#include <iostream>
 
const int WIDTH = 81;
Line 672 ⟶ 893:
 
return 0;
}</langsyntaxhighlight>
{{out}}
<pre>*********************************************************************************
Line 679 ⟶ 900:
*** *** *** *** *** *** *** ***
* * * * * * * * * * * * * * * *</pre>
 
=={{header|CLU}}==
<langsyntaxhighlight lang="clu">cantor = cluster is make
rep = null
ac = array[char]
Line 713 ⟶ 933:
cs: string := cantor$make(81, 5, '*')
stream$puts(po, cs)
end start_up</langsyntaxhighlight>
{{out}}
<pre>*********************************************************************************
Line 720 ⟶ 940:
*** *** *** *** *** *** *** ***
* * * * * * * * * * * * * * * *</pre>
 
=={{header|COBOL}}==
<langsyntaxhighlight lang="cobol"> IDENTIFICATION DIVISION.
PROGRAM-ID. CANTOR.
Line 769 ⟶ 988:
BLANK-CHAR.
MOVE SPACE TO CHAR(POS).
ADD 1 TO POS.</langsyntaxhighlight>
{{out}}
<pre>#################################################################################
Line 776 ⟶ 995:
### ### ### ### ### ### ### ###
# # # # # # # # # # # # # # # #</pre>
 
=={{header|D}}==
{{trans|C}}
<langsyntaxhighlight lang="d">import std.stdio;
 
enum WIDTH = 81;
Line 811 ⟶ 1,029:
writeln(lines[beg..beg+WIDTH]);
}
}</langsyntaxhighlight>
{{out}}
<pre>*********************************************************************************
Line 818 ⟶ 1,036:
*** *** *** *** *** *** *** ***
* * * * * * * * * * * * * * * *</pre>
 
=={{header|Delphi}}==
{{Trans|Java}}
<syntaxhighlight lang="delphi">
<lang Delphi>
program Cantor_set;
 
Line 871 ⟶ 1,088:
Readln;
end.
</syntaxhighlight>
</lang>
 
{{out}}
Same result of Java
 
=={{header|EasyLang}}==
 
[https://easylang.dev/show/#cod=S87PyS9SMDU15Sooyk9WSE7MKwHyKxQqFYqrFPQU9LgUFBQy00AcOwUDPUMQFwiKq4wVbEGC+grGUKHc/LJUsD5dkCxUsCg1uQSkDCGCZAFYITYpbQUjBS2wJJoiPS49LqgqAwULAwVDAwMuAA== Run it]
 
<syntaxhighlight>
color 555
proc cantor x y sz . .
if sz > 0.1
sz3 = sz / 3
move x y - sz3
rect sz sz3
cantor x y - sz3 sz3
cantor x + 2 * sz3 y - sz3 sz3
.
.
cantor 0 80 100
</syntaxhighlight>
 
=={{header|Elixir}}==
<syntaxhighlight lang="elixir">
defmodule Cantor do
@pos "█"
@neg " "
 
def run(lines) do
Enum.map(0..lines, fn line ->
segment_size = 3 ** (lines - line - 1)
chars = (3 ** line)
 
Enum.map(0..chars, fn char ->
char
|> Integer.digits(3)
|> Enum.any?(fn x -> x === 1 end)
|> case do
true -> @neg
false -> @pos
end
end)
|> Enum.reduce([], fn el, acc -> duplicate_char(acc, el, segment_size) end)
|> Enum.join()
|> String.trim_trailing()
end)
|> Enum.filter(fn line -> line !== "" end)
end
 
def duplicate_char(acc, el, segment_size) when segment_size >= 1, do: acc ++ [String.duplicate(el, segment_size)]
def duplicate_char(acc, _el, segment_size) when segment_size < 1, do: acc
end
 
Cantor.run(5) |> IO.inspect()
</syntaxhighlight>
{{out}}
<pre>["█████████████████████████████████████████████████████████████████████████████████",
"███████████████████████████ ███████████████████████████",
"█████████ █████████ █████████ █████████",
"███ ███ ███ ███ ███ ███ ███ ███",
"█ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █"]</pre>
 
=={{header|EMal}}==
<syntaxhighlight lang="emal">
int WIDTH = 81
int HEIGHT = 5
List lines = text[].with(HEIGHT) # a list with HEIGHT empty texts
for each int i in range(0, HEIGHT) do lines[i] = text("█", WIDTH) end
fun cantor = void by int start, int len, int index
int seg = len / 3
if seg == 0 do return end
for int i = index; i < HEIGHT; i++
for int j = start + seg; j < start + seg * 2; j++
lines[i][j] = " "
end
end
cantor(start, seg, index + 1)
cantor(start + seg * 2, seg, index + 1)
end
cantor(0, WIDTH, 1)
for each text line in lines do writeLine(line) end
</syntaxhighlight>
{{out}}
<pre>
█████████████████████████████████████████████████████████████████████████████████
███████████████████████████ ███████████████████████████
█████████ █████████ █████████ █████████
███ ███ ███ ███ ███ ███ ███ ███
█ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █
</pre>
 
=={{header|Excel}}==
Line 883 ⟶ 1,187:
 
{{Works with|Office 365 betas 2021}}
<langsyntaxhighlight lang="lisp">CANTOR
=LAMBDA(n,
APPLYN(n)(
Line 972 ⟶ 1,276:
)
)
)</langsyntaxhighlight>
 
and also assuming the following generic bindings in the Name Manager for the WorkBook:
 
<langsyntaxhighlight lang="lisp">APPENDCOLS
=LAMBDA(xs,
LAMBDA(ys,
Line 1,132 ⟶ 1,436:
)
)
)</langsyntaxhighlight>
 
{{Out}}
Line 1,147 ⟶ 1,451:
| style="text-align:center; font-family:Arial, Helvetica, sans-serif !important; background-color:#000000; color:#ffffff" | 1
| style="text-align:right; " | SHOWCANTOR(CANTOR(0))
| style="text-align:left; font-weight:bold" | <syntaxhighlight lang="text">█</langsyntaxhighlight>
 
|- style="text-align:right;"
| style="text-align:center; font-family:Arial, Helvetica, sans-serif !important; background-color:#000000; color:#ffffff" | 2
| style="text-align:right; " | SHOWCANTOR(CANTOR(1))
| style="text-align:left; background-color:#cbcefb;" | <syntaxhighlight lang="text">███
█ █</langsyntaxhighlight>
 
|- style="text-align:right;"
| style="text-align:center; font-family:Arial, Helvetica, sans-serif !important; background-color:#000000; color:#ffffff" | 3
| style="text-align:right; " | SHOWCANTOR(CANTOR(2))
| style="text-align:left; font-weight:bold" | <syntaxhighlight lang="text">█████████
███ ███
█ █ █ █</langsyntaxhighlight>
 
|- style="text-align:right;"
| style="text-align:center; font-family:Arial, Helvetica, sans-serif !important; background-color:#000000; color:#ffffff" | 4
| style="text-align:right; " | SHOWCANTOR(CANTOR(3))
| style="text-align:left; font-weight:bold" | <syntaxhighlight lang="text">███████████████████████████
█████████ █████████
███ ███ ███ ███
█ █ █ █ █ █ █ █</langsyntaxhighlight>
 
|}
Line 1,299 ⟶ 1,603:
| style="text-align:left" | 1
|}
 
=={{header|Factor}}==
<langsyntaxhighlight lang="factor">USING: grouping.extras io kernel math sequences
sequences.repeating ;
IN: rosetta-code.cantor-set
Line 1,323 ⟶ 1,626:
concat print ;
depth <iota> [ print-cantor ] each</langsyntaxhighlight>
{{out}}
<pre>
Line 1,332 ⟶ 1,635:
# # # # # # # # # # # # # # # #
</pre>
 
=={{header|Forth}}==
Where is says <code>[email protected]</code> it should say <code>c&#64;</code>, but I'm not keen on writing it as <code>c&amp;#64;</code> in the actual code.
<langsyntaxhighlight Forthlang="forth">warnings off
 
4 \ iterations
Line 1,360 ⟶ 1,662:
: go print BEGIN step done? UNTIL ;
 
go bye</langsyntaxhighlight>
Output:
<pre>#################################################################################
Line 1,367 ⟶ 1,669:
### ### ### ### ### ### ### ###
# # # # # # # # # # # # # # # #</pre>
 
=={{header|FreeBASIC}}==
<langsyntaxhighlight lang="freebasic">
Const ancho = 81
Const alto = 5
Line 1,406 ⟶ 1,707:
Next i
End
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 1,415 ⟶ 1,716:
█ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █
</pre>
 
 
 
 
=={{header|FutureBasic}}==
<syntaxhighlight lang="futurebasic">
_window = 1
 
_width = 81
_height = 5
 
window _window, @"FutureBasic Cantor Set", ( 0, 0, 695, 100 )
WindowSetBackgroundColor( _window, fn ColorWhite )
text @"Menlo", 14.0, fn ColorRed
 
begin globals
CFStringRef gInterval( _height, _width )
end globals
 
local fn Init
NSInteger i, j
for i = 0 to _height - 1
for j = 0 to _width - 1
gInterval( i, j ) = @"◼︎"
next
next
end fn
 
local fn CantorSet( start as NSInteger, length as NSInteger, index as NSInteger )
NSInteger i, j, segment = length / 3
if segment == 0 then exit fn
for i = index to _height - 1
for j = start + segment to start + segment * 2 - 1
gInterval( i, j ) = @" "
next
next
fn CantorSet( start, segment, index + 1 )
fn CantorSet( start + segment * 2, segment, index + 1 )
end fn
 
NSInteger i, j
 
fn Init
fn CantorSet ( 0, _width, 1 )
for i = 0 to _height - 1
for j = 0 to _width - 1
print gInterval( i, j );
next
print
next
 
HandleEvents
</syntaxhighlight>
{{output}}
[[File:FutureBasic Cantor Set.png]]
 
=={{header|Fōrmulæ}}==
 
{{FormulaeEntry|page=https://formulae.org/?script=examples/The_Cantor_set}}
 
'''Solution'''
 
Strictly speaking, a visualization of the perfect Cantor set is impossible, it consists of a infinite set of isolated points in the interval [0, 1]. The most we can do is drawing the early steps of its construction.
 
Several ways of visualization of the Cantor set are shown.
 
'''Preliminaries'''
 
Let us start with a definition of the points that define the central points of the intervals of the Cantos set on any step:
 
[[File:Fōrmulæ - Cantor set 01.png]]
 
[[File:Fōrmulæ - Cantor set 02.png]]
 
[[File:Fōrmulæ - Cantor set 03.png]]
 
The followign function defines the segments on each step:
 
[[File:Fōrmulæ - Cantor set 04.png]]
 
[[File:Fōrmulæ - Cantor set 05.png]]
 
[[File:Fōrmulæ - Cantor set 06.png]]
 
=== Plotting the central points ===
 
[[File:Fōrmulæ - Cantor set 07.png]]
 
[[File:Fōrmulæ - Cantor set 08.png]]
 
=== Common method ===
 
[[File:Fōrmulæ - Cantor set 09.png]]
 
[[File:Fōrmulæ - Cantor set 10.png]]
 
[[File:Fōrmulæ - Cantor set 11.png]]
 
=== Cantor dust ===
 
[[File:Fōrmulæ - Cantor set 12.png]]
 
[[File:Fōrmulæ - Cantor set 13.png]]
 
[[File:Fōrmulæ - Cantor set 14.png]]
 
=== [https://en.wikipedia.org/wiki/Knaster%E2%80%93Kuratowski_fan Knaster–Kuratowski fan or "Cantor teepee"] ===
 
[[File:Fōrmulæ - Cantor set 15.png]]
 
[[File:Fōrmulæ - Cantor set 16.png]]
 
[[File:Fōrmulæ - Cantor set 17.png]]
 
 
The following forms of visualization are taken from [https://en.wikipedia.org/wiki/Point-set_topology point-set topology]. They are not intended as forms of visualization of the Cantor set, instead, these structures make use of the Cantor set.
 
=== [https://en.wikipedia.org/wiki/Indecomposable_continuum Brouwer–Janiszewski–Knaster continuum, or "the bucket handle"] ===
 
[[File:Fōrmulæ - Cantor set 18.png]]
 
[[File:Fōrmulæ - Cantor set 19.png]]
 
[[File:Fōrmulæ - Cantor set 20.png]]
 
=== "Double Knaster" ===
 
[[File:Fōrmulæ - Cantor set 21.png]]
 
[[File:Fōrmulæ - Cantor set 22.png]]
 
[[File:Fōrmulæ - Cantor set 23.png]]
 
=={{header|Go}}==
{{trans|Kotlin}}
<langsyntaxhighlight lang="go">package main
 
import "fmt"
Line 1,456 ⟶ 1,891:
fmt.Println(string(line[:]))
}
}</langsyntaxhighlight>
 
{{out}}
Line 1,466 ⟶ 1,901:
* * * * * * * * * * * * * * * *
</pre>
 
=={{header|Groovy}}==
{{trans|Java}}
<langsyntaxhighlight lang="groovy">class App {
private static final int WIDTH = 81
private static final int HEIGHT = 5
Line 1,504 ⟶ 1,938:
}
}
}</langsyntaxhighlight>
{{out}}
<pre>*********************************************************************************
Line 1,511 ⟶ 1,945:
*** *** *** *** *** *** *** ***
* * * * * * * * * * * * * * * *</pre>
 
=={{header|Haskell}}==
===Interval bars===
{{Trans|Python}} (Functional version)
<langsyntaxhighlight lang="haskell">-------------------------- CANTOR ------------------------
 
cantor :: [(Bool, Int)] -> [(Bool, Int)]
cantor = (goconcatMap =<<)go
where
go (bln, n)
| bln && 1 < n = [(True, m), (False, m), (True, m)]
let m = quot n 3
in [(True, m), (False, m), (True, m)]
| otherwise = [(bln, n)]
 
where
m = quot n 3
--------------------------- TEST -------------------------
main :: IO ()
main = putStrLn $ cantorLines 5
 
------------------------- DISPLAY ------------------------
cantorLines :: Int -> String
Line 1,536 ⟶ 1,969:
showCantor
<$> take n (iterate cantor [(True, 3 ^ pred n)])
 
showCantor :: [(Bool, Int)] -> String
showCantor = concatMap $ uncurry (goflip replicate . =<<c)
where
goc (True, n) = replicate n '*'
goc (False, n) = replicate n ' '</langsyntaxhighlight>
{{Out}}
<pre>*********************************************************************************
Line 1,551 ⟶ 1,984:
Or, using strings for the model as well as the display:
 
<langsyntaxhighlight lang="haskell">-------------------------- CANTOR ------------------------
 
cantor :: [String] -> [String]
Line 1,580 ⟶ 2,013:
. pred
)
)</langsyntaxhighlight>
{{Out}}
<pre>█████████████████████████████████████████████████████████████████████████████████
Line 1,590 ⟶ 2,023:
===Dual representation===
Intervals as fraction pairs, and intervals as graphic bars:
<langsyntaxhighlight lang="haskell">import Control.Monad (join)
import Data.Bifunctor (bimap)
import Data.List (intercalate, mapAccumL, maximumBy)
Line 1,598 ⟶ 2,031:
 
cantor :: (Rational, Rational) -> [[(Rational, Rational)]]
cantor = iterate (>>= go =<<) . returnpure
where
go (x, y) = [(x, x + r), (y - r, y)]
Line 1,648 ⟶ 2,081:
go x
| 1 /= x = '/' : show x
| otherwise = []</langsyntaxhighlight>
{{Out}}
<pre>(0, 1)
Line 1,659 ⟶ 2,092:
███ ███ ███ ███
█ █ █ █ █ █ █ █</pre>
 
=={{header|IS-BASIC}}==
<langsyntaxhighlight ISlang="is-BASICbasic">100 PROGRAM "Cantor.bas"
110 GRAPHICS HIRES 2
120 SET PALETTE BLACK,WHITE
Line 1,671 ⟶ 2,103:
180 CALL CANTOR(X+2*L/3,Y-HEIGHT,L/3,HEIGHT)
190 END IF
200 END DEF</langsyntaxhighlight>
 
=={{header|J}}==
The argument to the cantor_dust monad is an integer that describes the depth of the dust. Shown here are results for cantor_dust 2 and for cantor_dust 3 . It works by checking for 1 digits in the base 3 representation of the coordinates. These background coordinates are plotted with # character using ASCII art. 1j1 #"1 expands the lines to improve aspect ratio on character cell (console) display. }:"1 curtails the extra space character line by line. < draws a pretty box.
<syntaxhighlight lang="j">
<lang J>
odometer =: [: (4 $. $.) $&1
 
Line 1,684 ⟶ 2,115:
< (}:"1) 1j1 #"1 '#' (([: <"1 [: ;/"1 (#~ 1 e."1 [: (,/"2) 3 3&#:)) i)}a
)
</syntaxhighlight>
</lang>
 
<pre>
Line 1,733 ⟶ 2,164:
</pre>
With an `x' argument cantor_dust generalizes to higher dimensions. Try 3 cantor_dust 2
<syntaxhighlight lang="j">
<lang J>
cantor_dust =: 2&$: :(dyad define)
shape =. x # 3 ^ y
Line 1,740 ⟶ 2,171:
< (}:"1) 1j1 #"1 '#' (([: <"1 [: ;/"1 (#~ 1 e."1 [: (,/"2) 3 3&#:)) i)} a
)
</syntaxhighlight>
</lang>
 
=={{header|Java}}==
{{trans|Kotlin}}
<langsyntaxhighlight lang="java">public class App {
private static final int WIDTH = 81;
private static final int HEIGHT = 5;
Line 1,780 ⟶ 2,210:
}
}
</syntaxhighlight>
</lang>
{{out}}
<pre>*********************************************************************************
Line 1,787 ⟶ 2,217:
*** *** *** *** *** *** *** ***
* * * * * * * * * * * * * * * *</pre>
 
=={{header|JavaScript}}==
===Cantor: (Bool, Int) pairs===
{{Trans|Python}} (Functional version)
{{Trans|Haskell}}
<langsyntaxhighlight JavaScriptlang="javascript">(() => {
"use strict";
 
Line 1,879 ⟶ 2,308:
// MAIN ---
return main();
})();</langsyntaxhighlight>
{{Out}}
<pre>*********************************************************************************
Line 1,890 ⟶ 2,319:
Using strings for the model as well as the display:
{{Trans|Haskell}}
<langsyntaxhighlight lang="javascript">(() => {
"use strict";
 
Line 1,961 ⟶ 2,390:
// MAIN ---
return main();
})();</langsyntaxhighlight>
{{Out}}
<pre>█████████████████████████████████████████████████████████████████████████████████
Line 1,977 ⟶ 2,406:
In the case of languages like Javascript which lack a built-in Ratio type, or standard Fraction/Ratio library, rendering stages of the set elaboration as lists of fraction pairs may take more work than rendering them as graphic lines.
 
<langsyntaxhighlight lang="javascript">(() => {
"use strict";
 
Line 2,363 ⟶ 2,792:
// MAIN ---
return main();
})();</langsyntaxhighlight>
{{Out}}
<pre>(0, 1)
Line 2,374 ⟶ 2,803:
███ ███ ███ ███
█ █ █ █ █ █ █ █</pre>
 
=={{header|jq}}==
<langsyntaxhighlight lang="jq"># cantor(width; height)
def cantor($w; $h):
def init: [range(0; $h) | [range(0; $w) | "*"]];
Line 2,393 ⟶ 2,821:
cantor($width; $height)
| pp</langsyntaxhighlight>
{{out}}
With the above in a file, cantor.jq, the following incantation
yields the same output as shown e.g. under `awk`, `julia`, etc.
jq -nr --argjson width 81 --argjson height 5 -f cantor.jq
 
 
=={{header|Julia}}==
{{trans|AWK}}
<langsyntaxhighlight lang="julia">const width = 81
const height = 5
 
Line 2,422 ⟶ 2,848:
print(Char(lines[i, j]), j == width ? "\n" : "")
end
</langsyntaxhighlight>{{out}}
<pre>
#################################################################################
Line 2,430 ⟶ 2,856:
# # # # # # # # # # # # # # # #
</pre>
 
=={{header|Kotlin}}==
Simple terminal drawing.
<langsyntaxhighlight lang="scala">// Version 1.2.31
 
const val WIDTH = 81
Line 2,453 ⟶ 2,878:
cantor(0, WIDTH, 1)
lines.forEach { println(it) }
}</langsyntaxhighlight>
 
{{output}}
Line 2,463 ⟶ 2,888:
* * * * * * * * * * * * * * * *
</pre>
 
=={{header|Lua}}==
{{trans|python}}
<langsyntaxhighlight lang="lua">local WIDTH = 81
local HEIGHT = 5
local lines = {}
Line 2,511 ⟶ 2,935:
end
print()
end</langsyntaxhighlight>
{{out}}
<pre>*********************************************************************************
Line 2,519 ⟶ 2,943:
* * * * * * * * * * * * * * * *</pre>
=={{header|Mathematica}}/{{header|Wolfram Language}}==
<langsyntaxhighlight Mathematicalang="mathematica">Graphics[MeshPrimitives[CantorMesh[#],1]/.{x_}:>{x,-0.05#}&/@Range[5],ImageSize->600]</langsyntaxhighlight>
{{out}}
A graphic of a Cantor set is shown
 
=={{header|MiniScript}}==
<syntaxhighlight lang="miniscript">
cantorSet = function(start, length, depth)
if depth == 0 then return [[start, start+length - 1]]
newLen = length / 3
leftInterval = cantorSet(start, newLen, depth - 1)
rightInterval = cantorSet(start + 2 * newLen, newLen, depth - 1)
return leftInterval + rightInterval
end function
 
for depth in range(0, 4)
output =[" "] * 81
segments = cantorSet(1, 81,depth)
for segment in segments
for x in range(segment[0] - 1, segment[1]-1)
output[x] = "#"
end for
end for
print output.join("")
end for
</syntaxhighlight>
{{out}}
<pre>
#################################################################################
########################### ###########################
######### ######### ######### #########
### ### ### ### ### ### ### ###
# # # # # # # # # # # # # # # #
</pre>
 
=={{header|Modula-2}}==
{{trans|Kotlin}}
<langsyntaxhighlight lang="modula2">MODULE Cantor;
FROM Terminal IMPORT Write,WriteLn,ReadChar;
 
Line 2,576 ⟶ 3,033:
 
ReadChar;
END Cantor.</langsyntaxhighlight>
 
=={{header|Nim}}==
{{trans|Kotlin}}
 
<langsyntaxhighlight Nimlang="nim">import strutils
 
const
Line 2,601 ⟶ 3,057:
cantor(0, Width, 1)
for line in lines:
echo line</langsyntaxhighlight>
 
{{Out}}
Line 2,609 ⟶ 3,065:
*** *** *** *** *** *** *** ***
* * * * * * * * * * * * * * * *</pre>
 
=={{header|Objeck}}==
{{trans|Java}}
<langsyntaxhighlight lang="objeck">class CantorSet {
WIDTH : static : Int;
HEIGHT : static : Int;
Line 2,657 ⟶ 3,112:
};
}
}</langsyntaxhighlight>
 
{{Output}}
Line 2,667 ⟶ 3,122:
* * * * * * * * * * * * * * * *
</pre>
 
=={{header|Perl}}==
{{trans|Raku}}
<langsyntaxhighlight Perllang="perl">use strict;
use feature 'say';
 
Line 2,697 ⟶ 3,151:
}
 
say for cantor(5);</langsyntaxhighlight>
 
{{Out}}
Line 2,707 ⟶ 3,161:
 
===regex version===
<langsyntaxhighlight lang="perl">#!/usr/bin/perl -l
 
use strict; # https://rosettacode.org/wiki/Cantor_set
Line 2,714 ⟶ 3,168:
$_ = '#' x 81;
 
1 while print, s/(#+)\1\1/ $1 . $1 =~ tr!#! !r . $1 /ge;</langsyntaxhighlight>
{{out}}
<pre>
Line 2,723 ⟶ 3,177:
# # # # # # # # # # # # # # # #
</pre>
 
=={{header|Phix}}==
Based on Algol 68, but even simpler, shorter, and sweeter!
<!--<langsyntaxhighlight Phixlang="phix">(phixonline)-->
<span style="color: #004080;">integer</span> <span style="color: #000000;">n</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">5</span><span style="color: #0000FF;">,</span>
<span style="color: #000000;">w</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">power</span><span style="color: #0000FF;">(</span><span style="color: #000000;">3</span><span style="color: #0000FF;">,</span><span style="color: #000000;">n</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">),</span>
Line 2,743 ⟶ 3,196:
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span>
<!--</langsyntaxhighlight>-->
{{out}}
<pre>
Line 2,752 ⟶ 3,205:
# # # # # # # # # # # # # # # #
</pre>
 
=={{header|Phixmonti}}==
<langsyntaxhighlight Phixmontilang="phixmonti">include ..\Utilitys.pmt
 
5 >ps
Line 2,774 ⟶ 3,226:
cps
line ?
endfor</langsyntaxhighlight>
Other solution
<langsyntaxhighlight Phixmontilang="phixmonti">include ..\Utilitys.pmt
 
5 >ps
Line 2,792 ⟶ 3,244:
endfor
endfor
line ?</langsyntaxhighlight>
{{out}}
<pre>#################################################################################
Line 2,801 ⟶ 3,253:
 
=== Press any key to exit ===</pre>
=={{header|PL/M}}==
{{works with|8080 PL/M Compiler}} ... under CP/M (or an emulator)
<syntaxhighlight lang="plm">
100H: /* DRAW A CANTOR SET USING ASCII */
 
/* BDOS SYSTEM CALL AND I/O ROUTINES */
BDOS: PROCEDURE( F, A ); DECLARE F BYTE, A ADDRESS; GOTO 5; END;
PR$CHAR: PROCEDURE( C ); DECLARE C BYTE; CALL BDOS( 2, C ); END;
PR$NL: PROCEDURE; CALL PR$CHAR( 0DH ); CALL PR$CHAR( 0AH ); END;
 
/* DRAW A CANTOR SET */
 
DECLARE LINES LITERALLY '4';
DECLARE WIDTH LITERALLY '27'; /* MUST BE 3**(LINES-1) */
 
DECLARE LINE (WIDTH)BYTE;
DECLARE ( I, L, C, W, S, SEGMENTS ) BYTE;
 
DO I = 0 TO LAST( LINE );
LINE( I ) = 023H;
CALL PR$CHAR( LINE( I ) );
END;
CALL PR$NL;
W = WIDTH;
SEGMENTS = 1;
DO L = 2 TO LINES;
W = W / 3;
SEGMENTS = SEGMENTS * 3;
C = 0;
DO S = 1 TO SEGMENTS;
DO I = 1 TO W;
IF NOT S THEN LINE( C ) = ' '; /* EVEN SEGMENT - BLANK IT */
CALL PR$CHAR( LINE( C ) );
C = C + 1;
END;
END;
CALL PR$NL;
END;
 
EOF
</syntaxhighlight>
{{out}}
<pre>
###########################
######### #########
### ### ### ###
# # # # # # # #
</pre>
 
=={{header|Processing}}==
<syntaxhighlight lang="java">
//Aamrun, 1st July 2022
 
void cantorSet(int x1,int y1,int x2,int y2,int strWt,int gap,int n){
strokeWeight(strWt);
line(x1,y1,x2,y2);
if(n>0){
cantorSet(x1,gap + y1,(2*x1+x2)/3,gap + (2*y1+y2)/3,strWt,gap,n-1);
cantorSet((2*x2+x1)/3,gap + (2*y2+y1)/3,x2,gap + y2,strWt,gap,n-1);
}
}
 
void setup(){
size(1000,1000);
cantorSet(100,10,900,10,1,10,5);
}
</syntaxhighlight>
 
=={{header|Python}}==
===Imperative===
<langsyntaxhighlight lang="python">WIDTH = 81
HEIGHT = 5
 
Line 2,827 ⟶ 3,346:
for i in xrange(HEIGHT):
beg = WIDTH * i
print ''.join(lines[beg : beg+WIDTH])</langsyntaxhighlight>
{{out}}
<pre>*********************************************************************************
Line 2,837 ⟶ 3,356:
Separating ''(Bool, Int)'' model from ''String'' display:
{{Works with|Python|3.7}}
<langsyntaxhighlight lang="python">'''Cantor set – separating model from display'''
 
from functools import (reduce)
Line 2,910 ⟶ 3,429:
# MAIN ---
if __name__ == '__main__':
main()</langsyntaxhighlight>
{{Out}}
<pre>
Line 2,923 ⟶ 3,442:
{{Trans|Haskell}}
{{Works with|Python|3.7}}
<langsyntaxhighlight lang="python">'''Cantor set – strings as both model and display.'''
 
from itertools import (chain, islice)
Line 2,993 ⟶ 3,512:
# MAIN ---
if __name__ == '__main__':
main()</langsyntaxhighlight>
{{Out}}
<pre>█████████████████████████████████████████████████████████████████████████████████
Line 3,003 ⟶ 3,522:
===Dual representations – fractional and graphic===
{{Works with|Python|3.7}}
<langsyntaxhighlight lang="python">'''A Cantor set generator, and two different
representations of its output.
'''
Line 3,128 ⟶ 3,647:
# MAIN ---
if __name__ == '__main__':
main()</langsyntaxhighlight>
{{Out}}
<pre>(0, 1)
Line 3,139 ⟶ 3,658:
███ ███ ███ ███
█ █ █ █ █ █ █ █</pre>
 
=={{header|QB64}}==
{{trans|FreeBASIC}}
Line 3,145 ⟶ 3,663:
Note: Other languages will need to zero out the a() array. In QB64 all arrays are initialized to zero at program start.
 
<langsyntaxhighlight lang="qb64">_Title "Cantor Set"
 
Dim Shared As Integer sw, sh, wide, high
Line 3,182 ⟶ 3,700:
Next
Next
End Sub</langsyntaxhighlight>
 
=={{header|Quackery}}==
 
===Using an L-System===
 
<langsyntaxhighlight Quackerylang="quackery"> [ $ "" swap witheach
[ nested quackery join ] ] is expand ( $ --> $ )
Line 3,208 ⟶ 3,725:
dip [ 3 / ] ] ]
2drop
</syntaxhighlight>
</lang>
 
{{out}}
Line 3,218 ⟶ 3,735:
q q q q q q q q q q q q q q q q
</pre>
 
 
=={{header|R}}==
[https://creativecommons.org/licenses/by-nc-sa/4.0 Attribution-NonCommercial-ShareAlike 4.0 International, CC BY-NC-SA 4.0] to neonira@gmail.com
 
<syntaxhighlight lang="r">
<lang R>
cantorSet <- function() {
depth <- 6L
Line 3,275 ⟶ 3,790:
list(graph = g, data = df, set = cs)
}
</syntaxhighlight>
</lang>
{{out}}
 
Currently, RosettaCode does not seem to accept image upload anymore.
So, you will have to run the program under R or RStudio IDE to get the diagram result.
 
=={{header|Racket}}==
{{trans|Kotlin}}
 
<langsyntaxhighlight lang="racket">#lang racket/base
;; {trans|Kotlin}}
 
Line 3,308 ⟶ 3,822:
(module+ main
(for-each displayln (Cantor_set)))
</syntaxhighlight>
</lang>
{{out}}
<pre>*********************************************************************************
Line 3,316 ⟶ 3,830:
* * * * * * * * * * * * * * * *
</pre>
 
=={{header|Raku}}==
(formerly Perl 6)
{{trans|Kotlin}}
<syntaxhighlight lang="raku" perl6line>sub cantor ( Int $height ) {
my $width = 3 ** ($height - 1);
 
Line 3,340 ⟶ 3,853:
}
 
.say for cantor(5);</langsyntaxhighlight>
 
{{Out}}
Line 3,348 ⟶ 3,861:
███ ███ ███ ███ ███ ███ ███ ███
█ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █</pre>
 
=={{header|REXX}}==
<langsyntaxhighlight lang="rexx">/*REXX program displays an ASCII diagram of a Canter Set as a set of (character) lines. */
w= linesize() /*obtain the width of the display term.*/
if w==0 then w= 81 /*Can't obtain width? Use the default.*/
Line 3,365 ⟶ 3,877:
say $ /*display a line of the Cantor Set. */
#= # % 3 /*the part (thirds) to be blanked out. */
end /*j*/ /*stick a fork in it, we're all done. */</langsyntaxhighlight>
This REXX program makes use of &nbsp; '''linesize''' &nbsp; REXX program (or BIF) which is used to determine the screen width (or linesize) of the terminal (console).
 
Line 3,391 ⟶ 3,903:
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
</pre>
 
=={{header|Ring}}==
<langsyntaxhighlight lang="ring">
# Project : Cantor set
 
Line 3,445 ⟶ 3,956:
cantor(x+floor(lens*2/3),y,floor(lens/3))
ok
</syntaxhighlight>
</lang>
Output image:
 
[https://www.dropbox.com/s/ap7c3301i0syh4e/CantorSet.jpg?dl=0 Cantor set]
 
=={{header|Ruby}}==
This works by numbering the segments (starting with 0) in base 3. Print whitespace if this number contains the digit 1; a black square otherwise.
<langsyntaxhighlight lang="ruby">lines = 5
 
(0..lines).each do |exp|
Line 3,459 ⟶ 3,969:
puts chars.map{ |c| c * seg_size }.join
end
</syntaxhighlight>
</lang>
{{out}}
<pre>█████████████████████████████████████████████████████████████████████████████████
Line 3,468 ⟶ 3,978:
 
</pre>
 
=={{header|Rust}}==
<langsyntaxhighlight lang="rust">
use convert_base::Convert;
use std::fmt;
Line 3,536 ⟶ 4,045:
}
 
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 3,547 ⟶ 4,056:
 
</pre>
 
=={{header|Scala}}==
===Imperative Programming (Q&D)===
<langsyntaxhighlight Scalalang="scala">object CantorSetQD extends App {
val (width, height) = (81, 5)
 
Line 3,571 ⟶ 4,079:
cantor(0, width, 1)
lines.foreach(l => println(l.mkString))
}</langsyntaxhighlight>
{{Out}}See it in running in your browser by [https://scalafiddle.io/sf/QrqaHeu/0 (JavaScript)]
or by [https://scastie.scala-lang.org/4JTi1zXzRq6H4yUlAYNTSw Scastie (JVM)].
 
===Functional Programming (Recommended)===
<langsyntaxhighlight Scalalang="scala">object CantorSetFP extends App {
val (width, height) = (81, 5)
 
Line 3,607 ⟶ 4,115:
output.map(l => (0 to width).map(pos => if (l contains pos) '*' else ' ').mkString)
.mkString("\n"))
}</langsyntaxhighlight>
{{Out}}See it in running in your browser by [https://scalafiddle.io/sf/szUjPWO/7 (JavaScript)]
or by [https://scastie.scala-lang.org/ZaNUtEOcStuBfJImOnEz5Q Scastie (JVM)].
 
=={{header|Sidef}}==
{{trans|Raku}}
<langsyntaxhighlight lang="ruby">func cantor (height) {
var width = 3**(height - 1)
var lines = height.of { "\N{FULL BLOCK}" * width }
Line 3,633 ⟶ 4,140:
}
 
cantor(5).each { .say }</langsyntaxhighlight>
{{out}}
<pre>
Line 3,642 ⟶ 4,149:
█ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █
</pre>
 
=={{header|Smalltalk}}==
{{works with|GNU Smalltalk}}
Smalltalk represents Intervals' start and stop values as Fraction, so precision is kept for quilte a while.
<langsyntaxhighlight Smalltalklang="smalltalk">Object subclass: CantorSet [
 
| intervals |
Line 3,713 ⟶ 4,219:
]
 
TestCantor iterations: 4.</langsyntaxhighlight>
Output:
<pre>#################################################################################
Line 3,720 ⟶ 4,226:
### ### ### ### ### ### ### ###
# # # # # # # # # # # # # # # #</pre>
=={{header|V (Vlang)}}==
{{trans|Go}}
<syntaxhighlight lang="v (vlang)">const (
width = 81
height = 5
)
fn cantor(mut lines [][]u8, start int, len int, index int) {
seg := len / 3
if seg == 0 {
return
}
for i in index.. height {
for j in start + seg..start + 2 * seg {
lines[i][j] = ' '[0]
}
}
cantor(mut lines, start, seg, index + 1)
cantor(mut lines, start + seg * 2, seg, index + 1)
}
fn main() {
mut lines := [][]u8{len:height, init: []u8{len:width, init:'*'[0]}}
cantor(mut lines, 0, width, 1)
for line in lines {
println(line.bytestr())
}
}</syntaxhighlight>
 
{{out}}
<pre>
*********************************************************************************
*************************** ***************************
********* ********* ********* *********
*** *** *** *** *** *** *** ***
* * * * * * * * * * * * * * * *
</pre>
 
=={{header|Visual Basic .NET}}==
{{trans|C#}}
<langsyntaxhighlight lang="vbnet">Module Module1
 
Const WIDTH = 81
Line 3,762 ⟶ 4,305:
End Sub
 
End Module</langsyntaxhighlight>
{{out}}
<pre>*********************************************************************************
Line 3,769 ⟶ 4,312:
*** *** *** *** *** *** *** ***
* * * * * * * * * * * * * * * *</pre>
 
=={{header|VTL-2}}==
<syntaxhighlight lang="vtl2">
1010 L=4
1020 I=1
1030 X=1
1040 I=I+1
1050 X=X*3
1060 #=I<L*1040
2010 I=0
2020 :I)=35
2030 $=:I)
2040 I=I+1
2050 #=I<X*2020
2060 ?=""
2070 W=X
2080 G=1
2090 W=W/3
2100 G=G*3
2110 S=1
2120 C=0
2130 I=1
2140 #=S/2*0+%=1*2160
2150 :C)=32
2160 $=:C)
2170 C=C+1
2180 I=I+1
2190 #=W>I*2140
2200 S=S+1
2210 #=C<X*2130
2220 ?=""
2230 L=L-1
2240 #=1<L*2090
</syntaxhighlight>
{{out}}
<pre>
###########################
######### #########
### ### ### ###
# # # # # # # #
</pre>
 
=={{header|Wren}}==
{{trans|Kotlin}}
<langsyntaxhighlight ecmascriptlang="wren">var width = 81
var height = 5
 
Line 3,790 ⟶ 4,374:
 
cantor.call(0, width, 1)
for (i in 0...height) System.print(lines[i].join())</langsyntaxhighlight>
 
{{out}}
Line 3,801 ⟶ 4,385:
</pre>
 
=={{header|XPL0}}==
<syntaxhighlight lang="xpl0">proc Cantor(N, LineSeg, Len); \Delete middle third of LineSeg
int N; char LineSeg; int Len, Third, I;
[if N>0 and Len>1 then
[Third:= Len/3;
for I:= Third, 2*Third-1 do LineSeg(I):= ^ ;
Cantor(N-1, LineSeg, Third);
Cantor(N-1, LineSeg+2*Third, Third);
];
];
 
char LineSeg, N;
[LineSeg:=
"#################################################################################
";
for N:= 0 to 4 do
[Cantor(N, LineSeg, 81);
Text(0, LineSeg);
];
]</syntaxhighlight>
 
{{out}}
<pre>
#################################################################################
########################### ###########################
######### ######### ######### #########
### ### ### ### ### ### ### ###
# # # # # # # # # # # # # # # #
</pre>
=={{header|zkl}}==
<langsyntaxhighlight lang="zkl">const WIDTH=81, HEIGHT=5;
var lines=HEIGHT.pump(List,List.createLong(WIDTH,"\U2588;").copy); // full block
Line 3,814 ⟶ 4,427:
}(0,WIDTH,1);
 
lines.pump(Console.println,"concat");</langsyntaxhighlight>
{{out}}
<pre>
9,476

edits