It's preferred that golfers don't publicly post full solutions to most holes on this site, but the Tutorial hole is an exception. This page aims to share golf knowledge by hosting concise or interesting Tutorial solutions, with explanations where they would be helpful.

Languages where the current best-known solution is visible on the wiki are marked with 🥇.

🥇 ><>

Bytes/Chars 🥇: 42b/42c

/:?!aoi!
/aoln0la=?
/ol?!
/"!dlroW ,olleH"

Sample code: 286b/286c

\ printing
> "!dlroW ,olleH" ooooooooooooo ao 03.
  looping
> 0 v
    >:nao 1+ :9)?v
v               ~<
  accessing arguments
> i : ?!v : 0) ?v ~;
        a
        o       o
        ~
^       <       <

Arguments are available via STDIN,
each argument is NULL terminated.
x is a no-op.
🥇 05AB1E

Bytes/Chars 🥇: 28b/14c

9Ý|«”Ÿ™,‚ï!”š»

Alternate: 28b/14c

”Ÿ™,‚ï!”9Ý»|»»

Sample code: 77b/65c

"Printing"
”Ÿ™,‚ï!”,

"Looping"
9ƒN,}

"Accessing arguments"
|»,}
ALGOL 68

Placeholder: 106b/106c (Feel free to replace)

printf($"Hello, World!"l$);FORiFROM0TO9DOprintf(($g(0)l$,i))OD;FORiFROM2TO99DOprintf(($gl$,a68gargv(i)))OD

Sample code: 193b/193c

# Printing #
printf($"Hello, World!"l$);

# Looping #
FOR i FROM 0 TO 9 DO
    printf(($g(0)l$, i))
OD;

# Accessing arguments #
FOR i FROM 2 TO a68g argc DO
    printf(($gl$, a68g argv(i)))
OD
🥇 APL

Bytes/Chars 🥇: 59b/42c

2401⌶1
⎕←¨'Hello, World!'0,(⍳9),1↓⍎8⊃⎕NL-3

Sample code: 141b/109c

⍝ Printing
⎕←'Hello, World!'

⍝ Looping
⎕IO←0
{⎕←⍵}¨⍳10

⍝ Accessing arguments
⎕←¨1↓2⎕NQ#'GetCommandLineArgs'
Arturo

Placeholder: 61b/61c (Feel free to replace)

print"Hello, World!"
loop 0..9'i->print i
loop arg'a->print a

Sample code: 123b/123c

; Printing
print "Hello, World!"

; Looping
loop 0..9 'i ->
    print i

; Accessing arguments
loop arg [a] [
    print a
]
Assembly

Placeholder: 93b (Feel free to replace)

.data
b: .string "Hello, World!\n0\n1\n2\n3\n4\n5\n6\n7\n8\n9\n"
l = . - b
.text
inc %eax
inc %edi
mov $b, %esi
mov $l, %edx
syscall

pop %rbx
pop %rax
a:
dec %rbx
jz e
pop %rsi
mov %rsi, %rdi
mov $-1, %ecx
xor %al, %al
repnz scasb
not %ecx
movb $'\n', -1(%rsi, %rcx)
mov %ecx, %edx
mov $1, %eax
mov $1, %edi
syscall
jmp a
e:

Sample code: 123b

SYS_WRITE = 1
SYS_EXIT = 60
STDOUT_FILENO = 1

# Printing
.data
buffer: .string "Hello, World!\n"
bufferLen = . - buffer

.text
mov $SYS_WRITE, %eax
mov $STDOUT_FILENO, %edi
mov $buffer, %esi
mov $bufferLen, %edx
syscall

# Looping
.data
digit: .byte   '0', '\n'

.text
mov $10, %bl
numberLoop:
    mov $SYS_WRITE, %eax
    mov $STDOUT_FILENO, %edi
    mov $digit, %esi
    mov $2, %edx
    syscall

    incb (%rsi)
    dec %bl
    jnz numberLoop

# Accessing arguments
pop %rbx
pop %rax

argLoop:
    dec %rbx
    jz endArgLoop

    pop %rsi
    mov %rsi, %rdi

    mov $-1, %ecx
    xor %al, %al
    repnz scasb

    not %ecx
    movb $'\n', -1(%rsi, %rcx)

    mov %ecx, %edx
    mov $SYS_WRITE, %eax
    mov $STDOUT_FILENO, %edi
    syscall

    jmp argLoop
endArgLoop:

mov $SYS_EXIT, %eax
mov $0, %edi
syscall
🥇 AWK

Bytes/chars 🥇: 43b/43c

{for(;i<11;)print i++?i-2:"Hello, World!"}1

Sample code: 439b/439c

BEGIN {
    # Printing
    print("Hello, World!")

    # Looping
    for (i = 0; i < 10; i++) {
        print(i)
    }
}

# Arguments are available via STDIN in the form of records
# Each record is NULL terminated
# By default, AWK automatically performs actions on each record
{
    # $0 is the full record while $1-$NF accesses individual fields in the record,
    # where NF is the number of fields in the current record
    print($0)
}
🥇 Bash

Bytes/chars 🥇: 35b/35c

history -p Hello,\ World! {0..9} $@

Sample code: 133b/133c

# Printing
echo Hello, World!

# Looping
for i in {0..9}; do
    echo $i;
done

# Accessing arguments
for arg; do
    echo $arg;
done
BASIC

Placeholder: 80b/80c (Feel free to replace)

#lang"qb
?"Hello, World!
for i=0to 9
?""& i
next
for i=1to 100
?command$(i)
next

