Cistercian numerals: Difference between revisions
Content added Content deleted
Line 1,024: | Line 1,024: | ||
x x x |
x x x |
||
x xxxxxx |
x xxxxxx |
||
9999: |
|||
xxxxxxxxxxx |
|||
x x x |
|||
x x x |
|||
x x x |
|||
xxxxxxxxxxx |
|||
x |
|||
x |
|||
x |
|||
x |
|||
x |
|||
xxxxxxxxxxx |
|||
x x x |
|||
x x x |
|||
x x x |
|||
xxxxxxxxxxx</pre> |
|||
=={{header|D}}== |
|||
{{trans|Java}} |
|||
<lang d>import std.stdio; |
|||
class Cistercian { |
|||
private immutable SIZE = 15; |
|||
private char[SIZE][SIZE] canvas; |
|||
public this(int n) { |
|||
initN(); |
|||
draw(n); |
|||
} |
|||
private void initN() { |
|||
foreach (ref row; canvas) { |
|||
row[] = ' '; |
|||
row[5] = 'x'; |
|||
} |
|||
} |
|||
private void horizontal(int c1, int c2, int r) { |
|||
for (int c = c1; c <= c2; c++) { |
|||
canvas[r][c] = 'x'; |
|||
} |
|||
} |
|||
private void vertical(int r1, int r2, int c) { |
|||
for (int r = r1; r <= r2; r++) { |
|||
canvas[r][c] = 'x'; |
|||
} |
|||
} |
|||
private void diagd(int c1, int c2, int r) { |
|||
for (int c = c1; c <= c2; c++) { |
|||
canvas[r + c - c1][c] = 'x'; |
|||
} |
|||
} |
|||
private void diagu(int c1, int c2, int r) { |
|||
for (int c = c1; c <= c2; c++) { |
|||
canvas[r - c + c1][c] = 'x'; |
|||
} |
|||
} |
|||
private void draw(int v) { |
|||
auto thousands = v / 1000; |
|||
v %= 1000; |
|||
auto hundreds = v / 100; |
|||
v %= 100; |
|||
auto tens = v / 10; |
|||
auto ones = v % 10; |
|||
drawPart(1000 * thousands); |
|||
drawPart(100 * hundreds); |
|||
drawPart(10 * tens); |
|||
drawPart(ones); |
|||
} |
|||
private void drawPart(int v) { |
|||
switch(v) { |
|||
case 0: |
|||
break; |
|||
case 1: |
|||
horizontal(6, 10, 0); |
|||
break; |
|||
case 2: |
|||
horizontal(6, 10, 4); |
|||
break; |
|||
case 3: |
|||
diagd(6, 10, 0); |
|||
break; |
|||
case 4: |
|||
diagu(6, 10, 4); |
|||
break; |
|||
case 5: |
|||
drawPart(1); |
|||
drawPart(4); |
|||
break; |
|||
case 6: |
|||
vertical(0, 4, 10); |
|||
break; |
|||
case 7: |
|||
drawPart(1); |
|||
drawPart(6); |
|||
break; |
|||
case 8: |
|||
drawPart(2); |
|||
drawPart(6); |
|||
break; |
|||
case 9: |
|||
drawPart(1); |
|||
drawPart(8); |
|||
break; |
|||
case 10: |
|||
horizontal(0, 4, 0); |
|||
break; |
|||
case 20: |
|||
horizontal(0, 4, 4); |
|||
break; |
|||
case 30: |
|||
diagu(0, 4, 4); |
|||
break; |
|||
case 40: |
|||
diagd(0, 4, 0); |
|||
break; |
|||
case 50: |
|||
drawPart(10); |
|||
drawPart(40); |
|||
break; |
|||
case 60: |
|||
vertical(0, 4, 0); |
|||
break; |
|||
case 70: |
|||
drawPart(10); |
|||
drawPart(60); |
|||
break; |
|||
case 80: |
|||
drawPart(20); |
|||
drawPart(60); |
|||
break; |
|||
case 90: |
|||
drawPart(10); |
|||
drawPart(80); |
|||
break; |
|||
case 100: |
|||
horizontal(6, 10, 14); |
|||
break; |
|||
case 200: |
|||
horizontal(6, 10, 10); |
|||
break; |
|||
case 300: |
|||
diagu(6, 10, 14); |
|||
break; |
|||
case 400: |
|||
diagd(6, 10, 10); |
|||
break; |
|||
case 500: |
|||
drawPart(100); |
|||
drawPart(400); |
|||
break; |
|||
case 600: |
|||
vertical(10, 14, 10); |
|||
break; |
|||
case 700: |
|||
drawPart(100); |
|||
drawPart(600); |
|||
break; |
|||
case 800: |
|||
drawPart(200); |
|||
drawPart(600); |
|||
break; |
|||
case 900: |
|||
drawPart(100); |
|||
drawPart(800); |
|||
break; |
|||
case 1000: |
|||
horizontal(0, 4, 14); |
|||
break; |
|||
case 2000: |
|||
horizontal(0, 4, 10); |
|||
break; |
|||
case 3000: |
|||
diagd(0, 4, 10); |
|||
break; |
|||
case 4000: |
|||
diagu(0, 4, 14); |
|||
break; |
|||
case 5000: |
|||
drawPart(1000); |
|||
drawPart(4000); |
|||
break; |
|||
case 6000: |
|||
vertical(10, 14, 0); |
|||
break; |
|||
case 7000: |
|||
drawPart(1000); |
|||
drawPart(6000); |
|||
break; |
|||
case 8000: |
|||
drawPart(2000); |
|||
drawPart(6000); |
|||
break; |
|||
case 9000: |
|||
drawPart(1000); |
|||
drawPart(8000); |
|||
break; |
|||
default: |
|||
import std.conv; |
|||
assert(false, "Not handled: " ~ v.to!string); |
|||
} |
|||
} |
|||
public void toString(scope void delegate(const(char)[]) sink) const { |
|||
foreach (row; canvas) { |
|||
sink(row); |
|||
sink("\n"); |
|||
} |
|||
} |
|||
} |
|||
void main() { |
|||
foreach (number; [0, 1, 20, 300, 4000, 5555, 6789, 9999]) { |
|||
writeln(number, ':'); |
|||
auto c = new Cistercian(number); |
|||
writeln(c); |
|||
} |
|||
}</lang> |
|||
{{out}} |
|||
<pre>0: |
|||
x |
|||
x |
|||
x |
|||
x |
|||
x |
|||
x |
|||
x |
|||
x |
|||
x |
|||
x |
|||
x |
|||
x |
|||
x |
|||
x |
|||
x |
|||
1: |
|||
xxxxxx |
|||
x |
|||
x |
|||
x |
|||
x |
|||
x |
|||
x |
|||
x |
|||
x |
|||
x |
|||
x |
|||
x |
|||
x |
|||
x |
|||
x |
|||
20: |
|||
x |
|||
x |
|||
x |
|||
x |
|||
xxxxxx |
|||
x |
|||
x |
|||
x |
|||
x |
|||
x |
|||
x |
|||
x |
|||
x |
|||
x |
|||
x |
|||
300: |
|||
x |
|||
x |
|||
x |
|||
x |
|||
x |
|||
x |
|||
x |
|||
x |
|||
x |
|||
x |
|||
x x |
|||
x x |
|||
x x |
|||
x x |
|||
xx |
|||
4000: |
|||
x |
|||
x |
|||
x |
|||
x |
|||
x |
|||
x |
|||
x |
|||
x |
|||
x |
|||
x |
|||
xx |
|||
x x |
|||
x x |
|||
x x |
|||
x x |
|||
5555: |
|||
xxxxxxxxxxx |
|||
x x x |
|||
x x x |
|||
x x x |
|||
xxx |
|||
x |
|||
x |
|||
x |
|||
x |
|||
x |
|||
xxx |
|||
x x x |
|||
x x x |
|||
x x x |
|||
xxxxxxxxxxx |
|||
6789: |
|||
x xxxxxx |
|||
x x x |
|||
x x x |
|||
x x x |
|||
xxxxxxxxxxx |
|||
x |
|||
x |
|||
x |
|||
x |
|||
x |
|||
x x x |
|||
x x x |
|||
x x x |
|||
x x x |
|||
9999: |
9999: |
||
Line 1,134: | Line 1,484: | ||
# O### |
# O### |
||
</pre> |
</pre> |
||
=={{header|Factor}}== |
=={{header|Factor}}== |
||
{{works with|Factor|0.99 2020-08-14}} |
{{works with|Factor|0.99 2020-08-14}} |