1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
|
// -*- mode: java; -*-
// An implementation of
// https://sampleprograms.io/projects/bubble-sort/
//
// Bubble sort, with reading (parsing) and writing (formatting) the data.
val _exit = { u8[~] msg ->
sys.io.p(msg);
sys.libc._exit(1);
};
val usage = { -> _exit("stdin must look like [4, 3, 2, 1]"); };
// Scanner
struct Scan {
int !x;
u8[~] buf;
};
// Skip whitespace
val skip = { Scan s ->
while( s.buf[s.x] <= ' ' )
s.x++;
};
// Require specific syntax or usage
val require = { Scan s, u8 c ->
skip(s);
if( s.buf[s.x++] != c )
usage();
};
val peek = { Scan s, u8 c ->
skip(s);
if( s.buf[s.x] != c ) return false;
s.x++;
return true;
};
val number = { Scan s ->
skip(s);
i32 n = 0;
while( '0' <= s.buf[s.x] & s.buf[s.x] <= '9' )
n = n*10 + (s.buf[s.x++] - '0');
return n;
};
val sort = { int[] ns, int len ->
var done = false;
while( !done ) {
done = true;
for( var i = 0; i < len-1; i++ )
if( ns[i] > ns[i+1] ) {
int tmp = ns[i];
ns[i] = ns[i+1];
ns[i+1] = tmp; // Swap
done = false;
}
}
};
// Read from stdin a line of the form "[ 4, 3, 2, 1]" and print it sorted.
val main = { ->
Scan !s = new Scan{ buf = sys.io.stdin(); };
require(s,'[');
// Array of parsed results
int[] !ns = new int[16];
i32 len = 0;
// Parse a list of numbers
if( !peek(s,']') ) { // Handle the empty list
// Parse "123, " until a something else
while( s.x < s.buf# ) {
int n = number(s);
ns[len++] = n;
if( !peek(s,',') )
break;
};
require(s,']'); // Close the list
}
// Bubble sort array of integers
sort(ns,len);
// Print a list of numbers
sys.io.p("[ ");
u8[] !junk = new u8[1];
for( int i=0; i<len; i++ ) {
int x = ns[i];
if( !x ) { sys.io.p("0, "); continue; }
int ten = 1, log = 0;
while( ten <= x ) { ten *= 10; log++; }
ten /= 10;
for( int i=0; i<log; i++ ) {
int q = x/ten;
int r = x - q*ten;
junk[0] = q+'0';
sys.io.p(junk);
x = r;
ten /= 10;
}
sys.io.p(", ");
}
sys.io.p("]");
return 0;
};
|