Add tasks for all the new languages
This commit is contained in:
parent
9dc3c2bb62
commit
bba7bfd280
13208 changed files with 134745 additions and 0 deletions
|
|
@ -0,0 +1,31 @@
|
|||
shared void run() {
|
||||
|
||||
class Numeral(shared Character char, shared Integer int) {}
|
||||
|
||||
value tiers = [
|
||||
[Numeral('I', 1), Numeral('V', 5), Numeral('X', 10)],
|
||||
[Numeral('X', 10), Numeral('L', 50), Numeral('C', 100)],
|
||||
[Numeral('C', 100), Numeral('D', 500), Numeral('M', 1k)]
|
||||
];
|
||||
|
||||
|
||||
String toRoman(Integer hindu, Integer power = 2) {
|
||||
assert(exists tier = tiers[power]);
|
||||
if(hindu <= 0) {
|
||||
return "";
|
||||
} else if(exists num = tier.rest.find((Numeral elem) => elem.int - tier.first.int <= hindu < elem.int)) {
|
||||
return "``tier.first.char````num.char````toRoman(hindu - (num.int - tier.first.int), power)``";
|
||||
} else if(exists num = tier.reversed.find((Numeral elem) => hindu >= elem.int)) {
|
||||
return "``num.char````toRoman(hindu - num.int, power)``";
|
||||
} else {
|
||||
return toRoman(hindu, power - 1);
|
||||
}
|
||||
}
|
||||
|
||||
assert(toRoman(1) == "I");
|
||||
assert(toRoman(2) == "II");
|
||||
assert(toRoman(4) == "IV");
|
||||
assert(toRoman(1666) == "MDCLXVI");
|
||||
assert(toRoman(1990) == "MCMXC");
|
||||
assert(toRoman(2008) == "MMVIII");
|
||||
}
|
||||
25
Task/Roman-numerals-Encode/ECL/roman-numerals-encode.ecl
Normal file
25
Task/Roman-numerals-Encode/ECL/roman-numerals-encode.ecl
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
RomanEncode(UNSIGNED Int) := FUNCTION
|
||||
SetWeights := [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1];
|
||||
SetSymbols := ['M', 'CM', 'D', 'CD', 'C', 'XC', 'L', 'XL', 'X', 'IX', 'V', 'IV', 'I'];
|
||||
ProcessRec := RECORD
|
||||
UNSIGNED val;
|
||||
STRING Roman;
|
||||
END;
|
||||
dsWeights := DATASET(13,TRANSFORM(ProcessRec,SELF.val := Int, SELF := []));
|
||||
|
||||
SymbolStr(i,n,STRING s) := CHOOSE(n+1,'',SetSymbols[i],SetSymbols[i]+SetSymbols[i],SetSymbols[i]+SetSymbols[i]+SetSymbols[i],s);
|
||||
|
||||
RECORDOF(dsWeights) XF(dsWeights L, dsWeights R, INTEGER C) := TRANSFORM
|
||||
ThisVal := IF(C=1,R.Val,L.Val);
|
||||
IsDone := ThisVal = 0;
|
||||
SELF.Roman := IF(IsDone,L.Roman,L.Roman + SymbolStr(C,ThisVal DIV SetWeights[C],L.Roman));
|
||||
SELF.val := IF(IsDone,0,ThisVal - ((ThisVal DIV SetWeights[C])*SetWeights[C]));
|
||||
END;
|
||||
i := ITERATE(dsWeights,XF(LEFT,RIGHT,COUNTER));
|
||||
RETURN i[13].Roman;
|
||||
END;
|
||||
|
||||
RomanEncode(1954); //MCMLIV
|
||||
RomanEncode(1990 ); //MCMXC
|
||||
RomanEncode(2008 ); //MMVIII
|
||||
RomanEncode(1666); //MDCLXVI
|
||||
25
Task/Roman-numerals-Encode/ERRE/roman-numerals-encode.erre
Normal file
25
Task/Roman-numerals-Encode/ERRE/roman-numerals-encode.erre
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
PROGRAM ARAB2ROMAN
|
||||
|
||||
DIM ARABIC%[12],ROMAN$[12]
|
||||
|
||||
PROCEDURE TOROMAN(VALUE->ANS$)
|
||||
LOCAL RESULT$
|
||||
FOR I%=0 TO 12 DO
|
||||
WHILE VALUE>=ARABIC%[I%] DO
|
||||
RESULT$+=ROMAN$[I%]
|
||||
VALUE-=ARABIC%[I%]
|
||||
END WHILE
|
||||
END FOR
|
||||
ANS$=RESULT$
|
||||
END PROCEDURE
|
||||
|
||||
BEGIN
|
||||
!
|
||||
!Testing
|
||||
!
|
||||
ARABIC%[]=(1000,900,500,400,100,90,50,40,10,9,5,4,1)
|
||||
ROMAN$[]=("M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I")
|
||||
TOROMAN(2009->ANS$) PRINT("2009 = ";ANS$)
|
||||
TOROMAN(1666->ANS$) PRINT("1666 = ";ANS$)
|
||||
TOROMAN(3888->ANS$) PRINT("3888 = ";ANS$)
|
||||
END PROGRAM
|
||||
|
|
@ -0,0 +1,31 @@
|
|||
' FB 1.05.0 Win64
|
||||
|
||||
Function romanEncode(n As Integer) As String
|
||||
If n < 1 OrElse n > 3999 Then Return "" '' can only encode numbers in range 1 to 3999
|
||||
Dim roman1(0 To 2) As String = {"MMM", "MM", "M"}
|
||||
Dim roman2(0 To 8) As String = {"CM", "DCCC", "DCC", "DC", "D", "CD", "CCC", "CC", "C"}
|
||||
Dim roman3(0 To 8) As String = {"XC", "LXXX", "LXX", "LX", "L", "XL", "XXX", "XX", "X"}
|
||||
Dim roman4(0 To 8) As String = {"IX", "VIII", "VII", "VI", "V", "IV", "III", "II", "I"}
|
||||
Dim As Integer thousands, hundreds, tens, units
|
||||
thousands = n \ 1000
|
||||
n Mod= 1000
|
||||
hundreds = n \ 100
|
||||
n Mod= 100
|
||||
tens = n \ 10
|
||||
units = n Mod 10
|
||||
Dim roman As String = ""
|
||||
If thousands > 0 Then roman += roman1(3 - thousands)
|
||||
If hundreds > 0 Then roman += roman2(9 - hundreds)
|
||||
If tens > 0 Then roman += roman3(9 - tens)
|
||||
If units > 0 Then roman += roman4(9 - units)
|
||||
Return roman
|
||||
End Function
|
||||
|
||||
Dim a(2) As Integer = {1990, 2008, 1666}
|
||||
For i As Integer = 0 To 2
|
||||
Print a(i); " => "; romanEncode(a(i))
|
||||
Next
|
||||
|
||||
Print
|
||||
Print "Press any key to quit"
|
||||
Sleep
|
||||
|
|
@ -0,0 +1,34 @@
|
|||
include "ConsoleWindow"
|
||||
|
||||
local fn DecimaltoRoman( decimal as short ) as Str15
|
||||
dim as short arabic(12)
|
||||
dim as Str15 roman(12)
|
||||
dim as long i
|
||||
dim as Str15 result : result = ""
|
||||
|
||||
arabic(0) = 1000 : arabic(1) = 900 : arabic(2) = 500 : arabic(3) = 400
|
||||
arabic(4) = 100 : arabic(5) = 90 : arabic(6) = 50 : arabic(7) = 40
|
||||
arabic(8) = 10 : arabic(9) = 9 : arabic(10) = 5 : arabic(11) = 4: arabic(12) = 1
|
||||
|
||||
roman(0) = "M" : roman(1) = "CM" : roman(2) = "D" : roman(3) = "CD"
|
||||
roman(4) = "C" : roman(5) = "XC" : roman(6) = "L" : roman(7) = "XL"
|
||||
roman(8) = "X" : roman(9) = "IX" : roman(10) = "V" : roman(11) = "IV" : roman(12) = "I"
|
||||
|
||||
for i = 0 to 12
|
||||
while ( decimal >= arabic(i) )
|
||||
result = result + roman(i)
|
||||
decimal = decimal - arabic(i)
|
||||
wend
|
||||
next i
|
||||
if result == "" then result = "Zepherium"
|
||||
end fn = result
|
||||
|
||||
print "1990 = "; fn DecimaltoRoman( 1990 )
|
||||
print "2008 = "; fn DecimaltoRoman( 2008 )
|
||||
print "2016 = "; fn DecimaltoRoman( 2016 )
|
||||
print "1666 = "; fn DecimaltoRoman( 1666 )
|
||||
print "3888 = "; fn DecimaltoRoman( 3888 )
|
||||
print "1914 = "; fn DecimaltoRoman( 1914 )
|
||||
print "1000 = "; fn DecimaltoRoman( 1000 )
|
||||
print " 513 = "; fn DecimaltoRoman( 513 )
|
||||
print " 33 = "; fn DecimaltoRoman( 33 )
|
||||
19
Task/Roman-numerals-Encode/Lasso/roman-numerals-encode.lasso
Normal file
19
Task/Roman-numerals-Encode/Lasso/roman-numerals-encode.lasso
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
define br => '\r'
|
||||
// encode roman
|
||||
define encodeRoman(num::integer)::string => {
|
||||
local(ref = array('M'=1000, 'CM'=900, 'D'=500, 'CD'=400, 'C'=100, 'XC'=90, 'L'=50, 'XL'=40, 'X'=10, 'IX'=9, 'V'=5, 'IV'=4, 'I'=1))
|
||||
local(out = string)
|
||||
with i in #ref do => {
|
||||
while(#num >= #i->second) => {
|
||||
#out->append(#i->first)
|
||||
#num -= #i->second
|
||||
}
|
||||
}
|
||||
return #out
|
||||
}
|
||||
|
||||
'1990 in roman is '+encodeRoman(1990)
|
||||
br
|
||||
'2008 in roman is '+encodeRoman(2008)
|
||||
br
|
||||
'1666 in roman is '+encodeRoman(1666)
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
function toRoman intNum
|
||||
local roman,numArabic
|
||||
put "M,CM,D,CD,C,XC,L,XL,X,IX,V,IV,I" into romans
|
||||
put "1000,900,500,400,100,90,50,40,10,9,5,4,1" into arabics
|
||||
put intNum into numArabic
|
||||
repeat with n = 1 to the number of items of romans
|
||||
put numArabic div item n of arabics into nums
|
||||
if nums > 0 then
|
||||
put repeatChar(item n of romans,nums) after roman
|
||||
add -(nums * item n of arabics) to numArabic
|
||||
end if
|
||||
end repeat
|
||||
return roman
|
||||
end toRoman
|
||||
|
||||
function repeatChar c n
|
||||
local cc
|
||||
repeat n times
|
||||
put c after cc
|
||||
end repeat
|
||||
return cc
|
||||
end repeatChar
|
||||
17
Task/Roman-numerals-Encode/Nim/roman-numerals-encode.nim
Normal file
17
Task/Roman-numerals-Encode/Nim/roman-numerals-encode.nim
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
import strutils
|
||||
|
||||
const nums = [(1000, "M"), (900, "CM"), (500, "D"), (400, "CD"), (100, "C"), (90, "XC"),
|
||||
(50, "L"), (40, "XL"), (10, "X"), (9, "IX"), (5, "V"), (4, "IV"), (1, "I")]
|
||||
|
||||
proc toRoman(x): string =
|
||||
var x = x
|
||||
result = ""
|
||||
for a,r in items(nums):
|
||||
result.add(repeatStr(x div a, r))
|
||||
x = x mod a
|
||||
|
||||
for i in [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,25,30,40,
|
||||
50,60,69,70,80,90,99,100,200,300,400,500,600,666,700,800,900,
|
||||
1000,1009,1444,1666,1945,1997,1999,2000,2008,2010,2011,2500,
|
||||
3000,3999]:
|
||||
echo toRoman(i)
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
[ [1000,"M"], [900,"CM"], [500,"D"], [400,"CD"], [100,"C"], [90,"XC"], [50,"L"], [40,"XL"], [10,"X"], [9,"IX"], [5,"V"], [4,"IV"], [1,"I"] ] const: Romans
|
||||
|
||||
: roman(n)
|
||||
| r |
|
||||
StringBuffer new
|
||||
Romans forEach: r [ while(r first n <=) [ r second << n r first - ->n ] ] ;
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
<@ DEFUDOLITLIT>_RO|__Transformer|<@ DEFKEYPAR>__NationalNumericID|2</@><@ LETRESCS%NNMPAR>...|1</@></@>
|
||||
|
||||
<@ ENU$$DLSTLITLIT>1990,2008,1,2,64,124,1666,10001|,|
|
||||
<@ SAYELTLST>...</@> is <@ SAY_ROELTLSTLIT>...|RomanLowerUnicode</@> <@ SAY_ROELTLSTLIT>...|RomanUpperUnicode</@> <@ SAY_ROELTLSTLIT>...|RomanASCII</@>
|
||||
</@>
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
<# DEFINE USERDEFINEDOPCODE LITERAL LITERAL>_RO|__Transformer|<# DEFINE KEYWORD PARAMETER>__NationalNumericID|2</#><# LET RESULT CAST NATIONALNUMBER PARAMETER>...|1</#></#>
|
||||
|
||||
<# ENUMERATION LAMBDASPECIFIEDDELMITER LIST LITERAL LITERAL>1990,2008,1,2,64,124,1666,10001|,|
|
||||
<# SAY ELEMENT LIST>...</#> is <# SAY _RO ELEMENT LIST LITERAL>...|RomanLowerUnicode</#> <# SAY _RO ELEMENT LIST LITERAL>...|RomanUpperUnicode</#> <# SAY _RO ELEMENT LIST LITERAL>...|RomanASCII</#>
|
||||
</#>
|
||||
13
Task/Roman-numerals-Encode/Phix/roman-numerals-encode.phix
Normal file
13
Task/Roman-numerals-Encode/Phix/roman-numerals-encode.phix
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
constant roman = {"M", "CM", "D","CD", "C","XC","L","XL","X","IX","V","IV","I"}
|
||||
constant decml = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 }
|
||||
|
||||
function toRoman(integer val)
|
||||
string res = ""
|
||||
for i=1 to length(roman) do
|
||||
while val>=decml[i] do
|
||||
res &= roman[i]
|
||||
val -= decml[i]
|
||||
end while
|
||||
end for
|
||||
return res
|
||||
end function
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
table: [1000 M 900 CM 500 D 400 CD 100 C 90 XC 50 L 40 XL 10 X 5 V 4 IV 1 I]
|
||||
|
||||
to-Roman: function [n [integer!] return: [string!]][
|
||||
out: copy ""
|
||||
foreach [a r] table [while [n >= a][append out r n: n - a]]
|
||||
out
|
||||
]
|
||||
|
||||
foreach number [40 33 1888 2016][print [number ":" to-Roman number]]
|
||||
11
Task/Roman-numerals-Encode/Red/roman-numerals-encode-2.red
Normal file
11
Task/Roman-numerals-Encode/Red/roman-numerals-encode-2.red
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
table: [1000 M 900 CM 500 D 400 CD 100 C 90 XC 50 L 40 XL 10 X 5 V 4 IV 1 I]
|
||||
|
||||
to-Roman: func [n [integer!] return: [string!]][
|
||||
case [
|
||||
tail? table [table: head table copy ""]
|
||||
table/1 > n [table: skip table 2 to-Roman n]
|
||||
'else [append copy form table/2 to-Roman n - table/1]
|
||||
]
|
||||
]
|
||||
|
||||
foreach number [40 33 1888 2016][print [number ":" to-Roman number]]
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
to-Roman: function [n [integer!]] reduce [
|
||||
'case collect [
|
||||
foreach [a r] [1000 M 900 CM 500 D 400 CD 100 C 90 XC 50 L 40 XL 10 X 9 IX 5 V 4 IV 1 I][
|
||||
keep compose/deep [n >= (a) [append copy (form r) any [to-Roman n - (a) copy ""]]]
|
||||
]
|
||||
]
|
||||
]
|
||||
|
||||
foreach number [40 33 1888 2016][print [number ":" to-Roman number]]
|
||||
16
Task/Roman-numerals-Encode/Ring/roman-numerals-encode.ring
Normal file
16
Task/Roman-numerals-Encode/Ring/roman-numerals-encode.ring
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
arabic = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1]
|
||||
roman = ["M", "CM", "D", "CD", "C" ,"XC", "L", "XL" ,"X", "IX", "V", "IV", "I"]
|
||||
|
||||
see "2009 = " + toRoman(2009) + nl
|
||||
see "1666 = " + toRoman(1666) + nl
|
||||
see "3888 = " + toRoman(3888) + nl
|
||||
|
||||
func toRoman val
|
||||
result = ""
|
||||
for i = 1 to 13
|
||||
while val >= arabic[i]
|
||||
result = result + roman[i]
|
||||
val = val - arabic[i]
|
||||
end
|
||||
next
|
||||
return result
|
||||
19
Task/Roman-numerals-Encode/Sidef/roman-numerals-encode.sidef
Normal file
19
Task/Roman-numerals-Encode/Sidef/roman-numerals-encode.sidef
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
func arabic2roman(num, roman='') {
|
||||
static lookup = [
|
||||
:M:1000, :CM:900, :D:500,
|
||||
:CD:400, :C:100, :XC:90,
|
||||
:L:50, :XL:40, :X:10,
|
||||
:IX:9, :V:5, :IV:4,
|
||||
:I:1
|
||||
];
|
||||
lookup.each { |pair|
|
||||
while (num >= pair.second) {
|
||||
roman += pair.first;
|
||||
num -= pair.second;
|
||||
}
|
||||
}
|
||||
return roman;
|
||||
}
|
||||
say("1990 in roman is " + arabic2roman(1990));
|
||||
say("2008 in roman is " + arabic2roman(2008));
|
||||
say("1666 in roman is " + arabic2roman(1666));
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
func ator(var n: Int) -> String {
|
||||
|
||||
var result = ""
|
||||
|
||||
for (value, letter) in
|
||||
[( 1000, "M"),
|
||||
( 900, "CM"),
|
||||
( 500, "D"),
|
||||
( 400, "CD"),
|
||||
( 100, "C"),
|
||||
( 90, "XC"),
|
||||
( 50, "L"),
|
||||
( 40, "XL"),
|
||||
( 10, "X"),
|
||||
( 9, "IX"),
|
||||
( 5, "V"),
|
||||
( 4, "IV"),
|
||||
( 1, "I")]
|
||||
{
|
||||
while n >= value {
|
||||
result += letter
|
||||
n -= value
|
||||
}
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
|
@ -0,0 +1 @@
|
|||
println(ator(1666)) // MDCLXVI
|
||||
|
|
@ -0,0 +1 @@
|
|||
print(ator(1666)) // MDCLXVI
|
||||
12
Task/Roman-numerals-Encode/XLISP/roman-numerals-encode.xlisp
Normal file
12
Task/Roman-numerals-Encode/XLISP/roman-numerals-encode.xlisp
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
(defun roman (n)
|
||||
(define roman-numerals '((1000 "m") (900 "cm") (500 "d") (400 "cd") (100 "c") (90 "xc") (50 "l") (40 "xl") (10 "x") (9 "ix") (5 "v") (4 "iv") (1 "i")))
|
||||
(defun romanize (arabic-numeral numerals roman-numeral)
|
||||
(if (= arabic-numeral 0)
|
||||
roman-numeral
|
||||
(if (>= arabic-numeral (caar numerals))
|
||||
(romanize (- arabic-numeral (caar numerals)) numerals (string-append roman-numeral (cadar numerals)))
|
||||
(romanize arabic-numeral (cdr numerals) roman-numeral))))
|
||||
(romanize n roman-numerals ""))
|
||||
|
||||
; test the function:
|
||||
(display (mapcar roman '(10 2016 800 2769 1666 476 1453)))
|
||||
Loading…
Add table
Add a link
Reference in a new issue