Jump to content

Rainbow

From Rosetta Code
Rainbow is a draft programming task. It is not yet considered ready to be promoted as a complete task, for reasons that should be found in its talk page.
Task
Print out the word 'RAINBOW' to the screen with every character being a different color of the rainbow.



ALGOL 68

Generates an SVG document, you can redirect the output to a .svg file and open it in a browser or other SVG viewer.

BEGIN # generate SVG to show the word RAINBOW in the colours of the spectrum #
    PROC max = ( INT a, b )INT: IF a < b THEN b ELSE a FI;
    STRING text = "RAINBOW";
    []STRING colour = ( "red", "orange", "yellow", "green", "blue", "indigo", "violet" );
    INT      c len  = ( UPB colour - LWB colour ) + 1;   # number of colours #
    INT      x     := 30;
    INT      y      = 30;
    print( ( "<svg xmlns='http://www.w3.org/2000/svg' width='"
           , whole( ( c len * 20 ) + 60, 0 ), "' "
           , "height='50' style='font:bold 30px monospace'>", newline
           , "  <rect width='100%' height='100%' fill='grey'/>", newline
           )
         );
    FOR i FROM LWB text TO UPB text DO
        STRING c name = colour[ max( 1, i MOD ( c len + 1 ) ) ];
        print( ( "  <text x='", whole( x, 0 ), "' y='", whole( y, 0 ), "' " ) );
        print( ( "fill='", c name, "' stroke='", c name, "'>", text[ i ], "</text>", newline ) );
        x +:= 20
    OD;
    print( ( "</svg>", newline ) )
END
Output:
<svg xmlns='http://www.w3.org/2000/svg' width='200' height='50' style='font:bold 30px monospace'>
  <rect width='100%' height='100%' fill='grey'/>
  <text x='30' y='30' fill='red' stroke='red'>R</text>
  <text x='50' y='30' fill='orange' stroke='orange'>A</text>
  <text x='70' y='30' fill='yellow' stroke='yellow'>I</text>
  <text x='90' y='30' fill='green' stroke='green'>N</text>
  <text x='110' y='30' fill='blue' stroke='blue'>B</text>
  <text x='130' y='30' fill='indigo' stroke='indigo'>O</text>
  <text x='150' y='30' fill='violet' stroke='violet'>W</text>
</svg>

...which should appear as:

Arturo

loop [
    #red "R"
    #orange "A"
    #yellow "I"
    #green "N"
    #blue "B"
    #indigo "O"
    #violet "W"
] [c l] -> prints color c l

BASIC

AmigaBASIC

Output
SCREEN 1,640,200,3,2
WINDOW 2,"Rainbow text",(0,10)-(320,50),15,1
LOCATE 3,18
s$="RAINBOW"
PALETTE 0,.8,.8,.8
FOR i=1 TO 7
  READ r,g,b
  PALETTE i,r,g,b
  COLOR i
  PRINT MID$(s$,i,1);
NEXT
WHILE INKEY$=""
WEND
SCREEN CLOSE 1

DATA .93,.11,.14
DATA 1,.5,.15
DATA 1,.95,0
DATA .13,.69,.3
DATA 0,.64,.91
DATA .25,.28,.8
DATA .64,.29,.65

Applesoft BASIC

 1  GR : DEF  FN C(I) =  ASC ( MID$ (A$,I)) - 58: FOR C = 1 TO 7: READ A$: COLOR=  FN C(1): FOR I = 2 TO  LEN (A$) STEP 3: VLIN  FN C(I), FN C(I + 1) AT  FN C(I + 2): NEXT I,C
 2  DATA"K?E?@BA??@CC@DEA",S@EC??DCCD@EE,W?EG,V?EI@AJBCK?EL,Q?EN??OBBOEEO@APCDP,L@DR??SEES@DT,M?EVCDWABXCDY?EZ

Aquarius BASIC

Output in MAME
10 PRINT CHR$(11)
20 PRINT "RAINBOW"
30 CS=13393
40 FOR I=0 TO 6
50 READ C
60 C=16*C+7
70 POKE CS+I,C
80 NEXT
90 DATA 1,3,2,6,4,10,5

