Data commit

This commit is contained in:
Ingy döt Net 2023-07-01 11:58:00 -04:00
parent 7387c8f97b
commit cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions

View file

@ -0,0 +1,3 @@
---
from: http://rosettacode.org/wiki/Mayan_numerals
note: Mayan numerals

View file

@ -0,0 +1,140 @@
;Task:
Present numbers using the Mayan numbering system   (displaying the Mayan numerals in a cartouche).
;Mayan numbers:
Normally, Mayan <u>numbers</u> are written vertically &nbsp; (top─to─bottom) &nbsp; with the most significant
numeral at the top &nbsp; (in the sense that decimal numbers are written left─to─right with the most significant
digit at the left). &nbsp; This task will be using a left─to─right (horizontal) format, &nbsp; mostly for familiarity and
readability, &nbsp; and to conserve screen space (when showing the output) on this task page.
;Mayan numerals:
Mayan <u>numerals</u> &nbsp; (a base─20 "digit" or glyph) &nbsp; are written in two orientations, &nbsp; this
task will be using the "vertical" format &nbsp; (as displayed below). &nbsp; Using the vertical format makes
it much easier to draw/construct the Mayan numerals (glyphs) with simple dots ('''.''')
and hyphen ('''-'''); &nbsp; &nbsp; (however, round bullets ('''&bull;''') and long dashes ('''─''')
make a better presentation on Rosetta Code).
Furthermore, each Mayan numeral &nbsp; (for this task) &nbsp; is to be displayed as a
cartouche &nbsp; (enclosed in a box) &nbsp; to make it easier to parse (read); &nbsp; the box may be
drawn with any suitable (ASCII or Unicode) characters that are presentable/visible in all web browsers.
;Mayan numerals added to Unicode
Mayan numerals (glyphs) were added to the Unicode Standard in June of 2018 &nbsp; (this corresponds with
version 11.0). &nbsp; But since most web browsers don't support them at this time, &nbsp; this Rosetta Code
task will be constructing the glyphs with "simple" characters and/or ASCII art.
;The "zero" glyph:
The Mayan numbering system has the concept of &nbsp; '''zero''', &nbsp; and should be shown by a glyph that represents
an upside─down (sea) shell, &nbsp; or an egg. &nbsp; The Greek letter '''theta''' &nbsp; (<big>'''Θ'''</big>) &nbsp; can be
used &nbsp; (which more─or─less, looks like an
egg). &nbsp; A &nbsp; ''commercial at'' &nbsp; symbol &nbsp; (<big>'''@'''</big>) &nbsp; could make a poor substitute.
;Mayan glyphs (constructed):
The Mayan numbering system is
a &nbsp; [[https://en.wikipedia.org/wiki/Vigesimal vigesimal (base 20)]] &nbsp; positional numeral system.
;The Mayan numerals &nbsp; (and some random numbers) &nbsp; shown in the &nbsp; ''vertical'' &nbsp; format would be shown as:
╔════╗ ╔════╗ ╔════╦════╗
║ ║ ║ ║ ║ ║ ║
║ ║ ║ ∙ ║ ║ ║ ║
1──► ║ ║ 11──► ║────║ 21──► ║ ║ ║
║ ∙ ║ ║────║ ║ ∙ ║ ∙ ║
╚════╝ ╚════╝ ╚════╩════╝
╔════╗ ╔════╗ ╔════╦════╗
║ ║ ║ ║ ║ ║ ║
║ ║ ║ ∙∙ ║ ║ ║ ║
2──► ║ ║ 12──► ║────║ 22──► ║ ║ ║
║ ∙∙ ║ ║────║ ║ ∙ ║ ∙∙ ║
╚════╝ ╚════╝ ╚════╩════╝
╔════╗ ╔════╗ ╔════╦════╗
║ ║ ║ ║ ║ ║ ║
║ ║ ║∙∙∙ ║ ║ ║ ║
3──► ║ ║ 13──► ║────║ 40──► ║ ║ ║
║∙∙∙ ║ ║────║ ║ ∙∙ ║ Θ ║
╚════╝ ╚════╝ ╚════╩════╝
╔════╗ ╔════╗ ╔════╦════╗
║ ║ ║ ║ ║ ║ ║
║ ║ ║∙∙∙∙║ ║ ║ ║
4──► ║ ║ 14──► ║────║ 80──► ║ ║ ║
║∙∙∙∙║ ║────║ ║∙∙∙∙║ Θ ║
╚════╝ ╚════╝ ╚════╩════╝
╔════╗ ╔════╗ ╔════╦════╗
║ ║ ║ ║ ║ ║ ║
║ ║ ║────║ ║ ║ ║
5──► ║ ║ 15──► ║────║ 90──► ║ ║────║
║────║ ║────║ ║∙∙∙∙║────║
╚════╝ ╚════╝ ╚════╩════╝
╔════╗ ╔════╗ ╔════╦════╗
║ ║ ║ ∙ ║ ║ ║ ║
║ ║ ║────║ ║ ║ ║
6──► ║ ∙ ║ 16──► ║────║ 100──► ║ ║ ║
║────║ ║────║ ║────║ Θ ║
╚════╝ ╚════╝ ╚════╩════╝
╔════╗ ╔════╗ ╔════╦════╗
║ ║ ║ ∙∙ ║ ║ ║ ║
║ ║ ║────║ ║ ║ ║
7──► ║ ∙∙ ║ 17──► ║────║ 200──► ║────║ ║
║────║ ║────║ ║────║ Θ ║
╚════╝ ╚════╝ ╚════╩════╝
╔════╗ ╔════╗ ╔════╦════╗
║ ║ ║∙∙∙ ║ ║ ║ ║
║ ║ ║────║ 300──► ║────║ ║
8──► ║∙∙∙ ║ 18──► ║────║ ║────║ ║
║────║ ║────║ ║────║ Θ ║
╚════╝ ╚════╝ ╚════╩════╝
╔════╗ ╔════╗ ╔════╦════╦════╗
║ ║ ║∙∙∙∙║ ║ ║ ║ ║
║ ║ ║────║ 400──► ║ ║ ║ ║
9──► ║∙∙∙∙║ 19──► ║────║ ║ ║ ║ ║
║────║ ║────║ ║ ∙ ║ Θ ║ Θ ║
╚════╝ ╚════╝ ╚════╩════╩════╝
╔════╗ ╔════╦════╗ ╔════╦════╦════╦════╗
║ ║ ║ ║ ║ ║ ║ ║ ║ ║
║ ║ ║ ║ ║ ║ ║ ║ ║ ║
10──► ║────║ 20──► ║ ║ ║ 16,000──► ║ ║ ║ ║ ║
║────║ ║ ∙ ║ Θ ║ ║ ∙∙ ║ Θ ║ Θ ║ Θ ║
╚════╝ ╚════╩════╝ ╚════╩════╩════╩════╝
Note that the Mayan numeral &nbsp; '''13''' &nbsp; in &nbsp; ''horizontal'' &nbsp; format would be shown as:
╔════╗
║ ││║
║ ∙││║
13──► ║ ∙││║ ◄─── this glyph form <u>won't</u> be used in this Rosetta Code task.
║ ∙││║
╚════╝
Other forms of cartouches (boxes) can be used for this task.
;Task requirements:
:* &nbsp; convert the following decimal numbers to Mayan numbers:
:::* &nbsp; &nbsp; &nbsp; 4,005
:::* &nbsp; &nbsp; &nbsp; 8,017
:::* &nbsp; 326,205
:::* &nbsp; 886,205
:* &nbsp; show a &nbsp; <u>unique</u> &nbsp; ''interesting/pretty/unusual/intriguing/odd/amusing/weird'' &nbsp; Mayan number
:* &nbsp; show all output here
;Related tasks:
:* &nbsp; [[Roman numerals/Encode]] &nbsp; ─── convert numeric values into Roman numerals
:* &nbsp; [[Roman numerals/Decode]] &nbsp; ─── convert Roman numerals into Arabic numbers
;See also:
:* &nbsp; The Wikipedia entry: &nbsp; [[https://en.wikipedia.org/wiki/Maya_numerals Mayan numerals]]
<br><br>

View file

@ -0,0 +1,74 @@
-V
UL = ‘╔’
UC = ‘╦’
UR = ‘╗’
LL = ‘╚’
LC = ‘╩’
LR = ‘╝’
HB = ‘═’
VB = ‘║’
Mayan = [ ,
,
∙∙ ,
‘∙∙∙ ,
‘∙∙∙∙’]
M0 = @
M5 = ‘────’
F toBase20(=n)
V result = [n % 20]
n I/= 20
L n != 0
result [+]= n % 20
n I/= 20
R reversed(result)
F toMayanNumeral(=d)
V result = [Mayan[0], Mayan[0], Mayan[0], Mayan[0]]
I d == 0
result[3] = :M0
R result
L(i) (3..0).step(-1)
I d >= 5
result[i] = :M5
d -= 5
E
result[i] = Mayan[d]
L.break
R result
F draw(mayans)
V idx = mayans.len - 1
print(:UL, end' )
L(i) 0 .. idx
print(:HB * 4, end' )
I i < idx
print(:UC, end' )
E
print(:UR)
L(i) 1..4
print(:VB, end' )
L(j) 0 .. idx
print(mayans[j][i - 1]:VB, end' )
print()
print(:LL, end' )
L(i) 0 .. idx
print(:HB * 4, end' )
I i < idx
print(:LC, end' )
E
print(:LR)
L(n) [4005, 8017, 326205, 886205, 1081439556]
print(Converting n to Mayan:)
V digits = toBase20(n)
V mayans = digits.map(d -> toMayanNumeral(d))
draw(mayans)
print()

View file

@ -0,0 +1,125 @@
putch: equ 2
puts: equ 9
org 100h
lxi h,80h ; Get length of command line input
mov a,m
cpi 2
rc ; If no input, stop
add l
mov l,a ; Go to end of numbers
mov c,l ; C = end of numbers
inx h
mvi m,0FFh ; Terminate digit sequence with FFh
dcx h
sub0: mov a,m
cpi 32 ; When space reached, we're at the beginning
jz to20
sui '0' ; Subtract '0' from each digit and make sure
rc ; they are all valid
cpi 10
rnc
mov m,a
dcx h
jmp sub0
to20: mov a,c ; Calculate amount of numbers
sui 81h
mov c,a
to20l: mov e,c ; E = digit counter
mvi l,82h ; Start at beginning
div2: mov a,m ; Grab digit
jnc $+5 ; If carry, add ten
adi 10
rar ; Divide by two
mov m,a ; Write back
inx h
dcr e
jnz div2 ; Keep going
dcx h ; For the last number we want
ral ; to keep the carry
mov m,a ; This digit is now base-20
dcr c ; One fewer digit left to do
jnz to20l
mvi l,81h ; Find start and end of numbers
start: inx h
mov a,m
ana a
jz start
mov b,l ; B = start
inr a ; If number is zero, output nothing
rz
nend: inx h
mov a,m
inr a
jnz nend
mov a,l ; A = end
sub b
mov c,a ; C = amount
call edge
mvi d,3 ; D=line
line: push b ; Save start and amount
mov l,b ; HL = first digit
mvi h,0
num: call dline ; Print line for digit
inx h ; Next digit
dcr c
jnz num
push d ; Save line number
lxi d,dn ; Print end of line
call print
pop d ; Restore variables
pop b
dcr d
jp line ; Print next line
edge: push b ; Print edge (top or bottom)
edge_l: push b ; Keep counter
lxi d,edges
call print
pop b
dcr c
jnz edge_l
lxi d,edgen
call print
pop b
ret
dline: push h ; Print line for digit (D'th from bottom)
push d
push b
mov a,m
ora d ; Line and number both 0?
jnz $+9
lxi d,dz ; Then print line with @
jmp dnum
mov a,d ; 5 * line
add a
add a
add d
mov e,a
mov a,m ; A -= 5 * line
sub e
lxi d,d0 ; If <0, empty
jm dnum
cpi 5
jc $+9
lxi d,d5 ; If >=5, ----
jmp dnum
add a ; Otherwise, d[n]
mov l,a
add a
add l
mov l,a
mvi h,0
dad d
xchg
dnum: call print
pop b
pop d
pop h
ret
print: mvi c,puts
jmp 5
edges: db '+----$'
edgen: db '+',13,10,'$'
dz: db '| @ $'
d0: db '| $| . $| .. $|... $|....$'
d5: db '|----$'
dn: db '|',13,10,'$'

View file

@ -0,0 +1,9 @@
mayan{
ds6 4' . .. ... ....────'
d{ =0:4 4¯14'Θ'
ds[1+50-15 10 5 0;]
}¨20(¯1)
top'╔',(1(d)'╦════'),'╗'
btm'╚',(1(d)'╩════'),'╝'
top((,/'║',¨d),'║')btm
}

View file

@ -0,0 +1,264 @@
use AppleScript version "2.4"
use framework "Foundation"
use scripting additions
-- MAYAN NUMBERS ------------------------------------------
-- mayanNumber:: Int -> [[String]]
on mayanNumber(n)
showIntAtBase(20, my mayanDigit, n, {})
end mayanNumber
-- mayanDigit :: Int -> String
on mayanDigit(n)
if 0 < n then
set r to n mod 5
bool({}, {concat(replicate(r, "●"))}, 0 < r) & ¬
replicate(n div 5, "━━")
else
{"Θ"}
end if
end mayanDigit
-- mayanFrame :: Int -> String
on mayanFrame(n)
"Mayan " & (n as string) & ":\n" & wikiTable({|class|:¬
"wikitable", colwidth:¬
"3em", cell:¬
"vertical-align:bottom;", |style|:¬
"text-align:center;background-color:#F0EDDE;" & ¬
"color:#605B4B;border:2px solid silver"})'s ¬
|λ|({map(intercalateS("<br>"), mayanNumber(n))}) & "\n"
end mayanFrame
-- TEST ---------------------------------------------------
on run
set str to unlines(map(mayanFrame, ¬
{4005, 8017, 326205, 886205, 2978480}))
set the clipboard to (str)
return str
end run
-- GENERIC ------------------------------------------------
-- Just :: a -> Maybe a
on Just(x)
{type:"Maybe", Nothing:false, Just:x}
end Just
-- Nothing :: Maybe a
on Nothing()
{type:"Maybe", Nothing:true}
end Nothing
-- Tuple (,) :: a -> b -> (a, b)
on Tuple(a, b)
{type:"Tuple", |1|:a, |2|:b, length:2}
end Tuple
-- bool :: a -> a -> Bool -> a
on bool(f, t, p)
if p then
t
else
f
end if
end bool
-- concat :: [[a]] -> [a]
-- concat :: [String] -> String
on concat(xs)
set lng to length of xs
if 0 < lng and string is class of (item 1 of xs) then
set acc to ""
else
set acc to {}
end if
repeat with i from 1 to lng
set acc to acc & item i of xs
end repeat
acc
end concat
-- foldl :: (a -> b -> a) -> a -> [b] -> a
on foldl(f, startValue, xs)
tell mReturn(f)
set v to startValue
set lng to length of xs
repeat with i from 1 to lng
set v to |λ|(v, item i of xs, i, xs)
end repeat
return v
end tell
end foldl
-- intercalateS :: String -> [String] -> String
on intercalateS(sep)
script
on |λ|(xs)
set {dlm, my text item delimiters} to {my text item delimiters, sep}
set s to xs as text
set my text item delimiters to dlm
return s
end |λ|
end script
end intercalateS
-- lookupDict :: a -> Dict -> Maybe b
on lookupDict(k, dct)
set ca to current application
set v to (ca's NSDictionary's dictionaryWithDictionary:dct)'s objectForKey:k
if missing value v then
Just(item 1 of ((ca's NSArray's arrayWithObject:v) as list))
else
Nothing()
end if
end lookupDict
-- Lift 2nd class handler function into 1st class script wrapper
-- mReturn :: First-class m => (a -> b) -> m (a -> b)
on mReturn(f)
if class of f is script then
f
else
script
property |λ| : f
end script
end if
end mReturn
-- map :: (a -> b) -> [a] -> [b]
on map(f, xs)
tell mReturn(f)
set lng to length of xs
set lst to {}
repeat with i from 1 to lng
set end of lst to |λ|(item i of xs, i, xs)
end repeat
return lst
end tell
end map
-- | The 'maybe' function takes a default value, a function, and a 'Maybe'
-- value. If the 'Maybe' value is 'Nothing', the function returns the
-- default value. Otherwise, it applies the function to the value inside
-- the 'Just' and returns the result.
-- maybe :: b -> (a -> b) -> Maybe a -> b
on maybe(v, f, mb)
if Nothing of mb then
v
else
tell mReturn(f) to |λ|(Just of mb)
end if
end maybe
-- quotRem :: Int -> Int -> (Int, Int)
on quotRem(m, n)
Tuple(m div n, m mod n)
end quotRem
-- Egyptian multiplication - progressively doubling a list, appending
-- stages of doubling to an accumulator where needed for binary
-- assembly of a target length
-- replicate :: Int -> a -> [a]
on replicate(n, a)
set out to {}
if n < 1 then return out
set dbl to {a}
repeat while (n > 1)
if (n mod 2) > 0 then set out to out & dbl
set n to (n div 2)
set dbl to (dbl & dbl)
end repeat
return out & dbl
end replicate
-- showIntAtBase :: Int -> (Int -> [String]) -> Int -> String -> String
on showIntAtBase(base, toDigit, n, rs)
script showIt
property f : mReturn(toDigit)
on |λ|(nd_, r)
set {n, d} to ({|1|, |2|} of nd_)
set r_ to {f's |λ|(d)} & r
if n > 0 then
|λ|(quotRem(n, base), r_)
else
r_
end if
end |λ|
end script
showIt's |λ|(quotRem(n, base), rs)
end showIntAtBase
-- unlines :: [String] -> String
on unlines(xs)
set {dlm, my text item delimiters} to ¬
{my text item delimiters, linefeed}
set str to xs as text
set my text item delimiters to dlm
str
end unlines
-- unwords :: [String] -> String
on unwords(xs)
set {dlm, my text item delimiters} to ¬
{my text item delimiters, space}
set s to xs as text
set my text item delimiters to dlm
return s
end unwords
-- wikiTable :: Dict -> [[String]] -> String
on wikiTable(opts)
script ksv
on |λ|(k)
script
on |λ|(s)
script
on |λ|(v)
k & v & s
end |λ|
end script
end |λ|
end script
end |λ|
end script
script
on |λ|(rows)
script boxStyle
on |λ|(a, k)
maybe(a, ksv's |λ|(a & k & "=\"")'s |λ|("\" "), ¬
lookupDict(k, opts))
end |λ|
end script
script rowText
on |λ|(row, iRow)
script cellText
on |λ|(cell)
if 1 = iRow then
set w to maybe("", ksv's |λ|("width:")'s |λ|(";"), ¬
lookupDict("colwidth", opts))
else
set w to ""
end if
set s to maybe(w, ksv's |λ|(w)'s |λ|(""), ¬
lookupDict("cell", opts))
if 0 < length of s then
"style=\"" & s & "\"|" & cell
else
cell
end if
end |λ|
end script
intercalateS("\n|")'s |λ|(map(cellText, row))
end |λ|
end script
"{| " & unwords(foldl(boxStyle, "", {"class", "style"})) & "\n|" & ¬
intercalateS("\n|-\n")'s |λ|(map(rowText, rows)) & "\n|}"
end |λ|
end script
end wikiTable

View file

@ -0,0 +1,70 @@
UL: "╔"
UC: "╦"
UR: "╗"
LL: "╚"
LC: "╩"
LR: "╝"
HB: "═"
VB: "║"
Mayan: [" ", " ∙ ", " ∙∙ ", "∙∙∙ ", "∙∙∙∙"]
M0: " Θ "
M5: "────"
toMayan: function [digit][
result: array.of:4 Mayan\0
if digit = 0 [
result\3: M0
return result
]
d: digit
loop 3..0 'i [
if? d >= 5 [
result\[i]: M5
d: d - 5
]
else [
result\[i]: Mayan\[d]
break
]
]
return result
]
draw: function [mayans][
idx: dec size mayans
prints UL
loop 0..idx 'i [
loop 0..3 'j [
prints HB
]
prints (i < idx)? -> UC -> UR ++ `\n`
]
loop 1..4 'i [
prints VB
loop 0..idx 'j ->
prints mayans\[j]\[dec i] ++ VB
print ""
]
prints LL
loop 0..idx 'i [
loop 0..3 'j ->
prints HB
prints (i < idx)? -> LC -> LR ++ `\n`
]
]
loop [4005, 8017, 326205, 886205, 1081439556] 'n [
print ["Converting" n "to Mayan:"]
digs: digits.base:20 n
mayans: map digs => toMayan
draw mayans
print ""
]

View file

@ -0,0 +1,52 @@
MayanNumerals(num){
pwr:=1, obj:=[], grid:=[]
while (num // 20**pwr)
pwr++
while --pwr
{
obj.Push(num // 20**pwr)
num := Mod(num, 20**pwr)
}
obj.Push(num)
cols := obj.count()
loop % cols
{
c := A_Index
loop 4
grid[c, A_Index] := " "
grid[c, 4] := " Θ "
}
for i, v in obj
{
j := 5
loop % v//5
{
j := 5 - A_Index
grid[i, j] := "————"
}
rem := ""
loop % Mod(v, 5)
rem .= ""
rem := rem = "" ? "" : rem = "●●" ? " ●● " : rem = "●●●" ? "●●● " : rem
if Mod(v, 5)
grid[i, j-1] := rem
}
return grid2table(grid, cols)
}
grid2table(grid, cols){
loop, % cols-1
topRow .= "════╦", bottomRow .= "════╩"
topRow := "" topRow "════╗"
bottomRow := "" bottomRow "════╝"
loop % 4
{
r := A_Index
loop % cols
result .= "" grid[A_Index, r]
result .= "║`n"
}
result := topRow "`n" result . bottomRow
return % result
}

View file

@ -0,0 +1,12 @@
for i, n in [4005, 8017, 326205, 886205, 194481]
{
x := MayanNumerals(n)
Gui, Font, S12, Consolas
Gui, Add, Text, , % n
Gui, Add, Text, y+0, % x
Gui, Show, y100
MsgBox, 262180, , continue with next number?
IfMsgBox, No
ExitApp
Gui, Destroy
}

View file

@ -0,0 +1,24 @@
10 DEFINT A-Z: DIM L$(5)
15 FOR I=0 TO 5: READ L$(I): NEXT I
20 LINE INPUT I$
30 M=LEN(I$): DIM D(M)
40 FOR I=1 TO M: D(I)=VAL(MID$(I$,I,1)): NEXT I
50 FOR J=M-1 TO 1 STEP -1
60 FOR I=1 TO J
70 D(I+1) = D(I+1) + 10*(D(I) AND 1)
80 D(I) = D(I)\2
90 NEXT I,J
100 S=1
110 IF D(S)=0 AND S<M THEN S=S+1: GOTO 110
120 FOR I=S TO M: PRINT "+----";: NEXT I: PRINT "+"
130 FOR L=3 TO 0 STEP -1
140 FOR I=S TO M
150 IF (D(I) OR L)=0 THEN PRINT "| @ ";: GOTO 180
160 N=D(I)-5*L: IF N>5 THEN N=5 ELSE IF N<0 THEN N=0
170 PRINT "|";L$(N);
180 NEXT I
190 PRINT "|"
200 NEXT L
210 FOR I=S TO M: PRINT "+----";: NEXT I: PRINT "+"
220 END
230 DATA " "," . "," .. ","... ","....","----"

View file

@ -0,0 +1,70 @@
get "libhdr"
let reads(v) be
$( v%0 := 0
$( let ch = rdch()
if ch = '*N' | ch = endstreamch break
v%0 := v%0 + 1
v%(v%0) := ch
$) repeat
$)
let digits(v) = valof
$( for i=1 to v%0
$( unless '0' <= v%i <= '9' resultis false
v%i := v%i - '0'
$)
resultis true
$)
let base20(v) be
$( let i = ?
for j=v%0-1 to 1 by -1
for i=1 to j
$( v%(i+1) := v%(i+1) + 10*(v%i & 1)
v%i := v%i >> 1
$)
i := 1
while v%i=0 & i<v%0 do i := i+1
for j=i to v%0 do v%(j-i+1) := v%j
v%0 := v%0-i+1
$)
let mayan(v) be
$( let border(n) be
$( for i=1 to n do writes("+----")
writes("+*N")
$)
let part(num, line) be
test num=0 do
writes(line=0 -> " @ ", " ")
or
$( num := num - line*5
writes(num<=0 -> " ",
num =1 -> " . ",
num =2 -> " .. ",
num =3 -> "... ",
num =4 -> "....",
"----")
$)
border(v%0)
for l=3 to 0 by -1
$( for d=1 to v%0
$( wrch('|')
part(v%d, l)
$)
writes("|*N")
$)
border(v%0)
$)
let start() be
$( let v = vec 1+255/BYTESPERWORD
$( writes("Number? ")
reads(v)
if v%0=0 finish
unless digits(v) loop
base20(v)
mayan(v)
$) repeat
$)

View file

@ -0,0 +1,90 @@
#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include <stdlib.h>
#define MAX(x,y) ((x) > (y) ? (x) : (y))
#define MIN(x,y) ((x) < (y) ? (x) : (y))
/* Find base-20 digits. */
size_t base20(unsigned int n, uint8_t *out) {
/* generate digits */
uint8_t *start = out;
do {*out++ = n % 20;} while (n /= 20);
size_t length = out - start;
/* put digits in high-endian order */
while (out > start) {
uint8_t x = *--out;
*out = *start;
*start++ = x;
}
return length;
}
/* Write a Mayan digit */
void make_digit(int n, char *place, size_t line_length) {
static const char *parts[] = {" "," . "," .. ","... ","....","----"};
int i;
/* write 4-part digit */
for (i=4; i>0; i--, n -= 5)
memcpy(place + i*line_length, parts[MAX(0, MIN(5, n))], 4);
/* if digit was 0 we should put '@' in 2nd position of last line */
if (n == -20) place[4 * line_length + 1] = '@';
}
/* Make a Mayan numeral */
char *mayan(unsigned int n) {
if (n == 0) return NULL;
uint8_t digits[15]; /* 2**64 is 15 Mayan digits long */
size_t n_digits = base20(n, digits);
/* a digit is 4 chars wide, plus N+1 divider lines, plus a newline
makes for a length of 5*n+2 */
size_t line_length = n_digits*5 + 2;
/* we need 6 lines - four for the digits, plus top and bottom row */
char *str = malloc(line_length * 6 + 1);
if (str == NULL) return NULL;
str[line_length * 6] = 0;
/* make the cartouche divider lines */
char *ptr;
unsigned int i;
/* top and bottom row */
for (ptr=str, i=0; i<line_length; i+=5, ptr+=5)
memcpy(ptr, "+----", 5);
memcpy(ptr-5, "+\n", 2);
memcpy(str+5*line_length, str, line_length);
/* middle rows */
for (ptr=str+line_length, i=0; i<line_length; i+=5, ptr+=5)
memcpy(ptr, "| ", 5);
memcpy(ptr-5, "|\n", 2);
memcpy(str+2*line_length, str+line_length, line_length);
memcpy(str+3*line_length, str+line_length, 2*line_length);
/* copy in the digits */
for (i=0; i<n_digits; i++)
make_digit(digits[i], str+1+5*i, line_length);
return str;
}
int main(int argc, char **argv) {
if (argc != 2) {
fprintf(stderr, "usage: mayan <number>\n");
return 1;
}
int i = atoi(argv[1]);
if (i <= 0) {
fprintf(stderr, "number must be positive\n");
return 1;
}
char *m = mayan(i);
printf("%s",m);
free(m);
return 0;
}

View file

@ -0,0 +1,50 @@
% This program must be linked with PCLU's "misc.lib" and "useful.lib"
base20 = proc (n: bigint) returns (sequence[int])
own zero: bigint := bigint$i2bi(0)
own twenty: bigint := bigint$i2bi(20)
if n=zero then return(sequence[int]$[0]) end
digits: array[int] := array[int]$[]
while n>zero do
array[int]$addl(digits, bigint$bi2i(n//twenty))
n := n/twenty
end
return(sequence[int]$a2s(digits))
end base20
mayan = proc (digits: sequence[int]) returns (string)
own parts: array[string] := array[string]$[0:
" ", " . ", " .. ", "... ", "....", "----"
]
% generate edges
edge: stream := stream$create_output()
for i: int in int$from_to(1, sequence[int]$size(digits)) do
stream$puts(edge, "+----")
end
stream$putl(edge, "+")
% generate digits
lines: stream := stream$create_output()
for i: int in int$from_to_by(15, 0, -5) do
for d: int in sequence[int]$elements(digits) do
p: int := d-i
if p<0 then p:=0 end
if p>5 then p:=5 end
if i=0 & p=0
then stream$puts(lines, "| @ ")
else stream$puts(lines, "|" || parts[p])
end
end
stream$putl(lines, "|")
end
s_edge: string := stream$get_contents(edge)
return(s_edge || stream$get_contents(lines) || s_edge)
end mayan
start_up = proc ()
po: stream := stream$primary_output()
n: bigint := bigint$parse(sequence[string]$bottom(get_argv()))
stream$puts(po, mayan(base20(n)))
end start_up

View file

@ -0,0 +1,76 @@
include "cowgol.coh";
include "argv.coh";
# convert number to base 20
sub base20(n: uint32, out: [uint8]): (n_digits: uint8) is
n_digits := 0;
loop
[out] := (n % 20) as uint8;
n := n / 20;
out := @next out;
n_digits := n_digits + 1;
if n == 0 then break; end if;
end loop;
end sub;
# get the N'th line (from the top) for a Mayan digit
sub digit_line(n: uint8, line: uint8): (s: [uint8]) is
var parts: [uint8][] := {" "," . "," .. ","... ","....","----"};
if n == 0 then
if line == 3 then s := " @ ";
else s := parts[0];
end if;
else
var nn := n - 5*(3-line);
if nn > 128 then s := parts[0];
elseif nn > 5 then s := parts[5];
else s := parts[nn];
end if;
end if;
end sub;
# print Mayan number
sub print_mayan(n: uint32) is
sub edge(n: uint8) is
while n>0 loop
print("+----");
n := n-1;
end loop;
print_char('+');
print_nl();
end sub;
var digits: uint8[8]; # 8 digits is enough for 2**32
var size := base20(n, &digits[0]);
edge(size);
var line: uint8 := 0;
while line < 4 loop
var d: uint8 := size-1;
loop
print_char('|');
print(digit_line(digits[d], line));
if d==0 then break; end if;
d := d - 1;
end loop;
print_char('|');
print_nl();
line := line + 1;
end loop;
edge(size);
end sub;
sub Error() is
print("usage: mayan <number>. number must be positive");
print_nl();
ExitWithError();
end sub;
# read number from command line
ArgvInit();
var arg := ArgvNext();
if arg == 0 as [uint8] then Error(); end if;
var n: int32;
(n, arg) := AToI(arg);
if n <= 0 then Error(); end if;
print_mayan(n as uint32);

View file

@ -0,0 +1,10 @@
// Mayan numerals. Nigel Galloway: February 19th., 2021
let N=[|"│ ";"│. ";"│.. ";"│... ";"....";"~~~~"|]
let fN g=(fun(n)->if g=0 && n=0 then "│ Θ " else N.[let g=g-5*n in if g>4 then 5 else if g<0 then 0 else g])
let rec fG n g=match n/20L,n%20L with (0L,0L)->(g,List.length g) |(i,n)->fG i ((fN(int n))::g)
let mayan n=let n,g=fG n []
printf "┌────"; for _ in 2..g do printf ""
printfn "┐"; for g in 3.. -1 ..0 do n|>List.iter(fun n->printf "%s" (n(g))); printfn ""
printf "└────"; for _ in 2..g do printf ""
printfn ""
[4005L;8017L;326205L;886205L]|>List.iter(fun n->printfn "%d" n; mayan n)

View file

@ -0,0 +1,34 @@
USING: arrays formatting io kernel make math math.extras
sequences ;
IN: rosetta-code.mayan-numerals
: mayan-digit ( n -- m pair ) 20 /mod 5 /mod swap 2array ;
: integer>mayan ( n -- seq )
[ [ mayan-digit , ] until-zero ] { } make reverse ;
: ones ( n -- str ) [ CHAR: ● ] "" replicate-as ;
: fives ( n -- str ) [ "——" ] replicate "<br>" join ;
: numeral ( pair -- str )
dup sum zero? [ drop "Θ" ]
[ first2 [ ones ] [ fives ] bi* 2array harvest "<br>" join ]
if ;
: .table-row ( pair -- )
"|style=\"width:3em;vertical-align:bottom;\"|" write numeral
print ;
: .table-head ( -- )
"class=\"wikitable\" style=\"text-align:center;\"" print ;
: .table-body ( n -- ) integer>mayan [ .table-row ] each ;
: .mayan ( n -- )
[ "Mayan %d:\n" printf ]
[ "{|" write .table-head .table-body "|}" print ] bi ;
: mayan-numerals ( -- )
{ 4005 8017 326205 886205 } [ .mayan ] each ;
MAIN: mayan-numerals

View file

@ -0,0 +1,106 @@
package main
import (
"fmt"
"strconv"
)
const (
ul = "╔"
uc = "╦"
ur = "╗"
ll = "╚"
lc = "╩"
lr = "╝"
hb = "═"
vb = "║"
)
var mayan = [5]string{
" ",
" ∙ ",
" ∙∙ ",
"∙∙∙ ",
"∙∙∙∙",
}
const (
m0 = " Θ "
m5 = "────"
)
func dec2vig(n uint64) []uint64 {
vig := strconv.FormatUint(n, 20)
res := make([]uint64, len(vig))
for i, d := range vig {
res[i], _ = strconv.ParseUint(string(d), 20, 64)
}
return res
}
func vig2quin(n uint64) [4]string {
if n >= 20 {
panic("Cant't convert a number >= 20")
}
res := [4]string{mayan[0], mayan[0], mayan[0], mayan[0]}
if n == 0 {
res[3] = m0
return res
}
fives := n / 5
rem := n % 5
res[3-fives] = mayan[rem]
for i := 3; i > 3-int(fives); i-- {
res[i] = m5
}
return res
}
func draw(mayans [][4]string) {
lm := len(mayans)
fmt.Print(ul)
for i := 0; i < lm; i++ {
for j := 0; j < 4; j++ {
fmt.Print(hb)
}
if i < lm-1 {
fmt.Print(uc)
} else {
fmt.Println(ur)
}
}
for i := 1; i < 5; i++ {
fmt.Print(vb)
for j := 0; j < lm; j++ {
fmt.Print(mayans[j][i-1])
fmt.Print(vb)
}
fmt.Println()
}
fmt.Print(ll)
for i := 0; i < lm; i++ {
for j := 0; j < 4; j++ {
fmt.Print(hb)
}
if i < lm-1 {
fmt.Print(lc)
} else {
fmt.Println(lr)
}
}
}
func main() {
numbers := []uint64{4005, 8017, 326205, 886205, 1081439556}
for _, n := range numbers {
fmt.Printf("Converting %d to Mayan:\n", n)
vigs := dec2vig(n)
lv := len(vigs)
mayans := make([][4]string, lv)
for i, vig := range vigs {
mayans[i] = vig2quin(vig)
}
draw(mayans)
fmt.Println()
}
}

View file

@ -0,0 +1,139 @@
import Data.Bool (bool)
import Data.List (intercalate, transpose)
import qualified Data.Map.Strict as M
import Data.Maybe (maybe)
--------------------------- MAIN -------------------------
main :: IO ()
main =
(putStrLn . unlines) $
mayanFramed
<$> [ 4005,
8017,
326205,
886205,
1081439556,
1000000,
1000000000
]
---------------------- MAYAN NUMBERS ---------------------
mayanGlyph :: Int -> [[String]]
mayanGlyph =
filter (any (not . null))
. transpose
. leftPadded
. flip (showIntAtBaseS 20 mayanDigit) []
mayanDigit :: Int -> [String]
mayanDigit n
| 0 /= n =
replicate (rem n 5) mayaOne :
concat
( replicate (quot n 5) [mayaFive]
)
| otherwise = [[mayaZero]]
mayanFramed :: Int -> String
mayanFramed =
("Mayan " <>)
. ( (<>) <$> show
<*> ( (":\n\n" <>)
. wikiTable
( M.fromList
[ ( "style",
concat
[ "text-align:center;",
"background-color:#F0EDDE;",
"color:#605B4B;",
"border:2px solid silver;"
]
),
("colwidth", "3em;")
]
)
. mayanGlyph
)
)
mayaZero, mayaOne :: Char
mayaZero = '\920'
mayaOne = '\9679'
mayaFive :: String
mayaFive = "\9473\9473"
---------------------- NUMERIC BASES ---------------------
-- Based on the Prelude showIntAtBase but uses an
-- (Int -> [String]) (rather than Int -> Char) function
-- as its second argument.
--
-- Shows a /non-negative/ 'Integral' number using the base
-- specified by the first argument, and the **String**
-- representation specified by the second.
showIntAtBaseS ::
Integral a =>
a ->
(Int -> [String]) ->
a ->
[[String]] ->
[[String]]
showIntAtBaseS base toStr n0 r0 =
let go (n, d) r =
seq s $
case n of
0 -> r_
_ -> go (quotRem n base) r_
where
s = toStr (fromIntegral d)
r_ = s : r
in go (quotRem n0 base) r0
------------------------- DISPLAY ------------------------
wikiTable :: M.Map String String -> [[String]] -> String
wikiTable opts rows
| null rows = []
| otherwise =
"{| "
<> foldr
( \k a ->
maybe
a
( ((a <> k <> "=\"") <>)
. ( <> "\" "
)
)
(M.lookup k opts)
)
[]
["class", "style"]
<> ( '\n' :
intercalate
"|-\n"
( zipWith renderedRow rows [0 ..]
)
)
<> "|}\n\n"
where
renderedRow row i =
unlines
( fmap
( ( bool
[]
( maybe
"|"
(("|style=\"width:" <>) . (<> "\""))
(M.lookup "colwidth" opts)
)
(0 == i)
<>
)
. ('|' :)
)
row
)
leftPadded :: [[String]] -> [[String]]
leftPadded xs =
let w = maximum (length <$> xs)
in ((<>) =<< flip replicate [] . (-) w . length) <$> xs

View file

@ -0,0 +1,3 @@
elems =: 6 4$' . .. ... ....----'
digit =: (elems{~5:<.0:>.15 10 5 0-~])`((4 4$_14{.'@')&[)@.(0&=)
mayan =: ":@(digit each@(20&#.^:_1))

View file

@ -0,0 +1,181 @@
import java.math.BigInteger;
public class MayanNumerals {
public static void main(String[] args) {
for ( long base10 : new long[] {4005, 8017, 326205, 886205, 1000000000, 1081439556L, 26960840421L, 503491211079L }) {
displayMyan(BigInteger.valueOf(base10));
System.out.printf("%n");
}
}
private static char[] digits = "0123456789ABCDEFGHJK".toCharArray();
private static BigInteger TWENTY = BigInteger.valueOf(20);
private static void displayMyan(BigInteger numBase10) {
System.out.printf("As base 10: %s%n", numBase10);
String numBase20 = "";
while ( numBase10.compareTo(BigInteger.ZERO) > 0 ) {
numBase20 = digits[numBase10.mod(TWENTY).intValue()] + numBase20;
numBase10 = numBase10.divide(TWENTY);
}
System.out.printf("As base 20: %s%nAs Mayan:%n", numBase20);
displayMyanLine1(numBase20);
displayMyanLine2(numBase20);
displayMyanLine3(numBase20);
displayMyanLine4(numBase20);
displayMyanLine5(numBase20);
displayMyanLine6(numBase20);
}
private static char boxUL = Character.toChars(9556)[0];
private static char boxTeeUp = Character.toChars(9574)[0];
private static char boxUR = Character.toChars(9559)[0];
private static char boxHorz = Character.toChars(9552)[0];
private static char boxVert = Character.toChars(9553)[0];
private static char theta = Character.toChars(952)[0];
private static char boxLL = Character.toChars(9562)[0];
private static char boxLR = Character.toChars(9565)[0];
private static char boxTeeLow = Character.toChars(9577)[0];
private static char bullet = Character.toChars(8729)[0];
private static char dash = Character.toChars(9472)[0];
private static void displayMyanLine1(String base20) {
char[] chars = base20.toCharArray();
StringBuilder sb = new StringBuilder();
for ( int i = 0 ; i < chars.length ; i++ ) {
if ( i == 0 ) {
sb.append(boxUL);
}
for ( int j = 0 ; j < 4 ; j++ ) {
sb.append(boxHorz);
}
sb.append(i < chars.length-1 ? boxTeeUp : boxUR);
}
System.out.println(sb.toString());
}
private static String getBullet(int count) {
StringBuilder sb = new StringBuilder();
switch ( count ) {
case 1: sb.append(" " + bullet + " "); break;
case 2: sb.append(" " + bullet + bullet + " "); break;
case 3: sb.append("" + bullet + bullet + bullet + " "); break;
case 4: sb.append("" + bullet + bullet + bullet + bullet); break;
default: throw new IllegalArgumentException("Must be 1-4: " + count);
}
return sb.toString();
}
private static void displayMyanLine2(String base20) {
char[] chars = base20.toCharArray();
StringBuilder sb = new StringBuilder();
for ( int i = 0 ; i < chars.length ; i++ ) {
if ( i == 0 ) {
sb.append(boxVert);
}
switch ( chars[i] ) {
case 'G': sb.append(getBullet(1)); break;
case 'H': sb.append(getBullet(2)); break;
case 'J': sb.append(getBullet(3)); break;
case 'K': sb.append(getBullet(4)); break;
default : sb.append(" ");
}
sb.append(boxVert);
}
System.out.println(sb.toString());
}
private static String DASH = getDash();
private static String getDash() {
StringBuilder sb = new StringBuilder();
for ( int i = 0 ; i < 4 ; i++ ) {
sb.append(dash);
}
return sb.toString();
}
private static void displayMyanLine3(String base20) {
char[] chars = base20.toCharArray();
StringBuilder sb = new StringBuilder();
for ( int i = 0 ; i < chars.length ; i++ ) {
if ( i == 0 ) {
sb.append(boxVert);
}
switch ( chars[i] ) {
case 'B': sb.append(getBullet(1)); break;
case 'C': sb.append(getBullet(2)); break;
case 'D': sb.append(getBullet(3)); break;
case 'E': sb.append(getBullet(4)); break;
case 'F': case 'G': case 'H': case 'J': case 'K':
sb.append(DASH); break;
default : sb.append(" ");
}
sb.append(boxVert);
}
System.out.println(sb.toString());
}
private static void displayMyanLine4(String base20) {
char[] chars = base20.toCharArray();
StringBuilder sb = new StringBuilder();
for ( int i = 0 ; i < chars.length ; i++ ) {
if ( i == 0 ) {
sb.append(boxVert);
}
switch ( chars[i] ) {
case '6': sb.append(getBullet(1)); break;
case '7': sb.append(getBullet(2)); break;
case '8': sb.append(getBullet(3)); break;
case '9': sb.append(getBullet(4)); break;
case 'A': case 'B': case 'C': case 'D': case 'E':
case 'F': case 'G': case 'H': case 'J': case 'K':
sb.append(DASH); break;
default : sb.append(" ");
}
sb.append(boxVert);
}
System.out.println(sb.toString());
}
private static void displayMyanLine5(String base20) {
char[] chars = base20.toCharArray();
StringBuilder sb = new StringBuilder();
for ( int i = 0 ; i < chars.length ; i++ ) {
if ( i == 0 ) {
sb.append(boxVert);
}
switch ( chars[i] ) {
case '0': sb.append(" " + theta + " "); break;
case '1': sb.append(getBullet(1)); break;
case '2': sb.append(getBullet(2)); break;
case '3': sb.append(getBullet(3)); break;
case '4': sb.append(getBullet(4)); break;
case '5': case '6': case '7': case '8': case '9':
case 'A': case 'B': case 'C': case 'D': case 'E':
case 'F': case 'G': case 'H': case 'J': case 'K':
sb.append(DASH); break;
default : sb.append(" ");
}
sb.append(boxVert);
}
System.out.println(sb.toString());
}
private static void displayMyanLine6(String base20) {
char[] chars = base20.toCharArray();
StringBuilder sb = new StringBuilder();
for ( int i = 0 ; i < chars.length ; i++ ) {
if ( i == 0 ) {
sb.append(boxLL);
}
for ( int j = 0 ; j < 4 ; j++ ) {
sb.append(boxHorz);
}
sb.append(i < chars.length-1 ? boxTeeLow : boxLR);
}
System.out.println(sb.toString());
}
}

View file

@ -0,0 +1,218 @@
(() => {
'use strict';
const main = () =>
unlines(
map(mayanFramed,
[4005, 8017, 326205, 886205, 1081439556, 1000000, 1000000000]
)
);
// MAYAN NUMBERS --------------------------------------
// mayanFramed :: Int -> String
const mayanFramed = n =>
'\nMayan ' + n.toString() + ':\n\n' +
wikiTable({
style: 'text-align:center; background-color:#F0EDDE; ' +
'color:#605B4B; border:2px solid silver',
colwidth: '3em'
})(
mayanGlyph(n)
);
// mayanGlyph :: Int -> [[String]]
const mayanGlyph = n =>
filter(any(compose(not, isNull)),
transpose(leftPadded(
showIntAtBase(20, mayanDigit, n, [])
))
);
// mayanDigit :: Int -> [String]
const mayanDigit = n =>
0 !== n ? cons(
replicateString(rem(n, 5), '●'),
replicate(quot(n, 5), '━━')
) : ['Θ'];
// FORMATTING -----------------------------------------
// wikiTable :: Dict -> [[a]] -> String
const wikiTable = opts => rows => {
const colWidth = () =>
'colwidth' in opts ? (
'|style="width:' + opts.colwidth + ';"'
) : '';
return 0 < rows.length ? (
'{| ' + ['class', 'style'].reduce(
(a, k) => k in opts ? (
a + k + '="' + opts[k] + '" '
) : a, ''
) + '\n' + rows.map(
(row, i) => row.map(
x => (0 === i ? (
colWidth() + '| '
) : '|') + (x.toString() || ' ')
).join('\n')
).join('\n|-\n') + '\n|}\n\n'
) : '';
};
// leftPadded :: [[String]] -> [[String]]
const leftPadded = xs => {
const w = maximum(map(length, xs));
return map(
x => replicate(w - x.length, '').concat(x),
xs
);
};
// GENERIC FUNCTIONS ----------------------------------
// Tuple (,) :: a -> b -> (a, b)
const Tuple = (a, b) => ({
type: 'Tuple',
'0': a,
'1': b,
length: 2
});
// any :: (a -> Bool) -> [a] -> Bool
const any = p => xs => xs.some(p);
// comparing :: (a -> b) -> (a -> a -> Ordering)
const comparing = f =>
(x, y) => {
const
a = f(x),
b = f(y);
return a < b ? -1 : (a > b ? 1 : 0);
};
// compose (<<<) :: (b -> c) -> (a -> b) -> a -> c
const compose = (f, g) => x => f(g(x));
// concatMap :: (a -> [b]) -> [a] -> [b]
const concatMap = (f, xs) =>
xs.reduce((a, x) => a.concat(f(x)), []);
// cons :: a -> [a] -> [a]
const cons = (x, xs) =>
Array.isArray(xs) ? (
[x].concat(xs)
) : 'GeneratorFunction' !== xs.constructor.constructor.name ? (
x + xs
) : ( // Existing generator wrapped with one additional element
function*() {
yield x;
let nxt = xs.next()
while (!nxt.done) {
yield nxt.value;
nxt = xs.next();
}
}
)();
// filter :: (a -> Bool) -> [a] -> [a]
const filter = (f, xs) => xs.filter(f);
// foldl1 :: (a -> a -> a) -> [a] -> a
const foldl1 = (f, xs) =>
1 < xs.length ? xs.slice(1)
.reduce(f, xs[0]) : xs[0];
// isNull :: [a] -> Bool
// isNull :: String -> Bool
const isNull = xs =>
Array.isArray(xs) || ('string' === typeof xs) ? (
1 > xs.length
) : undefined;
// Returns Infinity over objects without finite length.
// This enables zip and zipWith to choose the shorter
// argument when one is non-finite, like cycle, repeat etc
// length :: [a] -> Int
const length = xs =>
(Array.isArray(xs) || 'string' === typeof xs) ? (
xs.length
) : Infinity;
// map :: (a -> b) -> [a] -> [b]
const map = (f, xs) =>
(Array.isArray(xs) ? (
xs
) : xs.split('')).map(f);
// maximum :: Ord a => [a] -> a
const maximum = xs =>
0 < xs.length ? (
foldl1((a, x) => x > a ? x : a, xs)
) : undefined;
// Ordering: (LT|EQ|GT):
// GT: 1 (or other positive n)
// EQ: 0
// LT: -1 (or other negative n)
// maximumBy :: (a -> a -> Ordering) -> [a] -> a
const maximumBy = (f, xs) =>
0 < xs.length ? (
xs.slice(1)
.reduce((a, x) => 0 < f(x, a) ? x : a, xs[0])
) : undefined;
// not :: Bool -> Bool
const not = b => !b;
// quot :: Int -> Int -> Int
const quot = (n, m) => Math.floor(n / m);
// quotRem :: Int -> Int -> (Int, Int)
const quotRem = (m, n) =>
Tuple(Math.floor(m / n), m % n);
// rem :: Int -> Int -> Int
const rem = (n, m) => n % m;
// replicate :: Int -> a -> [a]
const replicate = (n, x) =>
Array.from({
length: n
}, () => x);
// replicateString :: Int -> String -> String
const replicateString = (n, s) => s.repeat(n);
// showIntAtBase :: Int -> (Int -> [String])
// -> Int -> [[String]] -> [[String]]
const showIntAtBase = (base, toStr, n, rs) => {
const go = ([n, d], r) => {
const r_ = cons(toStr(d), r);
return 0 !== n ? (
go(Array.from(quotRem(n, base)), r_)
) : r_;
};
return go(Array.from(quotRem(n, base)), rs);
};
// transpose :: [[a]] -> [[a]]
const transpose = tbl => {
const
gaps = replicate(
length(maximumBy(comparing(length), tbl)), []
),
rows = map(xs => xs.concat(gaps.slice(xs.length)), tbl);
return map(
(_, col) => concatMap(row => [row[col]], rows),
rows[0]
);
};
// unlines :: [String] -> String
const unlines = xs => xs.join('\n');
// MAIN ---
return main();
})();

View file

@ -0,0 +1,59 @@
def m:
{ ul: "╔",
uc: "╦",
ur: "╗",
ll: "╚",
lc: "╩",
lr: "╝",
hb: "═",
vb: "║",
m0: " Θ ",
m5: "────"
};
def mayan: [
" ",
" ∙ ",
" ∙∙ ",
"∙∙∙ ",
"∙∙∙∙"
];
# decimal number to base-20 array, most significant digit first
def dec2vig:
[recurse(if . >= 20 then ./20|floor else empty end) | . % 20]
| reverse;
def vig2quin:
if . >= 20 then "Cannot convert a number >= 20." | error
else . as $n
| [mayan[0], mayan[0], mayan[0], mayan[0]]
| if $n == 0
then .[3] = m.m0
else (($n/5)|floor) as $fives
| ($n % 5) as $rem
| .[3-$fives] = mayan[$rem]
| reduce range(3; 3-$fives; -1) as $i (.; .[$i] = m.m5)
end
end;
def draw($mayans):
($mayans|length) as $lm
| (reduce range(0; $lm) as $i (m.ul;
. + m.hb * 4 + if $i < $lm - 1 then m.uc else m.ur + "\n" end ) )
+ (reduce range(1; 5) as $i ("";
. + m.vb
+ (reduce range(0; $lm) as $j ("";
. + $mayans[$j][$i-1] + m.vb)) + "\n" ) )
+ (reduce range(0; $lm) as $i (m.ll;
. + (m.hb * 4)
+ if ($i < $lm - 1) then m.lc else m.lr + "\n" end ) );
def decimal2mayan:
"Converting \(.) to Mayan:",
draw(dec2vig | map( vig2quin ) ),
"" ;
4005, 8017, 326205, 886205, 1081439556
| decimal2mayan

View file

@ -0,0 +1,37 @@
using Gumbo
mayan_glyphs(x, y) = (x == 0 && y == 0) ? "\n<td>Θ</td>\n" : "<td>\n" * "●" ^ x * "<br />\n───" ^ y * "</td>\n"
inttomayan(n) = (s = string(n, base=20); map(ch -> reverse(divrem(parse(Int, ch, base=20), 5)), split(s, "")))
function testmayan()
startstring = """\n
<style>
table.roundedcorners {
border: 1px solid DarkOrange;
border-radius: 13px;
border-spacing: 1;
}
table.roundedcorners td,
table.roundedcorners th {
border: 2px solid DarkOrange;
border-radius: 13px;
border-bottom: 3px solid DarkOrange;
vertical-align: bottom;
text-align: center;
padding: 10px;
}
</style>
\n"""
txt = startstring
for n in [4005, 8017, 326205, 886205, 70913241, 2147483647]
txt *= "<h3>The Mayan representation for the integer $n is: </h3><table class=\"roundedcorners\"><tr>" *
join(map(x -> mayan_glyphs(x[1], x[2]), inttomayan(n))) * "</tr></table>\n\n"
end
println(parsehtml(txt))
end
testmayan()

View file

@ -0,0 +1,18 @@
mayan_glyphs(x, y) = (x == 0 && y == 0) ? "\n| style=$tdconfig | Θ" : "\n| style=$tdconfig | " * "●" ^ x * "<br>───" ^ y
inttomayan(n) = (s = string(n, base=20); map(ch -> reverse(divrem(parse(Int, ch, base=20), 5)), split(s, "")))
tableconfig = raw""" " border: 1px solid DarkOrange; border-radius: 13px; border-spacing: 1; " """
tdconfig = raw""" "border: 2px solid DarkOrange; border-radius: 13px; border-bottom: 2px solid DarkOrange; vertical-align: bottom; text-align: center; padding: 10px;" """
function testmayan()
txt = ""
for n in [4005, 8017, 326205, 886205, 70913241, 2147483647]
txt *= "\n'''The Mayan representation for the integer $n is:'''\n" *
"{| style=$tableconfig \n|- " *
join(map(x -> mayan_glyphs(x[1], x[2]), inttomayan(n))) * "\n|}\n\n"
end
println(txt)
end
testmayan()

View file

@ -0,0 +1,27 @@
ClearAll[MakeLengthFive, MayanNumeral]
MakeLengthFive[ci_String] := Module[{c},
c = If[EvenQ[StringLength[ci]], ci <> " ", ci];
While[StringLength[c] < 5, c = " " <> c <> " "];
c
]
MayanNumeral[n_Integer?Positive] := Module[{nums, q, r, c},
nums = IntegerDigits[n, 20];
Row[Table[
{q, r} = QuotientRemainder[m, 5];
If[{q, r} =!= {0, 0},
c = Prepend[ConstantArray["-----", q], StringJoin[ConstantArray[".", r]]];
c = Join[ConstantArray["", 4 - Length[c]], c];
c
,
c = {"", "", "", "\[Theta]"}
];
Column[MakeLengthFive /@ c, Frame -> True]
,
{m, nums}
], Spacer[1]]
]
MayanNumeral[4005]
MayanNumeral[8017]
MayanNumeral[326205]
MayanNumeral[886205]
MayanNumeral[1337]

View file

@ -0,0 +1,76 @@
import algorithm
type Border = enum UL = "", UC = "", UR = "", LL = "", LC = "", LR = "", HB = "", VB = ""
const
Mayan = [" ", "", " ∙∙ ", "∙∙∙ ", "∙∙∙∙"]
M0 = " Θ "
M5 = "────"
type
Digit = range[0..19]
Numeral = array[4, string]
MayanNumber = seq[Numeral]
func toBase20(n: Natural): seq[Digit] =
## Return "n" expressed as a sequence of base 20 digits.
result.add(n mod 20)
var n = n div 20
while n != 0:
result.add n mod 20
n = n div 20
result.reverse()
func toMayanNumeral(d: Digit): Numeral =
## Return the Numeral representing a base 20 digits.
result = [Mayan[0], Mayan[0], Mayan[0], Mayan[0]]
if d == 0:
result[3] = M0
return
var d = d
for i in countdown(3, 0):
if d >= 5:
result[i] = M5
dec d, 5
else:
result[i] = Mayan[d]
break
proc draw(mayans: MayanNumber) =
## Draw the representation fo a mayan number.
let idx = mayans.high
stdout.write UL
for i in 0..idx:
for j in 0..3: stdout.write HB
if i < idx: stdout.write UC else: echo UR
for i in 1..4:
stdout.write VB
for j in 0..idx: stdout.write mayans[j][i-1], VB
stdout.write '\n'
stdout.write LL
for i in 0..idx:
for j in 0..3: stdout.write HB
if i < idx: stdout.write LC else: echo LR
when isMainModule:
import sequtils, strutils
for n in [4005, 8017, 326205, 886205, 1081439556]:
echo "Converting $1 to Mayan:".format(n)
let digits = n.toBase20()
let mayans = digits.mapIt(it.toMayanNumeral)
mayans.draw()
echo ""

View file

@ -0,0 +1,99 @@
/* MAYAN NUMERALS IN PL/M
THIS PROGRAM RUNS UNDER CP/M AND TAKES THE NUMBER ON THE COMMAND LINE */
100H:
/* CP/M CALLS */
BDOS: PROCEDURE (FN, ARG); DECLARE FN BYTE, ARG ADDRESS; GO TO 5; END BDOS;
EXIT: PROCEDURE; CALL BDOS(0,0); END EXIT;
PRINT: PROCEDURE (S); DECLARE S ADDRESS; CALL BDOS(9,S); END PRINT;
/* CP/M COMMAND LINE */
DECLARE CL$PTR ADDRESS INITIAL (80H), CMD$LEN BASED CL$PTR BYTE;
DECLARE CMD$PTR ADDRESS INITIAL (81H), CMD$LINE BASED CMD$PTR BYTE;
/* THE PIPE AND AT SYMBOLS ARE NOT INCLUDED IN THE PL/M CHARSET */
DECLARE PIPE LITERALLY '7CH', AT LITERALLY '40H';
/* PRINT BORDER FOR N DIGITS */
BORDER: PROCEDURE (N);
DECLARE (I, N) BYTE;
DO I=1 TO N;
CALL PRINT(.'+----$');
END;
CALL PRINT(.('+',13,10,'$'));
END BORDER;
/* PRINT LINE FOR GIVEN DIGIT */
DIGIT$LINE: PROCEDURE (LINE, DIGIT);
DECLARE (I, LINE, DIGIT, UPB) BYTE;
DECLARE PARTS (6) ADDRESS;
PARTS(0) = .(PIPE,' $'); PARTS(1) = .(PIPE,' . $');
PARTS(2) = .(PIPE,' .. $'); PARTS(3) = .(PIPE,'... $');
PARTS(4) = .(PIPE,'....$'); PARTS(5) = .(PIPE,'----$');
IF DIGIT = 0 THEN DO;
IF LINE = 3 THEN CALL PRINT(.(PIPE,' ',AT,' $'));
ELSE CALL PRINT(PARTS(0));
END;
ELSE DO;
UPB = 15-LINE*5;
IF DIGIT < UPB THEN CALL PRINT(PARTS(0));
ELSE IF DIGIT >= UPB+5 THEN CALL PRINT(PARTS(5));
ELSE CALL PRINT(PARTS(DIGIT-UPB));
END;
END DIGIT$LINE;
/* PRINT LINE GIVEN DIGITS */
LINE: PROCEDURE (L, DIGITS, NDIGITS);
DECLARE DIGITS ADDRESS;
DECLARE (L, I, D BASED DIGITS, NDIGITS) BYTE;
DO I=0 TO NDIGITS-1;
CALL DIGIT$LINE(L, D(I));
END;
CALL PRINT(.(PIPE,13,10,'$'));
END LINE;
/* CHECK FOR ARGUMENT */
IF CMD$LEN < 2 THEN DO;
CALL PRINT(.'NO INPUT$');
CALL EXIT;
END;
/* PREPROCESS COMMAND LINE - TURN EACH ASCII DIGIT INTO 0-9 */
DECLARE (I, J) BYTE;
DO I = 1 TO CMD$LEN-1;
CMD$LINE(I) = CMD$LINE(I) - '0';
IF CMD$LINE(I) > 9 THEN DO;
/* ERROR MESSAGE FOR INVALID INPUT */
CALL PRINT(.'INVALID DIGIT IN INPUT$');
CALL EXIT;
END;
END;
/* CONVERT TO BASE 20 DIGIT BY DIGIT */
J = CMD$LEN-2;
DO WHILE J > 0;
DO I = 1 TO J;
CMD$LINE(I+1) = CMD$LINE(I+1) + 10*(CMD$LINE(I) AND 1);
CMD$LINE(I) = CMD$LINE(I) / 2;
END;
J = J - 1;
END;
/* FIND FIRST NONZERO DIGIT */
J = 1;
DO WHILE CMD$LINE(J) = 0 AND J < CMD$LEN-1;
J = J + 1;
END;
/* PRINT CARTOUCHES */
DECLARE SIZE BYTE;
SIZE = CMD$LEN-J;
CALL BORDER(SIZE);
DO I=0 TO 3;
CALL LINE(I, .CMD$LINE(J), SIZE);
END;
CALL BORDER(SIZE);
CALL EXIT;
EOF

View file

@ -0,0 +1,35 @@
use ntheory qw/fromdigits todigitstring/;
my $t_style = '"border-collapse: separate; text-align: center; border-spacing: 3px 0px;"';
my $c_style = '"border: solid black 2px;background-color: #fffff0;border-bottom: double 6px;'.
'border-radius: 1em;-moz-border-radius: 1em;-webkit-border-radius: 1em;'.
'vertical-align: bottom;width: 3.25em;"';
sub cartouches {
my($num, @digits) = @_;
my $render;
for my $d (@digits) {
$render .= "| style=$c_style | $_\n" for glyphs(@$d);
}
chomp $render;
join "\n", "\{| style=$t_style", "|+ $num", '|-', $render, '|}'
}
sub glyphs {
return 'Θ' unless $_[0] || $_[1];
join '<br>', '●' x $_[0], ('───') x $_[1];
}
sub mmod {
my($n,$b) = @_;
my @nb;
return 0 unless $n;
push @nb, fromdigits($_, $b) for split '', todigitstring($n, $b);
return @nb;
}
for $n (qw<4005 8017 326205 886205 26960840421>) {
push @output, cartouches($n, map { [reverse mmod($_,5)] } mmod($n,20) );
}
print join "\n<br>\n", @output;

View file

@ -0,0 +1,122 @@
(notonline)-->
<span style="color: #000080;font-style:italic;">-- demo\rosetta\Mayan_numerals.exw</span>
<span style="color: #008080;">without</span> <span style="color: #008080;">js</span> <span style="color: #000080;font-style:italic;">-- (file i/o [when as_html is true])</span>
<span style="color: #008080;">constant</span> <span style="color: #000000;">as_html</span> <span style="color: #0000FF;">=</span> <span style="color: #004600;">true</span><span style="color: #0000FF;">,</span> <span style="color: #000080;font-style:italic;">-- false == nasty ascii</span>
<span style="color: #000000;">inline_css</span> <span style="color: #0000FF;">=</span> <span style="color: #004600;">true</span> <span style="color: #000080;font-style:italic;">-- also uses wiki tables ({| etc) if false</span>
<span style="color: #004080;">string</span> <span style="color: #000000;">html</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">""</span>
<span style="color: #008080;">constant</span> <span style="color: #000000;">t_style</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"border-collapse: separate; text-align: center; border-spacing: 3px 0px;"</span><span style="color: #0000FF;">,</span>
<span style="color: #000000;">c_style</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"border: solid black 2px;background-color: #fffff0;border-bottom: double 6px;"</span><span style="color: #0000FF;">&</span>
<span style="color: #008000;">"border-radius: 1em;-moz-border-radius: 1em;-webkit-border-radius: 1em;"</span><span style="color: #0000FF;">&</span>
<span style="color: #008000;">"vertical-align: bottom;width: 3.25em;"</span><span style="color: #0000FF;">,</span>
<span style="color: #000000;">dot</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"&#x25cf;"</span><span style="color: #0000FF;">,</span>
<span style="color: #000000;">bar</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"&#x2500;&#x2500;&#x2500;"</span><span style="color: #0000FF;">,</span>
<span style="color: #000000;">zero</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"&#x0398;"</span><span style="color: #0000FF;">,</span>
<span style="color: #000000;">digits</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #008000;">" 0 "</span><span style="color: #0000FF;">,</span><span style="color: #008000;">" . "</span><span style="color: #0000FF;">,</span><span style="color: #008000;">" .. "</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"... "</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"...."</span><span style="color: #0000FF;">}</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">to_seq</span><span style="color: #0000FF;">(</span><span style="color: #004080;">atom</span> <span style="color: #000000;">a</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">sequence</span> <span style="color: #000000;">s</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{}</span>
<span style="color: #008080;">while</span> <span style="color: #004600;">true</span> <span style="color: #008080;">do</span>
<span style="color: #000000;">s</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">prepend</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">remainder</span><span style="color: #0000FF;">(</span><span style="color: #000000;">a</span><span style="color: #0000FF;">,</span><span style="color: #000000;">20</span><span style="color: #0000FF;">))</span>
<span style="color: #000000;">a</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">floor</span><span style="color: #0000FF;">(</span><span style="color: #000000;">a</span><span style="color: #0000FF;">/</span><span style="color: #000000;">20</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">a</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span> <span style="color: #008080;">exit</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span>
<span style="color: #008080;">return</span> <span style="color: #000000;">s</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">procedure</span> <span style="color: #000000;">show_mayan</span><span style="color: #0000FF;">(</span><span style="color: #004080;">atom</span> <span style="color: #000000;">a</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">sequence</span> <span style="color: #000000;">s</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">to_seq</span><span style="color: #0000FF;">(</span><span style="color: #000000;">a</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">if</span> <span style="color: #008080;">not</span> <span style="color: #000000;">as_html</span> <span style="color: #008080;">then</span>
<span style="color: #004080;">string</span> <span style="color: #000000;">tb</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">join</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #008000;">'+'</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">)+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">),</span><span style="color: #008000;">"------"</span><span style="color: #0000FF;">),</span>
<span style="color: #000000;">ln</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">join</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #008000;">'|'</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">)+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">),</span><span style="color: #008000;">" "</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">sequence</span> <span style="color: #000000;">res</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">tb</span><span style="color: #0000FF;">,</span><span style="color: #000000;">ln</span><span style="color: #0000FF;">,</span><span style="color: #000000;">ln</span><span style="color: #0000FF;">,</span><span style="color: #000000;">ln</span><span style="color: #0000FF;">,</span><span style="color: #000000;">ln</span><span style="color: #0000FF;">,</span><span style="color: #000000;">tb</span><span style="color: #0000FF;">}</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">si</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">],</span> <span style="color: #000000;">l</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">5</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">m</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">*</span><span style="color: #000000;">7</span><span style="color: #0000FF;">-</span><span style="color: #000000;">4</span>
<span style="color: #008080;">while</span> <span style="color: #004600;">true</span> <span style="color: #008080;">do</span>
<span style="color: #000000;">res</span><span style="color: #0000FF;">[</span><span style="color: #000000;">l</span><span style="color: #0000FF;">][</span><span style="color: #000000;">m</span><span style="color: #0000FF;">..</span><span style="color: #000000;">m</span><span style="color: #0000FF;">+</span><span style="color: #000000;">3</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">digits</span><span style="color: #0000FF;">[</span><span style="color: #7060A8;">min</span><span style="color: #0000FF;">(</span><span style="color: #000000;">si</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">5</span><span style="color: #0000FF;">)]</span>
<span style="color: #000000;">si</span> <span style="color: #0000FF;">-=</span> <span style="color: #000000;">5</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">si</span><span style="color: #0000FF;"><=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span> <span style="color: #008080;">exit</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #000000;">l</span> <span style="color: #0000FF;">-=</span> <span style="color: #000000;">1</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%d\n%s\n\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">a</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">join</span><span style="color: #0000FF;">(</span><span style="color: #000000;">res</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"\n"</span><span style="color: #0000FF;">)})</span>
<span style="color: #008080;">else</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
<span style="color: #004080;">sequence</span> <span style="color: #000000;">res</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #008000;">""</span><span style="color: #0000FF;">,</span><span style="color: #000000;">4</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">si</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">],</span> <span style="color: #000000;">l</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">4</span>
<span style="color: #008080;">while</span> <span style="color: #004600;">true</span> <span style="color: #008080;">do</span>
<span style="color: #000000;">res</span><span style="color: #0000FF;">[</span><span style="color: #000000;">l</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #000000;">si</span><span style="color: #0000FF;">>=</span><span style="color: #000000;">5</span><span style="color: #0000FF;">?</span><span style="color: #000000;">bar</span><span style="color: #0000FF;">:</span><span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #000000;">si</span><span style="color: #0000FF;">?</span><span style="color: #7060A8;">join</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #000000;">dot</span><span style="color: #0000FF;">,</span><span style="color: #000000;">si</span><span style="color: #0000FF;">),</span><span style="color: #008000;">""</span><span style="color: #0000FF;">):</span><span style="color: #000000;">zero</span><span style="color: #0000FF;">))</span>
<span style="color: #000000;">si</span> <span style="color: #0000FF;">-=</span> <span style="color: #000000;">5</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">si</span><span style="color: #0000FF;"><=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span> <span style="color: #008080;">exit</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #000000;">l</span> <span style="color: #0000FF;">-=</span> <span style="color: #000000;">1</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span>
<span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">join</span><span style="color: #0000FF;">(</span><span style="color: #000000;">res</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"&lt;br&gt;"</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">inline_css</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">html</span> <span style="color: #0000FF;">&=</span> <span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #008000;">" &lt;table&gt;\n &lt;caption&gt;%d&lt;/caption&gt;\n &lt;tr&gt;\n"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">a</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
<span style="color: #000000;">html</span> <span style="color: #0000FF;">&=</span> <span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #008000;">" &lt;td&gt;%s&lt;/td&gt;\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]})</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #000000;">html</span> <span style="color: #0000FF;">&=</span> <span style="color: #008000;">" &lt;/tr&gt;\n &lt;/table&gt;\n"</span>
<span style="color: #008080;">else</span>
<span style="color: #000000;">html</span> <span style="color: #0000FF;">&=</span> <span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"{| style=\"%s\"\n|+ %d\n|-\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">t_style</span><span style="color: #0000FF;">,</span><span style="color: #000000;">a</span><span style="color: #0000FF;">})</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
<span style="color: #000000;">html</span> <span style="color: #0000FF;">&=</span> <span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"| style=\"%s\" | %s\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">c_style</span><span style="color: #0000FF;">,</span><span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]})</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #000000;">html</span> <span style="color: #0000FF;">&=</span> <span style="color: #008000;">"|}\n"</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
<span style="color: #008080;">constant</span> <span style="color: #000000;">html_header</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"""
&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
&lt;head&gt;
&lt;meta charset="utf-8" /&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /&gt;
&lt;title&gt;Mayan numerals&lt;/title&gt;
&lt;style&gt;
table {%s}
td { %s }
&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h2&gt;Mayan numerals&lt;/h2&gt;
"""</span><span style="color: #0000FF;">,</span>
<span style="color: #000000;">wiki_header</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"""
The following is intended to be pasted into the rosettacode wiki, or similar&lt;br&gt;
"""</span><span style="color: #0000FF;">,</span>
<span style="color: #000000;">html_footer</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"""
&lt;/body&gt;
&lt;/html&gt;
"""</span>
<span style="color: #008080;">constant</span> <span style="color: #000000;">tests</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">4005</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">8017</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">326205</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">886205</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">26960840421</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">126524984376952</span><span style="color: #0000FF;">}</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">tests</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span> <span style="color: #000000;">show_mayan</span><span style="color: #0000FF;">(</span><span style="color: #000000;">tests</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">])</span> <span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">as_html</span> <span style="color: #008080;">then</span>
<span style="color: #004080;">string</span> <span style="color: #000000;">filename</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"Mayan_numerals.html"</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">fn</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">open</span><span style="color: #0000FF;">(</span><span style="color: #000000;">filename</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"w"</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">inline_css</span> <span style="color: #008080;">then</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">fn</span><span style="color: #0000FF;">,</span><span style="color: #000000;">html_header</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">t_style</span><span style="color: #0000FF;">,</span><span style="color: #000000;">c_style</span><span style="color: #0000FF;">})</span>
<span style="color: #008080;">else</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">fn</span><span style="color: #0000FF;">,</span><span style="color: #000000;">wiki_header</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">fn</span><span style="color: #0000FF;">,</span><span style="color: #000000;">html</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">inline_css</span> <span style="color: #008080;">then</span>
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">fn</span><span style="color: #0000FF;">,</span><span style="color: #000000;">html_footer</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #7060A8;">close</span><span style="color: #0000FF;">(</span><span style="color: #000000;">fn</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">inline_css</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">system</span><span style="color: #0000FF;">(</span><span style="color: #000000;">filename</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">else</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"See %s\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">filename</span><span style="color: #0000FF;">})</span>
<span style="color: #0000FF;">{}</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">wait_key</span><span style="color: #0000FF;">()</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">else</span>
<span style="color: #0000FF;">?</span><span style="color: #008000;">"done"</span>
<span style="color: #0000FF;">{}</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">wait_key</span><span style="color: #0000FF;">()</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<!--

View file

@ -0,0 +1,68 @@
#START_X=-4 : #START_Y=2
Dim pl$(5)
pl$(0)=" Θ " : pl$(1)=" • " : pl$(2)=" •• "
pl$(3)="••• " : pl$(4)="••••" : pl$(5)=""
If OpenConsole() : EnableGraphicalConsole(1) : Else : End 1 : EndIf
Procedure.s Dec2Mayan(wert.i)
result$=""
If wert=0 : result$="0;" : EndIf
While wert : result$=Str(wert%20)+";"+result$ : wert/20 : Wend
ProcedureReturn result$
EndProcedure
Procedure PutMayan(may$)
Shared pl$()
X=#START_X+6 : Y=#START_Y
For i=1 To CountString(may$,";")
m=Val(StringField(may$,i,";"))
yp=Y+4
If m=0 : ConsoleLocate(X,yp) : Print(pl$(0)) : X+5 : Continue : EndIf
While m
If m-5>=0
ConsoleLocate(X,yp) : Print(pl$(5)) : yp-1 : m-5
ElseIf m-4>=0
ConsoleLocate(X,yp) : Print(pl$(4)) : yp-1 : m-4
ElseIf m-3>=0
ConsoleLocate(X,yp) : Print(pl$(3)) : yp-1 : m-3
ElseIf m-2>=0
ConsoleLocate(X,yp) : Print(pl$(2)) : yp-1 : m-2
ElseIf m-1>=0
ConsoleLocate(X,yp) : Print(pl$(1)) : yp-1 : m-1
EndIf
Wend
X+5
Next
EndProcedure
Procedure MayanNumerals(may$)
X=#START_X : Y=#START_Y
m.i=CountString(may$,";")
For i=1 To m
X+5
ConsoleLocate(X,Y) : Print("╔════╗")
ConsoleLocate(X,Y+1) : Print("║ ║")
ConsoleLocate(X,Y+2) : Print("║ ║")
ConsoleLocate(X,Y+3) : Print("║ ║")
ConsoleLocate(X,Y+4) : Print("║ ║")
ConsoleLocate(X,Y+5) : Print("╚════╝")
Next
X=#START_X
For i=1 To m
X+5
If i<m
ConsoleLocate(X+5,Y) : Print("╦")
ConsoleLocate(X+5,Y+5) : Print("╩")
EndIf
Next
PutMayan(may$)
EndProcedure
Repeat
ConsoleLocate(0,0) : Print(LSet(" ",60))
ConsoleLocate(0,0) : Print("MAYAN: ? ") : i$=Input()
ClearConsole() : If i$="" : End : EndIf
j$=Dec2Mayan(Val(i$)) : MayanNumerals(j$)
ConsoleLocate(0,#START_Y+7) : Print("Dezimal = "+i$)
ConsoleLocate(0,#START_Y+8) : Print("Vigesimal= "+j$)
ForEver

View file

@ -0,0 +1,138 @@
'''Mayan numerals'''
from functools import (reduce)
# -------------------- MAYAN NUMERALS --------------------
# mayanNumerals :: Int -> [[String]]
def mayanNumerals(n):
'''Rows of Mayan digit cells,
representing the integer n.
'''
return showIntAtBase(20)(
mayanDigit
)(n)([])
# mayanDigit :: Int -> [String]
def mayanDigit(n):
'''List of strings representing a Mayan digit.'''
if 0 < n:
r = n % 5
return [
(['' * r] if 0 < r else []) +
(['━━'] * (n // 5))
]
else:
return ['Θ']
# mayanFramed :: Int -> String
def mayanFramed(n):
'''Mayan integer in the form of a
Wiki table source string.
'''
return 'Mayan ' + str(n) + ':\n\n' + (
wikiTable({
'class': 'wikitable',
'style': cssFromDict({
'text-align': 'center',
'background-color': '#F0EDDE',
'color': '#605B4B',
'border': '2px solid silver'
}),
'colwidth': '3em',
'cell': 'vertical-align: bottom;'
})([[
'<br>'.join(col) for col in mayanNumerals(n)
]])
)
# ------------------------- TEST -------------------------
# main :: IO ()
def main():
'''Mayan numeral representations of various integers'''
print(
main.__doc__ + ':\n\n' +
'\n'.join(mayanFramed(n) for n in [
4005, 8017, 326205, 886205, 1081439556,
1000000, 1000000000
])
)
# ------------------------ BOXES -------------------------
# wikiTable :: Dict -> [[a]] -> String
def wikiTable(opts):
'''Source text for wiki-table display of rows of cells,
using CSS key-value pairs in the opts dictionary.
'''
def colWidth():
return 'width:' + opts['colwidth'] + '; ' if (
'colwidth' in opts
) else ''
def cellStyle():
return opts['cell'] if 'cell' in opts else ''
return lambda rows: '{| ' + reduce(
lambda a, k: (
a + k + '="' + opts[k] + '" ' if (
k in opts
) else a
),
['class', 'style'],
''
) + '\n' + '\n|-\n'.join(
'\n'.join(
('|' if (
0 != i and ('cell' not in opts)
) else (
'|style="' + colWidth() + cellStyle() + '"|'
)) + (
str(x) or ' '
) for x in row
) for i, row in enumerate(rows)
) + '\n|}\n\n'
# ----------------------- GENERIC ------------------------
# cssFromDict :: Dict -> String
def cssFromDict(dct):
'''CSS string from a dictinary of key-value pairs'''
return reduce(
lambda a, k: a + k + ':' + dct[k] + '; ',
dct.keys(),
''
)
# showIntAtBase :: Int -> (Int -> String)
# -> Int -> String -> String
def showIntAtBase(base):
'''String representation of an integer in a given base,
using a supplied function for the string
representation of digits.
'''
def wrap(toChr, n, rs):
def go(nd, r):
n, d = nd
r_ = toChr(d) + r
return go(divmod(n, base), r_) if 0 != n else r_
return 'unsupported base' if 1 >= base else (
'negative number' if 0 > n else (
go(divmod(n, base), rs))
)
return lambda toChr: lambda n: lambda rs: (
wrap(toChr, n, rs)
)
# MAIN ---
if __name__ == '__main__':
main()

View file

@ -0,0 +1,13 @@
/*REXX program converts decimal numbers to the Mayan numbering system (with cartouches).*/
parse arg $ /*obtain optional arguments from the CL*/
if $='' then $= 4005 8017 326205 886205, /*Not specified? Then use the default.*/
172037122592320200101 /*Morse code for MAYAN; egg is a blank.*/
do j=1 for words($) /*convert each of the numbers specified*/
#= word($, j) /*extract a number from (possible) list*/
say
say center('converting the decimal number ' # " to a Mayan number:", 90, '')
say
call $MAYAN # '(overlap)' /*invoke the $MAYAN (REXX) subroutine.*/
say
end /*j*/ /*stick a fork in it, we're all done. */

View file

@ -0,0 +1,18 @@
### Formatting ###
my $t-style = '"border-collapse: separate; text-align: center; border-spacing: 3px 0px;"';
my $c-style = '"border: solid black 2px;background-color: #fffff0;border-bottom: double 6px;'~
'border-radius: 1em;-moz-border-radius: 1em;-webkit-border-radius: 1em;'~
'vertical-align: bottom;width: 3.25em;"';
my $joiner = '<br>';
sub display ($num, @digits) { join "\n", "\{| style=$t-style", "|+ $num", '|-', (|@digits.map: {"| style=$c-style | $_"}), '|}' }
### Logic ###
sub mayan ($int) { $int.polymod(20 xx *).reverse.map: *.polymod(5) }
my @output = <4005 8017 326205 886205 16160025 1081439556 503491211079>.map: {
display $_, .&mayan.map: { [flat '' xx 3, '' x .[0], '' xx .[1], ('Θ' if !.[0,1].sum)].tail(4).join: $joiner }
}
say @output.join: "\n$joiner\n";

View file

@ -0,0 +1,15 @@
### Formatting ###
use Terminal::Boxer;
my $joiner = "\n";
sub display ($num, @digits) { "$num\n" ~ dd-box( :6cw, :4ch, @digits ) }
### Logic ###
sub mayan ($int) { $int.polymod(20 xx *).reverse.map: *.polymod(5) }
my @output = <4005 8017 326205 886205 16160025 1081439556 503491211079>.map: {
display $_, .&mayan.map: { [flat '' xx 3, '' x .[0], '' xx .[1], ('Θ' if !.[0,1].sum)].tail(4).join: $joiner }
}
say @output.join: $joiner;

View file

@ -0,0 +1,29 @@
numbers = ARGV.map(&:to_i)
if numbers.length == 0
puts
puts("usage: #{File.basename(__FILE__)} number...")
exit
end
def maya_print(number)
digits5s1s = number.to_s(20).chars.map { |ch| ch.to_i(20) }.map { |dig| dig.divmod(5) }
puts(('+----' * digits5s1s.length) + '+')
3.downto(0) do |row|
digits5s1s.each do |d5s1s|
if row < d5s1s[0]
print('|----')
elsif row == d5s1s[0]
print("|#{[(d5s1s[0] == 0 ? ' @ ' : ' '), ' . ', ' .. ', '... ', '....'][d5s1s[1]]}")
else
print('| ')
end
end
puts('|')
end
puts(('+----' * digits5s1s.length) + '+')
end
numbers.each do |num|
puts(num)
maya_print(num)
end

View file

@ -0,0 +1,69 @@
const ONE: &str = "●";
const FIVE: &str = "——";
const ZERO: &str = "Θ";
fn main() {
println!("{}", mayan(4005));
println!("{}", mayan(8017));
println!("{}", mayan(326_205));
println!("{}", mayan(886_205));
println!("{}", mayan(69));
println!("{}", mayan(420));
println!("{}", mayan(1_063_715_456));
}
fn mayan(dec: i64) -> String {
let mut digits = vec![];
let mut num = dec;
while num > 0 {
digits.push(num % 20);
num /= 20;
}
digits = digits.into_iter().rev().collect();
let mut boxes = vec!["".to_string(); 6];
let n = digits.len();
for (i, digit) in digits.iter().enumerate() {
if i == 0 {
boxes[0] = "┏━━━━".to_string();
if i == n - 1 {
boxes[0] += "┓";
}
} else if i == n - 1 {
boxes[0] += "┳━━━━┓";
} else {
boxes[0] += "┳━━━━";
}
for j in 1..5 {
boxes[j] += "┃";
let elem = 0.max(digit - (4 - j as i64) * 5);
if elem >= 5 {
boxes[j] += &format!("{: ^4}", FIVE);
} else if elem > 0 {
boxes[j] += &format!("{: ^4}", ONE.repeat(elem as usize % 15));
} else if j == 4 {
boxes[j] += &format!("{: ^4}", ZERO);
} else {
boxes[j] += &" ";
}
if i == n - 1 {
boxes[j] += "┃";
}
}
if i == 0 {
boxes[5] = "┗━━━━".to_string();
if i == n - 1 {
boxes[5] += "┛";
}
} else if i == n - 1 {
boxes[5] += "┻━━━━┛";
} else {
boxes[5] += "┻━━━━";
}
}
let mut mayan = format!("Mayan {}:\n", dec);
for b in boxes {
mayan += &(b + "\n");
}
mayan
}

View file

@ -0,0 +1,76 @@
import "/fmt" for Conv
var ul = "╔"
var uc = "╦"
var ur = "╗"
var ll = "╚"
var lc = "╩"
var lr = "╝"
var hb = "═"
var vb = "║"
var mayan= [
" ",
" ∙ ",
" ∙∙ ",
"∙∙∙ ",
"∙∙∙∙"
]
var m0 = " Θ "
var m5 = "────"
var dec2vig = Fn.new { |n| Conv.itoa(n, 20).map { |c| Conv.atoi(c, 20) }.toList }
var vig2quin = Fn.new { |n|
if (n >= 20) Fiber.abort("Cant't convert a number >= 20.")
var res = [mayan[0], mayan[0], mayan[0], mayan[0]]
if (n == 0) {
res[3] = m0
return res
}
var fives = (n/5).floor
var rem = n % 5
res[3-fives] = mayan[rem]
for (i in 3...3-fives) res[i] = m5
return res
}
var draw = Fn.new { |mayans|
var lm = mayans.count
System.write(ul)
for (i in 0...lm) {
for (j in 0..3) System.write(hb)
if (i < lm - 1) {
System.write(uc)
} else {
System.print(ur)
}
}
for (i in 1..4) {
System.write(vb)
for (j in 0...lm) {
System.write(mayans[j][i-1])
System.write(vb)
}
System.print()
}
System.write(ll)
for (i in 0...lm) {
for (j in 0..3) System.write(hb)
if (i < lm - 1) {
System.write(lc)
} else {
System.print(lr)
}
}
}
var numbers = [4005, 8017, 326205, 886205, 1081439556]
for (n in numbers) {
System.print("Converting %(n) to Mayan:")
var vigs = dec2vig.call(n)
var mayans = vigs.map { |vig| vig2quin.call(vig) }.toList
draw.call(mayans)
System.print()
}

View file

@ -0,0 +1,9 @@
var zero=" \u0398 ",one="\u2219", five=String("\u2500"*4,"\n"), fill=" \n";
var ds=T(" "," \u2219 "," \u2219\u2219 ","\u2219\u2219\u2219 ","\u2219\u2219\u2219\u2219");
fcn mayan(m){ //--> lists of lists of strings (each line of tile)
m.toString(20).pump(List,fcn(m){ // 4,005 --> "a05"
bars,dots := m.toInt(20).divr(5); // "a" --> 10 --> (2,0)
if(0==bars==dots) return(String(fill*3, zero).split("\n")); // 0
String(fill*(3-bars), ds[dots],"\n", five*bars)[0,-1].split("\n") // tile
})
}

View file

@ -0,0 +1,6 @@
var vbar="\u2551", hbar="\u2550"*4, ut=(hbar+"\u2566"), bt=(hbar+"\u2569");
fcn displayMayan(m){ // eg 11 is ( ( ),( * ),(----),(----) )
println("\u2554", ut*(m.len()-1), hbar,"\u2557"); // top
foreach n in (4){ println(vbar, m.apply("get",n).concat(vbar), vbar) }
println("\u255a", bt*(m.len()-1), hbar,"\u255d"); // bottom
}

View file

@ -0,0 +1,3 @@
foreach m in (T(4_005, 8_017, 326_205, 886_205, 503_491_211_079, 88_637_341)){
println("\n%,d:".fmt(m)); mayan(m):displayMayan(_);
}

View file

@ -0,0 +1,22 @@
var [const]
t_style=0''"border-collapse: separate; text-align: center; border-spacing: 3px 0px;"',
c_style=0''"border: solid black 2px;background-color: #fffff0;border-bottom: double 6px;'
0''border-radius: 1em;-moz-border-radius: 1em;-webkit-border-radius: 1em;'
0''vertical-align: bottom;width: 3.25em;"';
var [const] dot="\u25cf", bar="\u2500\u2500\u2500!", zero=" \u0398 ";
fcn mayan(m){ m.toString(20).pump(List,fcn(m){ m.toInt(20).divr(5) }) }
fcn display(num,digits){
"{| style=%s\n|+ %s \n|-\n%s|}".fmt(t_style,num,
digits.split().pump(String, "| style=%s | %s\n".fmt.fp(c_style)) );
}
T(88637341,26960840421).apply(
fcn(m){
mayan(m).pump(String,
fcn([(bars,dots)]){
(if(bars or dots) (dot*dots + "!" + bar*bars)[0,-1] else zero)
+ " "
}).replace("!","<br>") : display(m,_)
})
.concat("\n<br>\n").println();