Diamond
Description of the page content
Conversion of Diamond to several programming languages.
Usually Diamond is the first program converted in the Basics off projects.
This program has been converted to 45 programming languages.
Original
Origin of diamond.bas:
Example included in Vintage BASIC 1.0.3.
http://vintage-basic.net/
10 LINES=17
20 FORI=1TOLINES/2+1
30 FORJ=1TO(LINES+1)/2-I+1:PRINT" ";:NEXT
40 FORJ=1TOI*2-1:PRINT"*";:NEXT
50 PRINT
60 NEXTI
70 FORI=1TOLIVES/2:REM note misspelled variable is the same
75 REM because variables are unique to only two characters
80 FORJ=1TOI+1:PRINT" ";:NEXT
90 FORJ=1TO((LINES+1)/2-I)*2-1:PRINT"*";:NEXT
100 PRINT
110 NEXTI
Output
*
***
*****
*******
*********
***********
*************
***************
*****************
***************
*************
***********
*********
*******
*****
***
*
In 8th
\ Diamond
\ Original version in BASIC:
\ Example included in Vintage BASIC 1.0.3.
\ http://www.vintage-basic.net
\ This version in 8th:
\ Copyright (c) 2023, Marcos Cruz (programandala.net)
\ SPDX-License-Identifier: Fair
\ Written on 2023-03-09.
\ Last modified 20251204T2247+0100.
17 constant lines
: star \ --
"*" . ;
\ Print a star.
: diamond_top \ n --
>r ' space 1 lines 1 n:+ 2 / r@ n:- 1 + loop
' star 1 r> 2 * 1 n:- loop cr ;
\ Print the diamond top part, _n_ lines high.
: diamond_bottom \ n --
>r ' space 1 r@ 1 n:+ loop
' star 1 lines 1 + 2 / r> n:- 2 * 1 n:- loop cr ;
\ Print the diamond bottom part, _n_ lines high.
: app:main \ --
' diamond_top 1 lines 2 / 1 + loop
' diamond_bottom 1 lines 2 / loop ;
In Ada
-- Diamond
--
-- Original version in BASIC:
-- Example included in Vintage BASIC 1.0.3.
-- http://www.vintage-basic.net
--
-- This version in Ada:
-- Copyright (c) 2025, Marcos Cruz (programandala.net)
-- SPDX-License-Identifier: Fair
--
-- Written on 2025-03-19.
--
-- Last modified: 20251204T2258+0100.
with ada.text_io;
use ada.text_io;
procedure diamond is
lines : constant integer := 17;
begin
for i in 1 .. lines / 2 + 1 loop
for j in 1 .. (lines + 1) / 2 - i + 1 loop
put (" ");
end loop;
for j in 1 .. i * 2 - 1 loop
put ("*");
end loop;
new_line;
end loop;
for i in 1 .. lines / 2 loop
for j in 1 .. i + 1 loop
put (" ");
end loop;
for j in 1 .. ((lines + 1) / 2 - i) * 2 - 1 loop
put ("*");
end loop;
new_line;
end loop;
end diamond;
In Arturo
; Diamond
; Original version in BASIC:
; Example included in Vintage BASIC 1.0.3.
; http://www.vintage-basic.net
; This version in Arturo:
; Copyright (c) 2023, Marcos Cruz (programandala.net)
; SPDX-License-Identifier: Fair
;
; Written in 2023-10-16/17.
;
; Last modified: 20251205T0054+0100.
lines: 17
; Print a star.
printStar: function[][ print `*` ]
; Print the diamond top part, _i_ lines high.
diamondTop: function[i][
loop 1 .. (((lines + 1) / 2) - i) + 1 'j [ prints " " ]
loop 1 .. (i * 2) - 1 'j [ prints "*" ]
print ""
]
; Print the diamond bottom part, _i_ lines high.
diamondBottom: function[i][
loop 1 .. i + 1 'j [ prints " " ]
loop 1 .. ((((lines + 1) / 2) - i) * 2) - 1 'j [ prints "*" ]
print ""
]
loop 1 .. (lines / 2) + 1 'i [ diamondTop i ]
loop 1 .. lines / 2 'i [ diamondBottom i ]
In C#
// Diamond
// Original version in BASIC:
// Example included in Vintage BASIC 1.0.3.
// http://www.vintage-basic.net
// This version in C#:
// Copyright (c) 2024, Marcos Cruz (programandala.net)
// SPDX-License-Identifier: Fair
//
// Written on 2024-12-20.
//
// Last modified 20251205T1534+0100.
using System;
class Diamond
{
static void Main()
{
const int LINES = 17;
int i = 1;
int j = 0;
i = 1;
while (i <= LINES / 2 + 1)
{
j = 1;
while (j <= (LINES + 1) / 2 - i + 1)
{
Console.Write(" ");
j += 1;
}
j = 1;
while (j <= i * 2 - 1)
{
Console.Write("*");
j += 1;
}
Console.WriteLine();
i += 1;
}
i = 1;
while (i <= LINES / 2)
{
j = 1;
while (j <= i + 1)
{
Console.Write(" ");
j += 1;
}
j = 1;
while (j <= ((LINES + 1) / 2 - i) * 2 - 1)
{
Console.Write("*");
j += 1;
}
Console.WriteLine();
i += 1;
}
}
}
In C3
/*
Diamond
Original version in BASIC:
Example included in Vintage BASIC 1.0.3.
http://www.vintage-basic.net
This version in C3:
Copyright (c) 2025, Marcos Cruz (programandala.net)
SPDX-License-Identifier: Fair
Written on 2025-03-05.
Last modified 20250305T0221+0100.
*/
import std::io;
const int LINES = 17;
fn void main() {
for (int i = 1; i < LINES / 2 + 2; i += 1) {
for (int j = 1; j < (LINES + 1) / 2 - i + 2; j += 1) {
io::print(" ");
}
for (int j = 1; j < i * 2; j += 1) {
io::print("*");
}
io::printn();
}
for (int i = 1; i < LINES / 2 + 1; i += 1) {
for (int j; j < i + 1; j += 1) {
io::print(" ");
}
for (int j = 1; j < ((LINES + 1) / 2 - i) * 2; j += 1) {
io::print("*");
}
io::printn();
}
}
In Chapel
/*
Diamond
Original version in BASIC:
Example included in Vintage BASIC 1.0.3.
http://www.vintage-basic.net
This version in Chapel:
Copyright (c) 2025, Marcos Cruz (programandala.net)
SPDX-License-Identifier: Fair
Written on 2025-01-19, 2025-04-04.
Last modified 20250405T2002+0200.
*/
import IO;
param lines = 17;
proc main() {
for i in 1 ..< lines / 2 + 2 {
for 1 ..< (lines + 1) / 2 - i + 2 {
write(" ");
}
for 1 ..< i * 2 {
write("*");
}
writeln();
}
for i in 1 ..< lines / 2 + 1 {
for 1 ..< i + 2 {
write(" ");
}
for 1 ..< ((lines + 1) / 2 - i) * 2 {
write("*");
}
writeln();
}
}
In Clojure
;; Diamond
;; Original version in BASIC:
;; Example included in Vintage BASIC 1.0.3.
;; http://www.vintage-basic.net
;; This version in Clojure:
;; Copyright (c) 2024, Marcos Cruz (programandala.net)
;; SPDX-License-Identifier: Fair
;;
;; Written on 2024-12-10.
;;
;; Last modified 20241210T2145+0100.
(def lines 17)
(dotimes [i (+ (/ lines 2) 1)]
(do
(dotimes [j (+ (- (/ (+ lines 1) 2) (+ i 1)) 1)]
(print " "))
(dotimes [j (- (* (+ i 1) 2) 1)]
(print "*"))
(println)))
(dotimes [i (/ lines 2)]
(do
(dotimes [j (+ i 2)]
(print " "))
(dotimes [j (- (* (- (/ (+ lines 1) 2) (+ i 1)) 2) 1)]
(print "*"))
(println)))
In Crystal
# Diamond
# Original version in BASIC:
# Example included in Vintage BASIC 1.0.3.
# http://www.vintage-basic.net
# This version in Crystal:
# Copyright (c) 2023, Marcos Cruz (programandala.net)
# SPDX-License-Identifier: Fair
#
# Written in 2023-09.
#
# Last modified: 20231104T0010+0100.
LINES = 17
(1..(LINES / 2 + 1)).each do |i|
(1..((LINES + 1) / 2 - i + 1)).each do
print ' '
end
(1..(i * 2 - 1)).each do
print '*'
end
puts
end
(1..(LINES / 2)).each do |i|
(1..(i + 1)).each do
print ' '
end
(1..(((LINES + 1) / 2 - i) * 2 - 1)).each do
print '*'
end
puts
end
In D
/*
Diamond
Original version in BASIC:
Example included in Vintage BASIC 1.0.3.
http://www.vintage-basic.net
This version in D:
Copyright (c) 2023, Marcos Cruz (programandala.net)
SPDX-License-Identifier: Fair
Written in 2023-03-22/26.
Last modified 20251219T2131+0100.
*/
module diamond;
void main()
{
import std.stdio : write;
import std.stdio : writeln;
enum lines = 17;
foreach (i; 1 .. lines / 2 + 2)
{
foreach (j; 1 .. (lines + 1) / 2 - i + 2)
{
write(" ");
}
foreach (j; 1 .. i * 2)
{
write("*");
}
writeln();
}
foreach (i; 1 .. lines / 2 + 1)
{
foreach (j; 1 .. i + 2)
{
write(" ");
}
foreach (j; 1 .. ((lines + 1) / 2 - i) * 2)
{
write("*");
}
writeln();
}
}
In Elixir
# Diamond
# Original version in BASIC:
# Example included in Vintage BASIC 1.0.3.
# http://www.vintage-basic.net
# This version in Elixir:
# Copyright (c) 2026, Marcos Cruz (programandala.net)
# SPDX-License-Identifier: Fair
#
# Written on 2026-01-13
#
# Last modified: 20260113T2101+0100.
defmodule Diamond do
def lines do
17
end
defp print_char(number, max_number, char) do
if number == max_number do
:ok
else
IO.write(char)
print_char(number + 1, max_number, char)
end
end
def print_top_line(line, max_line) do
if line == max_line do
:ok
else
print_char(1, div((Diamond.lines + 1), 2) - line + 2, " ")
print_char(1, line * 2, "*")
IO.puts("")
print_top_line(line + 1, max_line)
end
end
def print_bottom_line(line, max_line) do
if line == max_line do
:ok
else
print_char(1, line + 2, " ")
print_char(1, (div((Diamond.lines + 1), 2) - line) * 2, "*")
IO.puts("")
print_bottom_line(line + 1, max_line)
end
end
end
Diamond.print_top_line(1, div(Diamond.lines, 2) + 2)
Diamond.print_bottom_line(1, div(Diamond.lines, 2) + 1)
In F#
// Diamond
// Original version in BASIC:
// Example included in Vintage BASIC 1.0.3.
// http://www.vintage-basic.net
// This version in F#:
// Copyright (c) 2024, Marcos Cruz (programandala.net)
// SPDX-License-Identifier: Fair
//
// Written on 2024-12-30.
//
// Last modified 20241230T1639+0100.
[<EntryPoint>]
let main argv =
let LINES = 17
let mutable i = 1
let mutable j = 1
while i <= LINES / 2 + 1 do
j <- 1
while j <= (LINES + 1) / 2 - i + 1 do
printf " "
j <- j + 1
j <- 1
while j <= i * 2 - 1 do
printf "*"
j <- j + 1
printfn ""
i <- i + 1
i <- 1
while i <= LINES / 2 do
j <- 1
while j <= i + 1 do
printf " "
j <- j + 1
j <- 1
while j <= ((LINES + 1) / 2 - i) * 2 - 1 do
printf "*"
j <- j + 1
printfn ""
i <- i + 1
0 // integer exit code
// vim: filetype=fsharp
In Factor
! Diamond
! Original version in BASIC:
! Example included in Vintage BASIC 1.0.3.
! http://www.vintage-basic.net
! This version in Factor:
! Copyright (c) 2024, Marcos Cruz (programandala.net)
! SPDX-License-Identifier: Fair
! Written on 2024-11-30, 2024-12-03.
! Last modified 20241203T0106+0100.
USING: io math ranges sequences ;
IN: diamond
CONSTANT: lines 17
: print-star ( -- )
"*" write ;
: print-space ( -- )
" " write ;
: end-line ( -- )
"" print ;
:: print-top ( height -- )
lines 1 + 2 / height - 1 + [ print-space ] times
height 2 * 1 - [ print-star ] times end-line ;
! Print the diamond top part, with the given _height_.
:: print-bottom ( height -- )
height 1 + [ print-space ] times
lines 1 + 2 / height - 2 * 1 - [ print-star ] times end-line ;
! Print the diamond bottom part, with the given _height_.
: run ( -- )
lines 2 / 1 + [1..b] [ print-top ] each
lines 2 / [1..b] [ print-bottom ] each ;
MAIN: run
In FreeBASIC
/'
Diamond
Original version in BASIC:
Example included in Vintage BASIC 1.0.3.
http://www.vintage-basic.net
This version in FreeBASIC:
Copyright (c) 2024, Marcos Cruz (programandala.net)
SPDX-License-Identifier: Fair
Written on 2024-11-20.
Last modified: 20241120T1840+0100.
'/
const lines as integer = 17
dim i as integer = 0
dim j as integer = 0
for i = 1 to lines / 2 + .5
for j = 1 to (lines + 1) / 2 - i + 1
print " ";
next
for j = 1 to i * 2 - 1
print "*";
next
print
next
for i = 1 to lines / 2
for j = 1 to i + 1
print " ";
next
for j = 1 to ((lines + 1) / 2 - i) * 2 - 1
print "*";
next
print
next
' vim: filetype=freebasic
In Gleam
// Diamond
// Original version in BASIC:
// Example included in Vintage BASIC 1.0.3.
// http://www.vintage-basic.net
// This version in Gleam:
// Copyright (c) 2026, Marcos Cruz (programandala.net)
// SPDX-License-Identifier: Fair
//
// Written in 2026-01-12/13.
//
// Last modified 20260207T0111+0100.
import gleam/io
const lines = 17
fn print_character(number: Int, max_number: Int, char: String) {
case number == max_number {
True -> Nil
False -> {
io.print(char)
print_character(number + 1, max_number, char)
}
}
}
fn print_top_line(line: Int, max_line: Int) {
case line == max_line {
True -> Nil
False -> {
print_character(1, {lines + 1} / 2 - line + 2, " ")
print_character(1, line * 2, "*")
io.println("")
print_top_line(line + 1, max_line)
}
}
}
fn print_bottom_line(line: Int, max_line: Int) {
case line == max_line {
True -> Nil
False -> {
print_character(1, line + 2, " ")
print_character(1, {{lines + 1} / 2 - line} * 2, "*")
io.println("")
print_bottom_line(line + 1, max_line)
}
}
}
pub fn main() {
print_top_line(1, lines / 2 + 2)
print_bottom_line(1, lines / 2 + 1)
}
In Go
/*
Diamond
Original version in BASIC:
Example included in Vintage BASIC 1.0.3.
http://www.vintage-basic.net
This version in Go:
Copyright (c) 2024, Marcos Cruz (programandala.net)
SPDX-License-Identifier: Fair
Written on 2024-12-28.
Last modified: 20241231T0218+0100.
*/
package main
import "fmt"
const lines int = 17
func main() {
for i := 1; i <= lines/2+1; i++ {
for j := 1; j <= (lines+1)/2-i+1; j++ {
fmt.Print(" ")
}
for j := 1; j <= i*2-1; j++ {
fmt.Print("*")
}
fmt.Println()
}
for i := 1; i <= lines/2; i++ {
for j := 1; j <= i+1; j++ {
fmt.Print(" ")
}
for j := 1; j <= ((lines+1)/2-i)*2-1; j++ {
fmt.Print("*")
}
fmt.Println()
}
}
In Hare
// Diamond
// Original version in BASIC:
// Example included in Vintage BASIC 1.0.3.
// http://www.vintage-basic.net
// This version in Hare (v0.24.2):
// Copyright (c) 2024, Marcos Cruz (programandala.net)
// SPDX-License-Identifier: Fair
// Written in 2024-12-14/15.
// Last modified: 20260213T1645+0100.
use fmt;
def LINES = 17;
export fn main() void = {
for (let i = 1; i <= LINES / 2 + 1; i += 1) {
for (let j = 1; j <= (LINES + 1) / 2 - i + 1; j += 1) {
fmt::print(" ")!;
};
for (let j = 1; j <= i * 2 - 1; j += 1) {
fmt::print("*")!;
};
fmt::println()!;
};
for (let i = 1; i <= LINES / 2; i += 1) {
for (let j = 1; j <= i + 1; j += 1) {
fmt::print(" ")!;
};
for (let j = 1; j <= ((LINES + 1) / 2 - i) * 2 - 1; j += 1) {
fmt::print("*")!;
};
fmt::println()!;
};
};
In Icon
# Diamond
#
# Original version in BASIC:
# Example included in Vintage BASIC 1.0.3.
# http://www.vintage-basic.net
#
# This version in Icon:
# Copyright (c) 2023, Marcos Cruz (programandala.net)
# SPDX-License-Identifier: Fair
#
# Written in 2023-03-03.
#
# Last modified 20231103T2342+0100.
$define lines 17
procedure main()
every i := 1 to lines / 2 + 1 do {
every j := 1 to (lines + 1) / 2 - i + 1 do writes(" ")
every j := 1 to i * 2 - 1 do writes("*")
write()
}
every i := 1 to lines / 2 do {
every j := 1 to i + 1 do writes(" ")
every j := 1 to ((lines + 1) / 2 - i) * 2 - 1 do writes("*")
write()
}
end
In Io
#!/usr/bin/env io
/*
Diamond
Original version in BASIC:
Example included in Vintage BASIC 1.0.3.
http://www.vintage-basic.net
This version in Io:
Copyright (c) 2024, Marcos Cruz (programandala.net)
SPDX-License-Identifier: Fair
Written on 2024-12-02.
Last modified: 20241202T0206+0100.
*/
LINES := 17
for(i, 1, LINES / 2 + 1,
for(j, 1, (LINES + 1) / 2 - i + 1,
" " print
)
for(j, 1, i * 2 - 1,
"*" print
)
"" println
)
for(i, 1, LINES / 2,
for(j, 1, i + 1,
" " print
)
for(j, 1, ((LINES + 1) / 2 - i) * 2 - 1,
"*" print
)
"" println
)
In Janet
# Diamond
# Original version in BASIC:
# Example included in Vintage BASIC 1.0.3.
# http://www.vintage-basic.net
# This version in Janet:
# Copyright (c) 2025, Marcos Cruz (programandala.net)
# SPDX-License-Identifier: Fair
#
# Written on 2025-12-22.
#
# Last modified 20251223T1903+0100.
(defn main [& args]
(def lines 17)
(for i 1 (+ (/ lines 2) 1)
(for j 1 (+ (- (/ (+ lines 1) 2) i) 2)
(prin " "))
(for j 1 (* i 2)
(prin "*"))
(print))
(for i 1 (/ lines 2)
(for j 1 (+ i 2)
(prin " "))
(for j 1 (* (- (/ (+ lines 1) 2) i) 2)
(prin "*"))
(print)))
In Julia
# Diamond
# Original version in BASIC:
# Example included in Vintage BASIC 1.0.3.
# http://www.vintage-basic.net
# This version in Julia:
# Copyright (c) 2023, Marcos Cruz (programandala.net)
# SPDX-License-Identifier: Fair
# Written on 2023-07-08.
# Last modified: 20241029T1615+0100.
lines = 17
for i = 1 : lines / 2 + 1
for j = 1 : (lines + 1) / 2 - i + 1
print(" ")
end
for j = 1 : i * 2 - 1
print("*")
end
println()
end
for i = 1 : lines / 2
for j = 1 : i + 1
print(" ")
end
for j = 1 : ((lines + 1) / 2 - i) * 2 - 1
print("*")
end
println()
end
In Kotlin
/*
Diamond
Original version in BASIC:
Example included in Vintage BASIC 1.0.3.
http://www.vintage-basic.net
This version in Kotlin:
Copyright (c) 2023, Marcos Cruz (programandala.net)
SPDX-License-Identifier: Fair
Written in 2023-08, 2023-10.
Last modified: 20231104T0030+0100.
*/
fun main() {
val lines = 17
var i = 1
var j: Int
while (i <= lines / 2 + 1) {
j = 1
while (j <= (lines + 1) / 2 - i + 1) {
print(" ")
j += 1
}
j = 1
while (j <= i * 2 - 1) {
print("*")
j += 1
}
println()
i += 1
}
i = 1
while (i <= lines / 2) {
j = 1
while (j <= i + 1) {
print(" ")
j += 1
}
j = 1
while (j <= ((lines + 1) / 2 - i) * 2 - 1) {
print("*")
j += 1
}
println()
i += 1
}
}
In Lobster
/*
Diamond
Original version in BASIC:
Example included in Vintage BASIC 1.0.3.
http://www.vintage-basic.net
This version in Lobster:
Copyright (c) 2023, Marcos Cruz (programandala.net)
SPDX-License-Identifier: Fair
Written on 2023-09-16.
Last modified 20250318T1528+0100.
*/
let LINES = 17
var i = 1
while i <= int(LINES / 2 + 1):
let indent = repeat_string(" ", int((LINES + 1) / 2) - i + 1)
let stars = repeat_string("*", i * 2 - 1)
print(concat_string([ indent, stars ], ""))
i += 1
i = 1
while i <= int(LINES / 2):
let indent = repeat_string(" ", i + 1)
let stars = repeat_string("*", (int((LINES + 1) / 2) - i) * 2 - 1)
print(concat_string([ indent, stars ], ""))
i += 1
In Nature
/*
Diamond
Original version in BASIC:
Example included in Vintage BASIC 1.0.3.
http://www.vintage-basic.net
This version in Nature:
Copyright (c) 2025, Marcos Cruz (programandala.net)
SPDX-License-Identifier: Fair
Written on 2025-12-21.
Last modified: 20251221T1724+0100.
*/
const LINES = 17
fn main() {
for int i = 1; i <= LINES / 2 + 1; i += 1 {
for int j = 1; j <= (LINES + 1) / 2 - i + 1; j += 1 {
print(" ")
}
for int j = 1; j <= i * 2 - 1; j += 1 {
print("*")
}
println()
}
for int i = 1; i <= LINES / 2; i += 1 {
for int j = 1; j <= i + 1; j += 1 {
print(" ")
}
for int j = 1; j <= ((LINES + 1) / 2 - i) * 2 - 1; j += 1 {
print("*")
}
println()
}
}
In Neat
/*
Diamond
Original version in BASIC:
Example included in Vintage BASIC 1.0.3.
http://www.vintage-basic.net
This version in Neat:
Copyright (c) 2025, Marcos Cruz (programandala.net)
SPDX-License-Identifier: Fair
Written on 2025-12-05.
Last modified 20251217T1224+0100.
*/
module diamond;
import std.stdio : print;
void main()
{
int lines = 17;
mut string row;
for (int i in 1 .. lines / 2 + 2)
{
for (int j in 1 .. (lines + 1) / 2 - i + 2)
{
row ~= " ";
}
for (int j in 1 .. i * 2)
{
row ~= "*";
}
print(row);
row = "";
}
for (int i in 1 .. lines / 2 + 1)
{
for (int j in 1 .. i + 2)
{
row ~= " ";
}
for (int j in 1 .. ((lines + 1) / 2 - i) * 2)
{
row ~= "*";
}
print(row);
row = "";
}
}
In Neko
/*
Diamond
Original version in BASIC:
Example included in Vintage BASIC 1.0.3.
http://www.vintage-basic.net
This version in Neko:
Copyright (c) 2023, Marcos Cruz (programandala.net)
SPDX-License-Identifier: Fair
Written on 2023-08-04.
Last modified 20231103T2253+0100.
*/
var lines = 17;
var i;
var j;
i = 1;
while i <= lines / 2 + 1 {
j = 1;
while j <= (lines + 1) / 2 - i + 1 {
$print(" ");
j += 1
}
j = 1;
while j <= i * 2 - 1 {
$print("*");
j += 1
}
$print("\n");
i += 1
}
i = 1;
while i <= lines / 2 {
j = 1;
while j <= i + 1 {
$print(" ");
j += 1
}
j = 1;
while j <= ((lines + 1) / 2 - i) * 2 - 1 {
$print("*");
j += 1
}
$print("\n");
i += 1
}
In Nim
#[
Diamond
Original version in BASIC:
Example included in Vintage BASIC 1.0.3.
http://www.vintage-basic.net
This version in Nim:
Copyright (c) 2023, Marcos Cruz (programandala.net)
SPDX-License-Identifier: Fair
Written in 2023-07-18/19, 2023-08-27.
Last modified: 20250405T0302+0200.
]#
const Lines = 17
for i in 1 .. int(Lines / 2 + 1):
for j in 1 .. int((Lines + 1) / 2) - i + 1:
write(stdout, " ")
for j in 1 .. i * 2 - 1:
write(stdout, "*")
writeLine(stdout, "")
for i in 1 .. int(Lines / 2):
for j in 1 .. i + 1:
write(stdout, " ")
for j in 1 .. (int((Lines + 1) / 2) - i) * 2 - 1:
write(stdout, "*")
writeLine(stdout, "")
In Nit
# Diamond
# Original version in BASIC:
# Example included in Vintage BASIC 1.0.3.
# http://www.vintage-basic.net
# This version in Nit:
# Copyright (c) 2024, Marcos Cruz (programandala.net)
# SPDX-License-Identifier: Fair
# Written on 2024-11-25.
# Last modified: 20241126T1523+0100.
var lines = 17
for i in [1 .. lines / 2 + 1] do
for j in [1 .. (lines + 1) / 2 - i + 1] do
printn " "
end
for j in [1 .. i * 2 - 1] do
printn "*"
end
print ""
end
for i in [1 .. lines / 2] do
for j in [1 .. i + 1] do
printn " "
end
for j in [1 .. ((lines + 1) / 2 - i) * 2 - 1] do
printn "*"
end
print ""
end
In OCaml
(*
Diamond
Original version in BASIC:
Example included in Vintage BASIC 1.0.3.
http://www.vintage-basic.net
This version in OCaml:
Copyright (c) 2023, Marcos Cruz (programandala.net)
SPDX-License-Identifier: Fair
Written in 2023-10-19/20.
Last modified 20231103T2323+0100.
*)
let lines = 17;;
let i = ref 0 in
while !i <= lines / 2 + 1 do
let j = ref 1 in
while !j <= (lines + 1) / 2 - !i + 1 do
print_string " ";
j := !j + 1
done;
let j = ref 1 in
while !j <= !i * 2 - 1 do
print_string "*";
j := !j + 1
done;
print_newline();
i := !i + 1
done;;
let i = ref 1 in
while !i <= lines / 2 do
let j = ref 1 in
while !j <= !i + 1 do
print_string " ";
j := !j + 1
done;
let j = ref 1 in
while !j <= ((lines + 1) / 2 - !i) * 2 - 1 do
print_string "*";
j := !j + 1
done;
print_newline();
i := !i + 1
done;;
In Odin
/*
Diamond
Original version in BASIC:
Example included in Vintage BASIC 1.0.3.
http://www.vintage-basic.net
This version in Odin:
Copyright (c) 2023, Marcos Cruz (programandala.net)
SPDX-License-Identifier: Fair
Written on 2023-03-01.
Last modified: 20241226T2046+0100.
*/
package diamond
import "core:fmt"
LINES :: 17
main :: proc() {
for i in 1 ..= LINES / 2 + 1 {
for _ in 1 ..= (LINES + 1) / 2 - i + 1 {
fmt.print(" ")
}
for _ in 1 ..= i * 2 - 1 {
fmt.print("*")
}
fmt.println()
}
for i in 1 ..= LINES / 2 {
for _ in 1 ..= i + 1 {
fmt.print(" ")
}
for _ in 1 ..= ((LINES + 1) / 2 - i) * 2 - 1 {
fmt.print("*")
}
fmt.println()
}
}
In Pike
#! /usr/bin/env pike
// Diamond
// Original version in BASIC:
// Example included in Vintage BASIC 1.0.3.
// http://www.vintage-basic.net
// This version in Pike:
// Copyright (c) 2024, Marcos Cruz (programandala.net)
// SPDX-License-Identifier: Fair
// Written on 2024-12-17.
// Last modified: 20250310T0308+0100
constant LINES = 17;
void main() {
for (int i = 1; i <= LINES / 2 + 1; i += 1) {
for (int j = 1; j <= (LINES + 1) / 2 - i + 1; j += 1)
write(" ");
for (int j = 1; j <= i * 2 - 1; j += 1)
write("*");
write("\n");
}
for (int i = 1; i <= LINES / 2; i += 1) {
for (int j = 1; j <= i + 1; j += 1)
write(" ");
for (int j = 1; j <= ((LINES + 1) / 2 - i) * 2 - 1; j += 1)
write("*");
write("\n");
}
}
In Pony
// Diamond
//
// Original version in BASIC:
// Example included in Vintage BASIC 1.0.3.
// http://www.vintage-basic.net
//
// This version in Pony:
// Copyright (c) 2026, Marcos Cruz (programandala.net)
// SPDX-License-Identifier: Fair
//
// Written on 2026-02-07.
//
// Last modified: 20260207T1336+0100.
use "collections" // Range
actor Main
new create(env: Env) =>
let lines: I64 = 17
for i in Range[I64](1, (lines / 2) + 2) do
for j in Range[I64](1, (((lines + 1) / 2) - i) + 2) do
env.out.write(" ")
end
for j in Range[I64](1, i * 2) do
env.out.write("*")
end
env.out.print("")
end
for i in Range[I64](1, (lines / 2) + 1) do
for j in Range[I64](1, i + 2) do
env.out.write(" ")
end
for j in Range[I64](1, ((((lines + 1) / 2) - i) * 2)) do
env.out.write("*")
end
env.out.print("")
end
In Python
# Diamond
# Original version in BASIC:
# Example included in Vintage BASIC 1.0.3.
# http://www.vintage-basic.net
# This version in Python:
# Copyright (c) 2024, Marcos Cruz (programandala.net)
# SPDX-License-Identifier: Fair
#
# Written on 2024-10-29.
#
# Last modified: 20241203T2230+0100.
import math
LINES = 17
for i in range(1, math.floor(LINES / 2 + 1) + 1):
for j in range(1, math.floor((LINES + 1) / 2 - i + 1) + 1):
print(" ", end = "")
for j in range(1, i * 2):
print("*", end = "")
print()
for i in range(1, math.floor(LINES / 2) + 1):
for j in range(1, i + 2):
print(" ", end = "")
for j in range(1, math.floor(((LINES + 1) / 2 - i) * 2 - 1) + 1):
print("*", end = "")
print()
In Racket
#! /usr/bin/env racket
#|
Diamond
Original version in BASIC:
Example included in Vintage BASIC 1.0.3.
http://www.vintage-basic.net
This version in Racket:
Copyright (c) 2023, Marcos Cruz (programandala.net)
SPDX-License-Identifier: Fair
Written in 2023-08-22/23.
Last modified 20260106T0911+0100.
|#
#lang racket/base
(define lines 17)
(for ([i (in-range 1 (+ (/ lines 2) 1))])
(for ([j (in-range 0 (+ (- (/ (+ lines 1) 2) i) 1))])
(write-string " "))
(for ([j (in-range 0 (- (* i 2) 1))])
(write-string "*"))
(write-string "\n"))
(for ([i (in-range 1 (/ lines 2))])
(for ([j (in-range 0 (+ i 1))])
(write-string " "))
(for ([j (in-range 0 (- (* (- (/ (+ lines 1) 2) i) 2) 1))])
(write-string "*"))
(write-string "\n"))
In Raku
# Diamond
# Original version in BASIC:
# Example included in Vintage BASIC 1.0.3.
# http://www.vintage-basic.net
# This version in Raku:
# Copyright (c) 2024, Marcos Cruz (programandala.net)
# SPDX-License-Identifier: Fair
# Written on 2024-12-02.
# Last modified: 20241211T1235+0100.
constant $LINES = 17;
for 1..($LINES / 2 + 1) -> $i {
for 1 .. ($LINES + 1) / 2 - $i + 1 -> $j {
print ' ';
}
for 1 .. $i * 2 - 1 -> $j {
print '*';
}
put '';
}
for 1 .. $LINES / 2 -> $i {
for 1 .. $i + 1 -> $j {
print ' ';
}
for 1 .. (($LINES + 1) / 2 - $i) * 2 - 1 -> $j {
print '*';
}
put '';
}
In Retro
Diamond
Original version in BASIC:
Example included in Vintage BASIC 1.0.3.
http://www.vintage-basic.net
This version in Retro:
Copyright (c) 2023, Marcos Cruz (programandala.net)
SPDX-License-Identifier: Fair
Written in 2023-08-01/02.
Last modified 20231103T2320+0100.
~~~
#17 'LINES const
~~~
Print a star:
~~~
:star (-)
$* c:put ;
~~~
Print line _n_ of the diamond top part:
~~~
:top (n-)
#1 + LINES #1 + #2 / over - #1 + [ sp ] times
#2 * #1 - [ star ] times nl ;
~~~
Print line _n_ of the diamond bottom part:
~~~
:bottom (n-)
#1 + dup #1 + [ sp ] times
LINES #1 + #2 / swap - #2 * #1 - [ star ] times nl ;
~~~
Main:
~~~
LINES #2 / dup #1 + [ I top ] indexed-times
[ I bottom ] indexed-times
~~~
In Rexx
/*
Diamond
Original version in BASIC:
Example included in Vintage BASIC 1.0.3.
http://www.vintage-basic.net
This version in Rexx:
Copyright (c) 2025, Marcos Cruz (programandala.net)
SPDX-License-Identifier: Fair
Written on 2025-07-29.
Last modified: 20250729T1741+0200.
*/
lines = 17
do i = 1 to lines / 2 + 1
do j = 1 to (lines + 1) / 2 - i + 1
call charout, " "
end
do j = 1 to i * 2 - 1
call charout, "*"
end
say
end
do i = 1 to lines / 2
do j = 1 to i + 1
call charout, " "
end
do j = 1 to ((lines + 1) / 2 - i) * 2 - 1
call charout, "*"
end
say
end
exit
In Ring
/*
Diamond
Original version in BASIC:
Example included in Vintage BASIC 1.0.3.
http://www.vintage-basic.net
This version in Ring:
Copyright (c) 2024, Marcos Cruz (programandala.net)
SPDX-License-Identifier: Fair
Written on 2024-03-15.
Last modified: 20240315T1537+0100.
*/
LINES = 17
func main
for i = 1 to LINES / 2 + 1
for j = 1 to (LINES + 1) / 2 - i + 1
put " "
next
for j = 1 to i * 2 - 1
put "*"
next
put nl
next
for i = 1 to LINES / 2
for j = 1 to i + 1
put " "
next
for j = 1 to ((LINES + 1) / 2 - i) * 2 - 1
put "*"
next
put nl
next
end
In Rust
/*
Diamond
Original version in BASIC:
Example included in Vintage BASIC 1.0.3.
http://www.vintage-basic.net
This version in Rust:
Copyright (c) 2024, Marcos Cruz (programandala.net)
SPDX-License-Identifier: Fair
Written on 2024-12-26.
Last modified: 20241226T2041+0100.
*/
const LINES:isize = 17;
fn main() {
for i in 1 ..= LINES / 2 + 1 {
for _ in 1 ..= (LINES + 1) / 2 - i + 1 {
print!(" ")
}
for _ in 1 ..= i * 2 - 1 {
print!("*")
}
println!()
}
for i in 1 ..= LINES / 2 {
for _ in 1 ..= i + 1 {
print!(" ")
}
for _ in 1 ..= ((LINES + 1) / 2 - i) * 2 - 1 {
print!("*")
}
println!()
}
}
In Scala
/*
Diamond
Original version in BASIC:
Example included in Vintage BASIC 1.0.3.
http://www.vintage-basic.net
This version in Scala:
Copyright (c) 2023, Marcos Cruz (programandala.net)
SPDX-License-Identifier: Fair
Written on 2023-08-25.
Last modified: 20231103T2352+0100.
*/
val lines = 17
@main def diamond() =
var i = 1
var j = 1
while i <= lines / 2 + 1 do
j = 1
while j <= (lines + 1) / 2 - i + 1 do
print(" ")
j += 1
j = 1
while j <= i * 2 - 1 do
print("*")
j += 1
println()
i += 1
i = 1
while i <= lines / 2 do
j = 1
while j <= i + 1 do
print(" ")
j += 1
j = 1
while j <= ((lines + 1) / 2 - i) * 2 - 1 do
print("*")
j += 1
println()
i += 1
In Scheme
; Diamond
; Original version in BASIC:
; Example included in Vintage BASIC 1.0.3.
; http://www.vintage-basic.net
; This version in Scheme (Bigloo):
; Copyright (c) 2024, 2025, Marcos Cruz (programandala.net)
; SPDX-License-Identifier: Fair
;
; Written on 2024-12-06, 2025-11-29/30.
;
; Last modified 20251205T0113+0100.
(module diamond)
(define lines 17)
(do ((i 1 (+ i 1)))
((> i (+ (/ lines 2) 1)))
(do ((j 1 (+ j 1)))
((> j (+ (- (/ (+ lines 1) 2) i) 1)))
(display " "))
(do ((j 1 (+ j 1)))
((> j (- (* i 2) 1)))
(display "*"))
(newline))
(do ((i 1 (+ i 1)))
((>= i (/ lines 2)))
(do ((j 1 (+ j 1)))
((> j (+ i 1)))
(display " "))
(do ((j 1 (+ j 1)))
((> j (- (* (- (/ (+ lines 1) 2) i) 2) 1)))
(display "*"))
(newline))
In Styx
/*
Diamond
Original version in BASIC:
Example included in Vintage BASIC 1.0.3.
http://www.vintage-basic.net
This version in Styx:
Copyright (c) 2025, Marcos Cruz (programandala.net)
SPDX-License-Identifier: Fair
Written on 2025-09-30, 2025-12-06/07.
Last modified 20251207T0043+0100.
*/
unit diamond;
function main() {
const u32 lines = 17;
foreach const u32 i in 1 .. lines / 2 + 2 do {
foreach const u32 j in 1 .. 2 + (lines + 1) / 2 - i do
printf(" ");
foreach const u32 j in 1 .. i * 2 do
printf("*");
printf("\n");
}
foreach const u32 i in 1 .. lines / 2 + 1 do {
foreach const u32 j in 1 .. i + 2 do
printf(" ");
foreach const u32 j in 1 .. ((lines + 1) / 2 - i) * 2 do
printf("*");
printf("\n");
}
}
In Swift
/*
Diamond
Original version in BASIC:
Example included in Vintage BASIC 1.0.3.
http://www.vintage-basic.net
This version in Swift:
Copyright (c) 2023, Marcos Cruz (programandala.net)
SPDX-License-Identifier: Fair
Written on 2023-11-02.
Last modified 20231103T0050+0100.
*/
let LINES = 17
for i in 1 ... LINES / 2 + 1 {
for _ in 1 ... (LINES + 1) / 2 - i + 1 {
print(" ", terminator: "")
}
for _ in 1 ... i * 2 - 1 {
print("*", terminator: "")
}
print()
}
for i in 1 ... LINES / 2 {
for _ in 1 ... i + 1 {
print(" ", terminator: "")
}
for _ in 1 ... ((LINES + 1) / 2 - i) * 2 - 1 {
print("*", terminator: "")
}
print()
}
In V
/*
Diamond
Original version in BASIC:
Example included in Vintage BASIC 1.0.3.
http://www.vintage-basic.net
This version in V:
Copyright (c) 2025, Marcos Cruz (programandala.net)
SPDX-License-Identifier: Fair
Written on 2025-01-03.
Last modified: 20250103T0147+0100.
*/
const lines = 17
fn main() {
for i in 1 .. lines / 2 + 2 {
for _ in 0 .. (lines + 1) / 2 - i + 1 {
print(' ')
}
for _ in 1 .. i * 2 {
print('*')
}
println('')
}
for i in 1 .. lines / 2 + 1 {
for _ in 0 .. i + 1 {
print(' ')
}
for _ in 1 .. ((lines + 1) / 2 - i) * 2 {
print('*')
}
println('')
}
}
In Vala
/*
Diamond
Original version in BASIC:
Example included in Vintage BASIC 1.0.3.
http://www.vintage-basic.net
This version in Vala:
Copyright (c) 2023, Marcos Cruz (programandala.net)
SPDX-License-Identifier: Fair
Written in 2023-08-30/31.
Last modified 20231103T2130+0100.
*/
void main() {
const int lines = 17;
int i = 1;
int j;
while (i <= lines / 2 + 1) {
j = 1;
while (j <= (lines + 1) / 2 - i + 1) {
print(" ");
j += 1;
}
j = 1;
while (j <= i * 2 - 1) {
print("*");
j += 1;
}
print("\n");
i += 1;
}
i = 1;
while (i <= lines / 2) {
j = 1;
while (j <= i + 1) {
print(" ");
j += 1;
}
j = 1;
while (j <= ((lines + 1) / 2 - i) * 2 - 1) {
print("*");
j += 1;
}
print("\n");
i += 1;
}
}
In Zig
// Diamond
//
// Original version in BASIC:
// Example included in Vintage BASIC 1.0.3.
// http://www.vintage-basic.net
//
// This version in Zig:
// Copyright (c) 2023, Marcos Cruz (programandala.net)
// SPDX-License-Identifier: Fair
//
// Written on 2023-03-23.
//
// Last modified 20231103T2118+0100.
const print = @import("std").debug.print;
const lines = 17;
pub fn main() !void {
var i: i8 = 1;
var j: i8 = 1;
while (i <= lines / 2 + 1) {
j = 1;
while (j <= (lines + 1) / 2 - i + 1) {
print(" ", .{});
j += 1;
}
j = 1;
while (j <= i * 2 - 1) {
print("*", .{});
j += 1;
}
print("\n", .{});
i += 1;
}
i = 1;
while (i <= lines / 2) {
j = 1;
while (j <= i + 1) {
print(" ", .{});
j += 1;
}
j = 1;
while (j <= ((lines + 1) / 2 - i) * 2 - 1) {
print("*", .{});
j += 1;
}
print("\n", .{});
i += 1;
}
}