BASIC256

dim colors$(6)
colors$ = {red, orange, yellow, green, blue, darkblue, cyan}

clg
s$ = "RAINBOW"
for i = 1 to length(s$)
	color colors$[i-1]
	text i*8,150, mid(s$,i,1)
next i

BBC BASIC

Output
10 MODE 2
20 S$="RAINBOW"
30 FOR I=1 to 7
40 READ C
50 COLOUR C
60 PRINT MID$(S$,I,1);
70 NEXT
80 PRINT
90 DATA 1,2,3,7,6,4,5

Chipmunk Basic

Works with: Chipmunk Basic version 3.6.4
100 graphics 0
110 dim colors(6,6,6)
120 data 255,0,0,255,128,0,255,255,0,0,255,0,0,0,255,75,0,130,128,0,255
130 s$ = "RAINBOW"
140 for i = 1 to 7
150   read a,b,c
160   graphics color a,b,c
170   graphics moveto i*10,10
180   graphics text mid$(s$,i,1);
190 next i
200 end

Commodore BASIC

Output in VICE C64 emulator
10 S$="RAINBOW":POKE 53281,1
20 FOR I=1 TO 7
30 READ C:POKE 646,C
40 PRINT MID$(S$,I,1);
50 NEXT
60 DATA 2,8,7,5,3,6,4

FreeBASIC

Dim As Integer colors(6, 2) => { _
{255,   0,   0}, _ ' red
{255, 128,   0}, _ ' orange
{255, 255,   0}, _ ' yellow
{  0, 255,   0}, _ ' green
{  0,   0, 255}, _ ' blue
{75,    0, 130}, _ ' indigo
{128,   0, 255}} _ ' violet

Cls
Dim As String s = "RAINBOW"
For i As Byte = 1 To Len(s)
    Color Rgb(colors(i,2),colors(i,2),colors(i,2))
    Print Mid(s, i, 1);
Next i

Sleep

GW-BASIC

Works with: PC-BASIC version any
Works with: QBasic
10 CLS
20 DATA 4,6,14,2,1,11,13
30 S$ = "RAINBOW"
40 FOR I = 1 TO 7
50 READ C
60   COLOR C
70   PRINT MID$(S$, I, 1);
80 NEXT I
90 END

Locomotive Basic

Output in CPCBasic
10 mode 0:ink 0,10:locate 7,10:s$="RAINBOW"
20 for i=1 to 7
30 read col:ink i,col:pen i
40 print mid$(s$,i,1);
50 next
60 goto 60
70 data 6,15,24,18,2,5,8

True BASIC

CLEAR
DATA 4, 6, 14, 2, 1, 11, 13
LET s$ = "RAINBOW"
FOR i = 1 to 7
    READ c
    SET COLOR c
    PRINT (s$)[i:i+1-1];
NEXT i
END

ZX Spectrum Basic

Output
10 PAPER 0
20 LET s$="RAINBOW"
30 FOR i=1 TO 7
40 READ c
50 INK c
60 PRINT s$(i TO i);
70 NEXT i
80 PAPER 7
90 DATA 2,4,6,7,5,1,3

C

#include <stdio.h>

int main() {
    int i, clrs[7][3] = {
        {255,   0,   0}, // red
        {255, 128,   0}, // orange
        {255, 255,   0}, // yellow
        {  0, 255,   0}, // green
        {  0,   0, 255}, // blue
        { 75,   0, 130}, // indigo
        {128,   0, 255}, // violet
    };
    const char *s = "RAINBOW";
    for (i = 0; i < 7; ++i) {
        printf("\x1B[38;2;%d;%d;%dm%c", clrs[i][0], clrs[i][1], clrs[i][2], s[i]);
    }
    printf("\n");
    return 0;
}
Output:
RAINBOW

C++

#include <cstdint>
#include <iostream>
#include <string>
#include <vector>

