Diamond

Description of the page content

Conversion of Diamond to several programming languages.

Tags:

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;
    }
}

Related pages

Basics off
Metaproject about the "Basics of…" projects.

External related links