Sample code: 176b/176c

' Printing
Print "Hello, World!"

' Looping
For i As UInteger = 0 To 9
    Print i
Next

' Accessing arguments
For i As Integer = 1 To __FB_ARGC__ - 1
    Print Command(i)
Next
🥇 Befunge

Bytes/chars 🥇: 40/40c

a_v,kd"Hello, World!"
kv>.a,1+::9`
>#@~,

Sample code: 178b/178c

v Printing
> "!dlroW ,olleH" ck, v
v                   ,a<

v Looping
> 0 v            <
    >:.a, 1+ :9`!|
v               $<

v Accessing arguments
> #@~ :0`!#v_ ,
^        ,a<
🥇 Berry

Bytes/chars 🥇: 56b/56c

for n:~0..;print(~n?n>9?_argv[n-9]:n:'Hello, World!')end

Sample code: 135b/135c

# Printing
print('Hello, World!')

# Looping
for i : 0 .. 9
    print(i)
end

# Accessing arguments
for a : _argv[1..]
    print(a)
end
🥇 BQN

Bytes 🥇: 52b/40c

•Out"Hello, World!"
•Show¨↕10
•Out¨•args

Chars 🥇: 55b/38c

•Out¨"Hello, World!"<⊸∾•args∾˜•Fmt¨↕10

Sample code: 100b/88c

# Printing
•Out "Hello, World!"

# Looping
•Show ¨↕10

# Accessing arguments
•Out ¨•args
🥇 brainfuck

Bytes/chars 🥇: 115b/115c

+[-->-[>>+>-----<<]<--<---]>-.>>>+.>>..+++[.+>]-<[-]-<<<-.+++.------.<<-.>>>++>.[--->+>+<<]>[>.<-<<+.>>],[>.<[.,],]

The bulk of this code is for printing "Hello, World!" with convenient leftovers on the tape, making use of (a variation on) this optimal snippet.

Sample code: 431b/431c

>>Printing
+[-->-[>>+>-----<<]<--<---]>-.>>>+.>>..+++[.>]<<<<.+++.------.<<-.>>>>+.[<->-]<-.>

>>Looping
++++++++[>++++++<-]
++++++++++[>.+>++++++++++.[-]<<-]

>>Accessing arguments
,[
    [
        .[-],
    ]
    ++++++++++.
    [-],
]

Arguments are available via STDIN; each argument is NULL terminated;
Taking input after EOF leaves the cell unchanged; the tape is circular
with 65536 cells; and cells are 8 bit with wrapping;
C

Bytes/Chars: 70b/70c

c=47;main(n,v)int**v;{main(puts(n?"Hello, World!":++c<58?&c:*++v),v);}

Alternate: 71b/71c

main(n,x)char**x;{for(++**x;x+=++**x>57;)n=puts(n?"Hello, World!":*x);}

This solution utilizes two facts; None of the provided arguments start with a character that would have a small ascii value under 58. Secondly, the first C argument in every hole is set as string "-" consisting of just a minus sign (ascii 45). It works, as this solution manages to increment the first character three times before printing.

Alternate: 72b/72c

i=47;main(c,v)long*v;{for(puts("Hello, World!");;)puts(i++>56?*++v:&i);}

Sample code: 276b/276c

#include <stdio.h>

int main(int argc, char* argv[]) {
    // Printing
    puts("Hello, World!");

    // Looping
    for (int i = 0; i < 10; i++)
        printf("%d\n", i);

    // Accessing arguments
    for (int i = 1; i < argc; i++)
        puts(argv[i]);

    return 0;
}
🥇 C#

Bytes/chars 🥇: 73b/73c

for(int i=-2;;)Console.WriteLine(++i<0?"Hello, World!":i>9?args[i-10]:i);

Sample code: 372b/372c

// Printing
Console.WriteLine("Hello, World!");

// Looping
for (int i = 0; i < 10; i++)
    Console.WriteLine(i);

// Accessing arguments
foreach (String arg in args)
    Console.WriteLine(arg);

// Implicit using directives for console applications are enabled.
// See: https://docs.microsoft.com/en-us/dotnet/core/tutorials/top-level-templates#implicit-using-directives
C++

Placeholder: 100b/100c (Feel free to replace)

#include<ios>
int main(int c,char**v){c=47;for(puts("Hello, World!");;)puts(c++>56?*++v:(char*)&c);}

Sample code: 410b/410c

#include <iostream>

int main(int argc, char* argv[]) {
    // Printing
    std::cout<<"Hello, World!"<<std::endl;

    // Looping
    for (int i = 0; i < 10; i++)
        std::cout<<i<<std::endl;

    // Accessing arguments
    for (int i = 1; i < argc; i++)
        std::cout<<argv[i]<<std::endl;

    return 0;
}

// Code is compiled with clang with -std=c++23
// See: https://clang.llvm.org/cxx_status.html
🥇 Civet (Bytes only)

Bytes 🥇: 63b

(["Hello, World!"]++[0..9]++process.argv[>1]).map console.log .

Sample code: 158b/158c

// Printing
console.log 'Hello, World!'

// Looping
for i of [0..9]
    console.log i

// Accessing arguments
for arg of process.argv[2..]
    console.log arg
CJam

Bytes/chars 🥈: 32b/32c (Feel free to replace)

"Hello, World!"T{1_$+}9*]N*NeaN*

Sample code: 82b/82c

e# Printing
"Hello, World!"

e# Looping
T{1_$+}9*]N*N