int main() {
	// ANSI escape code constants for foreground text colours
	const std::string RED =    "\u001B[38;2;255;0;0m";
	const std::string ORANGE = "\u001B[38;2;255;128;0m";
	const std::string YELLOW = "\u001B[38;2;255;255;0m";
	const std::string GREEN =  "\u001B[38;2;0;255;0m";
	const std::string BLUE =   "\u001B[38;2;0;0;255m";
	const std::string INDIGO = "\u001B[38;2;75;0;130m";
	const std::string VIOLET = "\u001B[38;2;128;0;255m";

	// ANSI escape code constant to reset the terminal to its default values
	const std::string RESET = "\u001B[0m";

	const std::vector<std::string> colours = { RED, ORANGE, YELLOW, GREEN, BLUE, INDIGO, VIOLET };

	const std::string rainbow = "RAINBOW";

	for ( uint32_t i = 0; i < 7; ++i ) {
		std::cout << colours[i] << rainbow[i];
	}
	std::cout << RESET << std::endl;
}
Output:
RAINBOW

Dart

import 'dart:io';

void main() {
  const rainbow = 'RAINBOW';
  const spectrum = [
    [255, 0, 0], // red
    [255, 165, 0], // orange
    [255, 255, 0], // yellow
    [0, 128, 0], // green
    [0, 0, 255], // blue
    [75, 0, 130], // indigo
    [238, 130, 238], // violet
  ];

  for (int i = 0; i < rainbow.length; i++) {
    final red = spectrum[i][0];
    final green = spectrum[i][1];
    final blue = spectrum[i][2];
    stdout.write('\x1B[38;2;${red};${green};${blue}m${rainbow[i]}\x1B[0m');
  }
}

EasyLang

Run it

s$ = "RAINBOW"
cols[] = [ 900 950 990 090 009 306 509 ]
textsize 15
background 000
clear
for i to 7
   color cols[i]
   move i * 11.5 60
   text substr s$ i 1
.


Factor

USING: colors grouping hashtables io.styles qw sequences ui
ui.gadgets.panes ;

"RAINBOW" 1 group
qw{ red orange yellow green blue indigo violet } [
    [ named-color foreground associate format ] 2each
] make-pane "Rainbow" open-window
Output:


FutureBasic

Requires FB 7.0.31 or newer to compile macOS app.

_window = 1
begin enum 1
  _txtField
end enum

CFMutableAttributedStringRef local fn ColoredCharacters( string as CFStringRef )
  CFMutableAttributedStringRef aString = fn MutableAttributedStringWithString( string )
  
  for int i = 0 to len(string) -1
    CGFloat red   = rnd(256) / 255.0
    CGFloat green = rnd(256) / 255.0
    CGFloat blue  = rnd(256) / 255.0
    ColorRef randomColor = fn ColorWithSRGB( red, green, blue, 1.0 )
    MutableAttributedStringSetForegroundColorInRange( aString, randomColor, fn RangeMake( i, 1 ) )
  next
  MutableAttributedStringSetAlignment( aString, NSTextAlignmentCenter )
  MutableAttributedStringSetFontWithName( aString, @"Times Bold", 60.0 )
end fn = aString

void local fn BuildWindow
  CGRect r = fn CGRectMake( 0, 0, 340, 100 )
  window _window, @"Colored Characters", r, NSWindowStyleMaskTitled + NSWindowStyleMaskClosable
  WindowSetBackgroundColor( _window, fn ColorWhite )
  
  r = fn CGRectMake( 0, 25, 340, 60 )
  textfield _txtField, YES, ,r, _window
  TextFieldSetBezeled(  _txtField, NO )
  TextFieldSetBordered( _txtField, NO )
  TextFieldSetDrawsBackground( _txtField, NO )
  TextFieldSetPlaceholderAttributedString( _txtField, fn ColoredCharacters( @"RAINBOW" ) )
end fn

random
fn BuildWindow

HandleEvents
Output:


Go

Translation of: C
package main

import "fmt"

func main() {
    clrs := [7][3]int{
        {255, 0, 0},   // red
        {255, 128, 0}, // orange
        {255, 255, 0}, // yellow
        {0, 255, 0},   // green
        {0, 0, 255},   // blue
        {75, 0, 130},  // indigo
        {128, 0, 255}, // violet
    }
    s := "RAINBOW"
    for i := 0; i < 7; i++ {
        fmt.Printf("\x1B[38;2;%d;%d;%dm%c", clrs[i][0], clrs[i][1], clrs[i][2], s[i])
    }
    fmt.Println()
}
Output:
As C example.

HTML

<!DOCTYPE html>
<html>
<head>
    <title>Text in Multiple Colors (No Spaces)</title>
</head>
<body>
    <p>
        <span style="color: red">R</span><span style="color: orange">A</span><span style="color: yellow">I</span><span style="color: green">N</span><span style="color: blue">B</span><span style="color: indigo">O</span><span style="color: violet">W</span>
    </p>
</body>
</html>

Java

import java.util.List;

public final class Rainbow {

	 public static void main(String[] args) {        
	    	// ANSI escape code constants for foreground text colours
	        final String RED =    "\u001B[38;2;255;0;0m";
	        final String ORANGE = "\u001B[38;2;255;128;0m";
	        final String YELLOW = "\u001B[38;2;255;255;0m";
	        final String GREEN =  "\u001B[38;2;0;255;0m";
	        final String BLUE =   "\u001B[38;2;0;0;255m";
	        final String INDIGO = "\u001B[38;2;75;0;130m";
	        final String VIOLET = "\u001B[38;2;128;0;255m";
	        
	        // ANSI escape code constant to reset the terminal to its default values
	        final String RESET = "\u001B[0m";
	        
	        List<String> colours = List.of( RED, ORANGE, YELLOW, GREEN, BLUE, INDIGO, VIOLET );
	        
	        String rainbow = "RAINBOW";
	        
	        for ( int i = 0; i < 7; i++ ) {
	        	System.out.print(colours.get(i) + rainbow.charAt(i));
	        }
	        System.out.println(RESET);
	    }

}
Output:
RAINBOW

jq

The following assumes the terminal supports the ANSI RGB codes, and has been tested using iTerm2.

def colors: [
    [255,   0,   0],  # red
    [255, 128,   0],  # orange
    [255, 255,   0],  # yellow
    [  0, 255,   0],  # green
    [  0,   0, 255],  # blue
    [ 75,   0, 130],  # indigo
    [128,   0, 255]   # violet
  ];

def rainbow($s):
    # ;38 is the extended foreground color code 
    # ;2 indicates RGB digits follow
    def e: "\u001B";  # ESCAPE
    reduce range(0; $s|length) as $j ("";
      ($j % 7) as $i
      | . + "\(e)[38;2;\(colors[$i][0]);\(colors[$i][1]);\(colors[$i][2])m\($s[$i:$i+1])" )
    + "\(e)[0m";

rainbow("RAINBOW")

Invocation: jq -nr -f rainbow.jq

Julia

using Crayons

for (letter, color) in [("R", crayon"red"), ("A", crayon"ff7f00"),
                        ("I", crayon"yellow"), ("N", crayon"green"),
                        ("B", crayon"blue"), ("O", crayon"4b0082"), ("W", crayon"7f00ff")]
    print(color, letter, " ");
end

M2000 Interpreter

M2000 Interpreter has own console which we can draw on it.

FORM 20, 16
MODULE CHECK {
	MODULE RAINBOW{
		OLDPEN=PEN
		CLS #1F3F1F, 0
		FLUSH    ' empty stack
		DATA #FF0000, color(255, 128,0),14, 3, #2F2FFF, color(135,64,210), #7F1FAA
		LET s$ = "RAINBOW"
		FOR i = 1 to 7
		    READ c
		    PEN c
		    PRINT MID$(s$,i,1);
		NEXT i
		PRINT
		PEN OLDPEN
		END
	}
	RAINBOW
	DRAWING {
		RAINBOW  
	} AS DRW1  ' THIS IS AN EMF DATA IN RAM FILE
	MOVE 6000,6000
	' DRAW GRAPH WIDH 6000 TWIPS, HEIGHT CALCULATING AUTOMATIC, 30 DEGREE SLOPE
	IMAGE DRW1, 6000,,30
	PEN 11 {WIDTH 10 {CIRCLE 4000}}
}
CHECK
PUSH KEY$:DROP
FORM 80, 38
Output:
DRAWING RAINBOW
M2000 RAINBOW