e# Accessing arguments
eaN*
🥇 Clojure

Bytes/chars 🥇: 65b/65c

(mapv println`("Hello, World!"~@(range 10)~@*command-line-args*))

Sample code: 151b/151c

; Printing
(println "Hello, World!")

; Looping
(dotimes [i 10]
  (println i))

; Accessing arguments
(doseq [arg *command-line-args*]
  (println arg))
🥇 COBOL

Bytes/chars 🥇: 190b/190c

This program loops infinitely until it encounters an empty argument. Notice that we have to manually clear a on each loop iteration, since accept a from argument-value will simply leave a unmodified once it reaches the end of the argument list.

program-id.x.data division.local-storage section.
1 a pic X(99).
procedure division.display"Hello,, World!
0
1
2
3
4
5
6
7
8
9".u.set a to""accept a from argument-value
display a
if a>""go u

Sample code: 386b/386c

program-id.example.

data division.
local-storage section.
1 n pic 99 value 0.
1 i pic 9999.
1 a pic X(99).
procedure division.

*> Printing
display "Hello, World!"

*> Looping
perform 10 times
display n(2- function log10(n):)
add 1 to n
end-perform.

*> Accessing arguments
accept i from argument-number
perform i times
accept a from argument-value
display a
end-perform.
end-program.

🥇 Coconut

Bytes/chars 🥇: 53b/53c

*print`map`['Hello, World!';range 10]+os.sys.argv[1:]

Sample code: 158b/158c

import sys

# Printing
'Hello, World!' |> print

# Looping
for i in range(10):
    i |> print

# Accessing arguments
for arg in sys.argv[1:]:
    arg |> print
CoffeeScript

Placeholder: 100b/100c (Feel free to replace)

console.log 'Hello, World!'
for i in [0..9]
 console.log i
for a in process.argv[2..]
 console.log a

Sample code: 155b/155c

# Printing
console.log 'Hello, World!'

# Looping
for i in [0..9]
    console.log i

# Accessing arguments
for arg in process.argv[2..]
    console.log arg
🥇 Common Lisp

Bytes/chars 🥇: 58b/58c

(format t"Hello, World!
0
1
2
3
4
5
6
7
8
9~{
~a~}"*args*)

Sample code: 176b/176c

; Printing
(write-line "Hello, World!")

; Looping
(loop for i from 0 to 9
    do (format t "~d~%" i)
)

; Accessing arguments
(loop for arg in *args*
    do (write-line arg)
)
🥇 Crystal

Bytes/chars 🥇: 43b/43c

Although Crystal is similar to Ruby in many ways, one significant difference is the behavior of puts, which unlike in Ruby, does not automatically flatten its arguments and separate them by newlines.

puts ["Hello, World!",*0..9,*ARGV].join "
"

Sample code: 135b/135c

# Printing
puts "Hello, World!"

# Looping
(0..9).each do |i|
    puts i
end

# Accessing arguments
ARGV.each do |arg|
    puts arg
end
🥇 D

Bytes/chars 🥇: 89b/89c

import std;void main(string[]a){a[0]="Hello, World!
0
1
2
3
4
5
6
7
8
9";a.each!writeln;}

Sample code: 252b/252c

import std.stdio;

void main(string[] argv) {
    // Printing
    writeln("Hello, World!");

    // Looping
    foreach (i; 0 .. 10) {
        writeln(i);
    }

    // Accessing arguments
    foreach (arg; argv[1 .. $]) {
        writeln(arg);
    }
}
🥇 Dart

Bytes/chars 🥇: 65b/65c

main(a,b){for(b=-2;;)print(++b<0?"Hello, World!":9<b?a[b-10]:b);}

Sample code: 211b/211c

void main(List<String> argv) {
  // Printing
  print("Hello, World!");

  // Looping
  for (var i = 0; i < 10; i++) {
    print(i);
  }

  // Accessing arguments
  for (final arg in argv) {
    print(arg);
  }
}
Egel

Bytes/chars 🥉: 137b/137c (Feel free to replace)

import "prelude.eg"using System,List
def main=print"Hello, World!\n0\n1\n2\n3\n4\n5\n6\n7\n8\n9\n";map[A->print A"\n"](drop 2 args);print

Sample code: 242b/242c

import "prelude.eg"

using System, List

def main =
    # Printing
    print "Hello, World!\n";

    # Looping
    map [ I -> print I "\n" ] (from_to 0 9);

    # Accessing arguments
    map [ ARG -> print ARG "\n" ] (drop 2 args);

    print
Elixir

Placeholder: 69b/69c (Feel free to replace)

Enum.map ["Hello, World!",0,1,2,3,4,5,6,7,8,9|System.argv],&IO.puts&1

Sample code: 137b/137c

# Printing
IO.puts "Hello, World!"

# Looping
for i <- 0..9, do: IO.puts i

# Accessing arguments
for arg <- System.argv, do: IO.puts arg
Erlang

Placeholder: 107b/107c (Feel free to replace)

main(A)->io:format("Hello, World!
0
1
2
3
4
5
6
7
8
9
"),lists:foreach(fun(B)->io:format("~s~n",[B])end,A).

Sample code: 234b/234c

main(Args) ->
  % Printing
  io:format("Hello, World!~n"),

  % Looping
  lists:foreach(fun(N) -> io:format("~p~n", [N]) end, lists:seq(0, 9)),

  % Accessing arguments
  lists:foreach(fun(Arg) -> io:format("~ts~n", [Arg]) end, Args).
F#

Placeholder: 99b/99c (Feel free to replace)

[<EntryPoint>]let main a=
 printfn"Hello, World!
0
1
2
3
4
5
6
7
8
9";for b in a do printfn"%s"b
 0

Sample code: 217b/217c

[<EntryPoint>]
let main args =
    // Printing
    printfn "Hello, World!"

    // Looping
    for i in 0..9 do
        printfn "%d" i

    // Accessing arguments
    for arg in args do
        printfn "%s" arg

    0
Factor

Bytes/chars 🥈: 66b/66c (Feel free to replace)

[I Hello, World!
I] 0 ..= 9 stack. command-line get [ print ] each

Sample code: 124b/124c

! Printing
"Hello, World!" print

! Looping
0 ..= 9 [ . ] each

! Accessing arguments
command-line get-global [ print ] each
Fennel

Bytes/chars 🥉: 80b/80c (Feel free to replace)

(print"Hello, World!")(for [i 0 9] (print i))(each [i a (ipairs arg)] (print a))

Sample code: 135b/135c

;; Printing
(print "Hello, World!")

;; Looping
(for [i 0 9]
  (print i))

;; Accessing arguments
(each [i a (ipairs arg)]
  (print a))
Forth

Placeholder: 106b/106c (Feel free to replace)

.( Hello, World!) CR
: a
10 0 do i 0 .r cr loop 
begin next-arg 2dup d0<> while type CR repeat 2drop ;
a
z

Sample code: 217b/217c

\ Printing
.( Hello, World!) CR

\ Looping
: looping
    10 0 do i 0 .r cr loop ;
looping

\ Accessing arguments
: accessing-arguments
    begin next-arg 2dup d0<> while type CR repeat 2drop ;
accessing-arguments

bye
Fortran

Placeholder: 112b/112c (Feel free to replace)

character*32s
print "(a)","Hello, World!"
print"(i0)",[(i,i=0,9)]
do2 i=1,99
call getarg(i,s)
2 print"(a)",s
end

Sample code: 277b/277c

character(len=32) :: s
integer :: i

! Printing
print "(a)", "Hello, World!"

! Looping
do i = 0, 9
    print "(i0)", i
end do

! Accessing arguments
! (NOTE: getarg() and iargc() are GNU Fortran extensions)
do i = 1, iargc()
    call getarg(i,s)
    print "(a)", s
end do

end
Gleam

Bytes/chars: 142b/142c (Feel free to replace)

import gleam/io
import gleam/list
pub fn main(){list.map(["Hello, World!
0
1
2
3
4
5
6
7
8
9",..argv.load().arguments],io.println)}import argv

Sample code: 307b/307c

import argv
import gleam/int
import gleam/io
import gleam/list

pub fn main() {
  // Printing
  io.println("Hello, World!")

  // Looping
  list.range(0, 9)
  |> list.each(fn(i) { io.println(int.to_string(i)) })

  // Accessing arguments
  argv.load().arguments
  |> list.each(fn(arg) { io.println(arg) })
}
Go

Placeholder: 122b/122c (Feel free to replace)

package main
import(.`fmt`
.`os`)
func main(){Args[0]=`Hello, World!
0
1
2
3
4
5
6
7
8
9`
for _,a:=range Args{Println(a)}}

Sample code: 275b/275c

package main

import (
    "fmt"
    "os"
)

func main() {
    // Printing
    fmt.Println("Hello, World!")

    // Looping
    for i := range 10 {
        fmt.Println(i)
    }

    // Accessing arguments
    for _, arg := range os.Args[1:] {
        fmt.Println(arg)
    }
}
🥇 GolfScript

Bytes/chars 🥇: 23b/23c

"Hello, World!
"10,@+n*

Sample code: 121b/121c

# Printing
"Hello, World!"puts

# Looping
10,{p}/

# The stack is initialized with one element, an array of arguments:
n*
Groovy

Placeholder: 70b/70c (Feel free to replace)

println"Hello, World!"
for(i in 0..9)println i
for(a in args)println a

Sample code: 135b/135c

// Printing
println "Hello, World!"

// Looping
for (i in 0..9)
    println i

// Accessing arguments
for (arg in args)
    println arg
Harbour

Bytes/chars 🥈: 94b/94c (Feel free to replace)

LOCAL i
??"Hello, World!"
FOR i:=0TO 9
?hb_ntos(i)
NEXT
FOR i:=1TO PCount()
?hb_PValue(i)
NEXT

Sample code: 164b/164c

LOCAL i

// Printing
?? "Hello, World!"

// Looping
FOR i := 0 TO 9
    ? hb_ntos( i )
NEXT

// Accessing arguments
FOR i := 1 TO PCount()
    ? hb_PValue( i )
NEXT
Hare

Placeholder: 151b/151c (Feel free to replace)

use fmt;use os;export fn main()void={fmt::println("Hello, World!")!;for(let i=0;i<10;i+=1)fmt::println(i)!;for(let a..os::args[1..])fmt::println(a)!;};

Sample code: 267b/267c

use fmt;
use os;

export fn main() void = {
    // Printing
    fmt::println("Hello, World!")!;

    // Looping
    for (let i = 0; i < 10; i += 1)
        fmt::println(i)!;

    // Accessing arguments
    for (let arg .. os::args[1..])
        fmt::println(arg)!;
};
Haskell

Placeholder: 110b/110c (Feel free to replace)

import System.Environment
main=do putStrLn"Hello, World!";mapM print[0..9];a<-drop 1<$>getArgs;mapM putStrLn a

Sample code: 187b/187c

import System.Environment

main = do
  -- Printing
  putStrLn "Hello, World!"

  -- Looping
  mapM print [0..9]

  -- Accessing arguments
  args <- drop 1 <$> getArgs
  mapM putStrLn args
Haxe

Placeholder: 139b/139c (Feel free to replace)

class Main{static public function main(){Sys.println("Hello, World!");for (i in 0...10)Sys.println(i);for(a in Sys.args())Sys.println(a);}}

Sample code: 282b/282c

class Main {
    static public function main() {
        // Printing
        Sys.println("Hello, World!");

        // Looping
        for (i in 0...10)
            Sys.println(i);

        // Accessing arguments
        for (arg in Sys.args())
            Sys.println(arg);
    }
}
🥇 Hexagony

Bytes/chars 🥇: 63b/63c

(Explanation to be written at some point)

1*H;1Po;o..Q2&(}:</,"'x&)'/>=_;{!)'-<.'>e;dl;l;=.\0;WP0$;|_\r=;

Sample code: 650b/650c

          \ P r i n t i n g .
         \ H ; e ; l ; ; o ; \
        / o ; W ; 0 P ; 2 Q < .
       . > ; r ; l ; d ; P 1 ; \
      > * . . . . . . . . . . < .
     . . . . . . . . . . . . . . .
    . . L o o p i n g . . . . . . .
   \ 1 0 ; " $ / } ! ) " ; \ . . . .
  . . . . . . . > . - " = < . . . . .
 . / . . . . . < . . . . . . . . . . .
  . . . . . . . . . . . . . . . . . .
   . . . A c c e s s i n g . . . . .
    . . . A r g u m e n t s . . . .
     . . . . . . > \ . @ . . . . .
      . > $ > , < \ ) < . . . . .
       . . \ . ; / $ 0 / . . . .
        . A r g u m e n t s . .
         . a r e . N U L L . .
          t e r m i n a t e d
Hush

Bytes/chars 🥈: 118b/118c (Feel free to replace)

std.print("Hello, World!")for i in std.range(0,10,1)do
std.print(i)end
for a in std.iter(std.args())do
std.print(a)end

Sample code: 182b/182c

# Printing
std.print("Hello, World!")

# Looping
for i in std.range(0, 10, 1) do
    std.print(i)
end

# Accessing arguments
for arg in std.iter(std.args()) do
    std.print(arg)
end
🥇 Hy

Bytes/chars 🏅: 61b/61c

(py "*map(print,['Hello, World!',*range(10)]+sys.argv[1:]),")

Simply the Python 🏅 executed from a string. This pattern is very often optimal in Hy, so perhaps it ought to be removed to keep the language interesting...

Sample code: 161b/161c

; Printing
(print "Hello, World!")

; Looping
(for [i (range 10)]
    (print i))

; Accessing arguments
(for [arg (get sys.argv (slice 1 None))]
    (print arg))
🥇 iogii

Bytes/chars 🥇: 20b/20c (Feel free to replace)

"Hello, World!
"10T$

Sample code: 68b/68c

# Printing
"Hello, World!\n"

# Looping
10T

# Accessing arguments
$
J

Bytes/chars 🥈: 37b/37c

echo&>0 1}&ARGV'Hello, World!';i.10 1

Sample code: 97b/97c

NB.Printing
echo'Hello, World!'

NB.Looping
echo i.10 1

NB.Accessing arguments
echo each 2}.ARGV
🥇 Janet

Bytes/chars 🥇: 58b/58c

Compare to the more straightforward 59b/59c solution below. Instead of dropping the first argument, we can replace it with 9. That allows us to use (range 9) instead of (range 10), saving one byte.

(map print["Hello, World!";(range 9);(put(dyn :args)0 9)])

Bytes/chars 🥈: 59b/59c

(map print["Hello, World!";(range 10);(drop 1(dyn :args))])

Alternate 59b/59c which skips the first argument in a cleverer way, but ends up being the same length:

(|(map print["Hello, World!";(range 10)$1;$&]);(dyn :args))

Sample code: 146b/146c

# Printing
(print "Hello, World!")

# Looping
(for i 0 10
  (print i))

# Accessing arguments
(each arg (tuple/slice (dyn :args) 1)
  (print arg))
🥇 Java

Bytes/chars 🥇: 113b/113c (Feel free to replace)

interface ${static void main(String[]a){for(int i=-2;;)System.out.println(++i<0?"Hello, World!":i>9?a[i-10]:i);}}

Sample code: 323b/323c

class Main {
    public static void main(String[] args) {
        // Printing
        System.out.println("Hello, World!");

        // Looping
        for (int i = 0; i < 10; i++)
            System.out.println(i);

        // Accessing arguments
        for (String arg : args)
            System.out.println(arg);
    }
}
🥇 JavaScript

Bytes/chars 🥇: 61b/61c

There are (at least) three 61b solutions by hardcoding the numbers 0-9.

print(`Hello, World!
0
1
2
3
4
5
6
7
8
9
`+arguments.join`
`)

Alternatively, the spread syntax can be used to create the digits 0-9:

print(["Hello, World!",..."0123456789",...arguments].join`
`)

This variation abuses the mechanics of tagged templates:

print`Hello${[,..."0123456789",...arguments].join`
`} World!`

Without hardcoding: 64b/64c

for(i=~(p=print)`Hello, World!`;i++<9;)p(i);p(arguments.join`
`)

There are two tricks worth noting: First, this solution assigns the print function to a variable, which saves bytes when there are more than 2 prints. Second, it uses the return value of print to initialize the loop counter, saving a byte.

Without hardcoding, single expression: 65b/65c

print(["Hello, World!",...Array(10).keys(),...arguments].join`
`)

Sample code: 157b/157c

// Printing
print("Hello, World!");

// Looping
for (let i = 0; i < 10; i++)
    print(i);

// Accessing arguments
for (let arg of arguments)
    print(arg);
🥇 jq

Bytes/chars 🥇: 35b/35c

"Hello, World!",range(10),$ARGS[][]

Sample code: 91b/91c

# Printing
"Hello, World!",

# Looping
range(10),

# Accessing arguments
$ARGS.positional[]
🥇 Julia

Bytes/chars 🥇 36b/36c

println.(["Hello, World!";0:9;ARGS])

Sample code: 135b/135c

# Printing
println("Hello, World!")

# Looping
for i=0:9
    println(i)
end

# Accessing arguments
for arg in ARGS
    println(arg)
end
🥇 K

Bytes/chars 🥇: 28b/28c (Feel free to replace)

`0:($`"Hello, World!",!10),x

Sample code: 73b/73c

/Printing
`0:"Hello, World!"

/Looping
`0:$!10

/Accessing arguments
`0:x
🥇 Kotlin

Bytes/chars 🥇: 50b/50c

((0..9)+args).fold("Hello, World!"){s,x->s+"\n$x"}

Sample code: 71b/71c

print("""Hello, World!
0
1
2
3
4
5
6
7
8
9
"""+args.joinToString("\n"))

Sample code: 138b/138c

// Printing
println("Hello, World!")

// Looping
for (i in 0..9)
    println(i)

// Accessing arguments
for (arg in args)
    println(arg)
🥇 Lua

Bytes/Chars 🥇: 67b/67c

print'Hello, World!'for i=-9,#arg do
print(i>0 and arg[i]or 9+i)end

Sample code: 144b/144c

-- Printing
print("Hello, World!")

-- Looping
for i = 0, 9 do
    print(i)
end

-- Accessing arguments
for i = 1, #arg do
    print(arg[i])
end
Nim

Bytes/chars 🥉: 79b/79c (Feel free to replace)

import os
echo"Hello, World!"
for i in 0..999:echo if i>9:paramstr i-9 else: $i

Sample code: 149b/149c

import os

# Printing
echo "Hello, World!"

# Looping
for i in 0 .. 9:
    echo i

# Accessing arguments
for arg in commandLineParams():
    echo arg
OCaml

Placeholder: 106b/106c (Feel free to replace)

print_string"Hello, World!
0
1
2
3
4
5
6
7
8
9
";Sys.argv|>Array.to_list|>List.tl|>List.iter print_endline

Sample code: 207b/207c

(* Printing *)
print_endline "Hello, World!";

(* Looping *)
for i = 0 to 9 do
  Printf.printf "%d\n" i
done;

(* Accessing arguments *)
Sys.argv
  |> Array.to_list
  |> List.tl
  |> List.iter print_endline;
Odin

Placeholder: 160b/160c (Feel free to replace)

package main
import"core:fmt"
import"core:os"
main::proc(){fmt.println("Hello, World!")
for i in 0..<10{fmt.println(i)}for arg in os.args[1:]{fmt.println(arg)}}

Sample code: 272b/272c

package main

import "core:fmt"
import "core:os"

main :: proc() {
    // Printing
    fmt.println("Hello, World!")

    // Looping
    for i in 0..<10 {
        fmt.println(i)
    }

    // Accessing arguments
    for arg in os.args[1:] {
        fmt.println(arg)
    }
}
🥇 Pascal

Bytes/chars 🥇: 107b/107c

var i:word;begin
write('Hello, World!'^j);for i:=0to 9do writeLn(i);for i:=1to argc do writeLn(argv[i])end.

Sample code: 222b/222c

var
    i: integer;
begin
    { Printing }
    writeLn('Hello, World!');

    { Looping }
    for i := 0 to 9 do
        writeLn(i);

    { Accessing arguments }
    for i := 1 to argc - 1 do
        writeLn(argv[i]);
end.
🥇 Perl

Bytes/chars 🥇: 33b/33c

say for'Hello, World!',0..9,@ARGV

Sample code: 153b/153c

# Printing
say 'Hello, World!';

# Looping
say for 0..9;

# Accessing arguments
say for @ARGV;

# Code is run under -E, all current features are enabled.
PHP

Placeholder: 71/71c (Feel free to replace)

echo"Hello, World!
0
1
2
3
4
5
6
7
8
9
";for(;$s=next($argv);)echo"$s
"

Sample code: 168b/168c

# Printing
echo "Hello, World!\n";

# Looping
for ($i = 0; $i < 10; $i++)
    echo "$i\n";

# Accessing arguments
for ($i = 1; $i < $argc; $i++)
    echo "$argv[$i]\n";
Picat

Placeholder: 83b/83c (Feel free to replace)

main(B)=>print("Hello, World!
0
1
2
3
4
5
6
7
8
9
"),foreach (A in B)println(A)end.

Sample code: 329b/329c

main =>
    % Printing
    println("Hello, World!"),

    % Looping
    foreach (I in 0..9)
        println(I)
    end.

main(Args) =>
    % Printing
    println("Hello, World!"),

    % Looping
    foreach (I in 0..9)
        println(I)
    end,

    % Accessing arguments
    foreach (Arg in Args)
        println(Arg)
    end.
🥇 PowerShell

Bytes/chars 🥇: 26b/26c

Implicit output makes this one pretty simple. Note that implicit output is disabled on the Quine hole specifically, to keep it more interesting.

'Hello, World!'
0..9
$args

Sample code: 162b/162c

# Printing
Write-Host 'Hello, World!'

# Looping
ForEach ($i in 0..9) {
    Write-Host $i
}

# Accessing arguments
ForEach ($arg in $args) {
    Write-Host $arg
}
Prolog

Bytes/chars: 75b/75c

:-cmdline(A),maplist(writeln,['Hello, World!
0
1
2
3
4
5
6
7
8',9|A]).

Sample code: 179b/179c

% Printing
:- writeln("Hello, World!").

% Looping
:- numlist(0, 9, List),
   maplist(writeln, List).

% Accessing arguments
:- prolog_flag(argv, Args),
   maplist(writeln, Args).
🥇 Python

Bytes 🥇: 65b/65c

import sys
*map(print,["Hello, World!",*range(10)]+sys.argv[1:]),

Chars 🥇: 124b/58c

Check out the "Packers" section of the Python wiki page to see how this was generated from the bytes gold.

exec(bytes("浩潰瑲猠獹⨊慭⡰牰湩ⱴ≛效汬Ɐ圠牯摬∡⨬慲杮⡥〱崩猫獹愮杲孶㨱⥝‬","u16")[2:])

Sample code: 152b/152c

import sys

# Printing
print('Hello, World!')

# Looping
for i in range(10):
    print(i)

# Accessing arguments
for arg in sys.argv[1:]:
    print(arg)
Qore

Placeholder: 86b/86c (Feel free to replace)

print("Hello, World!
0
1
2
3
4
5
6
7
8
9
");foreach string a in(ARGV)printf("%s\n",a);

Sample code: 171b/171c

# Printing
print("Hello, World!\n");

# Looping
foreach int i in (0..9)
    printf("%d\n", i);

# Accessing arguments
foreach string arg in (ARGV)
    printf("%s\n", arg);
🥇 R

Bytes/chars 🥇: 46b/46c

write(c("Hello, World!",0:9,commandArgs(T)),1)

Sample code: 158b/158c

# Printing
write("Hello, World!", 1)

# Looping
for (i in 0:9) {
    write(i, 1)
}

# Accessing arguments
for (arg in commandArgs(TRUE)) {
    write(arg, 1)
}
🥇 Racket

Bytes/chars 🥇: 72b/72c

(command-line #:args a(map displayln`("Hello, World!",@(range 10),@a))x)

The x can be any undefined variable name. It causes an error, which prevents the implicit output of the map result.

Raku

Bytes/chars: 34b/33c

("Hello, World!",^10,@*ARGS)».say

Sample code: 96b/96c

# Printing
say 'Hello, World!';

# Looping
.say for ^10;

# Accessing arguments
.say for @*ARGS;
Rebol

Bytes/chars 🥈: 78b/78c (Feel free to replace)

print"Hello, World!"for i 0 9 1[print i]foreach a system/options/args[print a]

Sample code: 144b/144c

; Printing
print "Hello, World!"

; Looping
for i 0 9 1 [
    print i
]

; Accessing arguments
foreach arg system/options/args [
    print arg
]
Rexx

Bytes/chars 🥉: 71b/71c (Feel free to replace)

say"Hello, World!"
do i=0 to 9
say i
end
do i=1 to arg()
say arg(i)
end

Sample code: 132b/132c

-- Printing
say "Hello, World!"

-- Looping
do i = 0 to 9
    say i
end

-- Accessing arguments
do i = 1 to arg()
    say arg(i)
end
🥇 Rockstar

Bytes/chars 🥇: 55b/55c

say "Hello, World!
0
1
2
3
4
5
6
7
8
9"for b in i say i

Sample code: 129b/129c

(Printing)
print "Hello, World!"

(Looping)
for x in 10
  print x
end

(Accessing arguments)
for arg in arguments
  print arg
end
🥇 Ruby

Bytes/chars 🥇: 28b/28c

puts'Hello, World!',*0..9,$*

Sample code: 135b/135c

# Printing
puts 'Hello, World!'

# Looping
(0..9).each do |i|
    puts i
end

# Accessing arguments
ARGV.each do |arg|
    puts arg
end
Rust

Bytes/chars 🥈: 103b/103c

fn main(){print!{"Hello, World!
0
1
2
3
4
5
6
7
8
9"}for a in std::env::args().skip(1){print!("
{a}")}}

Sample code: 231b/231c

fn main() {
    // Printing
    println!("Hello, World!");

    // Looping
    for i in 0..10 {
        println!("{i}");
    }

    // Accessing arguments
    for arg in std::env::args().skip(1) {
        println!("{arg}");
    }
}
🥇 Scala

Bytes/chars 🥇: 43b/43c

"Hello, World!"+:(0.to(9)++args)map println

Sample code: 127b/127c

// Printing
println("Hello, World!")

// Looping
for (i <- 0 to 9)
    println(i)

// Accessing arguments
args.foreach(println)
🥇 Scheme

Bytes/chars 🥇: 63b/63c

(printf"Hello, World!~@{~{
~a~}~}"(iota 10)(cdr(command-line)))

Sample code: 207b/207c

; Printing
(printf "~a~n" "Hello, World!")

; Looping
(for-each (lambda (i) (display i) (newline)) (iota 10))

; Accessing arguments
(for-each (lambda (arg) (display arg) (newline)) (command-line-arguments))
(*) sed

Bytes/chars (*): 44b/44c

1s/^/Hello, World!0123456789/
s/[!0-9]/&\n/g

(*): This is the shortest solution with 100% pass rate so far, but it's not 🥇.

Sample code: 330b/330c

# Printing
1i Hello, World!

# Looping
2,$ b

h
s/.*/0/
:loop
p
y/012345678/123456789/
/9/ !b loop
G

# Accessing arguments
# (... automatic, one per line ...)

# Arguments are available via STDIN,
# each argument is separated with a null byte.
# The code is run with -E and -z options.
# Output replaces null bytes with newlines.
🥇 SQL

Bytes/chars 🥇: 58b/58c

SELECT'Hello, World!
0
1
2
3
4
5
6
7
8
9';SELECT*FROM argv
🥇 Squirrel

Bytes/chars 🥇: 65b/65c

for(x<--2;;)print((++x<0?"Hello, World!":9<x?vargv[x-10]:x)+"\n")

Sample code: 173b/173c

// Printing
print("Hello, World!\n");

// Looping
for (local i = 0; i < 10; i++)
    printf("%d\n", i);

// Accessing arguments
foreach (arg in vargv)
    print(arg + "\n");
🥇 Stax

Bytes 🥇: 17b/17c

ArrE`jaH1"jS3!`Lm

Chars 🥇: 37b/15c

Written in PackedStax, which can be easily generated using the online interpreter.

Ç¿∟↔ä♦Tδα₧▄↨♪▓ä

Sample code: 76b/76c

`Printing`d
"Hello, World!"P

`Looping`d
0P9R{P}F

`Accessing arguments`d
Lm
🥇 Swift

Bytes/chars 🥇: 88b/88c

(["Hello, World!"]+(0...9).map{"\($0)"}+CommandLine.arguments[1...]).map{print($0)}

Sample code: 160b/160c

// Printing
print("Hello, World!")

// Looping
for i in 0...9 {
    print(i)
}

// Accessing arguments
for arg in CommandLine.arguments[1...] {
    print(arg)
}
🥇 Tcl

Bytes/chars 🥇: 47b/47c

puts Hello,\ World!\n[join [lseq 10]\ $argv \n]

Sample code: 150b/150c

# Printing
puts "Hello, World!"

# Looping
for {set x 0} {$x < 10} {incr x} {
    puts $x
}

# Accessing arguments
foreach arg $argv {
    puts $arg
}
🥇 TeX

Bytes/chars 🥇: 80b/80c

\let\eject
Hello, World!0123456789\count0 0\def~{\argv{\count0}~ }~

Sample code: 218b/218c

% Printing
Hello, World!

% Looping
\newcount\i
\loop\ifnum\i<10
    \the\i\endgraf
    \advance\i by1
\repeat

% Accessing arguments
\newcount\j
\loop\ifnum\j<\argc\relax
    \argv\j\endgraf
    \advance\j by1
\repeat
🥇 Uiua

Bytes/chars 🥇: 39b/31c

∵&p⊂⇡10↘1&args&p"Hello, World!"

Sample code: 88b/80c

# Printing
&p"Hello, World!"

# Looping
∵&p⇡10

# Accessing arguments
∵&p↘1&args
V

Bytes/chars 🥈: 76b/76c (Feel free to replace)

import os
print('Hello, World!
0
1
2
3
4
5
6
7
8
9
'+os.args[1..].join('
'))

Sample code: 162b/162c

import os

// Printing
println('Hello, World!')

// Looping
for i in 0..10 {
    println(i)
}

// Accessing arguments
for arg in os.args[1..] {
    println(arg)
}
🥇 VimL

Bytes/chars 🥇: 37b/37c

i
Hello, World!
.
pu=range(10)+args
w

Alt: 37b/37c

norm"=rang<C-A>10)+args<CR>POHello, World!
x

Sample code: 175b/175c

" Printing
i
Hello, World!
.

" Looping
for i in range(10)
    pu=i
endfo

" Accessing arguments
for a in args
    pu=a
endfo

" Make sure to save the file when you're done!
w
Vyxal

Placeholder: 27b/27c (Feel free to replace)

"Hello, World!",0,9(n,}#?(,

Sample code: 80b/79c

## Printing
"Hello, World!",

## Looping
9ʁ (n,}

## Accessing arguments
#? (,}
🥇 Wren

Bytes/chars 🥇: 87b/87c

import"os"for Process as p
for(a in["Hello, World!"]+(0..9)+p.arguments)System.print(a)

Sample code: 179b/179c

import "os" for Process

// Printing
System.print("Hello, World!")

// Looping
for (i in 0..9) System.print(i)

// Accessing arguments
for (a in Process.arguments) System.print(a)
Zig

Bytes/chars 🥉: 181b/181c (Feel free to replace)

const s=@import("std");pub fn main()void{for(s.os.argv[1..],1..)|a,b|_=&s.io.getStdOut().writer().print("{s}{s}\n",.{"Hello, World!\n0\n1\n2\n3\n4\n5\n6\n7\n8\n9\n"[0..1/b*34],a});}

Sample code: 343b/343c

const std = @import("std");

pub fn main() !void {
    const stdout = std.io.getStdOut().writer();

    // Printing
    try stdout.print("Hello, World!\n", .{});

    // Looping
    for (0..10) |i|
        try stdout.print("{}\n", .{i});

    // Accessing arguments
    for (std.os.argv[1..]) |arg|
        try stdout.print("{s}\n", .{arg});
}