Perl

#!/usr/bin/perl

use strict; # https://rosettacode.org/wiki/Rainbow
use warnings;
use List::AllUtils qw( zip_by );

print zip_by { "\e[38;2;$_[1]m$_[0]\e[m" } [ split //, 'RAINBOW' ],
  [qw( 255;0;0 255;128;0 255;255;0 0;255;0 0;0;255 75;0;130 128;0;255 )];
print "\n";

Phix

Library: Phix/xpGUI
with javascript_semantics
requires("1.0.6")
include xpGUI.e

constant rainbow = {{"R",XPG_RED},
                    {"A",XPG_ORANGE},
                    {"I",XPG_YELLOW},
                    {"N",XPG_GREEN},
                    {"B",XPG_BLUE},
                    {"O",XPG_INDIGO},
                    {"W",XPG_PURPLE}}

function get_data(integer idx)
    return iff(idx<=0?1:rainbow)
end function

gdx list = gList(get_data,"=BGCLR",{#F0F0F0}),
    vbox = gVbox({list},`MARGIN=10`),
    dialog = gDialog(vbox,"Rainbow",`SIZE=240x62`)
gShow(dialog)
gMainLoop()
Output:

Python

Colored

from colored import Fore, Style
red: str = f'{Fore.rgb(255, 0, 0)}'
orange: str = f'{Fore.rgb(255, 128, 0)}'
yellow: str = f'{Fore.rgb(255, 255, 0)}'
green: str = f'{Fore.rgb(0, 255, 0)}'
blue: str = f'{Fore.rgb(0, 0, 255)}'
indigo: str = f'{Fore.rgb(75, 0, 130)}'
violet: str = f'{Fore.rgb(128, 0, 255)}'
print(f'{red}R{Style.reset}' + f'{orange}A{Style.reset}' + f'{yellow}I{Style.reset}' + f'{green}N{Style.reset}' + f'{blue}B{Style.reset}' + f'{indigo}O{Style.reset}' + f'{violet}W{Style.reset}')
Output:

RAINBOW


Quackery

  [ char m join
    $ /
print(("\033["+string_from_stack()),end='')
     / python ]                             is colour ( $ --> )

  [ $ "31" colour ]                         is red    (   --> )
  [ $ "38;5;208" colour ]                   is orange (   --> )
  [ $ "33" colour ]                         is yellow (   --> )
  [ $ "32" colour ]                         is green  (   --> )
  [ $ "34" colour ]                         is blue   (   --> )
  [ $ "38;5;54" colour ]                    is indigo (   --> )
  [ $ "35" colour ]                         is violet (   --> )
  [ $ "30" colour ]                         is black  (   --> )

  $ "RAINBOW"
  ' [ red orange yellow green blue indigo violet ] 
  witheach [ do behead emit ]
  drop 
  black
Output:

Raku

use Color::Names:api<2>;
use Color::Names::X11 :colors;

for 'RAINBOW',
    'Another phrase that happens to contain the word "Rainbow".'
  -> $rainbow-text {
    for $rainbow-text.comb Z, flat(<red orange yellow green blue indigo violet> xx *) -> ($l, $c) {
        print "\e[38;2;{COLORS{"{$c}-X11"}<rgb>.join(';')}m$l\e[0"
    }
    say '';
}
Output:

Displayed here as HTML as ANSI colors don't show up on web interfaces.

RAINBOW
Another phrase that happens to contain the word "Rainbow".

SVG

(this is also the output from the Algol 68 sample)

<svg xmlns='http://www.w3.org/2000/svg' width='200' height='50' style='font:bold 30px monospace'>
  <rect width='100%' height='100%' fill='grey'/>
  <text x='30' y='30' fill='red' stroke='red'>R</text>
  <text x='50' y='30' fill='orange' stroke='orange'>A</text>
  <text x='70' y='30' fill='yellow' stroke='yellow'>I</text>
  <text x='90' y='30' fill='green' stroke='green'>N</text>
  <text x='110' y='30' fill='blue' stroke='blue'>B</text>
  <text x='130' y='30' fill='indigo' stroke='indigo'>O</text>
  <text x='150' y='30' fill='violet' stroke='violet'>W</text>
</svg>

UNIX Shell

echo "$(tput setaf 1)R $(tput setaf 7)A $(tput setaf 3)I $(tput setaf 2)N $(tput setaf 4)B $(tput setaf 6)O $(tput setaf 5)W $(tput sgr0)"

— Ken McLeod

Wren

var colors = [
    [255,   0,   0], // red
    [255, 128,   0], // orange
    [255, 255,   0], // yellow
    [  0, 255,   0], // green
    [  0,   0, 255], // blue
    [ 75,   0, 130], // indigo
    [128,   0, 255]  // violet
]

var s = "RAINBOW"
for (i in 0..6) {
    var fore = "\e[38;2;%(colors[i][0]);%(colors[i][1]);%(colors[i][2])m"
    System.write("%(fore)%(s[i])")
}
System.print()
Output:
RAINBOW

X86 Assembly

Translation of: XPL0

Twenty-six byte executable program. Output is same as XPL0. Assemble with: tasm; tlink /t

0000                                 .model  tiny
0000                                 .code
                                     org     100h
                             ;MS-DOS loads .com files with registers set this way:
                             ; ax=0, bx=0, cx=00FFh, dx=cs, si=0100h, di=-2, bp=09xx, sp=-2, es=ds=cs=ss
                             ;The direction flag (d) is clear (incrementing).
0100  52 41 49 4E 42 4F 57   start:  db      "RAINBOW"       ;executed as code shown below
                             ;push dx    inc cx    dec cx    DEC SI    inc dx    dec di    push di
0107  B0 13                          mov     al, 13h         ;call BIOS to set graphic mode 13h (ah=0)
0109  CD 10                          int     10h             ; 320x200 with 256 colors
010B  B3 1E                          mov     bl, 32-2        ;base of rainbow colors
010D  B1 08                          mov     cl, 1+7         ;number of characters to display + null in PSP
010F  B4 0E                          mov     ah, 0Eh         ;write character in teletype mode
0111  AC                     rb10:   lodsb                   ;fetch char to write: al:= ds:[si++]
0112  CD 10                          int     10h
0114  43                             inc     bx              ;next color
0115  43                             inc     bx
0116  E2 F9                          loop    rb10            ;loop for all 1+7 characters (cx--)
0118  EB FE                          jmp     $               ;lock up
                                     end     start

XPL0

The Raspberry Pi versions of the language require a graphic mode for colored text (unlike the MS-DOS versions), but they compensate by supporting this unusual string indexing (which only works with the interpreted MS-DOS version).

char I;
[SetVid($13);                   \set 320x200x8 VGA graphics
for I:= 0 to 6 do
        [Attrib(32+I+I);        \set color attribute
        ChOut(6, I("RAINBOW "));
        ];
]

Zig

Translation of: C
const std = @import("std");

pub fn main() void {
    const clrs = [7][3]u8{
        [_]u8{255, 0, 0},   // red
        [_]u8{255, 128, 0}, // orange
        [_]u8{255, 255, 0}, // yellow
        [_]u8{0, 255, 0},   // green
        [_]u8{0, 0, 255},   // blue
        [_]u8{75, 0, 130},  // indigo
        [_]u8{128, 0, 255}, // violet
    };
    const s = "RAINBOW";
    for(0..7) |i| {
        std.debug.print("\x1B[38;2;{d};{d};{d}m{c}", .{clrs[i][0], clrs[i][1], clrs[i][2], s[i]});
    }
    std.debug.print("\n", .{});
}
Output:
RAINBOW
Cookies help us deliver our services. By using our services, you agree to our use of cookies.